我写了一个shell脚本来训练几个GMMs,用于一些声音活动和沉默。因此,我使用了LIUM扬声器的二次化工具包。我想用这个来做语音活动检测。下面的脚本通过使用Sphinx4从wav音频文件中提取MFCC特性,对这些文件进行GMM训练,并应用维特比解码进行分段。但是,结果很差,即分割结果是完全错误的。这绝对不应该是这样的,因为我正在将GMMs应用于培训集本身。我做错了什么?我在这方面付出了很大的努力,但仍然无法使它发挥作用。非常感谢您的帮助,提前!
顺便说一句:我双倍地检查了我的wav文件的输入格式,根据Sphinx4文档,它是单16位的。此外,我还尝试了许多不同的参数设置,特别是emCtrl (训练GMM)和dPenalty (Viterbi解码进行分段)等参数。对我没什么帮助。
下面是我的shell脚本:
# !/bin/bash
wav=$1
base=`basename $wav .wav`
show=$base
fDescIn="audio16kHz2sphinx,1:1:0:0:0:0,13,0:0:0"
fDescOut="sphinx,1:1:0:0:0:0,13,0:0:0"
features="./%s.mfcc"
seg="./%s.seg"
gmmInit="./%s.init.gmms" # output GMM, %s is replaced by $show
gmm="./%s.gmms"
# Extract MFCC features
java -Xmx2048m -classpath lium.jar \
fr.lium.spkDiarization.tools.Wave2FeatureSet \
--fInputMask=$wav --sInputMask="" --fInputDesc=$fDescIn \
--fOutputMask=$base.mfcc --fOutputDesc=fDescOut $show
# Initialize the GMM
java -Xmx1024m -cp lium.jar \
fr.lium.spkDiarization.programs.MTrainInit \
--sInputMask=$show".seg" --fInputMask=$base.mfcc
--fInputDesc=$fDescOut --kind=DIAG --nbComp=16 \
--emInitMethod=split_all --emCtrl=1,5,0.05 --tOutputMask=$gmmInit $show
# Train GMMs via EM
java -Xmx1024m -cp lium.jar \
fr.lium.spkDiarization.programs.MTrainEM \
--sInputMask=$show".seg" --fInputMask=$base.mfcc --emCtrl=10,20,0.01 \
--fInputDesc=$fDescOut --tInputMask=$gmmInit --tOutputMask=$gmm $show
# Segmentation
iseg=./$datadir/$show.i.seg
pmsseg=./$datadir/$show.pms.seg
java -Xmx2048m -cp lium.jar \
fr.lium.spkDiarization.programs.MDecode \
--fInputDesc=$fDescOut --fInputMask=$base.mfcc --sInputMask=$show.out2.seg \
--sOutputMask=$show.result.seg --dPenality=1,1,1,1 --tInputMask=$gmm $show发布于 2015-12-16 09:32:09
在fDescIn和fDescOut的末尾添加":1“是有效的。这指定了规范化方法,在本例中为集群方式。":0“的分段-明智也工作,并取得了类似的结果。
LIUM官方网站的代码示例在这方面是错误的。
https://stackoverflow.com/questions/34285324
复制相似问题