Это простая обёртка на 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.