✍Пабло Вальверде и Гийом Бакиаст
Готовые API или индивидуальная модель?
Транскрипция речи используется во все большем количестве вариантов использования. Большинство крупных интернет-компаний предлагают API для преобразования речи в текст. Несмотря на то, что эти API являются мощными и простыми в использовании, они имеют серьезные недостатки:
- Их цена не всегда незначительна;
- Они создают проблемы с конфиденциальностью и безопасностью, поскольку аудио передается через Интернет;
- Они обучены работе с универсальными приложениями и плохо справляются с конкретными вариантами использования.
В Quantmetry мы работали над задачей, организованной Airbus, чтобы расшифровать разговоры о воздушном движении между пилотами самолетов и диспетчерскими пунктами. В этом приложении звуки шумные, с высокой скоростью речи и большим количеством предметной лексики. Мы обнаружили, что стандартные API-интерфейсы плохо справляются с такими сложными задачами, а обучение пользовательской модели дает гораздо лучшие результаты.
Ниже приведены несколько примеров, в которых сравнивается транскрипция Google API и транскрипция построенной нами модели с реальной транскрипцией.
Настоящая транскрипция:
Билайн, четыре, два, браво, за этим трафиком от Майка, четыре, выстраивайся в линию, взлетно-посадочная полоса, три, два, налево и жди позади
Расшифровка API Google:
за этим трафиком с моего телефона и уроком в Интернете прямо позади
Транскрипция пользовательской модели:
Билайн, четыре, два, браво, позади движения от Майка, четыре, выстраивайся в линию, три, два, налево и жди позади
Транскрипция Google далека от реальной транскрипции. Он правильно понимает некоторые слова («трафик», «позади»), но добавляет несколько слов, которые не будут использоваться в контексте воздушного движения («интернет-страница»). Для сравнения, наша пользовательская модель ошибается только в одном слове («the» vs «this»).
Другой пример:
Настоящая транскрипция:
Евроуингс семь четыре три два первый да справа микрофон восемь пересечь взлетно-посадочную полосу три два справа с другой стороны контакт с землей один два один девять до свидания
Расшифровка API Google:
7 : 4 0, чтобы написать статью, на которой можно писать
Транскрипция пользовательской модели:
Евроуингс семь четыре три два, а, правильно, микрофон, восемь, пересечь взлетно-посадочную полосу, три, два, прямо, и коснуться земли, один, два, один, девять, до свидания
Интересно сравнить транскрипцию «написать» в Google с «правильно» в нашей модели (и реальную транскрипцию). Эти слова произносятся одинаково, но «правильно» гораздо более вероятно в контексте воздушного движения. Это было изучено нашей пользовательской моделью, но не Google, который обучен для общего случая.
Последний пример:
Настоящая транскрипция:
KLM шесть три танго сократить один восемь ноль узлов
Расшифровка API Google:
Я просто хочу пончик
Транскрипция пользовательской модели:
KLM шесть три танго сократить один восемь ноль узлов
Хотя пончик звучит красиво…
Эти примеры показывают, что готовые API плохо работают в определенных приложениях. В этом случае лучше обучать конкретные пользовательские модели.
В количественном отношении Коэффициент ошибок в словах (или WER, процент ошибок в словах между предполагаемой и реальной транскрипцией) в наборе тестовых звуков намного ниже при использовании нашего алгоритма.
Итак, как обучить пользовательскую систему распознавания речи?
Существует два основных подхода:
- Традиционный подход строится на нескольких компонентах (предварительная обработка звука, модель произношения, акустическая модель и т. д.), которые объединяются в декодер. Недостатком является то, что для этого требуется множество функций, разработанных вручную.
- Новые подходы основаны на современных алгоритмах глубокого обучения, которые напрямую преобразовывают речь в текст без необходимости выполнения нескольких ручных этапов.
Мы использовали метод глубокого обучения Deep Speech, разработанный Baidu и реализованный Mozilla в проекте с открытым исходным кодом. Он основан на двух основных элементах:
- Акустическая модель, преобразующая звук в серию букв;
- Языковая модель, придающая значение транскрипции.
В следующих параграфах более подробно описывается, как работает алгоритм и как его обучить на практике.
Акустическая модель: преобразование звуков в буквы
Акустическая модель распознает буквы, которые произносятся вдоль аудио. Для этого звук разрезается на последовательность небольших фрагментов по 0,1 секунды, и модель пытается определить букву, произносимую в каждом из них. Этот тип проблемы известен как последовательность к последовательности: модель переводит последовательность звуков в последовательность букв.
Рекуррентные нейронные сети («RNN») — это тип нейронных сетей, которые позволяют переносить информацию по последовательности. Каждый шаг сети принимает на вход как элемент последовательности, так и некоторую контекстную информацию, переданную от предшествующих элементов. Нашими входными данными здесь являются спектрограммы звуковых фрагментов, а нашими выходными данными являются буквы, произносимые на этих фрагментах.
Архитектура, предложенная Deep Speech, немного сложнее, чем обычная RNN, с несколькими полностью связанными уровнями для абстракции и двунаправленной RNN для учета контекста как из прошлого, так и из будущего, а также последовательности.
RNN выводит необработанную последовательность символов. Эта последовательность должна быть изменена, чтобы превратиться в осмысленную последовательность. В этом состоит цель языковой модели.
Языковая модель: придание смысла транскрипции
Языковые модели используются для выбора последовательности слов, наиболее подходящей для данного варианта использования. Они особенно полезны для различения слов, которые звучат одинаково, но пишутся по-разному. Например, несмотря на то, что «правильно» и «написать» звучат одинаково, хорошая языковая модель предпочтет выводить предложение «поверните направо», а не «поверните, пожалуйста, напишите», так как это имеет больше смысла.
Языковые модели легко обучаются, так как не требуют размеченных данных. Существует несколько подходов к обучению языковой модели. Самый интуитивно понятный из них, называемый n-граммами, просто зависит от того, сколько раз последовательность из n слов встречается в обучающем корпусе.
В приведенном ниже примере показано обучение модели биграммы (n-граммы с n = 2) для корпуса, состоящего из двух простых предложений.
Соединяем это через целевую функцию
Каждая модель машинного обучения нуждается в целевой функции для оптимизации. Вот одна из наших моделей:
Веса акустической модели изучаются путем максимизации целевой функции для реальной транскрипции. Для нового аудио транскрипция выбирается как последовательность символов, максимизирующая целевую функцию.
Реализация модели
В отношении реализации модели следует отметить три момента.
1. Объем данных
Для обучения модели транскрипции требуется много данных: Google использует более 100 000 часов аудио, Mozilla открыла исходный код модели, обученной 3000 часов, но для нашего варианта использования у нас было только 50 часов данных о воздушном движении. Имея так мало данных, мы не смогли обучить ни одну хорошую модель. Поэтому мы использовали трансферное обучение: мы инициализировали нашу сеть с весами, изученными Mozilla за 3000 часов, и повторно обучили их на наших конкретных данных. Это привело к значительному увеличению производительности модели.
2. Обучение в облаке
Используемая нами сеть имеет более 120 миллионов параметров. Для обучения требуется много памяти и вычислительной мощности. У нас быстро закончились вычислительные мощности на нашей физической машине. Поэтому мы обратились к облаку, где мы могли арендовать очень мощные машины для обучения нашей сети в течение нескольких часов.
3. Предсказать сравнение времени
Наша модель работает на устройстве. Это обеспечивает как конфиденциальность (данные не проходят через Интернет), так и быстрое время транскрипции (нет времени на загрузку). Это продемонстрировано нашим эталонным тестом, в котором Google API взял среднее время транскрипции, равное 50% времени аудио, в то время как наша модель заняла только 30% времени аудио.
Вывод
Транскрипция речи становится все более распространенной. Существует несколько готовых API, которые просты в использовании, однако эти API обучены для общего случая и, как правило, плохо работают в конкретных случаях использования. В такой ситуации предпочтительнее использовать пользовательскую модель, тем более что теперь она легко доступна благодаря прогрессу, достигнутому в сообществе глубокого обучения и открытого исходного кода.
Первоначально опубликовано на https://www.quantmetry.com 31 августа 2018 г.