使用 LIUM 进行语音 Activity 检测 (VAD/SAR)

Voice Activity Detection (VAD/SAR) with LIUM

我写了一个 shell 脚本来训练几个 GMM 用于某些类型的语音 activity 和静音。因此,我使用了 LIUM speaker diarization toolkit。我想用它来做语音 activity 检测。以下脚本使用 Sphinx4 从 wav 音频文件中提取 MFCC 特征,在这些特征上训练 GMM 并应用 Viterbi 解码进行分割。然而,结果很差,即分割结果是完全错误的。这绝对不应该是这种情况,因为我在训练集本身上应用了 GMM。我究竟做错了什么?我为此付出了很多努力,但仍然无法正常工作。非常感谢您提前提供的帮助!

顺便说一句:我仔细检查了我的 wav 文件的输入格式,根据 Sphinx4 文档,它是单声道 16 位 LE。此外,我尝试了许多不同的参数设置,尤其是 emCtrl(GMM 的训练)和 dPenalty(用于分割的维特比解码)等参数。对我没有任何帮助。

这是我的 shell 脚本:

# !/bin/bash

wav=
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

在 fDescIn 和 fDescOut 的末尾添加“:1”有效。这指定了规范化方法,即在这种情况下是集群方式。 “:0” 用于分段也有效并取得了可比的结果。

LIUM官网的代码示例在这方面是错误的。