За последнее десятилетие распознавание голоса сделало огромный рывок. Гаджеты без особого труда понимают самые сложные фразы и предложения независимо от акцента и артикуляции. Как это им удается?
Обработка звука
Попытки распознавания голосовых команд предпринимались еще с середины прошлого века. И уже тогда было ясно, что перед распознаванием запись голоса следует обработать. Одни люди говорят громче, другие — тише. Также в реальных условиях всегда есть посторонние шумы, не имеющие отношения к человеческой речи. И отдать запись на распознавание «как есть» — только запутать ситуацию и увеличить вероятность ошибок. В чем же состоит обработка звука?
Оцифровка
Звук — это волны. С микрофона он идет в виде аналогового сигнала, а компьютеры с аналоговыми данными работать не умеют. Звук надо оцифровать. Для этого используются АЦП — аналого-цифровые преобразователи. На выходе АЦП звук преобразовывается в цифровой массив. При частоте дискретизации 44 кГц одна секунда звука превращается в 44000 чисел.
Фильтрация
Фильтрация заключается в отсеивании всех частот, не относящихся к человеческому голосу. Это довольно узкий диапазон, лежащий в пределах 75–500 Гц. Слышимый человеком диапазон звуков намного шире — 20–20000 Гц. В таком (или близком) диапазоне выдают сигнал большинство микрофонов. Так что фильтрация позволяет отсеять 97,5 % ненужной информации. Это намного ускоряет дальнейшую обработку сигнала.
Фильтрация может производиться и до оцифровки — с помощью аналоговых фильтров. Но цифровой метод надежнее.
Нормализация
Нормализация нужна, чтобы устранить влияние громкости звука на результат. Слабый сигнал усиливается. Сильный, наоборот, ослабляется. Итоговый сигнал имеет примерно одинаковую амплитуду для всех записей звука — как громких, так и тихих.
Распознавание методами математического анализа
До развития ИИ алгоритмы распознавания звука часто работали прямо со звуковым сигналом. Вот такого вида:
Для распознавания текста использовались различные методы математического анализа. Например, в базе данных сохранялись эталонные записи команд, и каждая новая запись сравнивалась с ними с помощью корреляционного анализа. Это позволяло легко найти среди эталонов наиболее подходящий и выполнить соответствующую команду. Способ хорошо работал с отдельными командами, представляющими собой неизменное слово или фразу. А вот с распознаванием обычной речи все было хуже.
Распознавание с помощью нейросетей
Нейросети работают примерно так же, как и человеческий мозг. Они хорошо выявляют качественные признаки и не очень хорошо — количественные. Человек с первого взгляда отличит кошку от собаки, а вот кучку из 50 спичек от кучки из 49 — вряд ли даже с десятого. И вот здесь с распознаванием голоса на основе цифрового сигнала возникают сложности.
Вот три записи. Среди них — два слова «собака», произнесенные разными голосами и одно слово «забота».
Задача выглядит несложной. Конечно же, второй и третий паттерны намного более похожи друг на друга, чем первый и второй или первый и третий. А значит — первый паттерн — «забота», а второй и третий — «собака»?
Нет. «Собака» — первый и третий. «Забота» — второй. Почему так? Потому что на записи мы в первую очередь обращаем внимание на амплитуды сигналов. Но это — всего лишь громкость. Смысловую нагрузку несет частота сигнала, а вот ее с первого взгляда на записи не видно. И со второго не видно. И вообще не видно до тех пор, пока вы не измерите расстояние между соседними пиками на графике.
Впрочем, решение этой задачи найдено давно — частотный анализ. Возьмем кусочек записи и посчитаем, с какой громкостью на нем звучит каждая частота. И изобразим это в виде графика.
Но такой график — все еще сложная для восприятия штука. А раз она сложна нам, то и нейросетям она тоже не понравится. Поэтому громкость изобразим в виде цвета. Теперь каждая запись предстает в таком виде:
Не правда ли, все стало проще? Нейросетям — тоже. С этими картинками уже вполне можно использовать те же алгоритмы, что позволяют нейросетям обнаруживать на фотографии лица или разбираться в дорожной обстановке.
Более того, такое представление записи позволяет искать не слова, а отдельные фонемы. Фонемы — это элементы, из которых состоит человеческая речь. В разных языках они разные, но их немного. В русском языке, например, их 42 (по некоторым исследованиям больше — 46–48).
Фонемы — это не то же, что и буквы. В разных словах одним и тем же буквам могут соответствовать разные фонемы. Но, распознав все фонемы, уже можно легко собрать из них слово.
Дальнейшая работа с распознанным текстом
Итак, благодаря нейросети мы смогли преобразовать запись голоса в осмысленный текст. Но ведь голосовой помощник на этом не останавливается. Он как-то понимает этот текст и осмысленно на него отвечает. Как это делается? Во-первых, текст токенизируется. Из него выделяются отдельные токены — смысловые единицы. Токенами могут быть слова, их сочетания и целые фразы — это зависит от модели нейросети и ее целей. В голосовых помощниках это обычно слова и пунктуационные знаки. Дальше токены текста проходят через эмбеддинг — каждому токену сопоставляется некий смысловой вектор в N-мерном пространстве. Например, один из простейших методов эмбеддинга предполагает использование двумерного массива:
Так, после эмбеддинга токен «Корова» получит вектор [-,100,0,10,100]. Теперь, приняв набор токенов «Луг, Молоко», нейросеть предположит, что речь идет о корове.
Eще, сравнивая токен «Корова» с другими токенами своего словаря, нейросеть заметит сходство вектора только с одним вариантом — соответствующим токену «Птица». Мы понимаем, что это произошло потому, что птица — тоже животное, и она тоже может обитать на лугу. В данной простейшей модели нейросеть не знает таких терминов, как «животное» и «обитать». Но это не мешает прийти ей к тому же выводу, что и человек.
Очевидно, что эффективность нейросети очень сильно зависит от размеров словаря и от правильности заполнения соответствующей матрицы. Это делается с помощью методов машинного обучения на больших массивах реальных данных. Нейросеть просматривает различные тексты и заполняет словарь на основе встречающихся слов. Например, несколько раз встретив в одном предложении слова «Корова» и «Луг», она увеличит число, стоящее на пересечении соответствующих столбцов и строк.
Теперь, когда каждому слову сопоставлен какой-то смысл, нейросеть может определить, что хотел от нее пользователь. Для этого запрос пропускается через семантический теггер, который определяет семантическую функцию каждого токена. Например, при запросе «Кто на лугу?» нейросеть по токенам «Кто» и «?» поймет, что ей задали вопрос. А «луг» она определит как основную информацию запроса и, сопоставив вектор соответствующего токена с остальными, выдаст ответ: «Корова».
Но чтобы поддерживать разговор, умения отвечать на вопросы мало. Нужно оставаться в контексте беседы, и голосовым помощникам это удается. Для этого используются рекуррентные нейронные сети. Такие сети содержат рекуррентные слои, кроме обычных выходов имеющие дополнительный выход для следующего просчета.
Вывод
Голосовые помощники могут вести с нами полноценный разговор и выглядеть при этом вполне разумными собеседниками. Но это иллюзия. Нейросети способны выдавать грамотные, разумные и взвешенные ответы, совершенно не понимая сути вопроса. Весь секрет — в современных технологиях и в обширной базе знаний в виде книг и изображений, хранящихся в сети Интернет.
Обучение нейросети требует немалых вычислительных ресурсов, а под словари и базы данных нужны целые массивы накопителей. Поэтому большинство голосовых помощников «живет» на серверах в дата-центрах. Общение же с пользователями происходит через Интернет. Именно поэтому полный функционал умных колонок доступен только при их подключении к Интернету.