Всем привет!


У многих из нас мало опыта в так называемом голосовом письме – на диктофон свои мысли раньше записывали разве что психоаналитики. Теперь диктовка становится привычнее – к ней приучил сервис голосового набора в смартфонах. Участвуя как product owner в процессе создания продукта для распознавания русской слитной речи, общаясь с разработчиками алгоритмов и с клиентами, проводя различные тесты систем распознавания, наблюдая за тем, как пользователи диктуют свои тексты и имея свой большой опыт ввода текста в компьютер с помощью голоса, я набрал много интересных наблюдений. Чтобы лучше понимать, как правильно пользоваться автоматическим распознаванием речи давайте посмотрим, как устроено распознавание речи. Описание будет очень упрощенным, но зато поможет понять, какие ошибки люди совершают при диктовке. И еще: данную статью я буду писать с помощью диктовки, внося правки с клавиатуры только в тех местах, где без этого будет не обойтись.

Итак:


Для создания движка распознавания нам потребуются акустическая и языковая модели.
Акустическая модель отвечает за соотнесение кусочка звука (фрейма) с соответствующей фонемой. Фонема — это отдельный звук речи, например, «а-ударная», «т-мягкая», «т» и еще 49 других. Самая большая проблема заключается в том, что многие фонемы очень похожи между собой и отличить на слух слово «машины» от слова «машину» достаточно трудно (вспомните, сколько раз вы переспрашиваете, когда вам диктуют незнакомую фамилию). Поэтому акустическую модель делают вероятностной: она сообщает, что с некоторой вероятностью в этом звуковом фрагменте была произнесена фонема «а-ударная», с другой вероятностью это была фонема «а-безударная» и т.д. и выдает вероятности всем фонемам.


Для того чтобы иметь такую акустическую модель, нам надо ее сначала обучить. Для этого берется большая речевая база (сотни часов речи, записанные на микрофон десятками дикторов разного пола и возраста). База размечается, чтобы было известно, какая фонема звучит в какой момент времени. И далее после тренировки получаем для каждой фонемы некую функцию распределения вероятностей, которая описывает, как в среднем эта фонема произносится людьми.

Языковая модель также является вероятностной и описывает структуру языка. Она показывает, насколько вероятна (правильна) та или иная фраза с точки зрения языка. Например, фраза «мама мыла раму» вполне нормальная, а вот «рама мыла маму» уже ошибочна (эта фраза настолько не нравится Voco, что он распознает «мама мыла маму»). После того, как мы распознали очередное слово, языковая модель определяет, насколько это слово согласуется с предыдущими распознанными словами.
Языковая модель тренируется по большому объему текстовых данных (гигабайты текстов). По этим тренировочным данным мы вычисляем вероятности появления слов в определенном контексте, основываясь на частоте встречаемости этих словосочетаний. Мы используем словосочетания длиной не более 3 слов (3-граммные языковые модели). Поэтому, языковая модель не может помочь согласовать, например, прилагательное с существительным, если между ними располагаются какие-то два слова. В этом случае согласование происходит только за счет акустической модели.
В качестве словаря распознавания мы берем примерно 300 тысяч самых частотных слов, которые покрывают 99% речи среднестатистического человека.


Теперь разберемся с самим распознаванием


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


Граф распознавания для слов: «мама», «мыла», «раму», «посуду». На ребрах графа у нас фонемы в качестве входных символов (слово до ‘:’), слова в качестве выходных символов ( слово после ‘: ’) и веса из языковой модели (число после ‘/’). ‘-’ означает пустой вход или выход. Ребро из 4-го узла в 0-узел зацикливает граф, чтобы можно было распознать несколько слов подряд.

При распознавании мы получаем фрагмент звука, акустическая модель преобразует его в набор фонем с вероятностями, которые попадают на вход нашему графу. Таким образом, мы продвигаемся по графу, формируя множество гипотез. У каждой гипотезы есть вес, который формируется из вероятностей от акустической модели и вероятностей от языковой модели (располагаются на ребрах графа).
Настоящий граф распознавания в миллион раз больше, чем наш игрушечный пример, поэтому в какой-то момент гипотез станет слишком много и не хватит никакой оперативной памяти, чтобы их все тянуть. Чтобы такого не произошло, применяют различные методы сокращения числа гипотез. Зачастую это два простых критерия: гипотез не должно быть больше некоторого числа и любая гипотеза не должна проигрывать лучшей гипотезе слишком сильно.

Теперь, когда мы немного разобрались в теории, перейдем к советам, что лучше делать и чего лучше не делать при диктовке.


У ли СУ


Одна из наиболее частых ошибок, которые совершают пользователи — это диктовка по слогам. Мы обучаем систему на обычной речи, поэтому растягивание слов по слогам только путает систему. При диктовке по слогам все гласные в слове превращаются в ударные, фонемы произносятся дольше, появляются паузы между слогами. Все это приводит к печальному результату, когда слова разбиваются на кучу односложных фрагментов. Например, сказав Voco по слогам «выбежать на улицу» получим такой результат: «Вы без жать на у ли СУ» или такой: «Вы без жать на у лису», но точно не то, что нам надо.

Совет: говорите естественно, как среднестатистический человек.


Как даже черт возьмет тебя



Некоторые люди очень быстро говорят. При этом зачастую такая речь очень редуцирует слова: проглатываются предлоги, не проговариваются окончания, длинные слова превращаются в черт знает что, например, вместо «Александр Александрович» произносится панибратское «Сан Саныч». Люди зачастую без проблем понимают такую речь, так как мозг восстанавливает недостающую информацию, но алгоритмы распознавания речи справляются с этой проблемой с трудом. Например, человек вместо «красная машина» произнес «красн машин». Во время распознавания наша правильная гипотеза получит очень маленькие вероятности при прохождении через проглоченные фонемы окончания слов и в итоге набранного веса ей может не хватить для победы, а победит какая-нибудь «краса Маши».
Некоторые частотные сокращения при произношении мы учли. Например, если вы скажете «чо» вместо «что» или «здрасьте» вместо «здравствуйте», то это не повлияет на результат распознавания, так как мы добавили соответствующие транскрипции в наш граф. Вторая неприятность, которая может поджидать любителя подиктовать с высокой скоростью — синтагмовые омофоны.
«Вздыхал и думал про себя,
Как даже черт возьмет тебя.»

Совет: если вы склонны к очень быстрой речи, постарайтесь более четко проговаривать слова. Короткие паузы между словами помогут вам соблюдать более медленный темп и не проглатывать куски слов.


Пол лапы ралли но


Еще одной проблемой для распознавания являются «эканья- меканья» и запинки: человек начинает говорить слово, ошибается, обрывает его на половине, а затем произносит правильно. Например, человек произносит «пала параллельно». Слова «пала» в словаре нет, поэтому в таких случаях результат распознавания может очень удивить: например, запинка и само слово могут слиться в одно похожее по звучанию или результат распознавания будет состоять из нескольких маленьких слов также похожих по звучанию, например «пол лапы ралли но».
Также длительная пауза может привести к тому, что декодер посчитает, что вы закончили предложение, а значит, оборвется согласование с уже сказанными словами.

Совет: продумайте заранее, что вы хотите сказать, так как это значительно сокращает количество длительных пауз и запинок в речи.


Ночь. Улица. Фонарь. Аптека.


Короткие фразы распознаются хуже, чем длинные. В коротких фразах, особенно однословных практически не работает языковая модель. Слово «машина» на слух трудноотличимо от слов: «машине», «машину», «машины», а языковая модель в этом случае опирается только на встречаемость слова в тренировочных данных, что, по сути, не несет никакой полезной информации. В то же время слово «машине» во фразе «он приехал на машине» должно отлично распознаться, так как языковая модель, опираясь на уже распознанный контекст «приехал на», сделает правильный выбор. К коротким фразам относятся и фразы с длительными паузами между словами, так как в этом случае из работы языковой модели исключается весь контекст произнесения слова до паузы.

Совет: избегайте очень коротких фраз. Если это невозможно, то постарайтесь четко проговаривать окончания.


Я этого не говорил


Случается так, что распознается не только то, что вы говорите, но и речь вашего соседа. В итоге письмо, которое вы набираете голосом, похоже на письмо дяди Федора маме: «Шерсть облазит, хвост отваливается.» Особенно сильно это проявляется при использовании удаленного микрофона на ноутбуке или web-камеры. Мы стараемся улучшить качество распознавания в шумах и отделить фоновую речь, но в случаях, когда пользователь молчит, распознавание может настроиться и на тихую фоновую речь.

Совет: качественная гарнитура и тихая обстановка помогут улучшить качество распознавания.


Как кола


Voco распознает русскую речь, но некоторые популярные английские слова, названия компаний и продуктов программе также под силу. Например, «Coca-Cola», «Windows» прекрасно распознаются. Но есть небольшая проблема: в английской речи есть звуки, которых в русской речи нет. Для решения этой проблемы мы транскрибировали английские слова наиболее похожими русскими фонемами, поэтому и произносить их стоит на русский манер. Например, «Кока-Кола». [koka kola]. Не стоить демонстрировать свой отличный британский акцент [k’??k? k’??la].

Совет: Произносите английские слова с русским акцентом.


Глубокая Кутра штыка Буланова бока и курящих банк рынка


Бывает, что слово не распознается, несмотря на то, что вы очень стараетесь и соблюдаете все наши рекомендации. Возможно, причина в том, что этого слова нет в словаре распознавания. Мы обучали языковую модель на общей тематике (политика, экономика, культура, спорт и т.п.) и в словарь попали примерно 300 тысяч самых частотных слов. Поэтому скорее всего там нет узкоспециализированных терминов или фамилии вашего начальника. Итак, пользователь диктует письмо клиенту: уважаемый Владимир обязательно, Владимир бежать им, без всяких, безо 1, безликим. Снова и снова пользователь произносит фамилию клиента — Безякин, варьирует произношения, скорость произнесения, акцентирует ударение, но нужная фамилия не распознается.
Вот так вот известная фраза лингвиста Шербы «Гло?кая ку?здра ште?ко будлану?ла бо?кра и курдя?чит бокрёнка» превратилась в штык Булановой и курящую банку.
Чтобы необходимые вам слова, неизвестные языковой модели, распознавались корректно, следует воспользоваться адаптацией модели распознавания под ваши нужды. Если вы набираете тексты, например, по биоинформатике, то лучше всего взять тексты по биоинформатике и дообучить систему на них.
При дообучении по новым текстам строится маленькая языковая модель, которая будет участвовать в распознавании вместе с основной моделью. То есть теперь вес, который мы получаем от языковой модели, будет складываться из двух весов: веса от основной языковой модели и вес от адаптационной модели.
Адаптировать систему по текстам намного правильнее, чем добавлять в словарь распознавания отдельные слова. Добавление отдельного слова не дает нам информации, как употребляется это слово, как оно склоняется и т.п., поэтому возможны ошибки при распознавании окончаний.

Совет: адаптируйте распознавание под вашу тематику на ваших текстах или добавьте необходимые слова в словарь распознавания.


PS: Данный текст записан голосом с помощью приложения #Voco. А посмотреть, как это происходило можно на видео:


Литература для Geek’ов:
1. Тема конечных автоматов для распознавания речи хорошо описана здесь: Mohri, M., Pereira, F., & Riley, M. Speech recognition with weighted finite-state transducers. In Springer Handbook of Speech Processing (pp. 559-584). Springer Berlin Heidelberg 2008.
2. Или в книге www.morganclaypool.com/doi/abs/10.2200/S00462ED1V01Y201212SAP010
3. По нейронным сетям, которые используются в акустических моделях можно почитать www.amazon.com/Automatic-Speech-Recognition-Communication-Technology/dp/1447157788/ref=sr_1_1?s=books&ie=UTF8&qid=1447854516&sr=1-1&keywords=speech+recognition

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


  1. Sleuthhound
    18.12.2015 21:58

    Тестировал Voco пару недель, для меня загадка и непонятность:
    1. Voco ставиться только на Windows x64, а для работы нужен Office x86 — зачем так сделано? Это оооочень неудобно и сразу ограничивает круг использования приложения. Мы не стали его покупать только потому, что на многих ПК стоит либо Win x64 + Office x64 — Voco не будет работать или стоит Win x86 + Office x86 — Voco опять не будет работать.
    2. Что Вы туда напихали для оффлайн распознавания, что оно устанавливается и занимает 2 с лишним гига?
    3. Будет ли у Voco API для разработки и использования его в своем софте?

    А так в принципе распознает неплохо, вот только нужен довольно мощный ПК, на каком нить Atom бесполезно использовать Voco.


    1. VioletGiraffe
      18.12.2015 22:58

      А не подскажете оффлайн-распознавалку, которая нормально заработает на Атоме (рус. или англ.)? Я так понял, вы в теме.


      1. eugenelanda
        18.12.2015 23:05

        Оффлайн распознавалки под Atom вряд ли вы найдете. ASR вещь увесистая. Поэтому все что есть работает через облако.


      1. Sleuthhound
        19.12.2015 21:29

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


    1. eugenelanda
      18.12.2015 23:03

      Спасибо за комментарий. Очень приятно видеть среди Geek'ов одного из первых пользователей продукта. Отвечаю:
      1. Движок ASR изначально был разработан под 64-битные ОС. Поскольку подавляющее большинство ПК сейчас именно x64, то перевод ASR на x86 мы отложили до следующих релизов. Хотя не скрою, запросы такие от пользователей тоже есть. Более актуальной задачей сейчас является поддержка всех популярных редакций MS Office, включая недавно выпущенный Office 2016. И, конечно же, Office x64. На самом деле Office необходим только для той версии программы Voco, которая поддерживает конвертацию аудио в текст. Для сценария диктовки подойдет любой office, так как приложение фактически имитирует клавиатуру и работает в любом текстовом поле. Но поскольку запросы именно на конвертацию аудио в текст очень востребованы, то именно эту задачу мы сейчас и реализуем. Ну и небольшой анонс: обновленная версия с поддержкой Office x64 и большинства редакций выйдет уже в январе 2016. Естественно, ее смогут скачать и установить и те, у кого пробный период предыдущей версии уже закончился.
      2.Больше всего весит языковая модель, так как она состоит из десятков миллионов N-грамм. Плюс пунктуатор, т.е. по сути та же языковая модель, но для автоматической пунктуации. Плюс большое количество фонем. Тем ни менее, ASR для Voco уже был оптимизирован — изначально он весил ок. 4 ГБ. Но вы правы, надо вести работы по дальнейшей оптимизации.
      3.Видимо, рано или поздно жизнь заставит предоставить API для встраивания сторонними разработчиками. Несколько запросов уже таких было. Что ж, будем думать и работать дальше. Пока задачи — это добиться еще лучшего качества, в частности, на удаленных микрофонах, кое что уже для этого сделано и войдет в январский релиз. Добавить возможность голосового редактирования ну и много чего еще.
      Ну а что касается мощного компьютера, ну не знаю, если посмотреть то, что продается в магазинах Core i5 4 ГБ уже практически стандарт и назвать такой ПК особо мощным как-то даже стыдно.


      1. Sleuthhound
        19.12.2015 21:26

        К сожалению офисные ПК зачастую не Core i5 и даже не Core i3, а какие-нибудь Celeron 1,8 — 2,4 GHz с 1-2 Гб ОЗУ, редко 4Гб ибо более мощные для работы с офисными программами и не нужны и не покупаются большинством компаний. Поэтому и используется Windows x86 т.к. x64 просто не потянет на таком железе. Так что делайте выводы и выбор, на кого Вы больше ориентируйтесь в продаже Voco — на рынок физиков или рынок юриков.


        1. mbait
          22.12.2015 03:06

          А как это разрядность процессора влияет на производительность?


          1. Sleuthhound
            22.12.2015 09:02
            -1

            Разрядность процессора и его тактовая частота — это основные характеристики процессора, от которых зависит производительность компьютера. Чем выше разрядность и тактовая частота, тем выше производительность процессора.
            Разрядность процессора — размеры регистров (в битах). Рассказать что такое регистры? Думаю Вам лучше почитать книжку про архитектуру процессоров, начать хотя бы с простеньких Intel 8008 и 8086 (8-битный и 16-битный процессоры от Intel) и поехали вверх. С 70-х годов мало что изменилось в основных понятиях о процессорах, таких как регистры, шины, работа с памятью, система команд, тех.процесс и т.д.


  1. zomby
    19.12.2015 21:52
    +2

    Посмотрел видео и понял суть: надо говорить как синтезатор речи. Тогда компьютер примет тебя за своего и с радостью поможет. Надо вызвать у машины эмпатию :)


  1. keith
    22.12.2015 21:48

    Приколько получилось с «чо» и «здрасьте»:
    youtu.be/J8f8L__fZMg?t=857
    «То это не повлияет на результат распознавания...» )
    Спасибо, что не стали перезаписывать, а показываете честно!


    1. eugenelanda
      23.12.2015 00:12

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


      1. keith
        23.12.2015 01:57

        Т.е. статистически должно было распознаться как «что» и «здравствуйте», но вы это учли, чтобы было именно «чо» и «здрасьте»?


  1. eugenelanda
    23.12.2015 13:10

    Да, верно. Для слова «что» две транскрипции: «чо» и «что», и для «здравствуйте» две.
    Но мы замешивали нашу модель со спонтанной речью и там есть слова «чо» и «здрасьте».
    Поэтому ям выбирает правильный вариант.