我编写了一个shell脚本来训练几种GMM,用于某些语音活动和静音。因此,我使用了LIUM扬声器diarization工具包。我想用它来进行语音活动检测。以下脚本通过使用Sphinx4从wav音频文件中提取MFCC功能,在这些上训练GMM并应用Viterbi解码进行分段。但是,结果非常差,即产生的分割完全错误。绝对不应该这样,因为我在训练集本身上应用GMM。我究竟做错了什么?我已经付出了很多努力,仍然无法让它发挥作用。非常感谢您提前获得任何帮助!
BTW:我仔细检查了我的wav文件的输入格式,根据Sphinx4文档,它是单声道16位LE。此外,我尝试了许多不同的参数设置,尤其是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
答案 0 :(得分:2)
在fDescIn和fDescOut的末尾添加“:1”。这指定了归一化方法,即在这种情况下是群集方式。分段方式的“:0”也起作用并取得了可比较的结果。
LIUM官方网站的代码示例在这方面是错误的。