Python: отделение речи от пустых аудиозаписей

Я пытаюсь написать сценарий Python-3.6, который отделял бы пустые аудиозаписи .aif (т.е. содержащие только окружающий шум) от тех, которые содержат речь. Моя цель - не распознавать речевой контент - во-первых, это не английский язык, а во-вторых, он не нужен для моих целей.

Тем не менее, мне не удалось придумать ничего лучше, чем использовать SpeechRecognition с pocketsphinx для решения этой проблемы. Моя идея была довольно примитивной:

        import speech_recognition as sr

        r = sr.Recognizer()
        emptyRecords = []
        for fname in os.listdir(TESTDIR):
            with sr.AudioFile(TESTDIR + fname) as source:
                recorded = r.record(source)
                recognized = r.recognize_sphinx(recorded)
            if len(recognized) <= 10:
                print("{} seems to be an empty record.".format(fname))
                emptyRecords.append(fname)

То есть я попытался преобразовать записанные аудиозаписи в списки строк и разделить эти списки в соответствии с «интуитивным» порогом в 10 слов, поскольку иногда pocketsphinx распознавал фоновый шум как разреженную последовательность из нескольких междометий. Однако это заняло очень много времени из-за ненужного процесса распознавания речи - для каждой записи мне нужно было только проверить, содержит ли она больше 10 слов и не более того. Насколько я понимаю из документов SpeechRecognition, класс Recognizer не содержит никаких атрибутов или методов, которые ограничивали бы количество распознаваемых слов.

Может ли кто-нибудь предложить лучшую идею для этой проблемы?

Заранее спасибо.


person ntonk    schedule 01.09.2018    source источник


Ответы (2)


Попробуйте webrtcvad lib. Установите режим агрессивности и проверьте свои записанные данные.

https://pypi.org/project/webrtcvad/

person g10dras    schedule 02.09.2018
comment
Большое спасибо за ваш ответ, эта библиотека решила мою проблему. - person ntonk; 05.09.2018

Вы можете использовать STFT (кратковременное преобразование Фурье)

Получение полной энергии в сигнале и сравнение ее с энергией, которая находится в человеческом голосовом диапазоне (от 300 Гц до 3000 Гц). (https://en.wikipedia.org/wiki/Short-time_Fourier_transform)

Вот простой stft с использованием numpy и размером 1024 fft, вы можете использовать его https://github.com/JPabloVasquez/SimpleAudioTools

person Pablo Vásquez    schedule 03.09.2018
comment
Спасибо за ответ, я тоже попробую ваше решение, хотя webrtcvad уже решил мою проблему. - person ntonk; 05.09.2018