【數據預處理】TIMIT語料庫WAV文件轉換

1 問題描述

這兩天覆現代碼。先構造數據集,純淨語音、不一樣噪聲、不一樣SNR的混合語音。其中純淨語音由兩部分組成,IEEE corpus和TIMIT。html

一開始我用MATLAB中的audioread讀取音頻文件,合成後用audiowrite保存下來。沒有任何問題。python

後來,師姐讓我換成python處理,無論是wave仍是scipy.io中的wavfile,在讀取TIMIT的原始WAV時都會報錯。linux

stackoverflow上相關問題及解決方案算法

2 緣由定位

經過上述問答以及TIMIT語料庫的官方說明文件,咱們能夠發現TIMIT中的WAV文件是:shell

 

咱們用notepad++打開任意一個數據集中的wav文件,能夠看到如下內容做爲開頭:工具

而以一樣方式打開普通的wav文件,則開頭內容爲:post

3 解決思路

將SPHERE文件轉換成WAV文件。編碼

網上能夠找到許多方法,在此我採用了Dystopia基於各類分類算法的說話人識別(年齡段識別)一文中的方法。
url

Kaldi中tools下有SPHERE文件轉換工具sph2pipe.exespa

1.下載編譯sph2pipe

jacoxuWSJ0數據中的.wv1文件(sph)讀取

轉換工具: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

便可。

參考資料:

[1] 基於各類分類算法的說話人識別(年齡段識別)

[2] WSJ0數據中的.wv1文件(sph)讀取

[3] reading a WAV file from TIMIT database in python

相關文章
相關標籤/搜索