1 問題描述
這兩天復現代碼。先構造數據集,純凈語音、不同噪聲、不同SNR的混合語音。其中純凈語音由兩部分組成,IEEE corpus和TIMIT。
一開始我用MATLAB中的audioread讀取音頻文件,合成后用audiowrite保存下來。沒有任何問題。
后來,師姐讓我換成python處理,不管是wave還是scipy.io中的wavfile,在讀取TIMIT的原始WAV時都會報錯。
2 原因定位
通過上述問答以及TIMIT語料庫的官方說明文件,我們可以發現TIMIT中的WAV文件是:
我們用notepad++打開任意一個數據集中的wav文件,可以看到以下內容作為開頭:
而以同樣方式打開普通的wav文件,則開頭內容為:
3 解決思路
將SPHERE文件轉換成WAV文件。
網上可以找到許多方法,在此我采用了Dystopia在基於各種分類算法的說話人識別(年齡段識別)一文中的方法。
Kaldi中tools下有SPHERE文件轉換工具sph2pipe.exe
1.下載編譯sph2pipe
轉換工具:sph2pipe_v2.5,如果安裝過Kaldi的話,可以直接使用 $KALDI_ROOT/tools/sph2pipe_v2.5/sph2pipe,如果沒有安裝的話,可以單獨下載:http://sourceforge.net/projects/kaldi/files/sph2pipe_v2.5.tar.gz
如果是在Windows環境下的話直接使用sph2pipe.exe即可,如果是在linux環境下的話,則需要進行GCC編碼:gcc -o sph2pipe *.c -lm
2.用re_sph2pipe.py腳本生成sph2pipe轉換文件
1 #encoding="utf-8" 2 import os 3 import os.path 4 rootdir = "/data/Datasets/yuanpp/TIMIT" 5 timitpath = "/data/Datasets/yuanpp/TIMIT" 6 targetpath = "/data/Datasets/yuanpp/TIMIT_convert" 7 sph2pipepath = "/home/yuanpeipei/sph2pipe_v2.5/sph2pipe" 8 f = open('./make_sph2pipe_file.txt','w') 9 for root,dirs,files in os.walk(rootdir): 10 for fn in files: 11 if fn[len(fn)-3:len(fn)]=='wav': 12 sourcefile = timitpath+root[len(rootdir):]+"/"+fn 13 targetfile = targetpath + "/" + fn 14 s = sph2pipepath + " -f wav " + sourcefile+" "+targetfile+"\n" 15 f.write(s) 16 f.close()
生成make_sph2pipe_file.txt文件,內容為命令行。
1 /home/yuanpeipei/sph2pipe_v2.5/sph2pipe -f wav /data/Datasets/yuanpp/TIMIT/pure_utterance/validation/S_125_06.wav /data/Datasets/yuanpp/TIMIT_convert/S_125_06.wav 2 /home/yuanpeipei/sph2pipe_v2.5/sph2pipe -f wav /data/Datasets/yuanpp/TIMIT/pure_utterance/validation/S_130_03.wav /data/Datasets/yuanpp/TIMIT_convert/S_130_03.wav 3 /home/yuanpeipei/sph2pipe_v2.5/sph2pipe -f wav /data/Datasets/yuanpp/TIMIT/pure_utterance/validation/S_60_10.wav /data/Datasets/yuanpp/TIMIT_convert/S_60_10.wav 4 /home/yuanpeipei/sph2pipe_v2.5/sph2pipe -f wav /data/Datasets/yuanpp/TIMIT/pure_utterance/validation/S_130_06.wav /data/Datasets/yuanpp/TIMIT_convert/S_130_06.wav 5 ... ...
3.在linux下執行shell命令
1 #!/bin/sh 2 while read line 3 do 4 $line 5 done < make_sph2pipe_file.txt
即可。
參考資料: