В процессе работы над диалоговой системой (http://habrahabr.ru/post/235763/) мы столкнулись с непреодолимой, на первый взгляд, проблемой – в реальных, боевых условиях работы, производительность системы ASR оказывалась значительно ниже ожидаемой. Одним из компонентов, сказывающимся на производительности, неизменно оказывался шум на заднем фоне, принимающий самые разнообразные формы. Особенно неприятными для ASR в наших экспериментах были трудно-нейтрализуемые шум городской улицы и шум массовых скоплений людей.

Стало ясно, что проблему придется решить, или реальной ценности от голосовой системы просто не будет.

Изначальный план был простым – найти аналитическое решение для этих двух конкретных типов шума и нейтрализовать именно их. Но в процессе экспериментов с несколькими алгоритмами выяснилось, что, во-первых, голос достаточно сильно искажался, во-вторых, в нашей обучающей выборке типов шума оказалось сильно больше. Плюс к этому мы не хотели, чтобы (относительно) чистая речь как-либо модифицировалась, так как это негативно сказывалось на word error rate при распознавании.

Нужна была адаптивная схема.

Глубокие нейронные сети являются отличным решением в случаях, когда аналитическое решение для функции тяжело или невозможно подобрать. А мы хотели именно такую функцию – для трансформации зашумленного речевого сигнала в незашумленный. И вот что у нас получилось:
  1. Модель работает до фильтр-банка. Альтернативой было шумоподавление после фильтр-банка (например в MEL-space), которое к тому же работало бы быстрее. Но мы хотели построить модель, которая будет работать и для материала, который затем должен слышать человек или внешние ASR системы. Таким образом мы можем очищать от шума любые голосовые потоки.
  2. Модель адаптивна. Убирает любые типы шума на заднем фоне, включая музыку, крики, проехавший мимо грузовик или шум циркулярной пилы, чем выгодно отличается от других коммерчески доступных систем. Но если сигнал не зашумлен, он практически не претерпевает изменений. Т.е. это speech enhancement модель – восстанавливает чистый голос из плохого сигнала. Одним из интересных дальнейших экспериментов будет способность подобной модели восстанавливать голос студийного качества из 8KHz в 44KHz. Многого мы не ждем, но возможно она нас удивит.
  3. Эта конкретная модель работает только с 8Khz. Связано это с тем, что на момент начала обучения у нас было множество 8KHz материала. Сейчас у нас уже достаточно материала в 44KHz и мы можем собрать любую модель, будь в этом необходимость. Пока же наша область интересов лежит в телекоммуникационном поле.
  4. Время обучения (после всех наших оптимизаций) – около двух недель на 40 ядрах. Первая версия тренировалась почти 2 месяца на том же оборудовании. Причем модель продолжает улучшать уровень ошибки на тестовых данных, поэтому мы еще ее потренируем.
  5. Скорость обработки на относительно современном процессоре сейчас около 20х от реального времени на одном ядре. 20-ти ядерный сервер с hyper-threading’ом может обрабатывать примерно 700 голосовых потоков одновременно, почти 90 Мбит/с в сырых данных.

Мы пошли еще немного дальше и имплементировали сеть на комплексных числах. Идея сводится к тому, чтобы восстанавливать не только амплитуду, но и фазу, которую в противном случае приходится брать из зашумленного сигнала. А фаза из зашумленного сигнала негативно сказывается на качестве восстановленного звука, если его хочется затем услышать. Поэтому скоро у нас появится опция «высокое качество», за счет примерно 2-х-кратного замедления скорости обработки. Для использования в ASR смысла в ней, конечно же, нет.

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

Хотелось бы показать несколько интересных картинок
Вход image Выход image

Вход Выход

Вход Выход

Вход Выход

Для желающих побаловаться с моделью – добро пожаловать к нам на сайт (http://sapiensapi.com/#speechapidemo). Там можно загрузить свой файл, взять готовый, зашумить или убрать шум из файла. Интерфейс достаточно прост.

Любителям API мы предлагаем бесплатный тестовый API через Mashape (http://www.mashape.com/tridemax/speechapi).

Если у вас есть какие-то вопросы – пишите мне на tridemax@sapiensapi.com, ну или же добро пожаловать в комментарии.

Комментарии (25)


  1. datacompboy
    28.04.2015 18:51
    +2

    В деме не хватает _изначально зашумлённого_ семпла.
    А не «чистый + шум».


    1. tridemax Автор
      28.04.2015 18:53

      Хорошее замечание. Добавим несколько из самых жестких случаев. =)


  1. Gho_st
    28.04.2015 19:52

    >Internal Server Error: Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

    Это все из-за хабраэффкта, да? Или я что-то не так делаю


    1. tridemax Автор
      28.04.2015 20:02

      Да, как-то все упало. =)
      Дайте немного времени, сейчас все починим.


    1. tridemax Автор
      28.04.2015 20:16

      Починили, мониторим.


  1. tridemax Автор
    28.04.2015 20:22
    +1

    У нас наблюдаются технические проблемы с нашим внутрисервисным RPC. Приношу извинения за недоступность сервиса — мы максимально быстро постараемся все починить.


    1. tridemax Автор
      28.04.2015 23:51
      +2

      Падение починили.


  1. Manwe_SandS
    28.04.2015 21:11

    Internal Server Error: Failed to decode audio.
    Пробовал WAV 48 KHz mono и 44 KHz mono. Надо сперва вручную перекодировать в 8 KHz?


    1. tridemax Автор
      28.04.2015 21:15
      +1

      Нет, все автоматически произойдет, как только мы починим. Мы, к сожалению, замерджили на продакшин сервер неработающий код, на который запитан весь другой работающий код. Бывает… =(


  1. netmaxed
    29.04.2015 09:34

    а какую НС использовали?
    передо мной сейчас стоит проблема сделать эхо-подавитель для VoIP, так насколько я смотрю по литературе, там в основном multi-delay фильтры используются с последующим нелиненйным процессингом. Это все хорошо оптимизируется для маломощных процессоров. А насколько НС более требовательна к процессору?


    1. tridemax Автор
      29.04.2015 09:40

      В сети ~2.5М коеффициентов, соответственно ~5М операций (умножение + сложение) на каждый фрейм. С текущим окном это чуть больше 300М операций на секунду материала.


      1. buriy
        29.04.2015 10:51
        +1

        «около двух недель на 40 ядрах» — не используете видюшки, потому что применяете RNN?


        1. tridemax Автор
          29.04.2015 11:24

          Да, код местами жестко экспериментальный. Поддерживать два codebase, для CPU и GPU, тяжеловато, плюс мы активно используем MKL, поэтому выигрышь от GPU не такой гигантский. Решили пока, что второго codebase он не стоит.


  1. storoj
    29.04.2015 12:57

    сначала я подумал про адаптивное шумоподавление речевого сигнала от женщины справа


  1. MichaelBorisov
    29.04.2015 14:07

    А возможно ли использовать ваш алгоритм для удаления голоса из музыки?

    Например, скормить вашему алгоритму песню — он выделит из нее речь и удалит музыку как «шум». Потом вычесть отделенный речевой сигнал из суммарного. Должна остаться только музыка (если фазы правильные). Профит.


    1. tridemax Автор
      29.04.2015 14:11

      Да, структура голоса достаточно хорошо отделяется от музыки. Но для хорошего результата, мне кажется нужно было бы сделать иначе — натренировать приличных размеров RNN на удаление голоса из музыки, вместо выделения голоса из музыки. Хотя тренировать пришлось бы несколько дольше, да и материал подсобрать было бы еще той задачей, если конечно нет друзей в приличной звукозаписывающей компании, которые могу дать плюс и минус отдельно.


  1. MichaelBorisov
    29.04.2015 14:30

    удаление голоса из музыки, вместо выделения голоса из музыки

    Мне кажется, это задачи равноценные. Если натренировать систему на удаление голоса — то после вычитания из песни выделенного музыкального сигнала должен остаться только голос. И наоборот. Так же как и вашу систему (если она выдает на выходе речевой сигнал с удаленным шумом) можно использовать «в обратном направлении» — для выделения шума и подавления речи. Одним словом, когда смесь из двух компонентов разделена, и мы имеем на руках один компонент — то побочным продуктом получается и другой.

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


    1. tridemax Автор
      29.04.2015 14:31

      Именно. =)


  1. StirolXXX
    29.04.2015 17:58

    Загружаю свой семпл в надежде улучшить качество, но у меня «качество» т.е четкость голоса не повышается.

    ЧЯДНТ?

    MPEG Type: MPEG 0.0 Layer 3
    Bitrate: CBR 8 kbps
    Sample Rate: 8000Hz
    Channel Mode: Single channel


    1. tridemax Автор
      29.04.2015 22:50

      Если возможно, я бы хотел посмотреть на файл. Например через tridemax@sapiensapi.com?


      1. StirolXXX
        30.04.2015 08:26

        Отправил.


  1. J_K
    30.04.2015 00:34

    Здравствуйте, очень заинтересовала ваша технология. Особенно впечатлило то видео, где Дублин правильно ассоциируется с Ирландией. Мне интересно, каким образом вы создали подобные ассоциативные связи, работает ли это для всех других городов (и других предметных областей); строятся ли эти связи вручную или процесс автоматизирован.
    Понимаю, конечно, что это может быть вашим «секретом фирмы», но будет здорово, если вы сможете ответить хотя бы на некоторые вопросы.
    Спасибо!


    1. tridemax Автор
      30.04.2015 00:41

      Это называется латентное семантическое пространство. А вектора, которые описывают слова в этом многомерном пространстве, называются в литературе word embeddings и имеют такие вот свойства, где близкие по семантике слова находятся рядом. У нас, конечно, все несколько сложнее — само семантическое пространство объединяет сразу все поддерживаемые языки («кот» и «cat» в нем находятся рядом), а языковые модели умеют отвечать на запрос о вероятности нахождения конкретного слова на конкретной позиции в конкретном предложении, что дает возможность строить иерархии отношений слов. Но в базе современных подходов к NLP лежат именно эти word embeddings.


      1. J_K
        30.04.2015 07:51

        Спасибо за ответ!
        Буду изучать, что это такое, «латентное семантическое пространство».
        А можно поинтересоваться, вы сами разработали имплементацию алгоритма с нуля и или используете какие-то готовые решения?


        1. tridemax Автор
          30.04.2015 09:21

          Чтобы начать, лучше конечно воспользоваться чем-то готовым. Я бы порекомендовал word2vec.