在開始模型訓(xùn)練前,一定要對(duì)數(shù)據(jù)處理熟悉!
?文章來源地址http://www.zghlxwxcb.cn/news/detail-719439.html
一、預(yù)處理:
1、IEMOCAP語音數(shù)據(jù)部分
按照人(1F,1M,2F,2M,3F,3M,4F,4M,5F,5M):
ang有語音數(shù)量:[147, 82, 67, 70, 92, 148, 205, 122, 78, 92]
exc有語音數(shù)量:[63, 80, 96, 114, 48, 103, 154, 84, 82, 217]
hap有語音數(shù)量:[69, 66, 70, 47, 80, 55, 31, 34, 77, 66]
neu有語音數(shù)量:[171, 213, 135, 227, 130, 190, 76, 182, 221, 163]
sad有語音數(shù)量:[78, 116, 113, 84, 172, 133, 62, 81, 132, 113]
混合:
ang有語音數(shù)量:1103????????exc有語音數(shù)量:1041????????hap有語音數(shù)量:595
neu有語音數(shù)量:1708????????sad有語音數(shù)量:1084? 總共5531條
如果是4490條的話,就是去掉了exc的1041條。
在可以看到這個(gè)5分類各自的語音數(shù)量并不是很均衡。一大多數(shù)SER論文是做四分類即,'ang','hap', 'neu', 'sad',把'hap'與'exc'語音合并。那我也做4分類的SER,便于后期與其他論文的模型性能的比較。
2、數(shù)據(jù)劃分
大多數(shù)論文采用5折交叉驗(yàn)證或者10折交叉驗(yàn)證。
K折交叉驗(yàn)證:?把數(shù)據(jù)平均分成k等份,每次實(shí)驗(yàn)?zāi)靡环葑鰷y試,其余用做訓(xùn)練。實(shí)驗(yàn)k次求平均值。如5折交叉驗(yàn)證就是把數(shù)據(jù)平均分成5等份,每次實(shí)驗(yàn)?zāi)靡环葑鰷y試,其余用做訓(xùn)練。實(shí)驗(yàn)5次求平均值。
在IEMOCAP上的SER論文實(shí)驗(yàn)有speaker independent 與speaker dependent之分 :
(1)speaker dependent(SD):若采用 5 折交叉驗(yàn)證法,將語音情感數(shù)據(jù)庫中的所有數(shù)據(jù)隨機(jī)打亂,然后平均成 5 份,逐一選取 1 份作為測試數(shù)據(jù),其他 4 份做訓(xùn)練數(shù)據(jù),最后將得到的準(zhǔn)確率求和取平均。如此重復(fù) 5 次5折交叉驗(yàn)證,然后再求和取平均。
(2)speaker independent(SI):將IEMOCAP中逐一選取不同的說話人做測試數(shù)據(jù),其他說話人做訓(xùn)練數(shù)據(jù),最后將每個(gè)人的語音情感識(shí)別準(zhǔn)確率求和取平均;若采用5倍交叉驗(yàn)證,根據(jù)說話人的數(shù)量以80%:20%的比例分割數(shù)據(jù),80%的數(shù)據(jù)用于模型訓(xùn)練,剩余的數(shù)據(jù)用于模型測試。具體就是:IEMOCAP有10個(gè)人,1/2/3/4/5/6/7/8-th person做訓(xùn)練集(80%),9/10-th做測試集(20%);1/2/3/4/5/6/9/10-th person做訓(xùn)練集(80%),7/8-th做測試集(20%);1/2/3/4/7/8/9/10-th person做訓(xùn)練集(80%),5/6-th做測試集(20%);1/2/5/6/7/8/9/10-th person做訓(xùn)練集(80%),3/4-th做測試集(20%);3/4/5/6/7/8/9/10-th person做訓(xùn)練集(80%),1/2-th做測試集(20%)。這與按照session做5折交叉驗(yàn)證類似了。
IEMOCAP有5個(gè)session:1/2/3/4/5,比較特別,一個(gè)session里有兩個(gè)人,所以如果按照session做5折交叉驗(yàn)證的話就相當(dāng)于speaker independent了。
按session的5折交叉驗(yàn)證:
fold1:2/3/4/5-th session組成訓(xùn)練集,1-th session為測試集;
fold2:1/3/4/5-th session組成訓(xùn)練集,2-th session為測試集;
fold3:1/2/4/5-th session組成訓(xùn)練集,3-th session為測試集;
fold4:1/2/3/5-th session組成訓(xùn)練集,4-th session為測試集;
fold5:1/2/3/4-th session組成訓(xùn)練集,5-th session為測試集;
本次實(shí)驗(yàn)策略采用SI,說話人獨(dú)立的策略。
3、特征提取
常用的特征:語譜圖、MFCC等。語譜圖(語音頻譜圖):有線性頻譜圖、梅爾頻譜圖、log-Mel頻譜圖。
這次我就提取梅爾頻譜圖:
(1)首先把IEMOCAP的語音統(tǒng)一到相同長度,這里我統(tǒng)一到2秒,即把一條語音切分成2秒一段,重疊1.6秒;不足2秒的語音用0補(bǔ)充。
def cut_wav(wav, seg_length, overlap, rate):
"""波形數(shù)據(jù)切割"""
seg_len_points = seg_length * rate # 一個(gè)segment所包含的采樣點(diǎn)數(shù)
seg_overlap_points = overlap * rate # segment重疊的采樣點(diǎn)數(shù)
seg_hop_points = (seg_length - overlap) * rate # segment移動(dòng)
start = 0 # 開始指針
end = start + seg_len_points # 結(jié)尾指針
segs = [] # 存儲(chǔ)切分片段的
# 一段語音可被分割的數(shù)量
seg_num = int((len(wav) - seg_len_points + seg_hop_points) / seg_hop_points)
# 長度不足一個(gè)片段的補(bǔ)零處理
if len(wav) < seg_len_points:
segs.append(np.hstack([wav, np.array([0] * (seg_len_points - len(wav)))]))
# segs.append(wav)
for _ in range(seg_num): # 從頭開始切分
segs.append(wav[int(start): int(end)]) # 添加新片段
start += seg_hop_points # 更新起始指針
end = start + seg_len_points # 更新結(jié)尾指針
return segs
(2)預(yù)加重:
def pre_emphasis(signal): # 定義預(yù)加重函數(shù)
pre_emphasis = 0.97
emphasized_signal = np.append(signal[0],signal[1:] - pre_emphasis * signal[: -1])
return emphasized_signal # 返回預(yù)加重以后的采樣數(shù)組
(3)生成梅爾語譜圖:先librosa.load加載語音;然后調(diào)用cut_wav把語音切分成2秒一段,該函數(shù)返回一條語音的所有段;循環(huán),對(duì)每一個(gè)語音段seg執(zhí)行:預(yù)加重,stft變換,np.abs,平方,mel濾波器組,dot,power_to_db操作,就可以得到mel-spectrum;最后生成圖像。
def get_spectrogram(root_path, new_path):
emos = ['ang', 'exc', 'hap', 'neu', 'sad']
label_dict = {'ang': 0, 'exc': 1, 'hap': 1, 'neu': 2, 'sad': 3} # 把exc與hap合并
fold_name = ["Session1F", "Session1M", "Session2F", "Session2M", "Session3F",
"Session3M", "Session4F", "Session4M", "Session5F", "Session5M"]
print("數(shù)據(jù)收集階段:")
time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(time)
for name in fold_name: # 遍歷每一折文件夾
for emo in emos: # 遍歷每一種情感
files = os.listdir(os.path.join(root_path, name, emo)) # 列出該折中該類情感的文件
for f_name in files: # 針對(duì)每一個(gè)wav文件#D:\Workspace\FLDNetOnIEMOCAP\IEMOCAP\Session1F\ang\Ses01F_impro01_F012.wav
f_path = os.path.join(root_path, name, emo, f_name) # 獲取文件名
print(f_path)
(sig, rate) = librosa.load(f_path, sr=16000)
print(len(sig))
segs = cut_wav(sig, seg_length=2, overlap=1.6, rate=rate) # 切分波形數(shù)組為2s長,重疊1.6s片段
for i, seg in enumerate(segs):
y = pre_emphasis(seg) # 預(yù)加重
# 對(duì)每一段(2秒)segment進(jìn)行變換
linear = librosa.stft(y=y, n_fft=1024, hop_length=512)
mag = np.abs(linear) # (1+n_fft//2, T) 復(fù)數(shù)的實(shí)部:np.abs(D(f,t))頻率的振幅
mag = mag ** 2 # 平方
mel_basis = librosa.filters.mel(sr = rate, n_fft=1024, n_mels=40) # (n_mels, 1+n_fft//2) 梅爾譜矩陣
mel = np.dot(mel_basis, mag) # (n_mels, t) 梅爾譜=梅爾譜矩陣*幅度譜矩陣 mel spectrogram
mel = librosa.power_to_db(mel) # mel-spec
# logmelspec = librosa.amplitude_to_db(melspec) # 轉(zhuǎn)換到對(duì)數(shù)刻度
plt.figure(figsize=(3, 3)) #
librosa.display.specshow(mel, y_axis='mel', fmax=8000, x_axis='time', sr=rate) # ???
# plt.title('Mel spectrogram')
plt.axis('off') # 關(guān)閉坐標(biāo)軸
before = f_path[: -4] # 前綴D:\Workspace\FLDNetOnIEMOCAP\IEMOCAP\Session1F\ang\Ses01F_impro01_F012
seg_name = before + "-" + str(i) + ".png"
save_path = os.path.join(new_path, name, emo) # 存儲(chǔ)路徑創(chuàng)建
if not os.path.exists(save_path):
os.makedirs(save_path)
plt.savefig(os.path.join(save_path, seg_name.split('\\')[-1]), bbox_inches='tight', pad_inches=0)
# seg_name.split('\\')[-1] 就是Ses01F_impro01_F012
plt.close()
下圖顯示,session1F中impro04_F031語音的第四段的梅爾語譜圖:Ses01F_impro04_F031-3
最后得到的數(shù)據(jù)結(jié)構(gòu):
fold0:訓(xùn)練集:1-8-th person的梅爾語譜圖? ? 測試集:9-10-th person的語譜圖
fold1:訓(xùn)練集:1-8-th person的梅爾語譜圖? ? 測試集:9-10-th person的語譜圖
fold2:訓(xùn)練集:1-8-th person的梅爾語譜圖? ? 測試集:9-10-th person的語譜圖
fold3:訓(xùn)練集:1-8-th person的梅爾語譜圖? ? 測試集:9-10-th person的語譜圖
fold4:訓(xùn)練集:1-8-th person的梅爾語譜圖? ? 測試集:9-10-th person的語譜圖文章來源:http://www.zghlxwxcb.cn/news/detail-719439.html
?
到了這里,關(guān)于【ResNet18】on IEMOCAP—語音情感識(shí)別(預(yù)處理篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!