Каков хороший подход для извлечения частей речи из произвольного аудиофайла?

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

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

(Я ориентируюсь на среду Linux и разрабатываю на Mac)

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

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

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

Ответы

Ответ 1

EnergyDetector

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

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

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

Он выберет 19 MFCC + log-energy коэффициент + дельта-коэффициенты первого и второго порядка. Коэффициент энергии - 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, который выводит файл с речевой/нечетной классификацией, но я не могу найти его источники в Интернете, извините.

Ответ 2

Привет 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 применяется (с вероятностным выходом) на всей записи, а динамическое пороговое значение используется для обнаружения активных сегментов.

Ответ 3

webrtcvad - это оболочка Python вокруг Google отлично WebRTC Код обнаружения голосовой активности.

Он поставляется с файлом 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)

Ответ 4

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

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