Распознавание речи ВКонтакте: быстрая акустическая модель

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


????

24 сентября 2020 года прошёл онлайн-митап от Команды ВКонтакте — VK Tech Talks | ASR, посвящённый распознаванию речи. С первым докладом выступил разработчик Октай Татанов. Он рассказал про акустическую модель — основную часть автоматического распознавания речи (Automatic Speech Recognition, ASR), а также о подходах и некоторых экспериментах — успешных и не очень.

Делимся расшифровкой этого доклада.

Прежде чем начать делать какое-то дело с нуля, можно посмотреть, какие решения уже есть. Среди open source есть:

  • Kaldi. О нём неоднократно слышали многие, кто сталкивался c ASR. Однако это довольно медленное решение и оно не подходит из-за большого количества голосовых сообщений, нужно быстрое распознавание.
  • Из быстрых фреймворков можно выделить Mozilla DeepSpeech.Его проблема в том, что фреймворк реализован на старом TensorFlow, от которого многие сейчас отказываются.
  • Wav2Letter. Он базируется на малоизвестном фреймворке flashlight.

В итоге все готовые решения были либо не гибкими, либо медленными. И было решено делать с нуля собственное решение.

Решение с точки зрения инструментов очень простое — это PyTorch. Довольно популярный фреймворк, на котором пишут нейронный сети. С определённой версии PyTorch (примерно 1.3 или 1.4) очень удобно конвертировать модель в любой язык программирования с помощью Torch Script — промежуточного представления модели, благодаря которому можно запускать с любого языка программирования.

Препроцессинг

В ASR, как и в работе со звуком, препроцессинг занимает очень важную часть.

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

Что можно делать с сырым звуком:

  • Усиливать высокие частоты через Pre-Emphasis filter.

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

Затем, собственно, переход из амплитудного domain в частотный. Тут используется оконное преобразование Фурье, которое преобразуется точками. Аудиодорожка превращается в спектрограмму. Это происходит таким образом: преобразование Фурье для каждого фрейма даёт комплексные числа, потом берётся абсолютная величина комплексного числа (модуль), возводится в квадрат, и это называется power spectrogram.

Также переходят из герцев в единицу измерения мелы. Это выполняется с помощью mel filter bank. Происходит так: есть матрица, размер которой равен размеру спектрограммы по столбцам, и каждую строчку матрицы умножают на каждый столбец, что получается преобразование в новую единицу звук. Мелы больше похожи на то, как человек воспринимает звук. Подробнее о преобразование можно прочитать тут. Далее нормализуют, и получается на выходе мел-спектрограмма.

Во что ещё превращают сырую дорожку? То о, чём была речь выше, — это хэндкрафт фичи, то есть сделанные человеком подходы. Они были придуманы очень давно, ещё до нейронных сетей. Довольно распространён Mel-Frequency Cepstral Coefficients, в котором используются улучшения для мел-спектрограммы.

Что ещё можно сделать в работе со звуком? Сейчас активно пытаются делать не хэндкрафт фичи. Сырую дорожку хотят преобразовывать с помощью нейронных сетей. Для этого довольно активно пробуют SincNet filters. Подход следующий: сырую дорожку преобразовывают в промежуточное представление за счёт простых свёрточных нейронных сетей. Но ядрам надо задавать формы заранее, а также обучать не полноценно все ядра, чтобы преобразовывать из сырой в более сложную, в такое промежуточное представление, а именно задать формы и параметризовать, и параметры для этих ядер откорректировать. Узнать больше про SincNet filters можно на GitHub.

Подобная идея есть в wav2vec. В этом подходе из дорожки получают эмбеддинги. Для этого дорожку разбивают на фреймы следующим образом: прогоняют из пространства x в z, а затем в c, используя свёрточные слои. И пытаются уметь из c угадывать следующий фрейм из z с помощью дополнительного преобразования. Более подробнее — тут.

Акустическая модель

Уже имея представление — меньше размерность и больше информативность — можно сделать так, чтобы нейросетевая модель из мел-спектрограммы выдавала матрицы, где будет для каждого фрейма распределение на алфавит. Такие модели называют акустическими.

Какие есть варианты:

  • В первую очередь это RNN и Transformer. Это autoregressive-модели. Их довольно часто упоминают в свежих статьях по ASR. Несмотря на то, что они показывают себя хорошо, они очень медленные, из-за того что autoregressive.
  • CNN (свёрточные нейронные сети). Если использовать в них только акустическую модель, у них будет хуже качество. Однако они довольно приемлемы, если их использовать в связке с языковой моделью. Работает быстрее.

Какие модели вообще есть:

  • Одна из первых моделей на свёрточных блоках — это Jasper от NVIDIA: на вход подаётся спектрограмма, а затем идёт какой-то набор блоков. Более подробно можно почитать тут.
  • QuartzNet от NVIDIA. Основное изменение по сравнению с Jasper — переход с обычных свёрточных блоков к MobileNet-блокам. То есть QuartzNet — модель, где свёртки сменили на Dependency. Это позволило значительно ускорить модель: меньше параметров, быстрее выдаёт ответ. Более подробно можно узнать тут.
  • В 2020 году Google выпустил ContextNet. Его основная идея в том, что нейронной сети пытаются дать некий глобальный контекст. Этот контекст даётся за счёт C-блока. На вход C-блока подаётся матрица 2D, в ней есть время, есть число каналов. После этого усредняется по времени и остаётся вектор с количеством каналов, который сужают, разжимают и множат. Затем берётся сигмоида поверх этой матрицы и получается некая идея. Исходная матрица перевзвешивается за счёт того, что получили. Затем умножается вход на вероятностей. Таким образам передаётся информация входной матрице и перевзвешивают её значение на основе какого-то глобального контекста за счёт усреднения. Более подробно можно узнать тут.

В основе обучения используется Connectionist Temporal Classification. Как ранее уже говорилось, для каждого для фрейма предсказывается распределение вероятности на алфавит. Для расширения словаря добавим туда blank-символ. Декодирование результата происходит следующим образом: сначала удаляются подряд идущие повторяющиеся символы, и затем убираются blank-символы. Таким образом blank-позволяет решать проблему, когда в словах есть подряд идущие символы.

Функция ошибки очень простая — это минус логарифм вероятности. Получается, нужно уметь считать вероятность правильного ответа: насколько модель даёт правильный ответ. Так как правильный ответ состоит из суммы вероятностей правильных ответов, то просто считается по матрице, которая есть. Перемножаются имеющиеся вероятности в матрице, и потом складываются все правильные варианты. Это очень долгий процесс, но за счёт динамического программирования существует подход, как это сделать быстро и дифференцируемо. Более подробнее смотрите в этой лекции.

При обучении также используется аугментация SpecCutout.Идея очень простая: в основной мел-спектрограмме занулить какие-то строчки или столбцы.

Кроме того, обучение акустической модели сильно зависит от оптимизатора. Для этого используют Novograd. Он является некоторым улучшением Adam, его отличие в том, что wise-элементы заменили на layer-wise, которые занимают меньше памяти, и поэтому они быстрее. Кроме этого weight decay идёт как в AdamW.

Обучение акустической модели — это тяжёлый долгий процесс с большим количеством данных. Поэтому влияют любые фишки, которые ускоряют обучение. Одной из таких фишек является сбалансированное сублимирование данных в batch. Например: после индексирования для каждой аудиодорожки есть длина, сортируются индексы по длине, потом собираются подряд batch. Таким образом можно обучать нейронную сеть на итоговом тензоре с минимум количеством padding. Balanced Distributed Sampler значительно ускоряет обучение, но можно получить так, что batch будут формироваться очень похожими от эпохи к эпохе. Поэтому саму функцию длины можно как-то изменить, например, поделить на 2.

Что нужно ещё попробовать, если работаете со звуком:

Подведём итоги:

  1. Реализовали быструю акустическую модель на основе CNN.
  2. Простое встраивание с минимумом зависимостей.
  3. Быстрый путь от экспериментов до внедрения в прод.
  4. Future work: self-supervised, уменьшение модели, ускорение обучения.

Полная версия выступления:


Источник: m.vk.com

Комментарии: