2015-12-15 20 views
1

我編寫了一個shell腳本來訓練幾種GMM,用於某些種類的語音活動和靜音。因此我使用了LIUM揚聲器diarization工具包。我想用它來進行語音活動檢測。以下腳本通過使用Sphinx4從wav音頻文件中提取MFCC功能,在這些腳本上訓練GMM並應用維特比解碼進行分割。然而,結果非常差,即由此產生的分割是完全錯誤的。這肯定不是這種情況,因爲我將GMM應用於訓練集本身。我究竟做錯了什麼?我已經付出了很多努力,但仍然無法實現。提前感謝您的幫助!使用LIUM的語音活動檢測(VAD/SAR)

BTW:根據Sphinx4文檔,我重新檢查了我的wav文件的輸入格式,它是單聲道16bit LE。此外,我嘗試了許多不同的參數設置,尤其是參數如emCtrl(GMM的訓練)和dPenalty(用於分割的維特比解碼)。沒有什麼幫助我。

這裏是我的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 

回答

2

添加 「:1」 fDescIn和fDescOut結束工作。這指定了歸一化方法,即在這種情況下以簇爲單位。 「:0」的分段明智也可以達到可比的結果。

LIUM官方網站的代碼示例在這方面是錯誤的。