当前位置:   article > 正文

python scp 脚本_深入比较kaldi和python_speech_features提取的fbank特征之间的区别

python kaldi实现原理

b4b95ab12a2b39a0ab0a2642d3ff85f8.png

开始学习语音识别的时候,第一步工作就是把语音转为特征,有mfcc和fbank,fbank包含的信息量多,所以开始就用了fbank。有很多工具可以帮忙提取fbank特征,我常用的是kaldi和python_speech_features这两种方式。

但是这两种提取fbank的特征却差异很大,怀着对两者的敬畏之心,开启了探索比较的学习之路。由于python_speech_features的结构简单,所以从这里看起。可以简洁明朗的看到,python_speech_features的fbank特征提取分以下几个步骤:

1.预加重(pre-emphasis):y(n)=x(n)-ax(n-1), a = 0.97

2.分帧,对每帧计算功率谱(DFT,power-spectrum)

3.计算梅尔滤波器组(mel-filterbanks),计算功率谱和滤波器组的内积,并将内积转为db,即为特征

在python_speech_features的fbank特征提取方法熟悉了之后,开始查看kaldi的方法。

kaldi的复杂很多,首先看shell脚本(路径在:kaldi/egs/wsj/s5/steps/make_fbank_pitch.sh),其中136行有一句:

fbank_feats="ark:compute-fbank-feats $vtln_opts --verbose=2 --config=$fbank_config scp,p:$logdir/wav.JOB.scp

compute-fbank-feats是计算特征的函数,其中配置文件--config在kaldi/egs/aishell/s5/conf/fbank.conf, scp=$data/wav.scp,scp是语音文件地址

我的配置如下:

77579a56b103eaf3f649799dfbe77596.png

为了能单独运行compute-fbank-feats 这个bin文件,进入到kaldi/src/featbin这个目录下,可以看到可运行的bin文件:compute-fbank-feats,运行命令如下:

./compute-fbank-feats --verbose=2 --config="/disk1/code/kaldi/egs/aishell/s5/conf/fbank.conf" scp:/disk1/code/kaldi/egs/aishell/s5/data/wav.scp ark:/disk1/code/kaldi/egs/aishell/s5/data/a3.ark

wav.scp 只放了一个音频,a2.ark是生成的二进制特征,使用copy-feats可以将二进制特征转为txt文件:

./copy-feats ark:/disk1/code/kaldi/egs/aishell/s5/data/a3.ark ark,t:/disk1/code/kaldi/egs/aishell/s5/data/txt.ark

上述是生成特征的过程,会发现kaldi的特征和python_speech_features的特征差异很大,下面正式开始kaldi的特征生成过程深入挖掘。

这期间需要使用到gdb,c的调试工具,以前玩过c的人肯定很熟悉,这里有几个常用命令需要在这里复习一下:

b(break):设置断点

c(continue):继续

n(next):下一步(不进入函数)

r(run):运行

print:打印变量

s(step) :下一步(进入函数)

bt(backtrace): 查看堆栈

finish :退出函数

list : 查看当前运行到的位置

以上的信息基本够用了,如果还想看更多详细命令,可以去官网查看

大概说一下gdb调试的过程:

首先 :

gdb compute-fbank-feats

然后 :

set args --verbose=2 --config="/disk1/code/kaldi/egs/aishell/s5/conf/fbank.conf" scp:/disk1/code/kaldi/egs/aishell/s5/data/wav.scp ark:/disk1/code/kaldi/egs/aishell/s5/data/a3.ark

a857606efbad92b26b772a2e76390fb8.png

当然,为了能够看kaldi自定义的变量内容,需要对变量权限修改一下,将protected改为public

f6178735357266494d8daf12fc3816b2.png

修改完成后,需要重新编译一下compute-fbank-feats ,进入/disk1/code/kaldi/src/featbin,该目录下自带Makefile,直接make就okay了~

make完成之后,重新gdb启动,然后就可以看data_这个内部变量啦!

c81b35b20f1ce3fb71e4d03314bba3a9.png

好了,下面开始进入主题,讲不同!

————————————————————————————————————————————————————————————————————————————————————

kaldi 和 python_speech_features 生成fbank特征的不同地方在于以下几点:

  1. 预加重不同:
    * kaldi是先加窗分帧,再对帧内进行预加重;python_speech_features是全体先预加重,然后再分帧
    * 再看预加重,会发现,对于音频数据(譬如10,17,13,15, ...)第一个数据10,python_speech_features是不变(预加重系数0.97,预加重后是 10,7.3,-3.489,2.39,...),kaldi是第一个数据也做预加重(预加重后是 0.3,7.3,-3.489,2.39,...)

4f3e3f93c875688dfff2d365d0bd0130.png

036dae0d1127e10347699b9fc9612dde.png

2. 分帧数不同,功率谱计算不同
python_speech_features 对最后还剩余的数据,不足帧长的,按照一帧计算补齐;
kaldi 如果选择不切断最后剩余数据(snip-edged = False),会发现多了一帧(个人认为这里kaldi错了,python_speech_features正确);如果snip-edged = True,两者一致

功率谱计算不同:

python_speech_features 计算功率谱是:1.0/NFFT * numpy.square(magspec(frames,NFFT))
kaldi 没有乘1.0/NFFT

b4a3065d0b681653c02fd688958a7911.png

b50e7a2b8e504000fcf8593b6650f9d4.png

abefb723ea0badae3aad3516de311275.png

80f35568b75df627de9a0016524579a1.png

3. 梅尔滤波器组计算方法不同
kaldi是在梅尔坐标转换后的梅尔值域计算,index是hz的定义域,通过梅尔转换后比较(个人认为计算量偏大,每次计算都要经过一次转换);
而python_speech_features是先将linspace后的梅尔值统一转成了hz,再进行计算,index也是hz的定义域,计算量小

其实上述两种的本质是一样的,计算方法不同会导致系数存在差异

da72ad2edd0927ffe46fcdfcc39e3d8e.png

d0360f0331588446398eb4c5de4af116.png

b04a187a58c37c8510923b9d6afab65c.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/160008?site
推荐阅读
相关标签
  

闽ICP备14008679号