Изключително бързо разпознаване на речбез сървъри на реален пример

В тази статия ще ви разкажа подробно и ще ви покажа как бързо и правилно да внедрите разпознаване на български говор на енджин Pocketsphinx (за iOS, порт на OpenEars), използвайки реален Hello World пример за управление на домакински уреди. Защо домакински уреди? Да, защото благодарение на този пример можете да оценитебързината и точността, които могат да бъдат постигнати при използване нанапълно локалноразпознаване на реч без сървъри катоGoogle ASRилиYandex SpeechKit.Също така прикачвам всички изходни кодове на програмата и сборката за Android към статията.

Защо изведнъж?

Защо се нуждаем от нещо друго освен Yandex и Google?

Като това „практическо приложение“ избрах темата заинтелигентен домашен гласов контрол. Защо този пример? Защото на него можете да видите онези няколко предимства на напълно локалното разпознаване на реч пред разпознаването с помощта на облачни решения. а именно:

  • Скорост- ние не зависим от сървърите и следователно не зависим от тяхната наличност, пропускателна способност и т.н. фактори
  • Точност- нашата машина работи само с речника, от който нашето приложение се интересува, като по този начин повишава качеството на разпознаване
  • Цена- не трябва да плащаме за всяка заявка към сървъра
  • Гласова активация- като допълнителен бонус към първите точки - можем постоянно да "слушаме ефир", без да губим трафик и без да натоварваме сървъра

Така че Android може да разпознава речта без интернет!

Да, да ... Само на JellyBean. И то само от половин метър, не повече. И това разпознаване е същата диктовка, само че се използва много по-малък модел. Така че ние също не можем да го управляваме и конфигурираме. И в какво ще ни върне тяследващия път не се знае. Въпреки че за SMS-ок точно!

И какво ще правим?

Ние ще активираме микрофона или чрез глас, или като щракнете върху иконата на микрофона, или дори като просто поставите ръката си върху екрана. Екранът от своя страна може да бъде напълно изключен.

Какво е Джобен сфинкс

Ще можем да „захраним“ българския езиков модел (можете да го намерите в източниците) и граматиката на потребителските заявки към механизма за разпознаване. Точно това ще разпознае нашето приложение. Не може да разпознае нищо друго. И следователно почти никога няма да произведе нещо, което не очакваме.

Pocketsphinx може също да работи върху статистически езиков модел, който ви позволява да разпознавате спонтанна реч, която не е описана от контекстно-свободна граматика. Но за нашата задача това просто не е необходимо. Нашата граматика ще се състои само от имена на устройства. След процеса на разпознаване Pocketsphinx ще ни върне редовен ред текст, където устройствата ще вървят едно след друго.

Знакът плюсозначава, че потребителят може да посочи не едно, а няколко устройства подред. Приложението получава списък с устройства от интелигентния домашен контролер (виж по-долу) и формира такава граматика в класа Grammar.

Транскрипции

разпознаване
Граматиката описвакакво може да каже потребителят. За да знае Pocketsphinxкакще я произнесе, е необходимо да напишете за всяка дума от граматиката как звучи в съответния езиков модел. Тоесттранскрипцияна всяка дума. Това се наричаречник.

Транскрипциите се описват с помощта на специален синтаксис. Например:

По принцип нищо сложно. Двойната гласна в транскрипцията означава ударение. Двойна съгласна - мека съгласна, закойто идва с гласна. Всички възможни комбинации за всички български звукове могат да бъдат намерени в самия езиков модел.

Ясно е, че не можем да опишем предварително всички транскрипции в нашето приложение, тъй като не знаем предварително имената, които потребителят ще даде на своите устройства. Затова ние ще генерираме такива транскрипции в движение по някои правила на българската фонетика. За да направите това, можете да имплементирате такъв клас PhonMapper, който може да получи низ като вход и да генерира правилната транскрипция за него.

Гласово активиране

Това е способността на машината за разпознаване на реч да „слуша ефира“ през цялото време, за да отговори на предварително дефинирана фраза (или фрази). Всички други звуци и реч ще бъдат отхвърлени. Не е същото като да опишеш граматика и просто да включиш микрофона. Тук няма да давам теорията на тази задача и механиката как работи. Позволете ми само да кажа, че наскоро програмистите, работещи върху Pocketsphinx, внедриха такава функция и сега тя е достъпна извън кутията в API.

Едно нещо определено си струва да се спомене. За фразата за активиране е необходимо не само да посочите транскрипцията, но и да изберете подходящатастойност на прага на чувствителност. Твърде малката стойност ще доведе до много фалшиви положителни резултати (това е, когато не сте казали фразата за активиране, но системата я разпознава). И твърде високо - до имунитета. Следователно тази настройка е от особено значение. Приблизителният диапазон от стойности е от 1e-1 до 1e-40в зависимост от фразата за активиране.

Започваме разпознаването

Pocketsphinx предоставя удобен API за конфигуриране и стартиране на процеса на разпознаване. Това са класоветеSppechRecognizerиSpeechRecognizerSetup. Ето как изглежда конфигурацията и стартиранеторазпознаване:

Тук първо копираме всички необходими файлове на диск (Pocketpshinx изисква акустичен модел, граматика и речник за транскрипция на диск). След това се конфигурира самият механизъм за разпознаване. Указват се пътищата до файловете на модела и речника, както и някои параметри (праг на чувствителност за фразата за активиране). След това се конфигурира пътят до граматичния файл, както и фразата за активиране.

Както можете да видите от този код, един двигател е конфигуриран едновременно за разпознаване на граматика и активираща фраза. Защо се прави това? За да можем бързо да превключваме между това, което в момента трябва да разпознаем. Ето как изглежда стартирането на процеса на разпознаване на фраза за активиране:

И така - разпознаване на реч по зададена граматика:

Вторият аргумент (незадължителен) е броят милисекунди, след който разпознаването автоматично ще приключи, ако никой не каже нищо. Както можете да видите, можете да използвате само една машина, за да разрешите и двата проблема.

Как да получите резултат от разпознаването

За да получите резултата от разпознаването, вие също трябва да посочите слушател на събития, който имплементира интерфейсаRecognitionListener. Той има няколко метода, които се извикват от pocketsphinx, когато настъпи едно от събитията:

  • onBeginningOfSpeech- двигателят чу някакъв звук, може би е реч (или може би не)
  • onEndOfSpeech- звукът е приключил
  • onPartialResult— има междинни резултати от разпознаване. За фраза за активиране това означава, че е работила. АргументътХипотезасъдържа данни за разпознаване (низ и резултат)
  • onResult— краен резултат от разпознаването. Този метод щеизвикан след извикване на методаstopнаSpeechRecognizer. АргументътХипотезасъдържа данни за разпознаване (низ и резултат)

Като внедрите методите onPartialResult и onResult по един или друг начин, можете да промените логиката на разпознаване и да получите крайния резултат. Ето как се прави за нашето приложение:

Когато получим събитието onEndOfSpeech и разпознаем команда, която трябва да бъде изпълнена, тогава трябва да спрем разпознаването, след което onResult ще бъде извикан веднага. В onResult трябва да проверим какво току-що е разпознато. Ако това е команда, тогава трябва да я изпълните и да превключите двигателя към разпознаване на фразата за активиране. В onPartialResult ние се интересуваме само от разпознаването на фразата за активиране. Ако го открием, веднага започваме процеса на разпознаване на командата. Ето как изглежда:

Тук първо пускаме малък сигнал, за да уведомим потребителя, че сме го чули и сме готови за неговата команда. През това време микрофонът трябва да е изключен. Затова започваме разпознаването след малък таймаут (малко по-дълъг от продължителността на сигнала, за да не чуем ехото му). Той също така стартира нишка, която ще принуди разпознаването да спре, ако потребителят говори твърде дълго. В този случай това е 3 секунди.

Как да превърнете разпознат низ в команди

Е, всичко вече е специфично за конкретно приложение. В случая с голия пример, ние просто изваждаме имената на устройствата от реда, търсим желаното устройство и или променяме състоянието му, като използваме HTTP заявка към интелигентния домашен контролер, или съобщаваме текущото му състояние (както в случая с термостат). Тази логика може да се види в класа Controller.

Как да синтезираме речта

Синтез на реч -Това е операцията, обратна на разпознаването. Тук е обратното – трябва да превърнем ред от текст в реч, така че потребителят да го чуе. В случай на термостат, трябва да накараме нашето устройство с Android да казва текущата температура. С помощта на APITextToSpeechтова се прави доста лесно (благодарим на Google за красивия женски TTS за българския език):

Вероятно ще кажа, че е банално, нопреди процеса на синтез е необходимо да изключите разпознаването. На някои устройства (например всички телефони на Samsung) обикновено е невъзможно да слушате микрофон и да синтезирате нещо едновременно Краят на синтеза на реч (т.е. краят на процеса на изговаряне на текст със синтезатор) може да бъде проследен в слушателя:

В него просто проверяваме дали има нещо друго в опашката за синтез и включваме разпознаването на фраза за активиране, ако няма нищо друго.

да Както можете да видите, не е трудно бързо и точно да разпознаете речта директно на устройството, благодарение на наличието на такива прекрасни проекти като Pocketsphinx. Той предоставя много удобен API, който може да се използва за решаване на проблеми, свързани с разпознаването на гласови команди.

В този пример сме обвързали разпознаването с доста специфична задача -гласово управление на интелигентни домашни устройства. Благодарение на локалното разпознаване постигнахме много висока скорост на работа и сведехме до минимум грешките. Ясно е, че същият код може да се използва за други задачи, свързани с гласа. Не е задължително да е умен дом.

Всички източници, както и самото сглобяване на приложението, можете да намерите в хранилището на GitHub. Също така в моя канал в YouTube можете да видите някои други реализации на гласов контрол, а не само интелигентни домашни системи.