Search
Write a publication
Pull to refresh

Comments 33

Спасибо за статью и инструмент.
Планируете выложить код для тренировки на собственных данных?

Хотя формально сам код является отделимым и лаконичным, часть пайплайнов для данных не очень отделимы от приватных вещей, поэтому скорее нет чем да (опыт open-stt "научил" нас общению с коммьюнити)


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


Но как и в случае с silero-models мы собираем запросы на фичи и будем понемногу их добавлять, например больше устойчивости к мелким чанкам или детектор музыки


Ну и никто не мешает естественно использовать готовую модель как экстрактор фич для своей модели

Я попробовал вот этим скриптом обработать вот этот файл и получил вот этот результат:

[{'end': 35000, 'start': 0},
 {'end': 112000, 'start': 35000},
 {'end': 124000, 'start': 112000},
 {'end': 288000, 'start': 143000},
 {'end': 320000, 'start': 287000},
 {'end': 628000, 'start': 319000},
 {'end': 752000, 'start': 632000},
 {'end': 801000, 'start': 775000},
 {'end': 960000, 'start': 811000}]


В каких единицах измерения эти числа?

"а в детекцию тишины (тишина — это отсутствие и голоса и шума), " - из опыта работы в телефонии и кол-центрах мне кажется такое понимание неправильно на практике, хотя может теоретически и правильно. Дело втом что разные модели телефонов и блютуф гарнитур имеют системы автоматической регулировки уровня сигнала и системы подавления шумов - все это работает по разному и таких моделей сотни если не тысячи, из-за этого уровень фонового шума приходит в кол центр очень сильно разный, в 10 раз и более, (в тихом доме и в шуме у дороги или в метро и т.д.) и пороговый метод работает очень слабо. Точнее как бы тишина это отсутсвие голоса или многократно более слабый сигнал по сравнению с голосом но пока голоса не было порог не выставить, ну и в метро или у дороги с интенсивным движением шум или как бы тишина из-за АРУ может быть и громче голоса.

Мы сталкивались с этой проблемой, новый VAD ее частично решает. Более полно решает уже с неким набором эвристик уже в самих дистрибутивах.

на практике в крупном кол-центре где я работал как раз это отличить шум от голоса была главной нерешенной проблемой (а не нет сигнала - от есть сигнал), подход с эвристиками использовался в Инфинити в результате их число быстро разрослось до нескольких тысяч и постоянно пополнялось ввиду быстрого изменения условий и даже сверх супер мега мощный сервер за 20 млн. руб. перестал справляться. У меня сложилось впечатление что подход с эвристикми в корне неправильный и продать вашу систему в кол цент где уже обожглись на эвристиках будет невозможно. Нужен какой-то кардинально другой подход! И кстати гонка за скоростью на практиуке не нужна, в пределах 1 сек это очень даже Ок если 99.99% правильных срабатываний и вероятность пропуска близка к нулю.

День добрый! Если я получаю данные с микрофона в виде последовательности целых чисел (pvrecorder), как их лучше обрабатывать перед подачей в Silero VAD?

Там в репозитории есть примеры

Но вообще нормализовать к -1 ... 1

А дальше преобразовать в тензор или оставить список?
Со списком работают get_speech_timestamps и vad_iterator.
Команда collect_chunks(speech_timestamps, sound_scaled) выдает ошибку "TypeError: expected Tensor as element 0 in argument 0, but got list"
model(chunk, SAMPLING_RATE) выдает ошибку "forward() Expected a value of type 'Tensor' for argument 'x' but instead found type 'list'."

Преобразовал в тензор. Вроде работает. Спасибо!

Попробовал использовать Silero VAD в своём приложении, где требуется в реальном масштабе времени реагировать на голосовую активность. Всё хорошо работает, однако Silero VAD реагирует также на звуки фортепиано и гитары, чего по идее быть не должно. Решил попробовать другой - Ten-VAD, ситуация аналогичная - реагирует на звуки музыкальных инструментов струнной группы. Не ужели ни кто не создал VAD, реагирующий только на человеческий голос, и не допускающий ложных срабатываний от других звуков?

Только реагировать или нужно дальше расшифровывать речь? Если расшифровывать, то можно попробовать Whisper. Или Faster Whisper - в него встроен VAD. Вместе, возможно, будет работать лучше.

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

Просто приведу примеры:

  • Речь попугая - это другие звуки?

  • Рэп?

  • Речь на заднем фоне, которую невозможно понять?

  • Пение?

И ещё десяток таких примеров.

Речь попугая так скажем похожа на человеческую, порой и люди то отличить не смогут. Рэп когда просто читается, так это также речь. Если на заднем фоне, то это тоже по сути то же речь, если её нормализовать с помощью компрессора. А вот пение, особенно гласными, уже будет иметь периодический вид волновой формы, поэтому "технически" на речь уже не тянет (некоторые синтезаторные патчи могут иметь аналогичные спектрограмы). Хотя смотря для каких целей, если оценивать "музыкальность" то да. Но а если как определение голоса в целом то все приведённые случаи можно определить как речь.

Дополнительно можно привести пример "голос, пропущенный через вокодер или гармонайзер" ).

Можно еще на Hugging Face покопать. Возможно, именно для этой задачи подойдет что-то другое.

Ten-VAD

Мы снимали метрики и скорость этого VAD-а, и не были особо впечатлены. На ручных тестах триггерится просто на громкие звуки.

Сравнение по качеству на ~20 валидационных датасетах
Сравнение по качеству на ~20 валидационных датасетах

По скорости, он действительно быстрее, примерно на 20% и там на один уровень абстракции меньше. В теории это прикольно для компиляции на разные платформы, но тут с 99% вероятностью, это не будет поддерживаться как тот же onnx-runtime.

По качеству и валидации, мы, конечно, вскекнули. Там приведены в основном примеры супер-чистых датасетов и посчитаны метрики на … 30 аудио файлах.

Ну то есть на реальной датке оно очень странно работает, фейлится на очевидных стресс-тестах. Хорошо работает на идеально чистых аудио. Но … WebRTC тоже там работает (он быстрее в 3-4 раза). Будто бы челы просто дистиллировали на супер-чистых доменах какой-то публичный VAD, и такие оп, вот метрики на 30 файлах.

реагирует на звуки музыкальных инструментов струнной группы

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

Не ужели ни кто не создал VAD, реагирующий только на человеческий голос, и не допускающий ложных срабатываний от других звуков?

Если отвечать не на вопрос в духе сделайте кнопку "всё классно", а, например, почему никто не заморачивается со струнными инструментами - ответ очевиден. Никто не готов финансировать такую нишевую разработку, такие данные это яркий краевой случай, такой же как например высокая и быстрая речь персонажей мультиков.

По крайней мере при обучении модели можно же задействовать семплы рояля и гитары и указать что это не речь?

Если принципиально решать задачу разделения музыки на партии, это сделать можно, имея исходники до сведения треков.

Но тут есть ряд проблем:

  • Реальная музыка, на которой будет применяться VAD, сильно отличается от идеальных отдельных инструментов в вакууме, банки которых можно найти для аугов

  • У нас, в отличие от "стартапов" с US$100m инвестиций нет доступа ко всей голливудской базе музыки, разделенной на треки (это всего где-то 100M файлов кстати)

  • Уже есть сносно работающие делилки на треки (они не свободные / бесплатные / публичные (на выбор), но мир такой уже давно, а "свободные" так себе работают)

  • Очередь из компаний, кто готов профинансировать появление такой фичи, почему-то не выстраивается

По скорости, он действительно быстрее

В данном случае не важна скорость. Тут главное определить содержит ли буфер с аудиоданными речь, то есть функция должна возвратить true, всё остальное должно возвращать false.

Только не на буфер, а на буфер, и всё, что было до него. В самом буфере, как правило, недостаточно информации для такого решения.

Отсюда, кстати, и проблема. Чтобы решить такую задачу, надо массово фармить музыку (скачать все те миллионы треков), выделить там timestamp-ы пения (тексты допустим можно спарсить), выделить инструменты, выделить нужные категории инструментов.

Звучит как приключение на 20 минут. Тем временем разработчики систем разбивки аудио-трека на партии как правило начинают с "нам дали тут всю базу музыки из стриминга, вот сделайте разбивалку".

В моём случае это приложение реального масштаба времени, предназначенное для студийной работы, и timestamp-ы в этом случае не требуются. Аудиоданные с аудиовхода постоянно считываются драйвером ASIO в буфер, размер которого можно задать в панели управления ASIO. Внутри программы ещё один буфер - накопительный, размером 512 семплов (как раз такой как в примере https://github.com/snakers4/silero-vad/blob/master/examples/cpp/silero-vad-onnx.cpp).

Всё прекрасно работает. Речь прекрасно определяется и даже многие музыкальные инструменты не вызывают ложных срабатываний, однако как стоит зазвучать гитаре или роялю - тут 50 на 50 ложных срабатываний. И это недопустимо.

Вот и думаю, может вообще отказаться от VAD, вместо него смотреть в сторону библиотек для классификации звуков?

И ещё одна неудобная особенность Silero VAD, это работа только на частоте дискретизации 16000 Гц. Работаю со студийным звуком, захват которого происходит через ASIO, где обычно используются более высокие частоты дискретизации. Нельзя ли интегрировать ресемплер в саму библиотеку, чтобы пользователь смог указать свою частоту дискретизации?

это работа только на частоте дискретизации 16000 Гц.

Ну это просто неправда. Цитата из документации:

    sampling_rate: int (default - 16000)
        Currently silero VAD models support 8000 and 16000 (or multiply of 16000) sample rates

Вад работает на 8к и 16к, плюс на 32к и 48к.

Нельзя ли интегрировать ресемплер в саму библиотеку, чтобы пользователь смог указать свою частоту дискретизации?

Наш VAD - это тулкит / инструмент, а не полноценный редактор аудио на все случаи жизни. Он выложен насколько это возможно для нас минималистично и без лишних зависимостей.

Если взглянуть в минимальный рудиментарный, выложенный для примера использования VAD-а, там есть вот такая строчка. То есть по факту, ресемплер по факту уже интегрирован.

Ну это просто неправда. Цитата из документации:

Прошу прощения, действительно работает! Просто я разрабатываю на С++ и не читаю всё что касается питона.

А вот сегодня решил адаптировать пример silero-vad-onnx.cpp таким образом, чтобы он мог работать с разными частотами дискретизации, изменив всего пару строчек:

  1. при создании VadIterator.
    VadIterator vad(model_path, wav_reader.sample_rate()); // тут явно указал частоту дискретизации тестируемого wav-файла

  2. при расчёте временных меток:

    const float sample_rate_float = wav_reader.sample_rate(); // в примере было: const float sample_rate_float = 16000.0f;

При отладке в Visual Studio возникает исключение с параметром error_code = 2 если частота дискретизации 44100 Гц. С 16000 Гц всё работает хорошо.

Возникло исключение при частоте дискретизации 44100 Гц.
Возникло исключение при частоте дискретизации 44100 Гц.

Неужто параметр исключения ORT_INVALID_ARGUMENT подразумевает что задана неверная частота дискретизации?

8 и 16 в модели нативно поддерживается

32 и 48 приводятся в 16 тупо усреднением каждого 2 или 3 семпла

Следовательно частота дискретизации 44100 Гц не поддерживается?

Тогда как и писал вначале этой ветки о необходимости ресемплера в самой библиотеке.

32 и 48 приводятся в 16 тупо усреднением каждого 2 или 3 семпла

Ну так и 44100 Гц и вообще любую частоту дискретизации привести к требуемой с помощью простой линейной интерполяции. Если это в самой библиотеки приводится.

Поддерживается путём ресемплинга в 16к

Само собой если ресемплинг сделать самому )

Ну а если попытаться скормить алгоритму данные без ресемплинга - то получаем исключение, по крайней мере если собрать C++ пример в Visual Studio.

Ещё один недостаток был выявлен при тестировании. Если разговаривает ребёнок, или взрослый говорит фальцетом, то Silero VAD его не определяет как голос. С этим надо что то делать. Можно ли с Вами обсудить этот вопрос, и если требуется финансирование, давайте обсудим.

Sign up to leave a comment.

Articles