Ultra-бързо разпознаване на реч и сървъри без реален пример


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

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

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

Тъй като много "практическото прилагане" Аз избрах темата за гласов контрол умен дом.
Защо този пример? Тъй като това е възможно да се види от малкото предимства на напълно местен разпознаване на реч пред разпознаване с помощта на облачни решения. А именно:

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

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

Тъй като Android е в състояние да разпознава реч без интернет!

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

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

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

За тази практическа тегло приложение

Какво е Pocketsphinx

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

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

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

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

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

Ultra-бързо разпознаване на реч и сървъри без реален пример

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

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

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

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

гласова активация

Това разпознаване на речта на двигателя през цялото време ", за да слушат за излъчване", за да се отговори на предварително определена фраза (или фрази). В този случай, всички други звуци и ще бъдат отхвърлени. Това не е същият като този, описан граматика и трябва само да включите микрофона. Дайте тук теория на този проблем и механиката на това как тя работи, аз няма. Освен да кажа само, че наскоро програмисти, работещи по PocketSphinx, изпълнена тази функция, а сега тя е на разположение "извън кутията" в API.

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

Активирането на сензора за близост

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

стартирате разпознаване

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

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

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

И това е - raspozanvanie реч, изнесена граматика:

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

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

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

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

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

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

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

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

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

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

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

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

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

Това ли е всичко?

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

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

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