Kaldi脚本分析(2)——特征提取

来源:互联网 发布:限制网速软件 编辑:程序博客网 时间:2024/06/05 15:33

1特征提取

1.1特征提取概述

  • 输入采样率为16kHz的音频
  • 计算一个音频文件中的总帧数(通常帧长25ms,帧移10ms)
  • 提取数据,可选做dithering(加一点噪声避免出现log0)
  • 预加重(如s’(t)= s(t) -0.97 s(t-1))和去除直流偏移
  • 乘上窗函数,如Hamming窗
  • 离散傅里叶变换FFT,并在每个频点(frequencybin)计算功率谱能量
  • 计算每个梅尔滤波器的能量(23个部分重叠的三角滤波器)
  • 计算对数能量,得到FBANK特征,常用于DNN-HMM的ASR系统
  • 做IDFT变换(得到cepstrum),根据要求保留系数,常选择前12维MFCC系数作为特征向量(去除F0相关信息),再加上能量值,共13维。加上时间动态特性,即一阶、二阶导数,总计39维MFCC特征。因为上一步中计算得到的对数能量为实数且对称,这里离散傅里叶反变换IDFT等价于余弦变换DCT。
  • 选做倒谱系数lifter(仅仅是比例变换,确保系数在合理范围内)

 

1.2特征提取脚本流程

#produce MFCC features

rm -rf data/mfcc && mkdir -pdata/mfcc &&  cp -Rdata/{train,dev,test,test_phone} data/mfcc ||exit 1;

forxin train devtest;do

   #make mfcc

  steps/make_mfcc.sh --nj$n --cmd"$train_cmd" data/mfcc/$x exp/make_mfcc/$x mfcc/$x ||exit 1;

   #compute cmvn

  steps/compute_cmvn_stats.sh data/mfcc/$x exp/mfcc_cmvn/$x mfcc/$x ||exit 1;

done

#copy feats and cmvn to test.ph, avoidduplicated mfcc & cmvn

cp data/mfcc/test/feats.scpdata/mfcc/test_phone && cp data/mfcc/test/cmvn.scp data/mfcc/test_phone||exit 1;

 

1.2.1提取mfcc(steps/make_mfcc.sh)

调用命令行工具compute-mfcc-feats,提取特征,创建feats.ark和feats.scp文件。用法为:compute-mfcc-feats [options...]<wav-rspecifier> <feats-wspecifier>

该工具有两个参数:rspecifier和wspecifier

(关于rspecifier和wspecifier的具体用法参见Kaldi的I/O机制)

  • wav-rspecifier用来读取.wav数据(以发音为索引),只读取wav文件中的pcm数据,如果源文件不是wav格式,则需要用sph2pipe工具转换。

rspecifier用法

含义

ark:foo.ark

Read from archive foo.ark

scp:foo.scp

Read as specified in foo.scp(音频文件列表)

ark:-

Read archive from stdin

ark:gunzip –c foo.gz

Read archive from foo.gz

ark,s,cs:-

Read archive (sorted) from stdin...

  • feats-wspecifier用来写特征(以发音为索引)。典型的用法是,将特征数据写入一个大的“archive”存档文件,同时写一个对应的“scp”文件以便随机存取特征数据。

wspecifier用法

含义

ark:foo.ark

Write to archive “foo.ark”

scp:foo.scp

Write to files using mapping in foo.scp(特征列表)

ark:-

Write archive to stdout

ark,t:|gzip –c>foo.gz

Write text-form archive to foo.gz

ark,t:-

Write text-form archive to stdout

ark,scp:foo.ark,foo.scp

Write archive and scp file

 

该工具有一些常用选项:

  • 梅尔滤波器的个数,16kHz默认23个,8kHz则15个。
  • 最小和最大截止频率
  • 兼容htk
  • 提取特征均值
  • 声道长度归一化VTLN

 

1.2.2提取cmvn(steps/compute_cmvn_stats.sh)

调用命令行工具compute-cmvn-stats,创建cmvn.ark和cmvn.scp文件。

 

1.2.3修复数据错误(utils/fix_data_dir.sh)

该脚本会修复排序错误,并移除那些被指明需要特征数据或标注,但却找不到相应数据的那些发音。

 

注1:feats.scp文件

指向提取好的特征(保存在.ark存档文件)。文件格式为:

< utterance-id > <extended-filename-of-features>

以utterance-id1  /.../mfcc_train.ark:24为例,表示utterance-id1对应的音频段,从存档文件*.ark的24字节开始读取特征数据(通过fseek函数定位)。

 

注2:cmvn.scp文件

指向提取好的倒谱均值和方差归一化的统计量(保存在.ark存档文件)。文件格式为:

< speaker-id > <extended-filename-of-cmvn>

speaker-id1  /.../cmvn_train.ark:7的含义可参考feats.scp进行理解。

与feats.scp不同的是,该文件是以说话人编号为索引,而不是发音编号。

 

注3.ark存档文件

每一个特征文件*.ark保存的都是Kaldi格式的矩阵。特征存档文件中,每个特征是一个向量(如13维),所有特征构成矩阵,矩阵列数为特征维数,行数则和音频文件的长度有关,标准情况下帧长25ms,帧移10ms,所以一行特征数据对应10ms帧移的25ms音频。但是在Kaldi中,实际返回的帧数可能比预想的要小几帧,这和Kaldi处理不足以分帧的剩余数据的方式有关,目前这种方式是兼容HTK的。统计量存档文件中,每个统计量集合都是一个矩阵,如2*14维这种。