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

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

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

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

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

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

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


person stef    schedule 31.03.2011    source источник
comment
7 лет спустя у меня тот же вопрос, и я пытаюсь решить ту же проблему. @стеф. не могли бы вы поделиться, как выполнить эту задачу.   -  person DJ_Stuffy_K    schedule 31.01.2018
comment
О боже, простите, мы собрали кучу денег и бросили на это людей! ????   -  person stef    schedule 01.02.2018
comment
Ха-ха! рад узнать, что у вас были необходимые ресурсы, чтобы довести его до конца! :)   -  person DJ_Stuffy_K    schedule 01.02.2018


Ответы (4)


Детектор энергии

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

Он работает с файлами функций, а не с аудиофайлами, поэтому вам нужно будет извлечь энергию сигнала. Обычно я извлекаю кепстральные признаки (MFCC) с параметром логарифмической энергии и использую этот параметр для 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 содержит встроенный VAD. Он написан на C, и вы можете взломать его, чтобы получить файл этикетки для себя.

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

Другие VAD

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

person Andrea Spadaccini    schedule 31.03.2011
comment
Замечательный, подробный ответ. Спасибо! - person stef; 31.03.2011
comment
@stef добро пожаловать. Я надеюсь, что вы нашли его полезным и успешно справились со своей сложной задачей! - person Andrea Spadaccini; 03.04.2011
comment
Привет, я попробовал твои инструкции, но у меня возникла проблема. Я использовал файл, в котором сообщалось, что это данные RIFF (с прямым порядком байтов), звук WAVE, Microsoft PCM, 16 бит, стерео, 16000 Гц. Обнаружение тишины на основе исходящей энергии для [../output] (SegTools). Формат метки — LIARAL [ InvalidDataException 0x10f19b0 ] сообщение = неправильный заголовок - person stackoverflow128; 21.02.2014

webrtcvad – это Python-оболочка для превосходного 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)
person John Wiseman    schedule 24.04.2016

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

person Theodore Giannakopoulos    schedule 17.04.2015
comment
Это довольно аккуратная библиотека! Не могли бы вы также опубликовать пример фрагмента кода, чтобы немного заполнить этот ответ? - person SJoshi; 18.04.2015
comment
Как сказал @SJoshi, было бы здорово, если бы вы добавили код, показывающий, как вы будете использовать pyAudioAnalysis. Это действительно поможет тем, кто увидит ваш ответ, использовать его. - person Wai Ha Lee; 18.04.2015
comment
что, если в аудио нет тишины, а только речь и музыка. анализ pyaudio справляется с этим условием? Также было бы неплохо, если бы вы добавили код, сэр. - person kRazzy R; 18.12.2017
comment
да, это возможно, если вы обучите классификатор сегментов, а затем примените сегментацию фиксированного размера - person Theodore Giannakopoulos; 11.12.2019

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

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

person Ashutosh Sharma    schedule 21.07.2014
comment
Как бы я ни писал для Теодора, наличие примера в вашем ответе значительно улучшит его. Таким образом, мы не полностью полагаемся на ссылку. - person SJoshi; 18.04.2015
comment
Г-н Ашутош, пожалуйста, добавьте полный ответ в соответствии с рекомендациями stackoverflow. - person kRazzy R; 18.12.2017