Обнаружение голосовой активности (VAD/SAR) с помощью LIUM

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

Кстати, я дважды проверил формат ввода моего файла 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

1 ответ

Решение

Добавление ":1" в конец fDescIn и fDescOut сработало. Это определяет метод нормализации, то есть кластерный в этом случае. ":0" для сегментов также работает и достигает сопоставимых результатов.

Примеры кода с официального сайта LIUM неверны в этом отношении.

Другие вопросы по тегам