我的系统是Fedora 16. 由于音频驱动的不同,不可能依葫芦画瓢,照着教程一步步来.
网上也没有很详细的过程,希望后来者省却这些麻烦,以下详细介绍整个过程:
第一步:录制训练音频并标记
教程里使用的是HTK里的HSLab,但是似乎HSLab支持的是OSS驱动,而我的电脑使用的是Alsa(?),试了一些方法,无论如何也没有办法让HSLab工作,其间按照一些Posts误删一些重要的包因此重装系统,痛不欲生(夸张了).当按下Rec键时,出现以下错误:
ERROR [+6006] InitAudi: Cannot open OSS audio device /dev/dsp
FATAL ERROR - Terminating program HSLab
我的方法是使用开源软件Audacity来录制音频.然后保存为yes01.wav yes02.wav... no01.wav no02.wav... yes no 各十个
然后是制作音频的Label,即标出该音频那一段是sil(lence),那一段是yes(no).
可以手动做,但是蛮吃力的,我使用audacity自带的标记功能:
选择一段音频,然后按ctrl-b,然后输入标签名,如(sil,no,yes) ,然后在File里有一个Export Label选项,保存为txt格式.打开之后:
0.000000 0.470889 sil
0.470889 0.800729 no
0.800729 2.634376 sil
而htk要求的label时间是以100ns为单位的,我写了个python转换程序(初学python,献丑了):
import math
import sys
from cStringIO import StringIO
def txt2lab(filename):
f_in = open(filename,'r')
f_out = open(filename[:-3] + 'lab', 'w')
text_f_in = StringIO(f_in.read())
for line in text_f_in:
data = line.split('\t')
start = int(math.floor(float(data[0])*10000000))
end = int(math.floor(float(data[1])*10000000))
f_out.write(str(start) + '\t' + str(end) + '\t' + data[2])
if __name__ == '__main__':
filename = sys.argv[1]
txt2lab(filename)
然后批量转换之前手动生成的label(.txt)文件:
for file in *.txt; do python txt2lab.py $file; done
文件结构参照原pdf,即所有的wav存放在data/train/sig下,所有的lab存放在data/train/lab下