Каков хороший подход для извлечения частей речи из произвольного аудиофайла?
У меня есть набор аудиофайлов, загруженных пользователями, и я не знаю, что они содержат.
Я хотел бы взять произвольный аудиофайл и извлечь каждый из случаев, когда кто-то говорит в отдельные аудиофайлы. Я не хочу определять фактические слова, просто точки "начал говорить", "перестал говорить" и генерировать новые файлы в этих точках.
(Я ориентируюсь на среду Linux и разрабатываю на Mac)
Я нашел Sox, который выглядит многообещающе, и у него есть режим 'vad' (Voice Activity Detection). Однако, похоже, это находит первый экземпляр речи и обрезает звук до этой точки, так что это близко, но не совсем верно.
Я также посмотрел на библиотеку Python'wave', но затем мне нужно написать собственную реализацию Sox'vad'.
Есть ли инструменты командной строки, которые будут делать то, что я хочу с полки? Если нет, то подойдет какой-нибудь хороший Python или Ruby?
4 ответа
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 + логарифмический коэффициент энергии + дельта-коэффициенты первого и второго порядка. Коэффициент энергии - 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, которая выводит файл с классификацией речи / не речи, но я не могу найти его источники в Интернете, извините.
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)
Привет 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 применяется (с вероятностным выходом) ко всей записи, а динамическое определение порога используется для обнаружения активных сегментов.
SPro и HTK - это необходимые вам инструменты. Вы также можете увидеть там реализацию, используя документацию Alize Toolkit.