Каков хороший подход для извлечения частей речи из произвольного аудиофайла? - PullRequest
16 голосов
/ 31 марта 2011

У меня есть набор аудиофайлов, загруженных пользователями, и никто не знает, что они содержат.

Я хотел бы взять произвольный аудиофайл и извлечь каждый из случаев, когда кто-то находитсявыступая в отдельных аудиофайлах.Я не хочу определять фактические слова, просто точки «начал говорить», «перестал говорить» и генерировать новые файлы в этих точках.

(я нацеливаюсь на среду Linux и разрабатываю наMac)

Я нашел Sox , который выглядит многообещающе и имеет режим 'vad' (распознавание голосовой активности).Однако, похоже, это находит первый экземпляр речи и обрезает звук до этой точки, так что это близко, но не совсем верно.

Я также посмотрел библиотеку Python 'wave', но потом мне нужнонаписать собственную реализацию Sox 'vad'.

Существуют ли инструменты командной строки, которые будут делать то, что я хочу с полки?Если нет, то подойдет какой-нибудь хороший Python или Ruby?

Ответы [ 4 ]

22 голосов
/ 31 марта 2011

EnergyDetector

Для распознавания голосовой активности я использовал программу EnergyDetector из набора инструментов распознавания динамиков MISTRAL (was LIA_RAL), основанного на библиотеке ALIZE.

Он работает с файлами функций, а не с аудиофайлами, поэтому вам необходимо извлечь энергию сигнала. Я обычно извлекаю кепстральные функции (MFCC) с параметром log-energy, и я использую этот параметр для VAD. Вы можете использовать sfbcep`, служебную часть SPro набора инструментов для обработки сигналов, следующим образом:

sfbcep -F PCM16 -p 19 -e -D -A input.wav output.prm

Извлечет 19 MFCC + логарифмический коэффициент + дельта-коэффициенты первого и второго порядка. Коэффициент энергии является 19-м, это будет указано в файле конфигурации EnergyDetector.

Затем вы запустите EnergyDetector следующим образом:

EnergyDetector --config cfg/EnergyDetector.cfg --inputFeatureFilename output 

Если вы используете файл конфигурации, который вы найдете в конце ответа, вам нужно ввести output.prm в prm/, и вы найдете сегментацию в lbl/.

В качестве справки я прилагаю свой файл конфигурации EnergyDetector:

*** EnergyDetector Config File
***

loadFeatureFileExtension        .prm
minLLK                          -200
maxLLK                          1000
bigEndian                       false
loadFeatureFileFormat           SPRO4
saveFeatureFileFormat           SPRO4
saveFeatureFileSPro3DataKind    FBCEPSTRA
featureServerBufferSize         ALL_FEATURES
featureServerMemAlloc           50000000
featureFilesPath                prm/
mixtureFilesPath                gmm/
lstPath                         lst/
labelOutputFrames               speech
labelSelectedFrames             all
addDefaultLabel                 true
defaultLabel                    all
saveLabelFileExtension          .lbl
labelFilesPath                  lbl/    
frameLength                     0.01
segmentalMode                   file
nbTrainIt                       8       
varianceFlooring                0.0001
varianceCeiling                 1.5     
alpha                           0.25
mixtureDistribCount             3
featureServerMask               19      
vectSize                        1
baggedFrameProbabilityInit      0.1
thresholdMode                   weight

CMU Sphinx

Программное обеспечение для распознавания речи CMU Sphinx содержит встроенный VAD. Он написан на C, и вы можете взломать его, чтобы создать для вас файл метки.

Самым недавним дополнением является поддержка GStreamer. Это означает, что вы можете использовать его VAD в медиа-конвейере GStreamer. См. Использование PocketSphinx с GStreamer и Python -> Элемент 'vader'

Другие VAD

Я также использовал модифицированную версию кодека AMR1, которая выводит файл с речевой / неречевой классификацией, но я не могу найти его источники в Интернете, извините.

3 голосов
/ 24 апреля 2016

webrtcvad - это оболочка Python для превосходного кода Google WebRTC Voice Activity Detection.

Поставляется с файлом, example.py , это именно то, что вы ищете: учитывая файл .wav, он находит каждый экземпляр говорящего и записывает его в новый отдельный файл .wav.

API webrtcvad чрезвычайно прост,в случае, если example.py не делает то, что вы хотите:

import webrtcvad

vad = webrtcvad.Vad()
# sample must be 16-bit PCM audio data, either 8KHz, 16KHz or 32Khz,
# and 10, 20, or 30 milliseconds long.
print vad.is_voiced(sample)
2 голосов
/ 18 апреля 2015

Hi pyAudioAnalysis имеет функцию удаления молчания.

В этой библиотеке удаление молчания может быть простым:

from pyAudioAnalysis import audioBasicIO as aIO from pyAudioAnalysis import audioSegmentation as aS [Fs, x] = aIO.readAudioFile("data/recording1.wav") segments = aS.silenceRemoval(x, Fs, 0.020, 0.020, smoothWindow = 1.0, Weight = 0.3, plot = True)

Внутреннее молчание removal() следует подходу под наблюдением: сначала модель SVM обучается различать кратковременные кадры с высоким и низким энергопотреблением.С этой целью используются 10% кадров с самой высокой энергией, а также 10% самых низких.Затем SVM применяется (с вероятностным выводом) ко всей записи, а динамическое определение порога используется для обнаружения активных сегментов.

0 голосов
/ 21 июля 2014

SPro и HTK - это необходимые вам инструменты. Вы также можете увидеть там реализацию, используя документацию Alize Toolkit.

http://alize.univ -avignon.fr / doc.html

...