.NET ish stoli ilovalari yordamida nutqni aniqlash. Haqiqiy misol yordamida serverlarsiz ultra tez nutqni aniqlash Android 6.0 da oflayn nutqni aniqlash

) maishiy texnikani boshqarishning haqiqiy Hello World misolidan foydalanish.
Nima uchun maishiy texnika? Ha, chunki bunday misol tufayli siz buni qadrlashingiz mumkin tezlik va aniqlik foydalanish orqali erishish mumkin butunlay mahalliy kabi serverlarsiz nutqni aniqlash Google ASR yoki Yandex SpeechKit.
Shuningdek, men maqolaga dasturning barcha manba kodini va Android uchun yig'ilishning o'zini ilova qilaman.

Nega birdan?

Yaqinda bunga duch kelib, men muallifdan nima uchun u o'z dasturi uchun serverga asoslangan nutqni aniqlashdan foydalanishni xohlayotganini so'radim (mening fikrimcha, bu keraksiz edi va ba'zi muammolarga olib keldi). Shu maqsadda men hech narsani tanib olishning hojati bo'lmagan loyihalar uchun muqobil usullardan foydalanishni batafsil tasvirlab bera olamanmi va lug'at cheklangan so'zlar to'plamidan iborat. Va hatto amaliy qo'llash misoli bilan ...

Nima uchun bizga Yandex va Googledan boshqa narsa kerak?

O'sha "amaliy dastur" uchun men mavzuni tanladim aqlli uy uchun ovozli boshqaruv.
Nima uchun aynan shu misol? Chunki u bulutli yechimlardan foydalangan holda tanib olishdan ko'ra butunlay mahalliy nutqni tanib olishning bir qancha afzalliklarini ko'rsatadi. Aynan:
  • Tezlik- biz serverlarga bog'liq emasmiz va shuning uchun ularning mavjudligi, tarmoqli kengligi va boshqalarga bog'liq emasmiz. omillar
  • Aniqlik- bizning dvigatelimiz faqat ilovamizni qiziqtiradigan lug'at bilan ishlaydi va shu bilan tanib olish sifatini oshiradi
  • Narxi- biz serverga har bir so'rov uchun to'lashimiz shart emas
  • Ovozli faollashtirish- birinchi ball uchun qo'shimcha bonus sifatida - biz trafikni behuda sarf qilmasdan va serverlarni yuklamasdan doimiy ravishda "efirni tinglashimiz" mumkin.

Eslatma

Bu afzalliklarni afzallik deb hisoblash mumkinligi haqida darhol rezervlashimga ruxsat bering faqat ma'lum bir toifadagi loyihalar uchun, Biz qayerdamiz oldindan aniq bilamiz, foydalanuvchi qaysi lug'at va qaysi grammatika bilan ishlaydi. Ya'ni, biz o'zboshimchalik bilan matnni tanib olishimiz kerak bo'lmaganda (masalan, SMS xabar yoki qidiruv so'rovi). Aks holda, bulutni tanib olish ajralmas hisoblanadi.

Shunday qilib, Android nutqni Internetsiz taniy oladi!
Ha, ha... Faqat JellyBean-da. Va faqat yarim metrdan, ortiq emas. Va bu tanib olish bir xil diktant, faqat juda kichikroq model yordamida. Shuning uchun biz ham uni boshqara olmaymiz yoki sozlay olmaymiz. Va keyingi safar u bizga nima qaytishi noma'lum. Garchi SMS uchun to'g'ri bo'lsa ham!

Nima qilamiz?

Biz maishiy texnika uchun bir necha metrdan va hatto arzon, yomon, juda arzon Android smartfonlari, planshetlari va soatlarida aniq va tez ishlaydigan ovozli pultni amalga oshiramiz.
Mantiq oddiy, lekin juda amaliy bo'ladi. Biz mikrofonni faollashtiramiz va bir yoki bir nechta qurilma nomini aytamiz. Ilova ularni taniydi va joriy holatga qarab ularni yoqadi va o'chiradi. Yoki ulardan boylik oladi va uni yoqimli ayol ovozida talaffuz qiladi. Masalan, xonadagi joriy harorat.

Amaliy ilovalar juda ko'p

Ertalab siz ko'zingizni ochmasdan, tungi stol ustidagi smartfon ekraniga kaftingizni urib, “Xayrli tong!” deb buyruq berdingiz. - skript boshlanadi, kofe qaynatgich yoqiladi va g'o'ldiradi, yoqimli musiqa yangraydi, pardalar ochiladi.
Keling, har bir xonada devorga arzon (2 ming, ortiq emas) smartfon osib qo'yaylik. Biz ishdan keyin uyga boramiz va bo'shliqqa buyruq beramiz "Aqlli uy! Chiroqlar, televizor! - Menimcha, keyin nima bo'lishini aytishga hojat yo'q.

Transkripsiyalar



Grammatika nimani tasvirlaydi foydalanuvchi nima deyishi mumkin. Pocketsphinx bilish uchun, Qanaqasiga u uni talaffuz qiladi, grammatikadan har bir so'z tegishli til modelida qanday jaranglashini yozishi kerak. Ya'ni transkripsiya har bir so'z. U deyiladi lug'at.

Transkripsiya maxsus sintaksis yordamida tasvirlanadi. Masalan:
aqlli uu m n ay j uy d oo m

Aslida, hech qanday murakkab narsa yo'q. Transkripsiyadagi qo'sh unli stressni bildiradi. Qo‘sh undosh yumshoq undoshdan keyin unli bo‘ladi. Rus tilining barcha tovushlari uchun barcha mumkin bo'lgan kombinatsiyalar.

Ilovamizdagi barcha transkripsiyalarni oldindan tasvirlab bera olmasligimiz aniq, chunki foydalanuvchi o'z qurilmalariga beradigan nomlarni oldindan bilmaymiz. Shuning uchun biz rus fonetikasining ba'zi qoidalariga muvofiq bunday transkripsiyalarni "parvozda" yaratamiz. Buni amalga oshirish uchun siz quyidagi PhonMapper sinfini qo'llashingiz mumkin, u qatorni kirish sifatida qabul qilishi va uning uchun to'g'ri transkripsiyani yaratishi mumkin.

Ovozli faollashtirish

Bu nutqni aniqlash mexanizmining oldindan belgilangan iboraga (yoki iboralarga) munosabat bildirish uchun doimo "efirni tinglash" qobiliyatidir. Shu bilan birga, barcha boshqa tovushlar va nutqlar o'chiriladi. Bu grammatikani tasvirlash va mikrofonni yoqish bilan bir xil emas. Men bu erda ushbu vazifaning nazariyasini va uning qanday ishlashi mexanikasini taqdim etmayman. Aytmoqchimanki, yaqinda Pocketsphinx-da ishlaydigan dasturchilar bunday funktsiyani amalga oshirdilar va endi u API-da qutidan tashqarida mavjud.

Bir narsani albatta aytib o'tish joiz. Faollashtirish iborasi uchun siz nafaqat transkripsiyani belgilashingiz, balki tegishlisini tanlashingiz kerak. sezgirlikning chegara qiymati. Juda kichik qiymat ko'plab noto'g'ri pozitivlarga olib keladi (bu siz faollashtirish iborasini aytmagansiz, lekin tizim buni tan oladi). Va juda yuqori - immunitetga. Shuning uchun bu parametr alohida ahamiyatga ega. Qiymatlarning taxminiy diapazoni - 1e-1 dan 1e-40 gacha faollashtiruvchi iboraga qarab.

Yaqinlik sensorini faollashtirish

Bu vazifa bizning loyihamizga xos bo'lib, tan olish bilan bevosita bog'liq emas. Kodni bevosita asosiy faoliyatda ko'rish mumkin.
U amalga oshiradi SensorEventListener va yaqinlashish vaqtida (sensor qiymati maksimaldan past) u taymerni yoqadi, ma'lum bir kechikishdan keyin sensor hali ham bloklanganligini tekshiradi. Bu noto'g'ri pozitivlarni yo'q qilish uchun amalga oshiriladi.
Sensor qayta bloklanmaganda, biz tanib olishni to'xtatamiz, natijani olamiz (quyida tavsifga qarang).

Keling, tan olishni boshlaylik

Pocketsphinx tanib olish jarayonini sozlash va ishga tushirish uchun qulay API taqdim etadi. Bu sinflar SpechRecognizer Va SpeechRecognizerSetup.
Tanib olishni sozlash va ishga tushirish quyidagicha ko'rinadi:

PhonMapper phonMapper = yangi PhonMapper(getAssets().open("dict/ru/hotwords")); Grammatika grammatikasi = yangi Grammatika(nomlar, phonMapper); grammar.addWords(issiq so'z); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); Fayl hmmDir = yangi fayl (dataFiles.getHmm()); Fayl dict = yangi Fayl(dataFiles.getDict()); jsgf fayl = yangi fayl(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecog); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

Bu erda biz birinchi navbatda barcha kerakli fayllarni diskka nusxalaymiz (Pocketpshinx diskda bo'lishi uchun akustik model, grammatika va transkripsiyalari bilan lug'at talab qiladi). Keyin tanib olish mexanizmining o'zi sozlanadi. Modelga va lug'at fayllariga yo'llar, shuningdek, ba'zi parametrlar (faollashtirish iborasi uchun sezgirlik chegarasi) ko'rsatilgan. Keyinchalik, grammatika bilan faylga yo'l, shuningdek faollashtirish iborasi sozlangan.

Ushbu koddan ko'rinib turibdiki, bitta vosita grammatika va faollashtiruvchi iboralarni aniqlash uchun sozlangan. Bu nima uchun qilingan? Shunday qilib, biz hozir tan olishimiz kerak bo'lgan narsalarni tezda almashtirishimiz mumkin. Faollashtirish iborasini aniqlash jarayonini boshlash shunday ko'rinadi:

MRecognizer.startListening(KWS_SEARCH);
Va ma'lum bir grammatika bo'yicha nutq shunday tan olinadi:

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Ikkinchi argument (ixtiyoriy) - bu millisekundlar soni, undan keyin hech kim hech narsa demasa, tanib olish avtomatik ravishda tugaydi.
Ko'rib turganingizdek, ikkala muammoni hal qilish uchun faqat bitta dvigateldan foydalanishingiz mumkin.

Tan olish natijasini qanday olish mumkin

Tanib olish natijasini olish uchun siz interfeysni amalga oshiradigan voqea tinglovchisini ham ko'rsatishingiz kerak RecognitionListener.
Hodisalardan biri sodir bo'lganda, u pocketsphinx tomonidan chaqiriladigan bir nechta usullarga ega:
  • onBeginningOfSpeech- dvigatel qandaydir ovoz eshitdi, ehtimol bu nutqdir (yoki yo'q)
  • onEndOfSpeech- tovush tugaydi
  • onPartialResult- oraliq tan olish natijalari mavjud. Faollashtirish iborasi uchun bu ishlaganligini anglatadi. Dalil Gipoteza
  • onResult- tan olishning yakuniy natijasi. Ushbu usul usul chaqirilgandan keyin chaqiriladi STOP da SpeechRecognizer. Dalil Gipoteza tanib olish ma'lumotlarini o'z ichiga oladi (string va ball)

OnPartialResult va onResult usullarini u yoki bu tarzda amalga oshirish orqali siz tanib olish mantig'ini o'zgartirishingiz va yakuniy natija olishingiz mumkin. Bizning arizamizda bu qanday amalga oshiriladi:

@Override public void onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) (mRecognizer.stop(); ) ) @Override public void onEndOfSpeech() ) @Override public void onEndOfSpeech() ) ( if (gipoteza == null) qaytish; String text = hypothesis.getHypstr(); agar (KWS_SEARCH.equals(mRecognizer.getSearchName())) ( startRecognition(); ) boshqacha ( Log.d(TAG, matn); ) ) @Override public void onResult(Hipoteza gipotezasi) ( mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); String matni = gipoteza != null ;H: TAG null . , "onResult " + text); agar (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) ( agar (matn != null) ( Toast.makeText(bu, matn, Toast.LENGTH_SHORT).show(); process(matn) ); ) mRecognizer.startListening(KWS_SEARCH); ) )

Biz onEndOfSpeech hodisasini qabul qilganimizda va agar biz bir vaqtning o'zida bajariladigan buyruqni tan olsak, tan olishni to'xtatishimiz kerak, shundan so'ng onResult darhol chaqiriladi.
OnResult-da siz tanilgan narsani tekshirishingiz kerak. Agar bu buyruq bo'lsa, unda siz uni bajarish uchun ishga tushirishingiz va faollashtirish iborasini tanib olish uchun dvigatelni almashtirishingiz kerak.
OnPartialResult-da biz faqat faollashtirish iborasini tan olishga qiziqamiz. Agar biz buni aniqlasak, biz darhol buyruqni aniqlash jarayonini boshlaymiz. Bu qanday ko'rinishga ega:

Shaxsiy sinxronlashtirilgan void startRecognition() ( agar (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); new ToneGenerator(AudioManager.STREAM_MUSICTone. TONE_CDMA_PIP, 200); post (400, yangi Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH0); ".TAGs, 30d buyruqlar"); post (4000, mStopRecognitionCallback); ) )); )
Bu erda biz birinchi navbatda foydalanuvchini eshitganimiz va uning buyrug'iga tayyor ekanligimiz haqida xabardor qilish uchun kichik signalni o'ynaymiz. Bu vaqt ichida mikrofon o'chirilgan bo'lishi kerak. Shuning uchun, biz tanib olishni qisqa vaqtdan keyin boshlaymiz (uning aks-sadosini eshitmaslik uchun signalning davomiyligidan bir oz ko'proq). Bundan tashqari, agar foydalanuvchi juda uzoq vaqt gapirsa, tanib olishni to'xtatadigan mavzuni boshlaydi. Bunday holda, bu 3 soniya.

Qanday qilib tanilgan qatorni buyruqlarga aylantirish mumkin

Xo'sh, bu erda hamma narsa ma'lum bir dasturga xosdir. Yalang'och misolda, biz shunchaki satrdan qurilma nomlarini chiqaramiz, kerakli qurilmani qidiramiz va aqlli uy boshqaruvchisiga HTTP so'rovi yordamida uning holatini o'zgartiramiz yoki uning joriy holati haqida xabar beramiz (masalan, termostat). Ushbu mantiqni Controller sinfida ko'rish mumkin.

Nutqni qanday sintez qilish kerak

Nutq sintezi tanib olishning teskari amalidir. Bu erda aksincha - foydalanuvchi eshitishi uchun matn qatorini nutqqa aylantirishingiz kerak.
Termostat holatida biz Android qurilmamizni joriy haroratni aytishimiz kerak. API dan foydalanish TextToSpeech buni qilish juda oson (rus tili uchun ajoyib ayol TTS uchun Googlega rahmat):

Shaxsiy bekor gapirish (String matni) (sinxronlashtirilgan (mSpeechQueue) (mRecognizer.stop(); mSpeechQueue.add(matn); HashMap params = yangi HashMap (2); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "to'g'ri"); mTextToSpeech.speak(matn, TextToSpeech.QUEUE_ADD, parametrlar); ))

Men, ehtimol, bir narsa deyman, lekin sintez jarayonidan oldin, tanib olishni o'chirib qo'yish kerak. Ba'zi qurilmalarda (masalan, barcha Samsung qurilmalarida) bir vaqtning o'zida mikrofonni tinglash va biror narsani sintez qilish umuman mumkin emas.
Nutq sintezining tugashini (ya'ni sintezator tomonidan matnni gapirish jarayonining tugashini) tinglovchida kuzatish mumkin:

Maxfiy yakuniy TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() ( @Override public void onUtteranceCompleted(String utteranceId) (sinxronizatsiya qilingan (mSpeechQueue) (ue.QuemSpe) (e.QuemSpe)); ( mRecognizer.startListening( KWS_SEARCH); ))) ) );

Unda biz sintez navbatida boshqa biror narsa bor-yo'qligini tekshirib ko'ramiz va agar boshqa hech narsa bo'lmasa, faollashtirilgan iborani aniqlashni yoqamiz.

Va bu hammasi?

Ha! Ko'rib turganingizdek, Pocketsphinx kabi ajoyib loyihalar mavjudligi tufayli nutqni to'g'ridan-to'g'ri qurilmada tez va samarali tanib olish unchalik qiyin emas. Ovozli buyruqlarni tanib olish bilan bog'liq muammolarni hal qilishda foydalanish mumkin bo'lgan juda qulay API taqdim etadi.

Ushbu misolda biz mutlaqo aniq vazifani tan oldik - aqlli uy qurilmalarini ovozli boshqarish. Mahalliy tan olinishi tufayli biz juda yuqori tezlikka erishdik va xatolarni minimallashtirdik.
Xuddi shu kod boshqa ovoz bilan bog'liq vazifalar uchun ishlatilishi mumkinligi aniq. Bu aqlli uy bo'lishi shart emas.

  • ovozli boshqaruv
  • ovozli dvigatel
  • Teglar qo'shing

    Hech bir dastur yozib olingan nutqni transkripsiya qilish bo'yicha qo'l ishini to'liq almashtira olmaydi. Biroq, nutqni matnga tarjima qilishni sezilarli darajada tezlashtiradigan va osonlashtiradigan, ya'ni transkripsiyani soddalashtiradigan echimlar mavjud.

    Transkripsiya - audio yoki video faylni matn shaklida yozib olish. Internetda pullik pullik vazifalar mavjud bo'lib, matnni transkripsiya qilish uchun ijrochiga ma'lum miqdorda pul to'lanadi.

    Nutqni matnga tarjima qilish foydalidir

    • talabalar yozib olingan audio yoki video ma'ruzalarni matnga tarjima qilishlari,
    • veb-saytlar va bloglarni boshqaradigan bloggerlar,
    • yozuvchilar, kitoblar va matnlar yozish uchun jurnalistlar,
    • vebinar, nutq va hokazolardan keyin matnga muhtoj bo'lgan axborot biznesmenlari,
    • yozishda qiynalayotgan odamlar - ular xat yozib, uni oilasi yoki do'stlariga yuborishlari mumkin;
    • boshqa variantlar.

    Biz shaxsiy kompyuterlarda, mobil ilovalarda va onlayn xizmatlarda mavjud bo'lgan eng samarali vositalarni tasvirlab beramiz.

    1 speakpad.ru veb-sayti

    Bu Google Chrome brauzeri yordamida nutqni matnga tarjima qilish imkonini beruvchi onlayn xizmatdir. Xizmat mikrofon va tayyor fayllar bilan ishlaydi. Albatta, agar siz tashqi mikrofondan foydalansangiz va o'zingiz buyursangiz, sifat ancha yuqori bo'ladi. Biroq, xizmat YouTube videolari bilan ham yaxshi ish qiladi.

    "Yozishni yoqish" tugmasini bosing, "Mikrofondan foydalanish" haqidagi savolga javob bering - buning uchun "Ruxsat berish" tugmasini bosing.

    Xizmatdan foydalanish bo'yicha uzoq ko'rsatmalarni rasmdagi 1-tugmani bosish orqali yopish mumkin. 3. Oddiy ro'yxatdan o'tishni to'ldirib, reklamadan xalos bo'lishingiz mumkin.

    Guruch. 3. Speechpad xizmati

    Tayyor natijani tahrirlash oson. Buni amalga oshirish uchun ajratilgan so'zni qo'lda to'g'rilashingiz yoki yana dikta qilishingiz kerak. Ish natijalari shaxsiy hisobingizda saqlanadi, ularni kompyuteringizga ham yuklab olish mumkin.

    Speechpad bilan ishlash bo'yicha video darslar ro'yxati:

    Siz Youtube-dan yoki kompyuteringizdan videolarni transkripsiya qilishingiz mumkin, ammo sizga mikser kerak bo'ladi, batafsilroq:

    Video "audio transkripsiya"

    Xizmat yetti tilda ishlaydi. Kichik minus bor. Bu shundan iboratki, agar siz tayyor audio faylni transkripsiya qilishingiz kerak bo'lsa, unda uning ovozi karnaylar orqali eshitiladi, bu esa aks-sado ko'rinishida qo'shimcha shovqin yaratadi.

    2 Dictation.io xizmati

    Nutqni matnga bepul va oson tarjima qilish imkonini beruvchi ajoyib onlayn xizmat.

    Guruch. 4. Dictation.io xizmati

    1-rasmda. 4 – Sahifaning oxirida rus tilini tanlash mumkin. Google Chrome brauzerida til tanlangan, ammo Mozilla-da ba'zi sabablarga ko'ra bunday imkoniyat yo'q.

    Shunisi e'tiborga loyiqki, tayyor natijani avtomatik saqlash imkoniyati amalga oshirildi. Bu yorliq yoki brauzerni yopish natijasida tasodifiy o'chirishni oldini oladi. Ushbu xizmat tugallangan fayllarni tanimaydi. Mikrofon bilan ishlaydi. Diktant qilishda tinish belgilarini nomlash kerak.

    Matn juda to'g'ri tanilgan, imlo xatolari yo'q. Tinish belgilarini klaviaturadan o'zingiz qo'yishingiz mumkin. Yakunlangan natija kompyuteringizda saqlanishi mumkin.

    3 RealSpeaker

    Bu dastur inson nutqini matnga osonlik bilan tarjima qilish imkonini beradi. U turli xil tizimlarda ishlash uchun mo'ljallangan: Windows, Android, Linux, Mac. Uning yordami bilan siz eshitilgan nutqni mikrofonga aylantirishingiz mumkin (masalan, uni noutbukga o'rnatish mumkin), shuningdek audio fayllarga yozib qo'yishingiz mumkin.

    13 ta dunyo tilini tushuna oladi. Onlayn xizmat sifatida ishlaydigan dasturning beta-versiyasi mavjud:

    Siz yuqoridagi havolaga o'tishingiz, rus tilini tanlashingiz, audio yoki video faylingizni onlayn xizmatga yuklashingiz va uning transkripsiyasi uchun to'lashingiz kerak. Transkripsiyadan so'ng siz olingan matnni nusxalashingiz mumkin. Transkripsiya uchun fayl qanchalik katta bo'lsa, uni qayta ishlash uchun ko'proq vaqt kerak bo'ladi, batafsilroq ma'lumot:

    2017 yilda RealSpeaker yordamida bepul transkripsiya opsiyasi mavjud edi, ammo 2018 yilda bunday imkoniyat yo'q. Transkripsiya qilingan faylni yuklab olish uchun barcha foydalanuvchilar uchun mavjud ekanligi juda chalkash, ehtimol bu yaxshilanadi.

    Dasturni ishlab chiquvchisining aloqalari (VKontakte, Facebook, Youtube, Twitter, elektron pochta, telefon) uning veb-sayti sahifasida (aniqrog'i, saytning pastki qismida):

    4 Nutq qayd qiluvchi

    Android tizimida ishlaydigan mobil qurilmalar uchun oldingi ilovaga muqobil. Ilovalar do'konida bepul mavjud:

    Matn avtomatik ravishda tahrirlanadi va tinish belgilari qo'shiladi. O'zingizga eslatma yozish yoki ro'yxatlar tuzish uchun juda qulay. Natijada, matn juda munosib sifatga ega bo'ladi.

    5 Dragon diktanti

    Bu Apple mobil qurilmalari uchun bepul tarqatiladigan ilova.

    Dastur 15 ta tilda ishlashi mumkin. Bu sizga natijani tahrirlash va ro'yxatdan kerakli so'zlarni tanlash imkonini beradi. Siz barcha tovushlarni aniq talaffuz qilishingiz, keraksiz pauza qilmasligingiz va intonatsiyadan qochishingiz kerak. Ba'zan so'zlarning oxirlarida xatolar mavjud.

    Dragon Dictation ilovasi egalari tomonidan, masalan, kvartira bo'ylab harakatlanayotganda do'konda xaridlar ro'yxatini yozish uchun ishlatiladi. U erga borganimda, eslatmadagi matnga qarashim mumkin va men tinglashim shart emas.

    Amaliyotingizda qaysi dasturdan foydalansangiz ham, natijalarni ikki marta tekshirishga va muayyan tuzatishlar kiritishga tayyor bo'ling. Bu xatosiz mukammal matnni olishning yagona yo'li.

    Shuningdek, foydali xizmatlar:

    Kompyuter savodxonligi bo'yicha so'nggi maqolalarni to'g'ridan-to'g'ri pochta qutingizga oling.
    Allaqachon ko'proq 3000 obunachi

    .

    Mahsulotlar va texnologiyalar:

    Visual Studio, C#, .NET nutq kutubxonalari

    Maqolada muhokama qilinadi:

    • konsol ilovasiga nutqni aniqlash yordamini qo'shish;
    • tan olingan nutqni qayta ishlash;
    • nutqni aniqlash kutubxonalarini o'rnatish;
    • Microsoft.Speech va System.Speech ni solishtirish;
    • Windows Forms ilovasiga nutqni aniqlash yordamini qo'shish.

    Nutq orqali faollashtirilgan shaxsiy yordamchi (shuningdek, bejiz gapirib bo‘lmaydigan meva-kompaniya hamkasbi) Windows Phone Cortana paydo bo‘lishi bilan nutqni qo‘llab-quvvatlaydigan ilovalar dasturiy ta’minotni ishlab chiqishda tobora ko‘proq o‘rin oldi. Ushbu maqolada men Windows konsol ilovalari, Windows Forms ilovalari va Windows Presentation Foundation (WPF) da nutqni aniqlash va sintez qilishni qanday boshlashni ko'rsataman.

    Shuni esda tutingki, siz Windows Phone ilovalari, ASP.NET veb-ilovalari, Windows do'koni ilovalari, Windows RT va Xbox Kinect-ga nutq qobiliyatini ham qo'shishingiz mumkin, ammo usullar ushbu maqolada muhokama qilinganlardan farq qiladi.

    Ushbu maqolada aynan nimani muhokama qilish haqida tasavvurga ega bo'lishning yaxshi usuli - bu ikki xil demo dasturning skrinshotlarini ko'rishdir. guruch. 1 Va 2 . Konsol ilovasini ishga tushirgandan so'ng guruch. 1 darhol "Men uyg'oqman" iborasini aytadi. Albatta, siz ushbu maqolani o'qiyotganda demo ilovasini eshita olmaysiz, shuning uchun u kompyuter aytayotgan matnni ko'rsatadi. Keyin foydalanuvchi "Speech on" buyrug'ini aytadi. Demo ilovasi tanilgan matn bilan javob beradi va keyin ikkita raqam qo'shish so'rovlarini ichki tinglaydi va javob beradi.

    Guruch. 1. Konsol ilovasida nutqni aniqlash va sintez qilish


    Guruch. 2. Windows Forms ilovasida nutqni aniqlash

    Foydalanuvchi ilovadan bir va ikkita, keyin ikkita va uchta qo'shishni so'radi. Ilova aytilgan buyruqlarni tanidi va ovoz bilan javob berdi. Nutqni aniqlashdan foydalanishning foydali usullarini keyinroq tasvirlab beraman.

    Keyin foydalanuvchi "Speech off" dedi, bu ovozli buyruq qo'shimcha buyruqlarni tinglashni o'chiradi, lekin nutqni aniqlashni to'liq o'chirib qo'ymaydi. Ushbu og'zaki buyruqdan so'ng, bitta va ikkita qo'shish uchun keyingi buyruq e'tiborga olinmadi. Nihoyat, foydalanuvchi tinglash buyrug'ini yana yoqdi va ma'nosiz "Klatu barada nikto" buyrug'ini aytdi, bu dastur nutqni aniqlashni butunlay o'chirish va o'zini o'zi tugatish buyrug'i sifatida tan oldi.

    Yoniq guruch. 2 qo'g'irchoq nutq yoqilgan Windows Forms ilovasini ko'rsatadi. Ushbu ilova aytilgan buyruqlarni taniydi, lekin ovozli chiqish bilan ularga javob bermaydi. Ilovani birinchi marta ishga tushirganingizda, nutqni aniqlash faol emasligini ko'rsatuvchi "Speech On" katagiga belgi qo'yilmagan. Foydalanuvchi ushbu katakchani belgilab, keyin "Salom" dedi. Ilova oynaning pastki qismidagi ListBox boshqaruvida tan olingan matnni ko'rsatish orqali javob berdi.

    Keyin foydalanuvchi: "1-matn maydonini qizil rangga qo'ying" dedi. Ilova nutqni tanidi va javob berdi: "Matn qutisi 1 qizil rangga o'rnating", bu deyarli (lekin unchalik emas) foydalanuvchi aytganidek. Garchi yoqilgan bo'lsa ham guruch. 2 Siz buni ko'ra olmaysiz, oynaning yuqori qismidagi TextBox boshqaruvidagi matn chindan ham qizil rangda.

    Keyin foydalanuvchi: "Iltimos, 1-matn maydonini oq rangga o'rnating" dedi. Ilova buni “matn qutisi 1 oq” deb tan oldi va shunday qildi. Foydalanuvchi "Xayr" deb yakunladi va dastur ushbu matnni ko'rsatdi, lekin Windows Forms bilan hech narsa qilmadi, garchi u, masalan, "Speech On" katagiga belgi qo'yishni o'chirib tashlashi mumkin edi.

    Sintezator ob'ektidan foydalanish juda oddiy.

    Keyingi bo'limlarda men sizga ikkala demo-dasturni yaratish, jumladan, kerakli .NET nutq kutubxonalarini o'rnatish jarayonini ko'rsataman. Ushbu maqolada sizda hech bo'lmaganda oraliq dasturlash ko'nikmalaringiz bor, ammo nutqni aniqlash va sintez haqida hech narsa bilmaysiz.

    Konsol ilovasiga nutqni aniqlash yordamini qo'shish

    Ko'rsatilgan demo yaratish uchun guruch. 1, Men Visual Studio dasturini ishga tushirdim va ConsoleSpeech deb nomlangan yangi C# konsol ilovasini yaratdim. Men Visual Studio 2010 va 2012 bilan nutq vositalaridan muvaffaqiyatli foydalandim, ammo har qanday nisbatan yangi versiya yaxshi bo'lishi kerak. Shablon kodini muharrirga yuklaganimdan so'ng, men Solution Explorer oynasidagi Program.cs faylini yanada tavsiflovchi ConsoleSpeechProgram.cs deb o'zgartirdim va Visual Studio men uchun Dastur sinfini qayta nomladi.

    Keyinchalik, men C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly-da joylashgan Microsoft.Speech.dll fayliga havola qo'shdim. Ushbu DLL mening kompyuterimda yo'q edi va men uni yuklab olishim kerak edi. Ilovaga nutqni aniqlash va sintez qilish uchun kerakli fayllarni o'rnatish unchalik ahamiyatsiz emas. Keyingi bo'limda o'rnatish jarayonini batafsil tushuntiraman, ammo hozircha Microsoft.Speech.dll sizning tizimingizda deb faraz qilaylik.

    Nutq DLL ga havola qo'shish orqali men kodning yuqori qismidagi barcha foydalanish iboralarini olib tashladim, bundan tashqari yuqori darajadagi Tizim nom maydoniga ishora qildim. Keyin men Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis va System.Globalization nom maydonlari uchun bayonotlarni qo'shdim. Birinchi ikkita nom maydoni nutq DLL bilan taqqoslanadi. E'tibor bering, System.Speech.Recognition va System.Speech.Synthesis kabi nomlar bo'shliqlari ham bor, ular chalkash bo'lishi mumkin. Men ularning orasidagi farqni qisqacha tushuntiraman. Globallashuv nom maydoni sukut bo'yicha mavjud edi va loyihaga yangi havola qo'shishni talab qilmadi.

    Demo konsol ilovasining barcha manba kodi quyidagi manzilda keltirilgan guruch. 3, va ushbu maqola bilan birga kelgan manba paketida ham mavjud. Mumkin bo'lgan asosiy g'oyalarni yashirmaslik uchun barcha standart xatolarni olib tashladim.

    Guruch. 3. Namoyish konsoli ilovasining manba kodi

    tizimdan foydalanish; Microsoft.Speech.Recognition-dan foydalanish; Microsoft.Speech.Synthesis yordamida; System.Globalization yordamida; nom maydoni ConsoleSpeech ( sinf ConsoleSpeechProgram ( statik SpeechSynthesizer ss = yangi SpeechSynthesizer(); statik SpeechRecognitionEngine sre; statik bool bajarildi = noto‘g‘ri; statik bool nutqOn = rost; statik void Main(etfaultsDevice(string) (strings.Arguts)); ole.WriteLine ("\n(Gaplashmoqda: men uyg'oqman)"); ss.Speak("Men uyg'oqman"); CultureInfo ci = yangi CultureInfo("en-us"); sre = yangi SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; SRE.SpeECHRECHNIZED += SRE_SPEECHRECHRECOGNIZED; Tanlovlar ch_startStopcommands = Yangi tanlovlar (); Ch_StartStopcommands.add ("Gap yoqilgan"); ch_startstopcommands.add ("S Peech Off"); ch_startStopcommands.add ("S Peech Off"); ch_startStopcommands. StartStop = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammatika g_StartStop = yangi Grammatika(gb_StartStop); Tanlovlar ch_Raqamlar = yangi tanlovlar(); ch_Numbers.Add("1"); ch_Raqamlar."Number_Add. Add("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Nima"); gb_WhatIsXplusY.Append(ch_Raqamlar); gb_WhatIsXplusY.Append("ortiqcha"); gb_WhatIsXplusY.Append(ch_Raqamlar); Grammatika g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple); while (bajarildi == false) ( ; ) Console.WriteLine("\nHit< enter >qobiqni yopish uchun\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Asosiy statik bekor sre_SpeechRecognized(ob'ekt jo'natuvchisi, SpeechRecognizedEventArgs e) ) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nTaniq: " + txt); agar (ishonch< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Nutq hozir yoqilgan"); speakOn = true; ) if (txt.IndexOf("nutq o'chirilgan") >= 0) ( Console.WriteLine("Nutq hozir OFF"); speakOn = false; ) agar (speechOn == false) qaytarilsa; agar (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender). RecognizeAsyncCancel(); done = true; Console.WriteLine("(Gaplash: Vidolashuv)"); ss.Speak("Alvido"); ) if (txt.IndexOf("Nima") >= 0 && txt.IndexOf("plyus") >= 0) ( string so'zlari = txt.Split(" "); int num1 = int.Parse(so'zlar); int num2 = int.Parse(so'zlar); int sum = num1 + num2; Console.WriteLine("(Gaplash: " + so'zlar + " plus " + so'zlar + " tengdir " + sum + ")"); ss.SpeakAsync(so'zlar + " plus " + so'zlar + " teng " + yig'indisi); ) ) // sre_SpeechRecognized ) // Dastur ) // ns

    Foydalanish bayonotlaridan so'ng demo kodi quyidagicha boshlanadi:

    nom maydoni ConsoleSpeech ( sinf ConsoleSpeechProgram ( statik SpeechSynthesizer ss = yangi SpeechSynthesizer(); statik SpeechRecognitionEngine sre; statik bool bajarildi = noto‘g‘ri; statik bool nutqOn = rost; statik void Main (...string args)

    SpeechSynthesizer obyekti sinf darajasida dasturga nutqni sintez qilish imkonini beradi. SpeechRecognitionEngine obyekti ilovaga aytilgan so‘z yoki iboralarni tinglash va tanib olish imkonini beradi. Bajarilgan mantiqiy o'zgaruvchi butun dastur qachon tugashini aniqlaydi. SpeechOn mantiqiy o'zgaruvchisi ilova dasturdan chiqish buyrug'idan tashqari boshqa buyruqlarni tinglashini nazorat qiladi.

    Bu erda g'oya shundaki, konsol ilovasi klaviatura kiritishni qabul qilmaydi, shuning uchun u har doim buyruqlarni tinglaydi. Biroq, nutqOn noto'g'ri bo'lsa, faqat dasturdan chiqish buyrug'i tan olinadi va bajariladi; boshqa buyruqlar tan olinadi, lekin e'tiborga olinmaydi.

    Asosiy usul quyidagicha boshlanadi:

    urinib koʻring ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(Gaplashmoqda: men uygʻoqman)"); ss.Speak("Men uygʻoqman");

    SpeechSynthesizer ob'ektining namunasi e'lon qilinganda yaratilgan. Sintezator ob'ektidan foydalanish juda oddiy. SetOutputToDefaultAudioDevice usuli chiqishni kompyuteringizga ulangan karnaylarga yuboradi (chiqishni faylga ham yuborishingiz mumkin). Speak usuli satrni oladi va keyin uni gapiradi. Bu qanchalik oson.

    Nutqni aniqlash nutq sinteziga qaraganda ancha murakkab. Main usuli hal qiluvchi obyektni yaratish orqali davom etadi:

    CultureInfo ci = yangi CultureInfo("en-us"); sre = yangi SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized;

    Birinchidan, CultureInfo obyekti tan olinadigan tilni, bu holda Amerika Qo'shma Shtatlari ingliz tilini belgilaydi. CultureInfo ob'ekti Globallashuv nomlar maydonida joylashgan bo'lib, biz foydalanish bayonoti bilan murojaat qildik. Keyin, SpeechRecognitionEngine konstruktorini chaqirgandan so'ng, ovozli kiritish standart audio qurilmaga - ko'pincha mikrofonga tayinlanadi. E'tibor bering, aksariyat noutbuklarda o'rnatilgan mikrofon mavjud, ammo ish stoli kompyuterlari tashqi mikrofonni talab qiladi (ko'pincha bu kunlarda naushniklar bilan birlashtiriladi).

    Tanuvchi ob'ekt uchun asosiy usul SpeechRecognized hodisa ishlovchisi hisoblanadi. Visual Studio dan foydalanganda, agar siz "sre.SpeechRecognized +=" ni yozsangiz va bir soniya kutsangiz, IntelliSense avtomatik ravishda hodisa ishlov beruvchisi nomi bilan ifodani tugatadi - sre_SpeechRecognized. Taklifni qabul qilish uchun Tab tugmasini bosishingizni va bu nomni standart sifatida ishlatishingizni tavsiya qilaman.

    Tanlovlar ch_Raqamlar = yangi tanlovlar(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // texnik nuqtai nazardan, // bu Qo'shish (yangi satr ( "4" )); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Nima"); gb_WhatIsXplusY.Append(ch_Raqamlar); gb_WhatIsXplusY.Append("ortiqcha"); gb_WhatIsXplusY.Append(ch_Raqamlar); Grammatika g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Bu erda uchta asosiy ob'ekt Tanlovlar to'plami, GrammarBuilder shabloni va Grammatik boshqaruvdir. Men tanib olish uchun Grammatikani yaratganimda, tan olishim kerak bo'lgan ba'zi aniq misollarni sanab o'tishni boshlayman. Aytaylik, "Bir plyus ikki nima?" va "Uch ortiqcha to'rt nima?"

    Keyin men mos keladigan umumiy shablonni aniqlayman, masalan, "Nima ortiqcha ?. Shablon GrammarBuilder bo'lib, shablonga uzatiladigan maxsus qiymatlar Tanlovlar to'plamidir. Grammatika obyekti shablonni va Tanlovlarni qamrab oladi.

    Namoyish dasturida men qo'shimchalarni 1 dan 4 gacha cheklayman va ularni Tanlovlar to'plamiga qatorlar sifatida qo'shaman. Yana samarali yondashuv:

    qator raqamlari = yangi satr ("1", "2", "3", "4"); Tanlovlar ch_Raqamlar = yangi tanlovlar(raqamlar);

    Men ikkita sababga ko'ra Tanlovlar to'plamini yaratish uchun kamroq samarali yondashuvni taqdim etaman. Birinchidan, bir vaqtning o'zida bitta qatorni qo'shish men nutqni aniqlashning boshqa misollarida ko'rgan yagona yondashuv edi. Ikkinchidan, siz bir vaqtning o'zida bitta qatorni qo'shish umuman ishlamasligi kerak deb o'ylashingiz mumkin; Visual Studio IntelliSense real vaqt rejimida Qo'shish ortiqcha yuklamalaridan biri parametrlar qatori iboralarining parametrlarini qabul qilishini ko'rsatadi. Agar siz params kalit so'zini sezmagan bo'lsangiz, Qo'shish usuli bitta qatorni emas, faqat satrlar massivlarini qabul qiladi, deb taxmin qilgan bo'lishingiz mumkin. Ammo bu unday emas: u ikkalasini ham qabul qiladi. Men massivdan o'tishni tavsiya qilaman.

    Ketma-ket raqamlardan tanlovlar to'plamini yaratish alohida holat bo'lib, quyidagi kabi dasturiy yondashuvga imkon beradi:

    qator raqamlari = yangi qator; uchun (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    GrammarBuilder uyalarini to'ldirish uchun tanlovlarni yaratgandan so'ng, demo dasturi GrammarBuilder va keyin nazorat qiluvchi Grammatikani yaratadi:

    GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Nima"); gb_WhatIsXplusY.Append(ch_Raqamlar); gb_WhatIsXplusY.Append("ortiqcha"); gb_WhatIsXplusY.Append(ch_Raqamlar); Grammatika g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Namoyish dasturi ishga tushirish va to'xtatish buyruqlari uchun Grammatikani yaratish uchun shunga o'xshash shablondan foydalanadi:

    Tanlovlar ch_StartStopCommands = yangi tanlovlar(); ch_StartStopCommands.Add("nutq yoqilgan"); ch_StartStopCommands.Add("nutq o'chirilgan"); ch_StartStopCommands.Add("klatu barada nikto"); GrammarBuilder gb_StartStop = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammatika g_StartStop = new Grammar(gb_StartStop);

    Grammatikalarni juda moslashuvchan aniqlash mumkin. Bu erda "nutqni yoqish", "nutqni o'chirish" va "klatu barada nikto" buyruqlari bir grammatikaga joylashtirilgan, chunki ular mantiqiy bog'liqdir. Bu uch buyruq uch xil grammatikada aniqlanishi mumkin yoki "nutqni yoqish" va "nutqni o'chirish" buyruqlari bir grammatikaga va "klatu barada nikto" buyrug'i bir soniyada joylashtirilishi mumkin.

    Barcha Grammatik ob'ektlarni yaratganingizdan so'ng, siz ularni nutqni tanuvchiga qo'yasiz va nutqni aniqlash faollashadi:

    sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple);

    RecognizeMode.Multiple argumenti bir nechta grammatikaga ega bo'lganingizda kerak bo'ladi, bu eng oddiy dasturlardan tashqari hammada bo'ladi. Asosiy usul quyidagicha yakunlanadi:

    While (bajarildi == false) ( ; ) Console.WriteLine("\nHit< enter >qobiqni yopish uchun\n"); Console.ReadLine(); ) catch (Exception exception) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Asosiy

    G'alati ko'rinishdagi bo'sh while loopi konsol ilovasining qobig'ini ishlayotgan holda ushlab turish imkonini beradi. Sinf darajasidagi mantiqiy o'zgaruvchining bajarilgani nutqni aniqlash hodisasi ishlov beruvchisi tomonidan true qiymatiga o'rnatilganda tsikl tugallanadi.

    Tan olingan nutqni qayta ishlash

    Nutqni aniqlash hodisalarini boshqarish uchun kod quyidagicha boshlanadi:

    statik void sre_SpeechRecognized(ob'ekt jo'natuvchisi, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nRecognized: if: " + txtce);< 0.60) return; ...

    Tan olingan matn SpeechRecognizedEventArgs obyektining Result.Text xususiyatida saqlanadi. Shu bilan bir qatorda, Result.Words to'plamidan foydalanishingiz mumkin. Natija.Confidence xususiyati 0,0 dan 1,0 gacha bo'lgan qiymatni saqlaydi, bu og'zaki matn tan oluvchi bilan bog'langan har qanday grammatikaga qanchalik mos kelishining taxminiy bahosidir. Namoyish dasturi voqea ishlovchisiga tan olingan matnga ishonchi past bo'lgan matnni e'tiborsiz qoldirishni buyuradi.

    Ishonch qiymatlari grammatikalaringizning murakkabligi, mikrofon sifati va boshqa omillarga qarab katta farq qiladi. Misol uchun, agar demo dasturi faqat 1 dan 4 gacha bo'lgan raqamlarni tan olishi kerak bo'lsa, mening kompyuterimdagi ishonch qiymatlari odatda 0,75 ni tashkil qiladi. Ammo, agar grammatika 1 dan 100 gacha raqamlarni tan olishi kerak bo'lsa, ishonch qiymatlari taxminan 0,25 ga tushadi. Xulosa qilib aytganda, nutqni aniqlashda yaxshi natijalarga erishish uchun odatda ishonch qiymatlari bilan tajriba o'tkazishingiz kerak.

    if (txt.IndexOf("nutq yoqilgan") >= 0) ( Console.WriteLine("Nutq yoqilgan"); speakOn = rost; ) if (txt.IndexOf("nutq o'chirilgan") >= 0) ( Konsol .WriteLine("Nutq hozir OFF"); speakOn = noto'g'ri; ) if (speechOn == false) qaytish;

    Avvaliga bu butunlay aniq bo'lmasa-da, agar siz bu haqda o'ylab ko'rsangiz, bu mantiq mantiqiy bo'lishi kerak. Keyin maxfiy chiqish buyrug'i qayta ishlanadi:

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); done = true; Console.WriteLine("(Gaplash: Vidolashuv)"); ss.Speak("Alvido"); )

    E'tibor bering, nutqni aniqlash mexanizmi aslida bema'ni so'zlarni taniy oladi. Agar Grammatika ob'ektida ob'ektning o'rnatilgan lug'atida bo'lmagan so'zlar mavjud bo'lsa, Grammatika iloji bo'lsa, semantik evristika yordamida ushbu so'zlarni aniqlashga harakat qiladi va odatda juda muvaffaqiyatli bo'ladi. Shuning uchun men to'g'ri "klaatu" o'rniga "klatu" dan foydalandim (eski ilmiy-fantastik filmdan).

    Shuni ham yodda tutingki, sizdan Grammatika (“klatu barada nikto”) tomonidan tan olingan barcha matnlarni qayta ishlashingiz shart emas – grammatik iborani (“klatu” va “barada”) yagona aniqlash uchun yetarli ma’lumotga ega bo‘lishingiz kifoya.

    Agar (txt.IndexOf("Nima") >= 0 && txt.IndexOf("plyus") >= 0) ( string so'zlari = txt.Split(" "); int num1 = int.Parse(so'zlar); int num2 = int.Parse(so'zlar); int sum = num1 + num2; Console.WriteLine("(Gaplash: " + so'zlar + " plus " + so'zlar + " teng " + summa + ")"); ss.SpeakAsync(so'zlar + " plus " + so'zlar + " teng " + yig'indisi); ) ) // sre_SpeechRecognized ) // Dastur ) // ns

    Natijalar.Matndagi matn katta-kichik harflarga sezgir ("Nima" va "nima") ekanligini unutmang. Bir iborani tanib, uni aniq so'zlarga ajratish mumkin. Bunday holda, tan olingan matn "X plyus y nima" shaklida bo'ladi, shuning uchun "Nima" so'zlarga joylashtiriladi va ikkita qo'shilgan raqam (satr sifatida) so'zlar va so'zlarda saqlanadi.

    Kutubxonalarni o'rnatish

    Namoyish dasturining tushuntirishi barcha kerakli nutq kutubxonalari kompyuteringizda o'rnatilganligini nazarda tutadi. Namoyish dasturlarini yaratish va ishga tushirish uchun siz to'rtta paketni o'rnatishingiz kerak: SDK (Visual Studio'da demolar yaratish imkoniyatini beradi), ish vaqti (demolar yaratilgandan keyin ishlaydi) va tan olingan va sintez qilingan (talaffuz qilingan) tillar.

    SDK ni o'rnatish uchun Internetda "Speech Platform 11 SDK" ni qidiring. Bu sizni Microsoft Yuklash Markazining to'g'ri sahifasiga olib boradi ( guruch. 4). Yuklab olish tugmasini bosish orqali siz ko'rsatilgan variantlarni ko'rasiz guruch. 5. SDK 32 va 64 bitli versiyalarda mavjud. Tizimingizning bit o'lchamidan qat'i nazar, 32 bitli versiyadan foydalanishni qat'iy tavsiya qilaman. 64-bitli versiya ba'zi ilovalar bilan ishlamaydi.


    Guruch. 4. Microsoft Yuklab olish markazidagi asosiy SDK o'rnatish sahifasi


    Guruch. 5. Speech SDK ni o'rnating

    Sizga x86 ostida bitta .msi faylidan boshqa hech narsa kerak emas (32 bitli tizimlar uchun). Ushbu faylni tanlab, "Keyingi" tugmasini bosish orqali siz o'rnatuvchini to'g'ridan-to'g'ri shu yerdan ishga tushirishingiz mumkin. Nutq kutubxonalari oʻrnatish tugallangani haqida koʻp fikr bildirmaydi, shuning uchun muvaffaqiyat haqidagi xabarlarni qidirmang.


    Guruch. 6. Ish vaqti muhitini o'rnatish

    SDK bilan bir xil platforma versiyasini (demoda 11) va bit chuqurligini (32 yoki 64) tanlash juda muhimdir. Shunga qaramay, 64 bitli tizimda ishlayotgan bo'lsangiz ham, 32 bitli versiyani tavsiya qilaman.

    Shundan so'ng siz tanib olish tilini o'rnatishingiz mumkin. Yuklab olish sahifasi quyidagi manzilda keltirilgan guruch. 7. Namoyish dasturi MSSpeech_SR_en-us_TELE.msi faylidan foydalanadi (inglizcha-AQSh). SR nutqni aniqlashni, TELE esa telefoniyani anglatadi; bu tan olingan til telefon yoki ish stoli mikrofoni kabi past sifatli audio kiritish bilan ishlashga mo'ljallanganligini bildiradi.


    Guruch. 7. Taniqli tilni o'rnatish

    Nihoyat, siz nutq sintezi uchun til va ovozni o'rnatishingiz mumkin. Yuklab olish sahifasi quyidagi manzilda keltirilgan guruch. 8. Namoyish dasturi MSSpeech_TTS_en-us_Helen.msi faylidan foydalanadi. TTS (matndan nutqqa) mohiyatan nutq sintezi bilan sinonimdir. Ikki mavjud ovozga e'tibor bering Ingliz, U.S. Boshqa inglizcha ovozlar mavjud, ammo AQSh emas. Sintez tillari fayllarini yaratish juda qiyin ishdir. Biroq, siz turli kompaniyalardan boshqa ovozlarni sotib olishingiz va o'rnatishingiz mumkin.


    Guruch. 8. Ovoz va sintez tilini sozlash

    Qizig'i shundaki, nutqni aniqlash tili va ovoz/nutq sintezi tili aslida butunlay boshqacha narsalar bo'lsa-da, ikkala paket ham bir xil yuklab olish sahifasidagi variantlardir. Download Center UI ham tanib olish tilini, ham sintez tilini tekshirish imkonini beradi, lekin ularni bir vaqtning o‘zida o‘rnatishga urinish men uchun halokatli bo‘ldi, shuning uchun ularni alohida o‘rnatishni tavsiya etaman.

    Microsoft.Speech bilan System.Speechni solishtirish

    Agar siz Windows ilovalari uchun nutqni aniqlash va sintez qilishda yangi bo'lsangiz, hujjatlarni osongina chalkashtirib yuborishingiz mumkin, chunki bir nechta nutq platformalari mavjud. Xususan, ushbu maqoladagi demo dasturlarda ishlatiladigan Microsoft.Speech.dll kutubxonasidan tashqari, Windows operatsion tizimining bir qismi bo'lgan System.Speech.dll nomli kutubxona mavjud. Ikki kutubxona o'xshashdir, chunki ularning API-lari deyarli bir xil, ammo to'liq emas. Shuning uchun, agar siz Internetda nutqni qayta ishlash misollarini qidirsangiz va to'liq dasturlarni emas, balki kod qismlarini ko'rsangiz, misol System.Speech yoki Microsoft.Speech ekanligi aniq emas.

    Agar siz nutqni qayta ishlashda yangi bo'lsangiz, .NET ilovangizga nutqni qo'llab-quvvatlashni qo'shish uchun System.Speech o'rniga Microsoft.Speech kutubxonasidan foydalaning.

    Ikkala kutubxona ham umumiy asosiy kod bazasiga va shunga o'xshash API-larga ega bo'lsa-da, ular aniq farq qiladi. Ba'zi asosiy farqlar jamlangan stol 1.

    Jadval 1. Microsoft.Speech va System.Speech o'rtasidagi asosiy farqlar

    System.Speech DLL OS ning bir qismidir, shuning uchun u har bir Windows tizimida o'rnatiladi. Microsoft.Speech DLL (va u bilan bog'liq ish vaqti va tillari) yuklab olinishi va tizimga o'rnatilishi kerak. System.Speech yordamida tanib olish odatda ma'lum bir foydalanuvchi uchun treningni talab qiladi, qachonki foydalanuvchi biror matnni o'qisa va tizim ushbu foydalanuvchining talaffuz xususiyatini tushunishni o'rganadi. Microsoft.Speech yordamida tanib olish har qanday foydalanuvchi uchun darhol ishlaydi. System.Speech deyarli har qanday so'zni taniy oladi (bu erkin diktant deb ataladi). Microsoft.Speech faqat dasturda belgilangan Grammar ob'ektidagi so'z va iboralarni taniydi.

    Windows Forms ilovasiga nutqni aniqlash yordamini qo'shish

    Windows Forms yoki WPF ilovasiga nutqni aniqlash va sintezni qo'shish jarayoni konsol ilovasiga o'xshash. Ko'rsatilgan demo dasturini yaratish uchun guruch. 2, Men Visual Studio dasturini ishga tushirdim, yangi C# Windows Forms ilovasini yaratdim va uni WinFormSpeech nomini o'zgartirdim.

    Shablon kodini muharrirga yuklaganimdan so'ng, men Microsoft.Speech.dll fayliga havolani Solution Explorer oynasida qo'shdim - xuddi konsol dasturida bo'lgani kabi. Manba kodining yuqori qismida men keraksiz so'zlarni o'chirib tashladim, faqat Tizim, Ma'lumotlar, Chizma va Shakllar nom maydonlariga havolalarni qoldirdim. Keyin men Microsoft.Speech.Recognition va System.Globalization nom maydonlari uchun ikkita foydalanish bayonotini qo'shdim.

    Windows Forms-ga asoslangan demo nutq sintezidan foydalanmaydi, shuning uchun men Microsoft.Speech.Synthesis kutubxonasiga havola qilmayman. Windows Forms ilovasiga nutq sintezini qo'shish konsol ilovasi bilan bir xil.

    Dizayn rejimida Visual Studio'da men TextBox, CheckBox va ListBox boshqaruv elementlarini shaklga sudrab o'tdim. CheckBox-ni ikki marta bosing va Visual Studio avtomatik ravishda skelet CheckChanged voqea ishlov berish usulini yaratdi.

    Eslatib o'tamiz, demo konsol dasturi darhol og'zaki buyruqlarni tinglashni boshladi va u tugaguniga qadar buni davom ettirdi. Ushbu yondashuv Windows Forms ilovasida qo'llanilishi mumkin, ammo buning o'rniga men foydalanuvchiga CheckBox boshqaruvi (ya'ni, tasdiqlash qutisi) yordamida nutqni aniqlashni yoqish va o'chirishga ruxsat berishga qaror qildim.

    Qisman sinf aniqlangan demo dasturining Form1.cs faylidagi manba kodi quyidagi manzilda ko'rsatilgan. guruch. 9. Nutqni aniqlash mexanizmi ob'ekti shakl a'zosi sifatida e'lon qilinadi va yaratiladi. Shakl konstruktorida men SpeechRecognized voqea ishlovchisini ulayman va keyin ikkita Grammars obyektini yarataman va yuklayman:

    public Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Grammatika g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar = GetTextGoodbyeGrammar(); Grammatika g_SetTextGoodmarncBox(); (g_HelloGoodby e);sre.LoadGrammarAsync(g_SetTextBox) ; // sre.RecognizeAsync() // CheckBox hodisasi ishlovchisida)

    Guruch. 9. Windows Forms-ga nutqni aniqlash yordamini qo'shing

    tizimdan foydalanish; System.Data yordamida; System.Drawing yordamida; System.Windows.Forms-dan foydalanish; Microsoft.Speech.Recognition-dan foydalanish; System.Globalization yordamida; nom maydoni WinFormSpeech ( umumiy qisman sinf Form1: Shakl ( statik CultureInfo ci = new CultureInfo("en-us"); statik SpeechRecognitionEngine sre = yangi SpeechRecognitionEngine(ci); umumiy Form1() ( InitializeComponent(); sre.DevicesDereSA); .SpeechRecognized += sre_SpeechRecognized; Grammatika g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammatika g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodGrammarAsync(g_HelloGoods.Box);//LoadGoodbyes); re.Recognize Async() CheckBox hodisasi ishlov beruvchisida // hisoblanadi ) statik Grammar GetHelloGoodbyeGrammar() (Tanlovlar ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("salom"); ch_HelloGoodbye.Add("xayr"); GrammarBuilder gb_result = new GrammarBuilder (yangi Grammaryl = Grammarult_); natija) ; return g_result; ) statik Grammar GetTextBox1TextGrammar() (Tanlovlar ch_Colors = new Choices(); ch_Colors.Add(yangi qator ( "qizil", "oq", "koʻk" )); GrammarBuilder gb_result = yangi GrammarBuilder(); gb_result.Append("matn maydoni 1 o'rnatish"); gb_result.Append(ch_Colors); Grammatika g_natija = yangi Grammatika(gb_natija); g_natijani qaytarish; ) private void checkBox1_CheckedChanged(obyekt yuboruvchi, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // Disabled sA.)C); void sre_SpeechRecognized(ob'ekt jo'natuvchisi, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; agar (conf)< 0.65) return; this.Invoke(new MethodInvoker(() =>( listBox1.Items.Add("Men siz aytganingizni eshitdim: " + txt); ))); // WinForm xususiyatlari, agar (txt.IndexOf("matn") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) ( string so'zlari = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = so'zlar; ))); // WinForm xususiyatlari ) ) ) // Shakl ) // ns

    Konsol dasturidagi kabi to'g'ridan-to'g'ri ikkita Grammar ob'ektini yaratishim mumkin edi, lekin buning o'rniga, kodni biroz aniqroq qilish uchun men ikkita yordamchi usulni (GetHelloGoodbyeGrammar va GetTextBox1TextGrammar) aniqladim.

    statik Grammar GetTextBox1TextGrammar() (Tanlovlar ch_Colors = new Choices(); ch_Colors.Add(yangi qator ("qizil", "oq", "koʻk" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("matnni sozlash box 1"); gb_result.Append(ch_Colors); Grammatika g_natija = yangi Grammatika(gb_natija); g_natijani qaytarish; )

    Ushbu yordamchi usul "matn maydoni 1 qizilni o'rnatish" iborasini taniydi. Biroq, foydalanuvchi bu iborani aniq talaffuz qilishi shart emas. Masalan, u “Iltimos, 1-matn maydonidagi matnni qizil rangga o‘rnating” deb aytishi mumkin va nutqni aniqlash mexanizmi bu iborani “matn maydoni 1 qizil rangga o‘rnating” deb taniydi, garchi ishonch qiymati Grammatikaga to‘liq mos kelishidan pastroq bo‘lsa ham. shablon. Boshqacha qilib aytganda, Grammatik ob'ektlarni yaratishda sizdan iboraning barcha o'zgarishlarini hisobga olishingiz shart emas. Bu nutqni aniqlashdan foydalanishni tubdan soddalashtiradi.

    CheckBox uchun hodisa ishlov beruvchisi quyidagicha aniqlanadi:

    private void checkBox1_CheckedChanged(obyekt yuboruvchisi, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // disabled sre.ncco);

    Nutqni aniqlash mexanizmi ob'ekti, sre (nutqni aniqlash mexanizmi) har doim Windows Forms ilovasining ishlash muddati davomida mavjud. Ushbu ob'ekt RecognizeAsync va RecognizeAsyncCancel usullariga qo'ng'iroqlar orqali faollashtiriladi va o'chiriladi, agar foydalanuvchi mos ravishda CheckBox-ni almashtirsa.

    SpeechRecognized voqea ishlov beruvchisi ta'rifi quyidagilardan boshlanadi:

    void sre_SpeechRecognized(ob'ekt jo'natuvchisi, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; agar (conf)< 0.65) return; ...

    Natija obyektida koʻp yoki kamroq doimiy foydalaniladigan Natija.Text va Result.Confidence xossalaridan tashqari, siz oʻrganmoqchi boʻlishingiz mumkin boʻlgan yana bir qancha foydali, ammo murakkabroq xususiyatlarga ega; masalan, omofonlar va ReplacementWordUnits. Bundan tashqari, nutqni aniqlash mexanizmi SpeechHypothesized kabi bir nechta foydali hodisalarni taqdim etadi.

    this.Invoke((Action)(() => listBox1.Items.Add("Men siz aytganingizni eshitdim: " + txt)));

    Nazariy jihatdan MethodInvoker delegatsiyasidan foydalanish bu vaziyatda Actiondan biroz samaraliroqdir, chunki MethodInvoker Windows.Forms nom maydonining bir qismi va shuning uchun Windows Forms ilovalariga xosdir. Harakat delegati ko'p qirrali. Bu misol shuni ko'rsatadiki, siz Windows Forms ilovasini nutqni aniqlash mexanizmi orqali to'liq boshqarishingiz mumkin - bu juda kuchli va foydali xususiyat.

    Xulosa

    Agar siz .NET ilovalarida nutq sintezi va tan olinishini o'rganmoqchi bo'lsangiz, ushbu maqolada keltirilgan ma'lumotlar sizni darhol boshlashingiz kerak. Dastlabki o'rganish egri chizig'i va komponentlarni o'rnatishdagi qiyinchiliklardan o'tib ketganingizdan so'ng texnologiyani o'zlashtirish oson. Nutqni sintez qilish va tanib olishning asl muammosi uning qachon foydali ekanligini tushunishdir.

    Konsol dasturlari yordamida siz oldinga va orqaga qiziqarli suhbatlar yaratishingiz mumkin, unda foydalanuvchi savol beradi va dastur javob beradi, natijada asosan Cortana-ga o'xshash muhit paydo bo'ladi. Ehtiyot bo'lishingiz kerak, chunki nutq kompyuteringiz karnaylaridan kelganida, u mikrofon tomonidan qabul qilinadi va yana tan olinishi mumkin. Men o‘zimni juda kulgili vaziyatlarda ko‘rdim, u yerda men savol berdim, ilova buni tan oldi va javob berdi, lekin og‘zaki javob keyingi tanib olish hodisasini ishga tushirdi va men kulgili, cheksiz nutq tsikliga ega bo‘ldim.

    Konsol dasturida nutqdan foydalanish mumkin bo'lgan yana bir narsa bu "Bloknotni ishga tushirish" va "Wordni ishga tushirish" kabi buyruqlarni tanib olishdir. Boshqacha qilib aytganda, bunday konsol dasturi sizning kompyuteringizda klaviatura va sichqonchani ko'p manipulyatsiya qilishni talab qiladigan harakatlarni bajarish uchun ishlatilishi mumkin.

    Jeyms Makkaffri(Doktor Jeyms Makkaffri) Redmond, Vashingtondagi Microsoft Research kompaniyasida ishlaydi. U bir nechta Microsoft mahsulotlarini, jumladan Internet Explorer va Bingni yaratishda ishtirok etgan. U bilan bog'lanish mumkin [elektron pochta himoyalangan].

    Microsoft Research ekspertlari Rob Gruen, Mark Marron va Kertis fon Vehga ushbu maqolani ko'rib chiqqani uchun rahmat.