zoukankan      html  css  js  c++  java
  • 【数据预处理】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+"
    "
    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

  • 相关阅读:
    Door Frames CodeForces
    POJ 3090 Visible Lattice Points (ZOJ 2777)
    从斐波那契到矩阵快速幂
    Recursive sequence (矩阵快速幂)2016ACM/ICPC亚洲区沈阳站
    c++ 类实现 AVL树容器(包含迭代器)
    c++ 链表类的实现(包含迭代器)
    HDU
    【几何+模拟】二次元变换 计蒜客
    【bfs+链式向前星】防御僵尸(defend)计蒜客
    deque in Python
  • 原文地址:https://www.cnblogs.com/JJJanepp/p/10432254.html
Copyright © 2011-2022 走看看