深圳網(wǎng)站建設(shè)外包公司資源搜索神器
目錄
- 前言
- 引言
- 總體設(shè)計
- 系統(tǒng)整體結(jié)構(gòu)圖
- 系統(tǒng)流程圖
- 運行環(huán)境
- 模塊實現(xiàn)
- 1. 數(shù)據(jù)預(yù)處理
- 2. 模型構(gòu)建
- 3. 模型訓(xùn)練及保存
- 4. 模型生成
- 系統(tǒng)測試
- 1. 訓(xùn)練準(zhǔn)確率
- 2. 測試效果
- 相關(guān)其它博客
- 工程源代碼下載
- 其它資料下載
前言
博主前段時間發(fā)布了一篇有關(guān)方言識別和分類模型訓(xùn)練的博客,在讀者的反饋中發(fā)現(xiàn)許多小伙伴對方言的辨識和分類表現(xiàn)出濃厚興趣。鑒于此,博主決定專門撰寫一篇關(guān)于方言分類的博客,以滿足讀者對這一主題的進(jìn)一步了解和探索的需求。上篇博客可參考:
《基于Python+WaveNet+CTC+Tensorflow智能語音識別與方言分類—深度學(xué)習(xí)算法應(yīng)用(含全部工程源碼)》
引言
本項目以科大訊飛提供的數(shù)據(jù)集為基礎(chǔ),通過特征篩選和提取的過程,選用WaveNet模型進(jìn)行訓(xùn)練。旨在通過語音的梅爾頻率倒譜系數(shù)(MFCC)特征,建立方言和相應(yīng)類別之間的映射關(guān)系,解決方言分類問題。
首先,項目從科大訊飛提供的數(shù)據(jù)集中進(jìn)行了特征篩選和提取。包括對語音信號的分析,提取出最能代表語音特征的MFCC,為模型訓(xùn)練提供有力支持。
其次,選擇了WaveNet模型進(jìn)行訓(xùn)練。WaveNet模型是一種序列生成器,用于語音建模,在語音合成的聲學(xué)建模中,可以直接學(xué)習(xí)采樣值序列的映射,通過先前的信號序列預(yù)測下一個時刻點值的深度神經(jīng)網(wǎng)絡(luò)模型,具有自回歸的特點。
在訓(xùn)練過程中,利用語音的MFCC特征,建立了方言和相應(yīng)類別之間的映射關(guān)系。這樣,模型能夠識別和分類輸入語音的方言,并將其劃分到相應(yīng)的類別中。
最終,通過這個項目,實現(xiàn)了方言分類問題的解決方案。這對于語音識別、語音助手等領(lǐng)域具有實際應(yīng)用的潛力,也有助于保護(hù)和傳承各地區(qū)的語言文化。
總體設(shè)計
本部分包括系統(tǒng)整體結(jié)構(gòu)圖和系統(tǒng)流程圖。
系統(tǒng)整體結(jié)構(gòu)圖
系統(tǒng)整體結(jié)構(gòu)如圖所示。
系統(tǒng)流程圖
系統(tǒng)流程如圖所示。
運行環(huán)境
本部分包括Python環(huán)境、TensorFlow環(huán)境、JupyterNotebook環(huán)境、PyCharm環(huán)境。
詳見博客。
模塊實現(xiàn)
本項目包括4個模塊:數(shù)據(jù)預(yù)處理、模型構(gòu)建、模型訓(xùn)練及保存、模型生成。下面分別給出各模塊的功能介紹及相關(guān)代碼。
1. 數(shù)據(jù)預(yù)處理
本部分包括數(shù)據(jù)介紹、數(shù)據(jù)測試和數(shù)據(jù)處理。
詳見博客。
2. 模型構(gòu)建
數(shù)據(jù)加載進(jìn)模型之后,需要定義模型結(jié)構(gòu)并優(yōu)化損失函數(shù)。
詳見博客。
3. 模型訓(xùn)練及保存
本部分包括模型訓(xùn)練、模型保存和映射保存。
詳見博客。
4. 模型生成
將訓(xùn)練好的.h5
模型文件放入總目錄下:信息系統(tǒng)設(shè)計方言種類識別/fangyan.h5
。
相關(guān)代碼如下:
#打開映射
with open('resources.pkl', 'rb') as fr:[class2id, id2class, mfcc_mean, mfcc_std] = pickle.load(fr)
model = load_model('fangyan.h5')
#glob()提取路徑參數(shù)
paths = glob.glob('data/*/dev/*/*/*.pcm')
將保存的方言和種類之間映射關(guān)系.pkl
文件放到總文件目錄下:信息系統(tǒng)設(shè)計/方言種類識別/resources.pkl
。相關(guān)代碼如下:
#打開保存的方言和種類之間的映射
with open('resources.pkl', 'rb') as fr:[class2id, id2class, mfcc_mean, mfcc_std] = pickle.load(fr)
在單機上加載訓(xùn)練好的模型,隨機選擇一條語音進(jìn)行分類。新建測試主運行文件main.py
,加載庫之后,調(diào)用生成的模型文件獲得預(yù)測結(jié)果。
相關(guān)代碼如下:
#glob()提取路徑參數(shù)
paths = glob.glob('data/*/dev/*/*/*.pcm')
#通過random模塊隨機提取一條語音數(shù)據(jù)
path = np.random.choice(paths, 1)[0]
label = path.split('/')[1]
print(label, path)
#本部分的相關(guān)代碼
# -*- coding:utf-8 -*-
import numpy as np
from keras.models import load_model
from keras.preprocessing.sequence import pad_sequences
import librosa
from python_speech_features import mfcc
import pickle
import wave
import glob
#打開映射
with open('resources.pkl', 'rb') as fr:[class2id, id2class, mfcc_mean, mfcc_std] = pickle.load(fr)
model = load_model('fangyan.h5')
#glob()提取路徑參數(shù)
paths = glob.glob('data/*/dev/*/*/*.pcm')
#通過random模塊隨機提取一條語音數(shù)據(jù)
path = np.random.choice(paths, 1)[0]
label = path.split('/')[1]
print(label, path)
#語音分片處理
mfcc_dim = 13
sr = 16000
min_length = 1 * sr
slice_length = 3 * sr
#提取語音信號的參數(shù)
def load_and_trim(path, sr=16000):audio = np.memmap(path, dtype='h', mode='r')audio = audio[2000:-2000]audio = audio.astype(np.float32)energy = librosa.feature.rmse(audio)frames = np.nonzero(energy >= np.max(energy) / 5)indices = librosa.core.frames_to_samples(frames)[1]audio = audio[indices[0]:indices[-1]] if indices.size else audio[0:0]slices = []for i in range(0, audio.shape[0], slice_length):s = audio[i: i + slice_length]slices.append(s)return audio, slices
#提取MFCC特征進(jìn)行測試
audio, slices = load_and_trim(path)
X_data = [mfcc(s, sr, numcep=mfcc_dim) for s in slices]
X_data = [(x - mfcc_mean) / (mfcc_std + 1e-14) for x in X_data]
maxlen = np.max([x.shape[0] for x in X_data])
X_data = pad_sequences(X_data, maxlen, 'float32', padding='post', value=0.0)
print(X_data.shape)
#預(yù)測方言種類并輸出
prob = model.predict(X_data)
prob = np.mean(prob, axis=0)
pred = np.argmax(prob)
prob = prob[pred]
pred = id2class[pred]
print('True:', label)
print('Pred:', pred, 'Confidence:', prob)
系統(tǒng)測試
本部分包括訓(xùn)練準(zhǔn)確率及測試效果。
1. 訓(xùn)練準(zhǔn)確率
繪制損失函數(shù)曲線和準(zhǔn)確率曲線,經(jīng)過10輪訓(xùn)練后,準(zhǔn)確率將近100%,驗證集準(zhǔn)確率在89%左右。相關(guān)代碼如下:
train_loss = history.history['loss']
valid_loss = history.history['val_loss']
plt.plot(train_loss,label='訓(xùn)練集')
plt.plot(valid_loss,label='驗證集')
plt.legend(loc='upperright')
plt.xlabel('迭代次數(shù)')
plt.ylabel('損失')
plt.show()
#訓(xùn)練損失
#驗證損失
#繪圖
train acc = history.history['acc']
valid_acc = history.history['val_acc']
plt.plot(train_acc,label='訓(xùn)練集')
plt.plot(valid acc,label='驗證集')
plt.legend(loc='upper right')
plt.xlabel('迭代次數(shù)')
plt.ylabel('準(zhǔn)確率')
plt.show()
隨著訓(xùn)練次數(shù)的增多,模型在訓(xùn)練數(shù)據(jù)、測試數(shù)據(jù)上的損失和準(zhǔn)確率逐漸收斂,最終趨于穩(wěn)定,如圖3和圖4所示。
2. 測試效果
在本地服務(wù)器端進(jìn)行測試,使用PyCharm調(diào)用保存的模型和映射。設(shè)置PyCharm運行環(huán)境,找到本地Python環(huán)境并導(dǎo)入,如圖所示。
從本地隨機抽取一段語音進(jìn)行測試,相關(guān)代碼如下:
#glob()提取路徑參數(shù)
paths = glob.glob('data/*/dev/*/*/* / .pcm')
#通過 random模塊隨機提取一條語音數(shù)據(jù)
path = np.random.choice(paths, 1)[0]
label=path.split('/')[1]
print(label,path)
paths=glob.glob('D:/課堂導(dǎo)讀/信息系統(tǒng)設(shè)計/方言種類分類/data/*/dev/*/*.pcm')
#預(yù)測方言種類并輸出
prob=model.predict(X_data)
prob = np.mean(prob,axis=0)
pred = np.argmax(prob)
prob = prob[pred]
pred = id2class[pred]
print('True:',label)
print('Pred:', pred, 'Confidence:', prob)
在PyCharm上編輯運行,得到的分類結(jié)果與語音片段一致,如圖所示。
相關(guān)其它博客
基于Python+WaveNet+MFCC+Tensorflow智能方言分類—深度學(xué)習(xí)算法應(yīng)用(含全部工程源碼)(一)
基于Python+WaveNet+MFCC+Tensorflow智能方言分類—深度學(xué)習(xí)算法應(yīng)用(含全部工程源碼)(二)
基于Python+WaveNet+MFCC+Tensorflow智能方言分類—深度學(xué)習(xí)算法應(yīng)用(含全部工程源碼)(三)
工程源代碼下載
詳見本人博客資源下載頁
其它資料下載
如果大家想繼續(xù)了解人工智能相關(guān)學(xué)習(xí)路線和知識體系,歡迎大家翻閱我的另外一篇博客《重磅 | 完備的人工智能AI 學(xué)習(xí)——基礎(chǔ)知識學(xué)習(xí)路線,所有資料免關(guān)注免套路直接網(wǎng)盤下載》
這篇博客參考了Github知名開源平臺,AI技術(shù)平臺以及相關(guān)領(lǐng)域?qū)<?#xff1a;Datawhale,ApacheCN,AI有道和黃海廣博士等約有近100G相關(guān)資料,希望能幫助到所有小伙伴們。