Это простая обёртка на Python для WebRTC Voice Activity Detection (VAD). Поддерживается только Python 3.
VAD - это детектор голосовой активности, который позволяет удалять тишину/извлекать фрагменты с речью (или другими звуками) из wav аудиозаписи.
WebRTCVAD_Wrapper упрощает работу с WebRTC VAD: избавляет пользователя от необходимости самому извлекать фреймы/кадры из аудиозаписи и снимает ограничения на параметры обрабатываемой аудиозаписи.
Так же он содержит дополнительный режим работы, который является отдельным, более грубым и строгим алгоритмом VAD, основанным на вычислении мощности звуковой волны (RMS, root-mean-square) и частот пересечения нуля (ZCR, zero-crossing rate). Данный режим будет полезен при подготовке аудиозаписей для обучения нейронной сети, так как он часто игнорирует вообще всё, кроме гласных и звонких согласных звуков в речи (или просто громких звуков). Его можно использовать, например, в нейронной сети, предназначенной для:
- классификации пола человека по его речи (gender classification/recognition)
- классификации эмоций человека по его речи (emotion classification/recognition)
- идентификации человека по его голосу (speaker identification/verification)
- классификации аудиозаписей
- разделении голосов (speaker diarization)
- корректировки результатов сведения текста с аудиозаписью (forced alignment)
Однако его нельзя использовать в распознавании речи, потому что данный режим не гарантирует сохранность всех фонем в речи.
Данная обёртка имеет следующие зависимости: pydub, librosa и py-webrtcvad.
Установка с помощью pip:
pip install git+https://github.com/Desklop/WebRTCVAD_Wrapper
1. Из вашего кода Python (извлечение фрагментов с речью/звуком из test.wav и сохранение их как segment_%i.wav):
from webrtcvad_wrapper import WebRTCVAD
vad = VAD(sensitivity_level=3)
audio = vad.read_wav('test.wav')
filtered_segments = vad.filter(audio)
segments_with_voice = [[filtered_segment[0], filtered_segment[1]] for filtered_segment in filtered_segments if filtered_segment[-1]]
for i, segment in enumerate(segments_with_voice):
vad.write_wav('segment_%002d.wav' % (i + 1), audio[segment[0]*1000:segment[1]*1000])Очистка аудиозаписи от тишины (например, для обучения нейронной сети) (извлечение фрагментов с речью/звуком из test.wav, объединение их в одну аудиозапись и сохранение как test_without_silence.wav):
vad.set_mode(sensitivity_level=4)
audio = vad.read_wav('test.wav')
filtered_segments = vad.filter(audio)
segments_with_voice = [[filtered_segment[0], filtered_segment[1]] for filtered_segment in filtered_segments if filtered_segment[-1]]
audio_without_silence = audio[segments_with_voice[0][0]*1000:segments_with_voice[0][1]*1000]
for segment in segments_with_voice[1:]:
audio_without_silence += audio[segment[0]*1000:segment[1]*1000]
vad.write_wav('test_without_silence.wav', audio_without_silence)Класс VAD содержит следующие методы:
read_wav(): принимает имя .wav аудиозаписи, приводит её в поддерживаемый формат (см. ниже) и возвращает объектpydub.AudioSegmentс аудиозаписьюwrite_wav(): принимает имя .wav аудиозаписи, объектpydub.AudioSegment(или байтовую строку с аудиоданными без заголовков wav) и сохраняет аудиозапись под переданным именемfilter(): принимает объектpydub.AudioSegment(или байтовую строку с аудиоданными без заголовков wav), разбивает аудиозапись на фреймы, фильтрует их по наличию речи/звука (с помощьюwebrtcvad.Vad().is_speech()или дополнительным алгоритмом VAD, в зависимости от заданного уровня чувствительности) и возвращает список из списков с границами сегментов:[[0.00, 1.23, True/False], ...](где0.00- начало сегмента (в секундах),1.23- конец сегмента,True/False-True: речь/звук,False: тишина)set_mode(): принимает целое число от0до4, которое задаёт уровень чувствительности VAD (значение от0до3- уровень чувствительности WebRTC VAD, значение4- отключение WebRTC VAD и использование дополнительного грубого алгоритма VAD)
Подробная информация о поддерживаемых аргументах и работе каждого метода находится в комментариях в исходном коде этих методов.
Особенности:
- WebRTC VAD принимает только PCM 16 бит, моно, по этому метод
read_wav()автоматически приводит вашу wav аудиозапись в необходимый формат - WebRTC VAD работает только с фреймами/кадрами длиной 10, 20 или 30 миллисекунд и частотой дискретизации 8, 16, 32 или 48кГц, об этом заботится метод
filter() - метод
set_mode()позволяет задать уровень чувствительности (его так же можно задать при создании объектаVAD(0)), поддерживаются значения от0до4, где4- максимальная чувствительность (по умолчанию используется значение3). Значения от0до3являются базовыми для WebRTC VAD, значение4включает использование отдельного, более грубого и строгого алгоритма VAD, основанного на вычислении мощности звуковой волны и частот пересечения нуля
2. В качестве инструмента командной строки:
python3 -m webrtcvad_wrapper.cli --mode=3 input.wav output.wavили
webrtcvad_wrapper --mode=3 input.wav output.wavГде:
--mode=3- уровень чувствительности, целое число от0до4(если не передавать аргумент - использовать значение3)input.wav- имя исходной .wav аудиозаписиoutput.wavилиoutput- шаблонное имя для .wav аудиозаписей, в которые будут сохранены найденные фрагменты с речью/звуком в форматеoutput_%i.wav
В данном варианте используются следующие параметры:
- длина фрейма
10миллисекунд - фрагмент считается фрагментом с речью/звуком, если он содержит более
90%фреймов, в которых WebRTC VAD (или дополнительный алгоритм VAD) нашёл речь/звук
Если у вас возникнут вопросы или вы хотите сотрудничать, можете написать мне на почту: vladsklim@gmail.com или в LinkedIn.