让机器听声音识别男女(机器学习的方法)
讓機器聽聲音識別男女(機器學習的方法)
瀏覽更多內容,可訪問:http://www.growai.cn
寫在前面
歡迎您關注作者知乎:ML與DL成長之路
推薦關注公眾號:AI成長社,ML與DL的成長圣地。
1、簡介
? 人能夠很容易的聽出說話人的性別,我們能不能讓機器也像人一樣,聽聲辨別性別?這個答案是肯定的,特別是隨著人工智能算法的發(fā)展,識別性能是不斷的提升。本實驗就是通過聲音識別男女性別。主要分為三個部分,第一是對聲音文件進行特征提取,第二是通過機器學習方法建立男女性別分類模型,第三則是加載模型進行聲音文件測試。
2、主體框架
-
聲音文件:本文中采用的數(shù)據(jù)是預存為wav格式的錄音文件,主要來自The Harvard-Haskins Database of Regularly-Timed Speech、Festvox CMU_ARCTIC Speech Database at Carnegie Mellon University
-
特征提取:利用R語言實現(xiàn),可以使用R語言的warbleR包,本文中使用的是一個開源的R語言函數(shù)包(末尾會提供),它能提取出20個特征(特征如下圖),本文末尾會提供一個已經(jīng)通過此腳本處理好的3000多條特征文件,可以直接加載訓練模型。
-
算法:本文中采用的是xgboost算法,測試準備率可達98%以上。
-
模型保存:為了方便測試使用,將訓練得到的參數(shù),保存下來,只用訓練一次,測試時只需加載參數(shù)即可。
3、 所需環(huán)境
- R語言(本文是在linux系統(tǒng)進行)
- python2
- rpy2(用來加載R函數(shù),讀取R語言的輸出文件特征)
- pickle(模型保存)
- xgboost
4 代碼
1 利用R語言腳本輸出特征文件
import pandas as pd import rpy2.robjects as robjects from rpy2.robjects import r, pandas2ri import os os.chdir('home/qlmx')data_list = []#獲取特征文件 def get_feature(fname):pandas2ri.activate()robjects.r.source('feature_extract.R') #利用rpy2讀取R腳本data_read = robjects.r.processFolder(fname) #得到數(shù)據(jù)文件data_read = pandas2ri.ri2py(data_read) #轉化為python可以使用的數(shù)據(jù)return data_readif __name__ == '__main__':file_name_list = os.listdir('data') #存放.wav格式聲音的文件夾for file_name in file_name_list:data = get_feature(file_name)data_list.append(data)result = pd.concat(data_list) result['label'] = 'male'result.to_csv("male.csv", index=False)#result['label'] = 'female'#result.to_csv("female.csv", index=False)注:該文件主要是用來構造訓練過程中的特征文件,需要人為的標定male或者female。對生成的male.csv和female.csv文件再合并成為train.csv文件,用于訓練。
2 獲得訓練model
#-*- coding:utf-8 _*- import xgboost as xgb import pandas as pd import numpy as np import sklearn import pickle import pprintdef xgb_score(preds, dtrain):labels = dtrain.get_label()return 'log_loss', sklearn.metrics.log_loss(labels, preds)input_data = pd.read_csv('train.csv') input_data = input_data.sample(frac=1) gender = {'male' : 0, 'female' : 1} input_data['label'] = input_data['label'].map(gender) cols = [c for c in input_data.columns if c not in ['label']] print cols train = input_data.iloc[0 :3300] test = input_data.iloc[3300 : ] test_label = test['label'] test_label = np.array(test_label).reshape([-1 , 1]) del(test['label'])fold = 1 for i in range(fold):params = {'eta': 0.01, #use 0.002'max_depth': 5,'objective': 'binary:logistic','eval_metric': 'logloss','lambda':0.1,'gamma':0.1,'seed': i,'silent': True}x1 = train[cols][0:3000]x2 = train[cols][3000:]y1 = train['label'][0:3000]y2 = train['label'][3000 : ]watchlist = [(xgb.DMatrix(x1, y1), 'train'), (xgb.DMatrix(x2, y2), 'valid')]model = xgb.train(params, xgb.DMatrix(x1, y1), 1500, watchlist, feval=xgb_score, maximize=False, verbose_eval=50, early_stopping_rounds=50) #use 1500if i != 0:pred += model.predict(xgb.DMatrix(test[cols]), ntree_limit=model.best_ntree_limit)else:pred = model.predict(xgb.DMatrix(test[cols]), ntree_limit=model.best_ntree_limit)pred /= fold pre_label = np.zeros([pred.shape[0], 1]) for i in range(pred.shape[0]):if pred[i] >= 0.5:pre_label[i] = 1else:pre_label[i] = 0acc = np.mean(np.equal(pre_label, test_label).astype(np.float)) print("the test acc is:", acc)model_save = open('model.pkl', 'wb') #保存模型 pickle.dump(model, model_save) model_save.close()3 測試聲音
import xgboost as xgb import pandas as pd import numpy as np import sklearn import pickle import pprint import rpy2.robjects as robjects from rpy2.robjects import r, pandas2ri import os os.chdir('/home/qlmx')#get feature file def get_feature(fname):pandas2ri.activate()robjects.r.source('feature_extract.R')data_read = robjects.r.processFolder(fname)data_read = pandas2ri.ri2py(data_read)return data_readif __name__ == '__main__':data_list = []model_save = open('model.pkl', 'rb')model = pickle.load(model_save)model_save.close()file_name_list = os.listdir('data') #讀取聲音文件for file_name in file_name_list:data = get_feature(file_name)data_list.append(data)test = pd.concat(data_list)pred = model.predict(xgb.DMatrix(test), ntree_limit=model.best_ntree_limit)print predpre_label = np.zeros([pred.shape[0], 1])for i in range(pred.shape[0]):if pred[i] >= 0.5:pre_label[i] = 1else:pre_label[i] = 0num = 0tlen = len(pre_label)for i in pre_label:num += iprint 'female is;'+str(num)print 'male is:'+str(tlen-num)print (tlen-num)/tlenprint num/tlen鏈接:特征文件和R語言腳本
總結
以上是生活随笔為你收集整理的让机器听声音识别男女(机器学习的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消防工程师答题做试题模拟真题微信小程序,
- 下一篇: 【大数据】大数据初识