2015-12-15 5 views
1

Я написал сценарий оболочки для обучения нескольких GMM для некоторых видов активности голоса и тишины. Поэтому я использовал инструментарий для диаректирования динамиков LIUM. Я хочу использовать это для обнаружения голосовой активности. Следующий скрипт извлекает функции MFCC из аудиофайла wav с помощью Sphinx4, обучает GMM и применяет декодирование Viterbi для сегментации. Однако результаты очень плохие, т. Е. Результирующая сегментация полностью неверна. Это определенно не так, поскольку я применяю GMM к самому набору тренировок. Что я делаю не так? Я приложил много усилий в этом и до сих пор не могу заставить его работать. Большое вам спасибо за любую помощь заранее!Обнаружение голосовой активности (VAD/SAR) с LIUM

BTW: Я дважды проверил формат ввода моего wav-файла, который является моно-16-битным LE в соответствии с документацией Sphinx4. Кроме того, я пробовал много разных параметров, особенно таких параметров, как emCtrl (обучение GMM) и dPenalty (декодирование Витерби для сегментации). Ничто не помогло мне.

Вот мой сценарий оболочки:

# !/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 ошибочны в этом отношении.