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


1 問題描述

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

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

后來,師姐讓我換成python處理,不管是wave還是scipy.io中的wavfile,在讀取TIMIT的原始WAV時都會報錯。

stackoverflow上相關問題及解決方案

2 原因定位

通過上述問答以及TIMIT語料庫的官方說明文件,我們可以發現TIMIT中的WAV文件是:

 

我們用notepad++打開任意一個數據集中的wav文件,可以看到以下內容作為開頭:

而以同樣方式打開普通的wav文件,則開頭內容為:

3 解決思路

將SPHERE文件轉換成WAV文件。

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM