Стало ясно, что проблему придется решить, или реальной ценности от голосовой системы просто не будет.
Изначальный план был простым – найти аналитическое решение для этих двух конкретных типов шума и нейтрализовать именно их. Но в процессе экспериментов с несколькими алгоритмами выяснилось, что, во-первых, голос достаточно сильно искажался, во-вторых, в нашей обучающей выборке типов шума оказалось сильно больше. Плюс к этому мы не хотели, чтобы (относительно) чистая речь как-либо модифицировалась, так как это негативно сказывалось на word error rate при распознавании.
Нужна была адаптивная схема.
Глубокие нейронные сети являются отличным решением в случаях, когда аналитическое решение для функции тяжело или невозможно подобрать. А мы хотели именно такую функцию – для трансформации зашумленного речевого сигнала в незашумленный. И вот что у нас получилось:
- Модель работает до фильтр-банка. Альтернативой было шумоподавление после фильтр-банка (например в MEL-space), которое к тому же работало бы быстрее. Но мы хотели построить модель, которая будет работать и для материала, который затем должен слышать человек или внешние ASR системы. Таким образом мы можем очищать от шума любые голосовые потоки.
- Модель адаптивна. Убирает любые типы шума на заднем фоне, включая музыку, крики, проехавший мимо грузовик или шум циркулярной пилы, чем выгодно отличается от других коммерчески доступных систем. Но если сигнал не зашумлен, он практически не претерпевает изменений. Т.е. это speech enhancement модель – восстанавливает чистый голос из плохого сигнала. Одним из интересных дальнейших экспериментов будет способность подобной модели восстанавливать голос студийного качества из 8KHz в 44KHz. Многого мы не ждем, но возможно она нас удивит.
- Эта конкретная модель работает только с 8Khz. Связано это с тем, что на момент начала обучения у нас было множество 8KHz материала. Сейчас у нас уже достаточно материала в 44KHz и мы можем собрать любую модель, будь в этом необходимость. Пока же наша область интересов лежит в телекоммуникационном поле.
- Время обучения (после всех наших оптимизаций) – около двух недель на 40 ядрах. Первая версия тренировалась почти 2 месяца на том же оборудовании. Причем модель продолжает улучшать уровень ошибки на тестовых данных, поэтому мы еще ее потренируем.
- Скорость обработки на относительно современном процессоре сейчас около 20х от реального времени на одном ядре. 20-ти ядерный сервер с hyper-threading’ом может обрабатывать примерно 700 голосовых потоков одновременно, почти 90 Мбит/с в сырых данных.
Мы пошли еще немного дальше и имплементировали сеть на комплексных числах. Идея сводится к тому, чтобы восстанавливать не только амплитуду, но и фазу, которую в противном случае приходится брать из зашумленного сигнала. А фаза из зашумленного сигнала негативно сказывается на качестве восстановленного звука, если его хочется затем услышать. Поэтому скоро у нас появится опция «высокое качество», за счет примерно 2-х-кратного замедления скорости обработки. Для использования в ASR смысла в ней, конечно же, нет.
Ну и через непродолжительное время мы перейдем на нашу новую рекуррентную модель, которая сможет похвастаться местами радикальным улучшением качества восстановленного голоса за счет существенного расширения области видимости. Относительно небольшой размер окна в текущей модели приводит к небольшим артефактам на переходах между разными типами шума, или когда профиль сигнала шума частично совпадает с профилем речи (ребенок плачет на заднем фоне).
Вход Выход
Вход Выход
Вход Выход
Для желающих побаловаться с моделью – добро пожаловать к нам на сайт (http://sapiensapi.com/#speechapidemo). Там можно загрузить свой файл, взять готовый, зашумить или убрать шум из файла. Интерфейс достаточно прост.
Любителям API мы предлагаем бесплатный тестовый API через Mashape (http://www.mashape.com/tridemax/speechapi).
Если у вас есть какие-то вопросы – пишите мне на tridemax@sapiensapi.com, ну или же добро пожаловать в комментарии.
Комментарии (25)
Gho_st
28.04.2015 19:52>Internal Server Error: Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.
Это все из-за хабраэффкта, да? Или я что-то не так делаю
Manwe_SandS
28.04.2015 21:11Internal Server Error: Failed to decode audio.
Пробовал WAV 48 KHz mono и 44 KHz mono. Надо сперва вручную перекодировать в 8 KHz?tridemax Автор
28.04.2015 21:15+1Нет, все автоматически произойдет, как только мы починим. Мы, к сожалению, замерджили на продакшин сервер неработающий код, на который запитан весь другой работающий код. Бывает… =(
netmaxed
29.04.2015 09:34а какую НС использовали?
передо мной сейчас стоит проблема сделать эхо-подавитель для VoIP, так насколько я смотрю по литературе, там в основном multi-delay фильтры используются с последующим нелиненйным процессингом. Это все хорошо оптимизируется для маломощных процессоров. А насколько НС более требовательна к процессору?tridemax Автор
29.04.2015 09:40В сети ~2.5М коеффициентов, соответственно ~5М операций (умножение + сложение) на каждый фрейм. С текущим окном это чуть больше 300М операций на секунду материала.
buriy
29.04.2015 10:51+1«около двух недель на 40 ядрах» — не используете видюшки, потому что применяете RNN?
tridemax Автор
29.04.2015 11:24Да, код местами жестко экспериментальный. Поддерживать два codebase, для CPU и GPU, тяжеловато, плюс мы активно используем MKL, поэтому выигрышь от GPU не такой гигантский. Решили пока, что второго codebase он не стоит.
storoj
29.04.2015 12:57сначала я подумал про адаптивное шумоподавление речевого сигнала от женщины справа
MichaelBorisov
29.04.2015 14:07А возможно ли использовать ваш алгоритм для удаления голоса из музыки?
Например, скормить вашему алгоритму песню — он выделит из нее речь и удалит музыку как «шум». Потом вычесть отделенный речевой сигнал из суммарного. Должна остаться только музыка (если фазы правильные). Профит.tridemax Автор
29.04.2015 14:11Да, структура голоса достаточно хорошо отделяется от музыки. Но для хорошего результата, мне кажется нужно было бы сделать иначе — натренировать приличных размеров RNN на удаление голоса из музыки, вместо выделения голоса из музыки. Хотя тренировать пришлось бы несколько дольше, да и материал подсобрать было бы еще той задачей, если конечно нет друзей в приличной звукозаписывающей компании, которые могу дать плюс и минус отдельно.
MichaelBorisov
29.04.2015 14:30удаление голоса из музыки, вместо выделения голоса из музыки
Мне кажется, это задачи равноценные. Если натренировать систему на удаление голоса — то после вычитания из песни выделенного музыкального сигнала должен остаться только голос. И наоборот. Так же как и вашу систему (если она выдает на выходе речевой сигнал с удаленным шумом) можно использовать «в обратном направлении» — для выделения шума и подавления речи. Одним словом, когда смесь из двух компонентов разделена, и мы имеем на руках один компонент — то побочным продуктом получается и другой.
Другое дело, что ваша нейронная сеть натренирована не на музыке, а на типичных шумах окружающего мира, поэтому на музыке она может и не показать хороших результатов без дополнительной тренировки.
StirolXXX
29.04.2015 17:58Загружаю свой семпл в надежде улучшить качество, но у меня «качество» т.е четкость голоса не повышается.
ЧЯДНТ?
MPEG Type: MPEG 0.0 Layer 3
Bitrate: CBR 8 kbps
Sample Rate: 8000Hz
Channel Mode: Single channel
J_K
30.04.2015 00:34Здравствуйте, очень заинтересовала ваша технология. Особенно впечатлило то видео, где Дублин правильно ассоциируется с Ирландией. Мне интересно, каким образом вы создали подобные ассоциативные связи, работает ли это для всех других городов (и других предметных областей); строятся ли эти связи вручную или процесс автоматизирован.
Понимаю, конечно, что это может быть вашим «секретом фирмы», но будет здорово, если вы сможете ответить хотя бы на некоторые вопросы.
Спасибо!tridemax Автор
30.04.2015 00:41Это называется латентное семантическое пространство. А вектора, которые описывают слова в этом многомерном пространстве, называются в литературе word embeddings и имеют такие вот свойства, где близкие по семантике слова находятся рядом. У нас, конечно, все несколько сложнее — само семантическое пространство объединяет сразу все поддерживаемые языки («кот» и «cat» в нем находятся рядом), а языковые модели умеют отвечать на запрос о вероятности нахождения конкретного слова на конкретной позиции в конкретном предложении, что дает возможность строить иерархии отношений слов. Но в базе современных подходов к NLP лежат именно эти word embeddings.
J_K
30.04.2015 07:51Спасибо за ответ!
Буду изучать, что это такое, «латентное семантическое пространство».
А можно поинтересоваться, вы сами разработали имплементацию алгоритма с нуля и или используете какие-то готовые решения?tridemax Автор
30.04.2015 09:21Чтобы начать, лучше конечно воспользоваться чем-то готовым. Я бы порекомендовал word2vec.
datacompboy
В деме не хватает _изначально зашумлённого_ семпла.
А не «чистый + шум».
tridemax Автор
Хорошее замечание. Добавим несколько из самых жестких случаев. =)