.NET ширээний программуудыг ашиглан яриа таних. Бодит жишээг ашиглан сервергүйгээр хэт хурдан яриа таних Android 6.0 дээрх офлайн яриа таних

) гэр ахуйн хэрэгслийн удирдлагын жинхэнэ Hello World жишээг ашиглан.
Яагаад гэр ахуйн цахилгаан хэрэгсэл гэж? Тийм ээ, учир нь ийм жишээний ачаар та үүнийг үнэлж чадна хурд ба нарийвчлалашиглах замаар хүрч болох юм бүрэн орон нутгийнгэх мэт сервергүйгээр яриа таних Google ASRэсвэл Yandex SpeechKit.
Би мөн нийтлэлд програмын бүх эх код болон Android-д зориулсан угсралтыг хавсаргав.

Яагаад гэнэт?

Саяхан үүнтэй тулгараад би зохиогчоос яагаад програмдаа серверт суурилсан яриа танихыг ашиглахыг хүсч байгааг асуув (миний бодлоор энэ нь шаардлагагүй байсан бөгөөд зарим асуудалд хүргэсэн). Үүний тулд би юуг ч таних шаардлагагүй, толь бичиг нь хязгаарлагдмал үгсээс бүрддэг төслүүдэд өөр аргуудыг ашиглах талаар илүү дэлгэрэнгүй тайлбарлаж болох уу. Мөн практик хэрэглээний жишээтэй ч гэсэн ...

Яагаад бидэнд Yandex болон Google-ээс өөр зүйл хэрэгтэй байна вэ?

Тэр маш "практик хэрэглээний" хувьд би сэдвийг сонгосон ухаалаг гэрт зориулсан дуут удирдлага.
Яагаад яг энэ жишээ? Учир нь энэ нь үүлэн шийдлийг ашиглан танихаас илүү орон нутгийн яриаг бүрэн таних хэд хэдэн давуу талыг харуулж байна. Тухайлбал:
  • Хурд- бид серверүүдээс хамаардаггүй тул тэдгээрийн хүртээмж, зурвасын өргөн гэх мэт зүйлээс хамаардаггүй. хүчин зүйлүүд
  • Нарийвчлал- Манай хөдөлгүүр нь зөвхөн манай програмыг сонирхож буй толь бичигтэй ажилладаг бөгөөд ингэснээр таних чанарыг нэмэгдүүлдэг
  • Үнэ- Бид серверт илгээсэн хүсэлт бүрийн төлбөрийг төлөх шаардлагагүй
  • Дуут идэвхжүүлэлт- эхний онооны нэмэлт урамшуулал болгон бид траффикаа дэмий үрэлгүйгээр, серверүүдийг ачаалахгүйгээр байнга "нэвтрүүлэг сонсох" боломжтой.

Анхаарна уу

Эдгээр давуу талуудыг давуу тал гэж үзэж болох тул яаралтай захиалгаа өгье зөвхөн тодорхой ангиллын төслүүдэд зориулагдсан, Бид хаана байна бид урьдчилан мэдэж байгаа, хэрэглэгч ямар толь бичиг, ямар дүрмийн дагуу ажиллах вэ. Өөрөөр хэлбэл, бид дурын текстийг таних шаардлагагүй үед (жишээлбэл, SMS мессеж эсвэл хайлтын асуулга). Үгүй бол үүл таних нь зайлшгүй юм.

Тиймээс Android нь интернетгүйгээр яриаг таньж чадна!
Тийм ээ, тийм... Зөвхөн JellyBean дээр. Зөвхөн хагас метрээс илүүгүй. Мөн энэ хүлээн зөвшөөрөлт нь ижил диктант бөгөөд зөвхөн илүү жижиг загварыг ашигладаг. Тиймээс бид үүнийг удирдах эсвэл тохируулах боломжгүй. Дараагийн удаа тэр бидэнд юу буцаж ирэх нь тодорхойгүй байна. Хэдийгээр SMS-д тохиромжтой!

Бид юу хийх вэ?

Бид гэр ахуйн цахилгаан хэрэгсэлд хэдхэн метрээс, тэр ч байтугай хямд, муу, маш хямд Android ухаалаг утас, таблет, цаг дээр ч үнэн зөв, хурдан ажиллах дуут алсын удирдлагыг хэрэгжүүлэх болно.
Логик нь энгийн боловч маш практик байх болно. Бид микрофоныг идэвхжүүлж, нэг буюу хэд хэдэн төхөөрөмжийн нэрийг хэлнэ. Аппликешн нь тэдгээрийг таньж, одоогийн төлөвөөс хамааран асааж, унтраадаг. Эсвэл тэр тэднээс хөрөнгө авч, эмэгтэй хүний ​​аятайхан хоолойгоор дууддаг. Жишээлбэл, өрөөний одоогийн температур.

Практик програмууд маш их байдаг

Та өглөө нүдээ нээлгүй унтлагын ширээн дээрх ухаалаг утасны дэлгэц рүү алгаа алгадаад “Өглөөний мэнд!” гэж тушаав. - скрипт эхэлж, кофе чанагч асч, дуугарч, аятайхан хөгжим тоглож, хөшиг нээгдэнэ.
Өрөө бүрийн хананд хямдхан (2 мянга, илүүгүй) ухаалаг утас өлгөцгөөе. Бид ажлаа тараад гэртээ харьж, хоосон орон зайд "Ухаалаг гэр! Гэрэл, зурагт! -Дараа нь юу болохыг хэлэх шаардлагагүй гэж бодож байна.

Транскрипци



Дүрэм нь юуг тодорхойлдог хэрэглэгч юу хэлж чадах вэ. Pocketsphinx мэдэхийн тулд, Хэрхэнтэр үүнийг дуудах болно, дүрмийн үг бүрийг харгалзах хэлний загварт хэрхэн сонсогдож байгааг бичих шаардлагатай. Тэр бол транскрипциүг бүр. гэж нэрлэдэг толь бичиг.

Транскрипцийг тусгай синтакс ашиглан тайлбарладаг. Жишээлбэл:
smart uu m n ay j house d oo m

Зарчмын хувьд ямар ч төвөгтэй зүйл байхгүй. Транскрипц дэх давхар эгшиг нь стрессийг илэрхийлдэг. Хос гийгүүлэгч нь зөөлөн гийгүүлэгч, араас нь эгшиг ордог. Орос хэлний бүх дуу авианы бүх боломжит хослолууд.

Хэрэглэгч өөрийн төхөөрөмжид ямар нэр өгөхийг бид урьдчилан мэдэхгүй тул програмынхаа бүх транскрипцийг урьдчилан тайлбарлаж чадахгүй нь тодорхой байна. Тиймээс бид Оросын авиа зүйн зарим дүрмийн дагуу ийм транскрипцийг "ямарч" үүсгэх болно. Үүнийг хийхийн тулд та мөрийг оролт болгон хүлээн авч, зөв ​​транскрипцийг үүсгэж болох дараах PhonMapper классыг хэрэгжүүлж болно.

Дуут идэвхжүүлэлт

Энэ нь яриа таних хөдөлгүүр нь урьдчилан тодорхойлсон хэллэгт (эсвэл хэллэг) хариу үйлдэл үзүүлэхийн тулд үргэлж "нэвтрүүлэг сонсох" чадвар юм. Үүний зэрэгцээ бусад бүх дуу чимээ, яриаг хаях болно. Энэ нь дүрмийг тайлбарлаж, микрофоноо асаахтай адил зүйл биш юм. Би энд энэ даалгаврын онол, хэрхэн ажилладаг механикийн талаар танилцуулахгүй. Саяхан Pocketsphinx дээр ажиллаж байсан программистууд ийм функцийг хэрэгжүүлсэн бөгөөд одоо үүнийг API дээр ашиглах боломжтой гэдгийг хэлье.

Нэг зүйлийг заавал дурдах нь зүйтэй. Идэвхжүүлэх хэллэгийн хувьд та зөвхөн транскрипцийг зааж өгөхөөс гадна тохирохыг нь сонгох хэрэгтэй. мэдрэмжийн босго утга. Хэт бага утга нь олон хуурамч эерэг үр дүнд хүргэнэ (энэ үед та идэвхжүүлэх хэллэгийг хэлээгүй, гэхдээ систем үүнийг таньдаг). Мөн хэт өндөр - дархлаа. Тиймээс энэ тохиргоо нь онцгой ач холбогдолтой юм. Ойролцоогоор утгын хүрээ - 1e-1-ээс 1e-40 хүртэл идэвхжүүлэх хэллэгээс хамаарна.

Ойролцоох мэдрэгчийг идэвхжүүлэх

Энэ даалгавар нь манай төслийн онцлог бөгөөд хүлээн зөвшөөрөхтэй шууд холбоогүй юм. Кодыг үндсэн үйл ажиллагаанаас шууд харж болно.
Тэр хэрэгжүүлдэг SensorEventListenerойртох мөчид (мэдрэгчийн утга нь дээд хэмжээнээс бага) таймерыг асааж, тодорхой хугацааны дараа мэдрэгч хаагдсан эсэхийг шалгана. Энэ нь хуурамч эерэг үр дүнг арилгахын тулд хийгддэг.
Мэдрэгч дахин хаагдахгүй бол бид танихыг зогсоож, үр дүнг нь авна (доорх тайлбарыг үзнэ үү).

Танилцаж эхэлцгээе

Pocketsphinx нь таних процессыг тохируулах, ажиллуулахад тохиромжтой API-ээр хангадаг. Эдгээр нь ангиуд юм SpechRecognizerТэгээд SpeechRecognizerSetup.
Тохируулга болон танихыг эхлүүлэх нь дараах байдалтай байна.

PhonMapper phonMapper = шинэ PhonMapper(getAssets().open("dict/ru/hotwords")); Дүрмийн дүрэм = шинэ Дүрэм(нэр, phonMapper); grammar.addWords(холбох үг); DataFiles dataFiles = шинэ DataFiles(getPackageName(), "ru"); Файл hmmDir = шинэ Файл(dataFiles.getHmm()); File dict = new File(dataFiles.getDict()); Файл jsgf = шинэ Файл(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);

Энд бид эхлээд бүх шаардлагатай файлуудыг диск рүү хуулна (Pocketpshinx нь дискэн дээр байхын тулд акустик загвар, дүрмийн болон транскрипц бүхий толь бичиг шаарддаг). Дараа нь таних хөдөлгүүр өөрөө тохируулагдсан болно. Загвар болон толь бичгийн файлд хүрэх замууд, мөн зарим параметрүүдийг (идэвхжүүлэх хэллэгийн мэдрэмжийн босго) зааж өгсөн болно. Дараа нь дүрмийн файлын зам, түүнчлэн идэвхжүүлэх хэллэгийг тохируулна.

Энэ кодоос харж байгаагаар нэг хөдөлгүүр нь дүрмийн болон идэвхжүүлэх хэллэгийг танихад зориулагдсан болно. Яагаад үүнийг хийж байгаа юм бэ? Ингэснээр бид одоо таних шаардлагатай зүйлсийн хооронд хурдан шилжих боломжтой болно. Идэвхжүүлсэн хэллэгийг таних үйл явцыг эхлүүлэх нь дараах байдалтай байна.

MRecognizer.startListening(KWS_SEARCH);
Өгөгдсөн дүрмийн дагуу яриаг ингэж хүлээн зөвшөөрдөг.

MRecognizer.startListening(COMMAND_SEARCH, 3000);
Хоёрдахь аргумент (заавал биш) бол хэн ч юу ч хэлэхгүй бол таних нь автоматаар дуусах миллисекундын тоо юм.
Таны харж байгаагаар та хоёр асуудлыг шийдэхийн тулд зөвхөн нэг хөдөлгүүр ашиглаж болно.

Хүлээн зөвшөөрөх үр дүнг хэрхэн авах вэ

Таних үр дүнг авахын тулд та интерфэйсийг хэрэгжүүлдэг үйл явдлын сонсогчийг зааж өгөх ёстой Таних Сонсогч.
Энэ нь үйл явдлуудын аль нэг нь тохиолдоход халаасны финкс гэж нэрлэдэг хэд хэдэн аргуудтай:
  • onBeginningOfSpeech- хөдөлгүүр зарим дууг сонссон, энэ нь яриа байж магадгүй (эсвэл үгүй ​​ч байж магадгүй)
  • onEndOfSpeech- дуу чимээ дуусна
  • onPartialResult- дунд шатны хүлээн зөвшөөрөх үр дүн байна. Идэвхжүүлэх хэллэгийн хувьд энэ нь ажилласан гэсэн үг. Аргумент Таамаглал
  • onResult- хүлээн зөвшөөрөх эцсийн үр дүн. Энэ аргыг дуудсаны дараа дуудах болно Зогсцагт Яриа танигч. Аргумент Таамаглалтаних өгөгдлийг агуулсан (мөр ба оноо)

onPartialResult болон onResult аргуудыг ямар нэг байдлаар хэрэгжүүлснээр таних логикийг өөрчилж, эцсийн үр дүнг авах боломжтой. Энэ нь манай өргөдлийн хувьд хэрхэн хийгдсэнийг энд харуулав.

@Override public void onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) ( mRecognizer.stop(); ) ) @Хэсэгчилсэн хүчингүйг хүчингүй болгох(HartialRethesis) ( хэрэв (таамаглал == null) буцаана; Мөр текст = hypothesis.getHypstr(); хэрэв (KWS_SEARCH.equals(mRecognizer.getSearchName())) ( startRecognition(); ) өөр ( Log.d(TAG, текст); ) ) @Override public void onResult(Hypothesis hypothesis) ( mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); Мөр текст = таамаглал != null авах ;H ? hypothesis TAG(Таамаглал таамаглал) , "onResult" + text); хэрэв (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) ( хэрэв (текст!= null) ( Toast.makeText(энэ, текст, Toast.LENGTH_SHORT).show(); процесс(текст) ); ) mRecognizer.startListening(KWS_SEARCH); ) )

Бид onEndOfSpeech үйл явдлыг хүлээн авах үед, хэрэв бид нэгэн зэрэг гүйцэтгэх тушаалыг хүлээн зөвшөөрвөл таних ажиллагааг зогсоох шаардлагатай бөгөөд үүний дараа onResult шууд дуудагдах болно.
OnResult дээр та дөнгөж сая танигдсан зүйлийг шалгах хэрэгтэй. Хэрэв энэ нь тушаал бол та үүнийг ажиллуулахаар ажиллуулж, идэвхжүүлэх хэллэгийг танихын тулд хөдөлгүүрийг солих хэрэгтэй.
onPartialResult-д бид зөвхөн идэвхжүүлэх хэллэгийг таних сонирхолтой байдаг. Хэрэв бид үүнийг илрүүлбэл тушаалыг таних процессыг шууд эхлүүлнэ. Энэ нь дараах байдалтай байна.

Хувийн синхрончлогдсон хүчингүй startRecognition() (хэрэв (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) буцах; mRecognizer.cancel(); new ToneGenerator(AudioManager.STREAM_MUSICERTone. TONE_CDMA_PIP, 200); post(400, new Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, ".TAG0), ". командууд"); post(4000, mStopRecognitionCallback); ) )); )
Энд бид эхлээд хэрэглэгчийг сонссон, түүний тушаалд бэлэн байгаа тухай мэдэгдэхийн тулд жижиг дохиог тоглуулдаг. Энэ хугацаанд микрофоныг унтраасан байх ёстой. Тиймээс бид богино хугацааны завсарлага авсны дараа таних ажлыг эхлүүлнэ (дохионы цуурайг сонсохгүйн тулд дохионы үргэлжлэх хугацаанаас арай урт). Энэ нь мөн хэрэглэгч хэтэрхий удаан яривал таних үйлдлийг хүчээр зогсоох хэлхээ эхлүүлдэг. Энэ тохиолдолд 3 секунд байна.

Хүлээн зөвшөөрөгдсөн мөрийг хэрхэн команд болгон хувиргах вэ

За, энд бүх зүйл тодорхой програмд ​​зориулагдсан болно. Нүцгэн жишээний хувьд бид зүгээр л шугамнаас төхөөрөмжийн нэрийг гаргаж аваад, хүссэн төхөөрөмжөө хайж, ухаалаг гэрийн хянагч руу HTTP хүсэлтийг ашиглан төлөвийг нь өөрчлөх, эсвэл одоогийн төлөвийг нь мэдээлэх (хэрэв термостат). Энэ логикийг Controller ангиас харж болно.

Яриаг хэрхэн нэгтгэх вэ

Ярианы синтез нь таних урвуу үйлдэл юм. Энэ нь эсрэгээрээ байна - хэрэглэгч үүнийг сонсохын тулд та текстийн мөрийг яриа болгон хувиргах хэрэгтэй.
Термостатын хувьд бид Андройд төхөөрөмжөө одоогийн температурыг хэлэх ёстой. API ашиглах TextToSpeechҮүнийг хийхэд маш хялбар (Орос хэлний гайхалтай эмэгтэй TTS-ийн Google-д баярлалаа):

Хувийн хүчингүй яриа(Мөр текст) ( синхрончлогдсон (mSpeechQueue) (mRecognizer.stop(); mSpeechQueue.add(текст); HashMap params = шинэ 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, "үнэн"); mTextToSpeech.speak(текст, TextToSpeech.QUEUE_ADD, параметрүүд); ) )

Би улиг болсон зүйл хэлэх байх, гэхдээ синтезийн процессын өмнө танихыг идэвхгүй болгох шаардлагатай. Зарим төхөөрөмж дээр (жишээ нь, Samsung-ийн бүх төхөөрөмж) микрофоныг сонсож, нэгэн зэрэг ямар нэг зүйлийг нэгтгэх нь ерөнхийдөө боломжгүй юм.
Ярианы синтезийн төгсгөлийг (өөрөөр хэлбэл синтезатороор текст ярих үйл явцын төгсгөлийг) сонсогчдод хянах боломжтой.

Хувийн эцсийн TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() ( @Override public void onUtteranceCompleted(String utteranceId) (синхрончлогдсон (mSpeechQueue)) (e mSpeechQueue) (e mSpeechQueue) (em.Em.Spe)); ( mRecognizer.startListening( KWS_SEARCH); ))) )))

Үүний дотор бид синтезийн дараалалд өөр зүйл байгаа эсэхийг шалгаж, өөр зүйл байхгүй бол идэвхжүүлэх хэлц таних функцийг идэвхжүүлнэ.

Тэгээд бүгд үү?

Тийм ээ! Таны харж байгаагаар Pocketsphinx гэх мэт гайхалтай төслүүдийн ачаар төхөөрөмж дээр яриаг хурдан бөгөөд үр дүнтэй таних нь тийм ч хэцүү биш юм. Энэ нь дуут командыг танихтай холбоотой асуудлыг шийдвэрлэхэд ашиглаж болох маш тохиромжтой API-г өгдөг.

Энэ жишээнд бид бүрэн тодорхой үүрэг даалгаврыг хүлээн зөвшөөрсөн болно. ухаалаг гэрийн төхөөрөмжүүдийн дуут удирдлага. Орон нутагт хүлээн зөвшөөрөгдсөний ачаар бид маш өндөр хурдтай ажиллаж, алдааг багасгасан.
Ижил кодыг дуу хоолойтой холбоотой бусад ажлуудад ашиглаж болох нь ойлгомжтой. Энэ нь ухаалаг гэр байх албагүй.

  • дуут удирдлага
  • дуут хөдөлгүүр
  • Шошго нэмэх

    Ямар ч програм бичигдсэн яриаг хуулбарлах гарын авлагын ажлыг бүрэн орлож чадахгүй. Гэсэн хэдий ч яриаг текст рүү хөрвүүлэх ажлыг ихээхэн хурдасгаж, хөнгөвчлөх, өөрөөр хэлбэл транскрипцийг хялбаршуулах шийдлүүд байдаг.

    Транскрипци гэдэг нь аудио эсвэл видео файлыг текст хэлбэрээр бичих явдал юм. Интернэт дээр төлбөртэй даалгавар байдаг бөгөөд текстийг орчуулсны төлөө жүжигчин тодорхой хэмжээний мөнгө төлдөг.

    Яриа текст рүү орчуулах нь ашигтай

    • оюутнууд бичигдсэн аудио эсвэл видео лекцийг текст болгон орчуулах,
    • вэбсайт, блог ажиллуулдаг блогчид,
    • зохиолчид, ном зохиол бичих сэтгүүлчид,
    • вэбинар, яриа гэх мэтийн дараа текст хэрэгтэй мэдээллийн бизнес эрхлэгчид,
    • бичихэд бэрхшээлтэй хүмүүс - тэд захидал бичиж, гэр бүл эсвэл найз нөхөддөө илгээж болно.
    • бусад сонголтууд.

    Бид компьютер, гар утасны програмууд болон онлайн үйлчилгээнүүдэд байдаг хамгийн үр дүнтэй хэрэгслүүдийг тайлбарлах болно.

    1 speakpad.ru вэбсайт

    Энэ бол Google Chrome хөтөч ашиглан яриаг текст болгон хөрвүүлэх боломжийг олгодог онлайн үйлчилгээ юм. Үйлчилгээ нь микрофон болон бэлэн файлуудтай ажилладаг. Гадны микрофон ашиглаад өөрөө зааж өгвөл чанар нь мэдээж хамаагүй өндөр болно. Гэсэн хэдий ч, үйлчилгээ нь YouTube-ийн видеонуудтай ч гэсэн сайн ажилладаг.

    "Бичлэгийг идэвхжүүлэх" дээр дарж, "Микрофон ашиглах" гэсэн асуултанд хариулна уу - үүнийг хийхийн тулд "Зөвшөөрөх" дээр дарна уу.

    Үйлчилгээг ашиглах тухай урт зааврыг Зураг дээрх 1-р товчлуур дээр дарж буулгаж болно. 3. Энгийн бүртгэлийг бөглөж байж зар сурталчилгаанаас ангижрах боломжтой.

    Цагаан будаа. 3. Ярианы самбарын үйлчилгээ

    Дууссан үр дүнг засварлахад хялбар байдаг. Үүнийг хийхийн тулд та тодруулсан үгийг гараар засах эсвэл дахин бичих хэрэгтэй. Ажлын үр дүнг таны хувийн дансанд хадгалдаг бөгөөд тэдгээрийг компьютер дээрээ татаж авах боломжтой.

    Чанарын самбартай ажиллах видео хичээлүүдийн жагсаалт:

    Та Youtube-ээс эсвэл компьютерээсээ видео бичлэг хийж болно, гэхдээ танд холигч хэрэгтэй болно, илүү дэлгэрэнгүй:

    Видео "аудио транскрипт"

    Үйлчилгээ нь долоон хэлээр ажилладаг. Жижиг хасах зүйл бий. Энэ нь хэрэв та дууссан аудио файлыг хуулбарлах шаардлагатай бол түүний дуу чанга яригчаар сонсогддог бөгөөд энэ нь цуурай хэлбэрээр нэмэлт хөндлөнгийн оролцоо үүсгэдэг.

    2 Үйлчилгээний dictation.io

    Хэл яриаг текст рүү үнэгүй, хялбар орчуулах боломжийг олгодог гайхалтай онлайн үйлчилгээ.

    Цагаан будаа. 4. Үйлчилгээний dictation.io

    Зураг дээрх 1. 4 – Хуудасны төгсгөлд орос хэлийг сонгож болно. Google Chrome хөтөч дээр хэлийг сонгосон боловч ямар нэг шалтгааны улмаас Mozilla-д ийм сонголт байдаггүй.

    Дууссан үр дүнг автоматаар хадгалах чадварыг хэрэгжүүлсэн нь анхаарал татаж байна. Энэ нь таб эсвэл хөтчийг хаасны үр дүнд санамсаргүй устгахаас сэргийлнэ. Энэ үйлчилгээ дууссан файлуудыг танихгүй байна. Микрофонтой ажилладаг. Тайлбар бичихдээ цэг таслалыг нэрлэх хэрэгтэй.

    Текст нь маш зөв танигдсан, зөв ​​бичгийн алдаа байхгүй. Та гараас өөрөө цэг таслал оруулах боломжтой. Дууссан үр дүнг таны компьютер дээр хадгалах боломжтой.

    3 Бодит чанга яригч

    Энэ програм нь хүний ​​яриаг текст болгон хялбархан хөрвүүлэх боломжийг олгодог. Энэ нь Windows, Android, Linux, Mac зэрэг өөр өөр системүүд дээр ажиллахад зориулагдсан. Үүний тусламжтайгаар та сонссон яриаг микрофон болгон хувиргах боломжтой (жишээлбэл, зөөврийн компьютерт суулгаж болно), мөн аудио файл болгон бичиж болно.

    Дэлхийн 13 хэлийг ойлгох чадвартай. Хөтөлбөрийн бета хувилбар нь онлайн үйлчилгээ болж ажилладаг:

    Та дээрх холбоосыг дагаж орос хэлээ сонгоод аудио эсвэл видео файлаа онлайн үйлчилгээнд байршуулж, транскрипцийг нь төлөх шаардлагатай. Транскрипц хийсний дараа та үүссэн текстийг хуулж болно. Транскрипц хийх файл том байх тусам түүнийг боловсруулахад илүү их цаг хугацаа шаардагдана, илүү дэлгэрэнгүй:

    2017 онд RealSpeaker ашиглан үнэгүй транскрипц хийх боломжтой байсан бол 2018 онд ийм сонголт байхгүй байна. Хуулбарласан файлыг бүх хэрэглэгчдэд татаж авах боломжтой байгаа нь маш их ойлгомжгүй юм, магадгүй үүнийг сайжруулах болно.

    Хөтөлбөрийн хөгжүүлэгчийн холбоо барих хаягийг (VKontakte, Facebook, Youtube, Twitter, и-мэйл, утас) түүний вэбсайтын хуудаснаас (илүү нарийвчлалтай, сайтын доод хэсэгт) олж болно.

    4 Яриа хөтлөгч

    Андройд дээр ажилладаг гар утасны төхөөрөмжүүдийн өмнөх програмын өөр хувилбар. Апп дэлгүүрт үнэгүй авах боломжтой:

    Текстийг автоматаар засаж, цэг таслал нэмдэг. Өөртөө тэмдэглэл бичих эсвэл жагсаалт гаргахад маш тохиромжтой. Үүний үр дүнд текст нь маш сайн чанартай байх болно.

    5 Луу диктант

    Энэ нь Apple-аас гар утасны төхөөрөмжүүдэд үнэ төлбөргүй тараагддаг програм юм.

    Хөтөлбөр нь 15 хэлтэй ажиллах боломжтой. Энэ нь үр дүнг засах, жагсаалтаас хүссэн үгсийг сонгох боломжийг танд олгоно. Та бүх дууг тодорхой хэлж, шаардлагагүй завсарлага хийж, аялгуунаас зайлсхийх хэрэгтэй. Заримдаа үгийн төгсгөлд алдаа гардаг.

    Dragon Dictation програмыг эзэмшигчид, жишээлбэл, орон сууцанд нүүж байхдаа дэлгүүрт худалдан авалтын жагсаалтыг бичихэд ашигладаг. Тэнд очоод би тэмдэглэл дээрх текстийг харж болох бөгөөд сонсох шаардлагагүй болно.

    Дадлага хийхдээ ямар ч програм ашиглаж байгаа бай, үр дүнг дахин шалгаж, тодорхой тохируулга хийхэд бэлэн байгаарай. Энэ бол алдаагүй, өөгүй текст авах цорын ганц арга зам юм.

    Мөн ашигтай үйлчилгээ:

    Компьютерийн мэдлэгийн талаарх сүүлийн үеийн нийтлэлүүдийг шууд өөрийн имэйл хайрцагт хүлээн авна уу.
    Аль хэдийн илүү 3000 захиалагч

    .

    Бүтээгдэхүүн, технологи:

    Visual Studio, C#, .NET ярианы сангууд

    Нийтлэлд:

    • консолын програмд ​​яриа таних дэмжлэгийг нэмэх;
    • хүлээн зөвшөөрөгдсөн яриаг боловсруулах;
    • яриа таних номын санг суурилуулах;
    • Microsoft.Speech болон System.Speech-ийн харьцуулалт;
    • Windows Forms програмд ​​яриа таних дэмжлэгийг нэмж байна.

    Windows Phone Cortana, хэл ярианы тусламжтайгаар идэвхжүүлдэг хувийн туслах (түүнчлэн дэмий ярихын аргагүй жимсний компани) бий болсноор ярианы функцтэй програмууд програм хангамж хөгжүүлэхэд улам бүр нэр хүндтэй болж байна. Энэ нийтлэлд би Windows консолын програмууд, Windows Forms програмууд болон Windows Presentation Foundation (WPF) дээр яриа таних, нэгтгэх үйлдлийг хэрхэн эхлүүлэхийг харуулах болно.

    Та мөн Windows Phone програмууд, ASP.NET вэб програмууд, Windows Store програмууд, Windows RT болон Xbox Kinect-д ярианы чадварыг нэмж болно гэдгийг анхаарна уу, гэхдээ техник нь энэ нийтлэлд авч үзсэнээс ялгаатай.

    Энэ нийтлэлд яг юу ярих талаар ойлголттой болох сайн арга бол хоёр өөр демо програмын дэлгэцийн агшинг харах явдал юм. будаа. 1Тэгээд 2 . Консол програмыг ажиллуулсны дараа будаа. 1тэр даруй "Би сэрүүн байна" гэсэн хэллэгийг хэлдэг. Мэдээжийн хэрэг, та энэ нийтлэлийг уншиж байхдаа демо програмыг сонсох боломжгүй тул компьютерийн хэлж байгаа текстийг харуулах болно. Дараа нь хэрэглэгч "Яриа асаах" командыг хэлдэг. Демо програм нь хүлээн зөвшөөрөгдсөн текстээр хариу өгч, дараа нь хоёр тоо нэмэх хүсэлтийг дотооддоо сонсож, хариу өгдөг.

    Цагаан будаа. 1. Консолын программ дахь яриа таних, нэгтгэх


    Цагаан будаа. 2. Windows Forms программ дахь яриа таних

    Хэрэглэгч програмаас нэг, хоёр, дараа нь хоёр, гурав нэмэхийг хүссэн. Аппликейшн нь ярианы командуудыг таньж, дуу хоолойгоор хариулт өгсөн. Би дараа нь яриа таних аргыг ашиглах илүү ашигтай аргуудыг тайлбарлах болно.

    Дараа нь хэрэглэгч "Яриа унтраах" гэж хэлсэн бөгөөд энэ нь нэмэлт командуудыг сонсохыг идэвхгүй болгодог боловч яриа танихыг бүрэн идэвхгүй болгодоггүй. Энэ аман тушаалын дараа нэг, хоёрыг нэмэх дараагийн командыг үл тоомсорлов. Эцэст нь хэрэглэгч сонсох командыг дахин асааж, "Klatu barada nikto" гэсэн утгагүй командыг хэлсэн нь програм нь яриа танихыг бүрэн идэвхгүй болгож, өөрийгөө зогсоох тушаал гэж хүлээн зөвшөөрсөн.

    Асаалттай будаа. 2нь дамми яриа идэвхжүүлсэн Windows Forms програмыг харуулж байна. Энэ аппликейшн нь ярианы командыг таньдаг боловч дуут гаралтаар хариу үйлдэл үзүүлэхгүй. Таныг анх аппликешныг эхлүүлэх үед "Яриа асаах" нүдийг тэмдэглээгүй байсан нь яриа таних идэвхгүй байгааг харуулж байна. Хэрэглэгч энэ хайрцгийг шалгаад "Сайн уу" гэж хэлэв. Програм нь цонхны доод талд байгаа ListBox удирдлагад танигдсан текстийг харуулах замаар хариу үйлдэл үзүүлсэн.

    Дараа нь хэрэглэгч "Текстийн хайрцгийг 1 улаан болгож тохируулна уу" гэж хэлсэн. Аппликешн яриаг таньж, "Текстийн хайрцгийг 1 улаанаар тохируулна уу" гэж хариулсан нь хэрэглэгчийн хэлсэнтэй яг адилхан (гэхдээ тийм биш). Хэдийгээр асаалттай будаа. 2Та үүнийг харахгүй байна, цонхны дээд талд байгаа TextBox удирдлага дахь текст үнэхээр улаан өнгөтэй байна.

    Дараа нь хэрэглэгч: "Текстийн хайрцгийг 1-р цагаан болгож тохируулна уу." Апп нь үүнийг "текст хайрцаг 1 цагаанаар тохируулах" гэж хүлээн зөвшөөрч, үүнийг хийсэн. Хэрэглэгч "Баяртай" гэж хэлсэн үгээ дуусгасан бөгөөд програм нь тэр текстийг харуулсан боловч Windows Forms дээр юу ч хийгээгүй, жишээлбэл, "Яриа асаах" нүдийг арилгах боломжтой байсан.

    Синтезаторын объектыг ашиглах нь маш энгийн.

    Дараах хэсгүүдэд би танд шаардлагатай .NET ярианы сангуудыг суулгах зэрэг демо программуудыг хоёуланг нь бий болгох үйл явцыг зааж өгөх болно. Энэ нийтлэлд та ядаж дунд зэргийн програмчлалын чадвартай, гэхдээ яриа таних, синтезийн талаар юу ч мэдэхгүй гэж үздэг.

    Консолын програмд ​​яриа таних дэмжлэгийг нэмж байна

    Үзүүлсэн демо үүсгэхийн тулд будаа. 1, Би Visual Studio-г эхлүүлж, ConsoleSpeech нэртэй шинэ C# консол программыг үүсгэсэн. Би ярианы хэрэгслийг Visual Studio 2010 болон 2012 дээр амжилттай ашигласан, гэхдээ харьцангуй сүүлийн үеийн хувилбарууд нь зүгээр байх ёстой. Загварын кодыг засварлагч руу ачаалсны дараа би Solution Explorer цонхны Program.cs файлын нэрийг илүү тодорхой ConsoleSpeechProgram.cs болгон өөрчилсөн бөгөөд Visual Studio надад зориулж Program классын нэрийг өөрчилсөн.

    Дараа нь би C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly дотор байрлах Microsoft.Speech.dll файлын холбоосыг нэмсэн. Энэ DLL миний компьютерт байхгүй байсан тул татаж авах шаардлагатай болсон. Програмд ​​яриа таних, синтез нэмэхэд шаардлагатай файлуудыг суулгах нь тийм ч энгийн зүйл биш юм. Би дараагийн хэсэгт суулгах процессыг дэлгэрэнгүй тайлбарлах болно, гэхдээ одоогоор Microsoft.Speech.dll таны систем дээр байгаа гэж үзье.

    Ярианы DLL-д лавлагаа нэмснээр би дээд түвшний Системийн нэрсийн орон зайг зааснаас бусад кодын дээд талд байгаа бүх ашиглах мэдэгдлийг устгасан. Дараа нь би Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis, System.Globalization нэрийн орон зайд зориулсан мэдэгдлүүдийг нэмсэн. Эхний хоёр нэрийн орон зайг ярианы DLL-д буулгасан. Мөн System.Speech.Recognition, System.Speech.Synthesis гэх мэт нэрийн орон зай байдаг бөгөөд энэ нь төөрөгдүүлж болзошгүйг анхаарна уу. Би тэдний хоорондын ялгааг удахгүй тайлбарлах болно. Даяаршлын нэрийн орон зай нь анхдагчаар боломжтой байсан бөгөөд төсөлд шинэ лавлагаа нэмэх шаардлагагүй байв.

    Демо консол програмын бүх эх кодыг эндээс өгсөн болно будаа. 3, мөн энэ нийтлэлийг дагалдах эх багцад байгаа. Гол санааг аль болох нуун дарагдуулахгүйн тулд би бүх стандарт алдааг арилгасан.

    Цагаан будаа. 3. Демо консол програмын эх код

    системийг ашиглах; Microsoft.Speech.Recognition ашиглах; Microsoft.Speech.Synthesis ашиглах; System.Globalization ашиглан; нэрийн орон зай ConsoleSpeech ( анги ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); статик SpeechRecognitionEngine sre; статик bool хийгдсэн = худал; статик bool speakOn = үнэн; статик хүчингүй Main (etfaultsToDevices) Main (etfaults.Arguts); ole.WriteLine ("\n(Ярих: Би сэрүүн байна)"); ss.Speak("Би сэрүүн"); CultureInfo ci = шинэ CultureInfo("en-us"); sre = шинэ SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; sre.Speechrecognized += sre_Speechrecognized; сонголтууд ch_startstopcommands = Шинэ сонголтууд (); ch_startstopcommands.add ("Яриа асаалттай"); ch_startstopcommands.add ("S Peech Off"); ch_start.Stopcommands "); ch_start. Зогс = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammar g_StartStop = шинэ Grammar(gb_StartStop); Сонголтууд ch_Numbers = шинэ Сонголтууд(); ch_Numbers.Add("1"); ch_Numbers."Number_"Number. Add("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Юу вэ"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("нэмэх"); gb_WhatIsXplusY.Append(ch_Numbers); Grammar g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple); байхад (хийсэн == худал) ( ; ) Console.WriteLine("\nХит< enter >бүрхүүлийг хаахын тулд\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Үндсэн статик хүчингүй sre_SpeechRecognized(объект илгээгч, SpeechRecognizedEventArgs e) ) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nТанигдсан: " + txt); хэрэв (итгэлцэл)< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Яриа асаалттай байна"); speakOn = үнэн; ) if (txt.IndexOf("яригаа унтраасан") >= 0) ( Console.WriteLine("Яриа одоо унтарсан"); speakOn = false; ) if (speechOn == false) буцах; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender). RecognizeAsyncCancel(); хийсэн = үнэн; Console.WriteLine("(Ярих: Баяртай)"); ss.Speak("Баяртай"); ) if (txt.IndexOf("Юу") >= 0 && txt.IndexOf("нэмэх") >= 0) ( string үгс = txt.Split(" "); int num1 = int.Parse(үг); int num2 = int.Parse(үг); int нийлбэр = тоо1 + тоо2; Console.WriteLine("(Ярих: " + үг + " нэмэх " + үг + " тэнцүү байна " + нийлбэр + ")"); ss.SpeakAsync(үгс + " нэмэх " + үг + " тэнцүү " + нийлбэр); ) ) // sre_SpeechRecognized ) // Програм ) // ns

    Хэрэглээний мэдэгдлийн дараа демо код дараах байдлаар эхэлнэ.

    нэрийн орон зай ConsoleSpeech ( анги ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); static SpeechRecognitionEngine sre; статик bool хийгдсэн = худал; static bool speakOn = true; static void Main (string ... args)

    Ангийн түвшний SpeechSynthesizer объект нь яриаг нэгтгэх програмыг идэвхжүүлдэг. SpeechRecognitionEngine объект нь ярианы үг, хэллэгийг сонсох, таних боломжийг програмд ​​олгодог. Хийсэн логикийн хувьсагч нь програмыг бүхэлд нь хэзээ дуусгахыг тодорхойлдог. speakOn логикийн хувьсагч нь програмаас гарах командаас бусад командыг програм сонсох эсэхийг хянадаг.

    Энд байгаа санаа нь консол программ нь гарны оролтыг хүлээн авдаггүй тул командуудыг байнга сонсож байдаг. Гэсэн хэдий ч, speakOn нь худал бол зөвхөн програмаас гарах командыг хүлээн зөвшөөрч, гүйцэтгэнэ; бусад командууд танигдсан боловч үл тоомсорлодог.

    Үндсэн арга нь дараах байдлаар эхэлнэ.

    оролдох ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(Ярих: Би сэрүүн байна)"); ss.Speak("Би сэрүүн байна");

    SpeechSynthesizer объектыг зарлах үед түүний жишээ үүсгэгдсэн. Синтезаторын объектыг ашиглах нь маш энгийн. SetOutputToDefaultAudioDevice арга нь гаралтыг таны компьютерт холбогдсон чанга яригч руу илгээдэг (та мөн файл руу гаралтыг илгээж болно). Speak арга нь мөрийг аваад дараа нь ярьдаг. Ийм л амархан.

    Яриа таних нь ярианы синтезээс хамаагүй илүү төвөгтэй байдаг. Үндсэн арга нь шийдвэрлэх объект үүсгэх замаар үргэлжилнэ:

    CultureInfo ci = шинэ CultureInfo("en-us"); sre = шинэ SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized;

    Нэгдүгээрт, CultureInfo объект нь танигдах хэлийг, энэ тохиолдолд АНУ-ын англи хэлийг зааж өгдөг. CultureInfo объект нь Глобалчлалын нэрийн талбарт байгаа бөгөөд бид үүнийг ашиглах мэдэгдлээр лавласан. Дараа нь SpeechRecognitionEngine бүтээгчийг дуудсаны дараа дуут оролтыг анхдагч аудио төхөөрөмжид хуваарилдаг - ихэнхдээ микрофон. Ихэнх зөөврийн компьютерууд нь суурилагдсан микрофонтой байдаг ч ширээний компьютерууд нь гадаад микрофон шаарддаг гэдгийг анхаарна уу (ихэвчлэн өнөө үед чихэвчтэй хослуулсан).

    Танигч объектын гол арга бол SpeechRecognized үйл явдлын зохицуулагч юм. Visual Studio-г ашиглах үед "sre.SpeechRecognized +=" гэж бичээд хэсэгхэн секунд хүлээвэл IntelliSense таны илэрхийлэлийг үйл явдлын зохицуулагч нэрээр автоматаар дуусгах болно - sre_SpeechRecognized. Саналыг хүлээн авахын тулд Tab товчийг дарж, энэ нэрийг өгөгдмөл болгон ашиглахыг зөвлөж байна.

    Сонголтууд ch_Тоонууд = шинэ сонголтууд(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // техникийн үүднээс авч үзвэл, // энэ нь Add(new string ( "4" )); GrammarBuilder gb_WhatIsXplusY = шинэ GrammarBuilder(); gb_WhatIsXplusY.Append("Юу вэ"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("нэмэх"); gb_WhatIsXplusY.Append(ch_Numbers); Grammar g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Энд байгаа гурван үндсэн объект нь Сонголтуудын багц, GrammarBuilder загвар, дүрмийн удирдлага юм. Би танихын тулд дүрмээ бүтээхдээ таних ёстой зүйлсийнхээ тодорхой жишээг жагсааж эхэлдэг. "Нэг нэмэх хоёр хэд вэ?" гэж хэлье. болон "Гурав дээр дөрөв нь хэд вэ?"

    Дараа нь би тохирох ерөнхий загварыг тодорхойлно, жишээлбэл "Юу байна нэмэх ?. Загвар нь GrammarBuilder бөгөөд загварт дамжуулагдсан тодорхой утгууд нь Сонголтуудын багц юм. Grammar объект нь загвар болон Сонголтуудыг багтаасан болно.

    Демо хөтөлбөрт би нэмэлтүүдийг 1-ээс 4 хүртэл хязгаарлаж, Сонголтуудын багцад мөр болгон нэмнэ. Илүү үр дүнтэй арга:

    мөрийн тоо = шинэ мөр ("1", "2", "3", "4"); Сонголтууд ch_Numbers = шинэ Сонголтууд(тоо);

    Би хоёр шалтгааны улмаас Сонголтуудын багц үүсгэх үр ашиг багатай аргыг танилцуулж байна. Нэгдүгээрт, нэг мөр нэмэх нь яриа таних бусад жишээн дээр миний харсан цорын ганц арга байсан. Хоёрдугаарт, нэг мөр нэмэх нь огт ажиллахгүй байх ёстой гэж та бодож магадгүй; Visual Studio IntelliSense нь Нэмэх хэт ачааллын аль нэг нь параметрийн стринг хэллэгийн төрлийн параметрийг хүлээн зөвшөөрдөг болохыг бодит цаг хугацаанд харуулж байна. Хэрэв та params түлхүүр үгийг анзаараагүй бол Add арга нь зөвхөн мөрийн массивыг хүлээн авдаг болохоос нэг мөр биш гэж таамагласан байх. Гэхдээ энэ нь тийм биш: тэр хоёуланг нь хүлээн зөвшөөрдөг. Би массивыг дамжуулахыг зөвлөж байна.

    Дараалсан тоонуудаас сонголтын багц үүсгэх нь зарим талаараа онцгой тохиолдол бөгөөд дараахь программчлагдсан хандлагыг зөвшөөрдөг.

    мөрийн тоо = шинэ мөр; хувьд (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    GrammarBuilder-ийн зайг бөглөх сонголтуудыг үүсгэсний дараа демо програм нь GrammarBuilder, дараа нь хяналтын Grammar-г үүсгэдэг:

    GrammarBuilder gb_WhatIsXplusY = шинэ GrammarBuilder(); gb_WhatIsXplusY.Append("Юу вэ"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("нэмэх"); gb_WhatIsXplusY.Append(ch_Numbers); Grammar g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Демо програм нь эхлүүлэх, зогсоох командуудад зориулсан дүрмүүдийг үүсгэхийн тулд ижил төстэй загварыг ашигладаг.

    Сонголтууд ch_StartStopCommands = шинэ Сонголтууд(); ch_StartStopCommands.Add("яриа асаалттай"); ch_StartStopCommands.Add("яриа унтраах"); ch_StartStopCommands.Add("klatu barada nikto"); GrammarBuilder gb_StartStop = шинэ GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Grammar g_StartStop = new Grammar(gb_StartStop);

    Дүрмийг маш уян хатан байдлаар тодорхойлж болно. Энд "яриа асаах", "ярих унтраах", "клату барада никто" гэсэн командууд нь логик холбоотой тул нэг дүрмийн санд байршдаг. Эдгээр гурван командыг гурван өөр дүрмээр тодорхойлж болно, эсвэл "яриа асаах", "ярих унтраах" командыг нэг дүрэмд, "klatu barada nikto" командыг секундэд багтааж болно.

    Бүх дүрмийн объектыг үүсгэсний дараа та тэдгээрийг яриа танигч руу оруулах ба яриа таних функц идэвхжсэн болно.

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

    RecognizeMode.Multiple аргумент нь нэгээс олон дүрмийн мэдлэгтэй үед хэрэг болох бөгөөд энэ нь хамгийн энгийн программаас бусад бүх программ дээр байх болно. Үндсэн аргыг дараах байдлаар гүйцэтгэнэ.

    байхад (хийсэн == худал) ( ; ) Console.WriteLine("\nХит< enter >бүрхүүлийг хаахын тулд\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Үндсэн

    Хачирхалтай харагдах хоосон while давталт нь консолын програмын бүрхүүлийг ажиллуулах боломжийг танд олгоно. Ангийн түвшний логикийн хувьсагчийг яриа таних үйл явдал зохицуулагч үнэн гэж тохируулснаар давталт дуусна.

    Хүлээн зөвшөөрөгдсөн ярианы боловсруулалт

    Яриа таних үйл явдлуудыг зохицуулах код дараах байдлаар эхэлнэ.

    статик хүчингүй sre_SpeechRecognized(объект илгээгч, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float confidence = e.Result.Confidence; Console.WriteLine("\nТанигдав: " + txtce);< 0.60) return; ...

    Хүлээн зөвшөөрөгдсөн текст нь SpeechRecognizedEventArgs объектын Result.Text шинж чанарт хадгалагдана. Эсвэл та Үр дүн.Үг багцыг ашиглаж болно. Result.Confidence шинж чанар нь 0.0-оос 1.0 хүртэлх утгыг хадгалдаг бөгөөд энэ нь ярианы текст нь танигчтай холбоотой ямар ч дүрмэнд хэр нийцэж байгааг харуулсан ойролцоогоор тооцоолол юм. Демо програм нь үйл явдал зохицуулагчийг хүлээн зөвшөөрөгдсөн текстэд итгэх итгэл багатай текстийг үл тоомсорлохыг зааварчилдаг.

    Итгэлийн үнэ цэнэ нь таны дүрмийн нарийн төвөгтэй байдал, микрофоны чанар болон бусад хүчин зүйлээс хамааран ихээхэн ялгаатай байдаг. Жишээлбэл, хэрэв демо програм нь зөвхөн 1-ээс 4 хүртэлх тоог таних шаардлагатай бол миний компьютер дээрх итгэлийн утгууд нь ихэвчлэн 0.75 орчим байдаг. Гэхдээ дүрмийн хувьд 1-ээс 100 хүртэлх тоог таних ёстой бол итгэлийн утга нь ойролцоогоор 0.25 болж буурдаг. Товчхондоо та яриа таних чадвар сайтай үр дүнд хүрэхийн тулд өөртөө итгэх итгэлийн утгыг туршиж үзэх хэрэгтэй.

    if (txt.IndexOf("яригаа унтраасан") >= 0) ( Console.WriteLine("Яриа одоо АСААЛТТАЙ"); speakOn = үнэн; ) if (txt.IndexOf("яриа унтраалттай") >= 0) ( Консол .WriteLine("Яриа одоо унтарсан"); speakOn = худал; ) if (speechOn == худал) буцаана;

    Хэдийгээр энэ нь эхэндээ бүрэн тодорхой биш байж болох ч, хэрэв та энэ талаар бодож байвал энэ логик утга учиртай байх болно. Дараа нь нууц гарах командыг боловсруулна:

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); хийсэн = үнэн; Console.WriteLine("(Ярих: Баяртай)"); ss.Speak("Баяртай"); )

    Яриа таних хөдөлгүүр нь үнэхээр утгагүй үгсийг таньж чадна гэдгийг анхаарна уу. Хэрэв Grammar объект нь тухайн объектын толь бичигт байхгүй үгсийг агуулж байвал Grammar нь боломжтой бол семантик эвристик ашиглан эдгээр үгсийг тодорхойлохыг оролддог бөгөөд ихэвчлэн амжилттай байдаг. Тийм ч учраас би зөв "klaatu" (хуучин шинжлэх ухааны уран зөгнөлт киноны) оронд "klatu" -г ашигласан.

    Мөн та Grammar-аар хүлээн зөвшөөрөгдсөн бүх текстийг боловсруулах шаардлагагүй гэдгийг анхаарна уу ("klatu barada nikto") - та зөвхөн дүрмийн хэллэгийг ("klatu" болон "barada") өвөрмөц тодорхойлох хангалттай мэдээлэлтэй байх хэрэгтэй.

    Хэрэв (txt.IndexOf("Юу") >= 0 && txt.IndexOf("нэмэх") >= 0) ( string үгс = txt.Split(" "); int num1 = int.Parse(words); int num2 = int.Parse(үг); int нийлбэр = num1 + num2; Console.WriteLine("(Ярих: " + үгс + " нэмэх " + үгс + " тэнцүү " + нийлбэр + ")"); ss.SpeakAsync(үг + " нэмэх " + үгс + " тэнцүү " + нийлбэр); ) ) // sre_SpeechRecognized ) // Програм ) // ns

    Үр дүн.Текст дэх текст нь жижиг жижиг том үсгээр ялгагдахыг анхаарна уу ("Юу" ба "юу"). Нэг өгүүлбэрийг таньж мэдсэнийхээ дараа үүнийг тодорхой үг болгон задлан шинжилж болно. Энэ тохиолдолд хүлээн зөвшөөрөгдсөн текст нь "Х нэмэх нь у гэж юу вэ" гэсэн хэлбэртэй байх тул "Юу" гэж үгээр байрлуулж, нэмсэн хоёр тоог (мөр хэлбэрээр) үг, үгээр хадгална.

    Номын сангуудыг суулгаж байна

    Демо програмын тайлбар нь таны компьютер дээр шаардлагатай бүх ярианы санг суулгасан гэж үздэг. Демо программ үүсгэх, ажиллуулахын тулд та дөрвөн багцыг суулгах хэрэгтэй: SDK (Visual Studio дээр демо үүсгэх боломжийг олгодог), ажиллах хугацаа (демо-г үүсгэсний дараа ажиллуулдаг), хүлээн зөвшөөрөгдсөн, нэгтгэсэн (дуудлагатай) хэлүүд.

    SDK-г суулгахын тулд интернетээс "Speech Platform 11 SDK" гэж хайна уу. Энэ нь таныг Microsoft-ын Татаж авах төвийн зөв хуудас руу аваачна ( будаа. 4). Татаж авах товчийг дарснаар та дээрх сонголтуудыг харах болно будаа. 5. SDK нь 32 ба 64 битийн хувилбаруудтай. Би таны системийн битийн хэмжээнээс үл хамааран 32 битийн хувилбарыг ашиглахыг зөвлөж байна. 64 битийн хувилбар нь зарим програм дээр ажиллахгүй.


    Цагаан будаа. 4. Microsoft Татаж авах Төв дэх SDK суулгах үндсэн хуудас


    Цагаан будаа. 5. Speech SDK суулгана уу

    Танд x86 (32 битийн системүүдийн хувьд) доорх .msi файлаас өөр зүйл хэрэггүй. Энэ файлыг сонгоод Next товчийг дарснаар суулгагчийг эндээс шууд ажиллуулж болно. Ярианы сангууд суулгац дууссаны талаар тийм ч их санал хүсэлт өгдөггүй тул амжилтын тухай мессеж хайх хэрэггүй.


    Цагаан будаа. 6. Ажиллах цагийн орчныг суурилуулах

    SDK-тэй ижил платформ хувилбарыг (демо хувилбарт 11) болон битийн гүнийг (32 эсвэл 64) сонгох нь туйлын чухал юм. Дахин хэлэхэд, та 64 битийн систем дээр ажиллаж байгаа ч гэсэн 32 битийн хувилбарыг зөвлөж байна.

    Дараа нь та таних хэлийг тохируулж болно. Татаж авах хуудсыг эндээс өгсөн болно будаа. 7. Демо программ нь MSSpeech_SR_en-us_TELE.msi (Англи-АНУ) файлыг ашигладаг. SR нь яриа таних, TELE нь телефон утас гэсэн үг; Энэ нь хүлээн зөвшөөрөгдсөн хэл нь утас эсвэл ширээний микрофон гэх мэт чанар муутай аудио оролттой ажиллахад зориулагдсан гэсэн үг юм.


    Цагаан будаа. 7. Хүлээн зөвшөөрөгдсөн хэлийг тохируулах

    Эцэст нь та ярианы синтезийн хэл, дуу хоолойг тохируулж болно. Татаж авах хуудсыг эндээс өгсөн болно будаа. 8. Демо программ нь MSSpeech_TTS_en-us_Helen.msi файлыг ашигладаг. TTS (текстээс яриа) нь үндсэндээ ярианы синтезтэй ижил утгатай. Англи, АНУ гэсэн хоёр боломжтой дуу хоолойг анхаарна уу. Бусад англи дуу хоолой байдаг, гэхдээ U.S биш. Синтез хэлний файл үүсгэх нь маш хэцүү ажил юм. Гэсэн хэдий ч та янз бүрийн компаниудаас өөр дуу хоолойг худалдан авч, суулгаж болно.


    Цагаан будаа. 8. Дуу болон синтезийн хэлийг тохируулах

    Сонирхолтой нь яриа таних хэл ба дуу хоолой/ярианы синтезийн хэл нь үнэндээ огт өөр зүйл боловч хоёр багц нь нэг татаж авах хуудсан дээрх сонголтууд юм. Татаж авах төвийн UI нь таних хэл болон синтезийн хэлийг хоёуланг нь шалгах боломжийг олгодог боловч тэдгээрийг нэгэн зэрэг суулгахыг оролдох нь миний хувьд сүйрэлтэй байсан тул тусад нь суулгахыг зөвлөж байна.

    Microsoft.Speech-ийг System.Speech-тэй харьцуулах

    Хэрэв та Windows програмуудад зориулсан яриа таних, нэгтгэх талаар шинэхэн бол олон ярианы платформ байдаг тул баримт бичигт амархан андуурч болно. Тодруулбал, энэ нийтлэл дэх үзүүлэн программуудын ашигладаг Microsoft.Speech.dll номын сангаас гадна Windows үйлдлийн системийн нэг хэсэг болох System.Speech.dll нэртэй номын сан бий. Эдгээр хоёр номын сан нь API-ууд нь бараг ижил биш боловч бараг ижил биш гэдгээрээ төстэй юм. Тиймээс, хэрэв та интернетээс яриа боловсруулах жишээг хайж, бүрэн программ биш кодын хэсгүүдийг харвал, жишээ нь System.Speech эсвэл Microsoft.Speech эсэх нь тодорхойгүй байна.

    Хэрэв та яриа боловсруулахад шинээр орсон бол .NET программдаа ярианы дэмжлэг нэмэхийн тулд System.Speech биш Microsoft.Speech номын санг ашиглана уу.

    Хэдийгээр хоёр номын сан нь нийтлэг үндсэн кодын бааз болон ижил төстэй API-г хуваалцдаг боловч тэдгээр нь мэдээж ялгаатай. Зарим гол ялгааг тоймлон харуулав ширээ 1.

    Хүснэгт 1. Microsoft.Speech болон System.Speech хоёрын үндсэн ялгаа

    System.Speech DLL нь үйлдлийн системийн нэг хэсэг тул Windows систем болгон дээр суулгасан байдаг. Microsoft.Speech DLL (болон түүнтэй холбогдох ажиллах хугацаа болон хэлүүд) татан авч систем дээр суулгасан байх ёстой. System.Speech-ийг ашиглан таних нь ихэвчлэн тодорхой хэрэглэгчдэд зориулсан сургалт шаарддаг бөгөөд энэ нь хэрэглэгч зарим текстийг уншиж, систем нь энэ хэрэглэгчийн дуудлагын шинж чанарыг ойлгож сурдаг. Microsoft.Speech ашиглан таних нь ямар ч хэрэглэгчдэд шууд ажилладаг. System.Speech бараг ямар ч үгийг таньж чаддаг (үүнийг чөлөөт диктант гэж нэрлэдэг). Microsoft.Speech нь зөвхөн программд тодорхойлсон Grammar объектод байгаа үг, хэллэгийг таних болно.

    Windows Forms програмд ​​яриа таних дэмжлэгийг нэмж байна

    Windows Forms эсвэл WPF програмд ​​яриа таних болон синтезийн дэмжлэгийг нэмэх үйл явц нь консол програмынхтай төстэй. Үзүүлсэн демо програмыг үүсгэхийн тулд будаа. 2, Би Visual Studio-г эхлүүлж, шинэ C# Windows Forms програмыг үүсгээд WinFormSpeech нэрийг нь өөрчилсөн.

    Загварын кодыг засварлагч руу ачаалсны дараа би консол программ дээр хийсэн шиг Microsoft.Speech.dll файлын холбоосыг Solution Explorer цонхонд нэмсэн. Эх кодын дээд талд би шаардлагагүй мэдэгдлүүдийг устгаж, зөвхөн Систем, Өгөгдөл, Зураг, Маягтын нэрсийн орон зайн лавлагааг үлдээсэн. Дараа нь би Microsoft.Speech.Recognition болон System.Globalization нэрийн орон зайд ашиглах хоёр мэдэгдлийг нэмсэн.

    Windows Forms-д суурилсан демо нь ярианы синтезийг ашигладаггүй тул би Microsoft.Speech.Synthesis номын сантай холбогддоггүй. Windows Forms програмд ​​ярианы синтезийг нэмэх нь консол програмтай адил юм.

    Дизайн горимд Visual Studio дээр би TextBox, CheckBox, ListBox хяналтуудыг маягт руу чирсэн. CheckBox дээр давхар товшиж, Visual Studio автоматаар CheckChanged үйл явдал зохицуулагчийн араг ясыг үүсгэсэн.

    Демо консолын программ шууд л ярианы командуудыг сонсож эхэлсэн бөгөөд дуусах хүртлээ үргэлжлүүлэн хийж байсныг санаарай. Энэ аргыг Windows Forms програмд ​​ашиглаж болох ч оронд нь би хэрэглэгчдэд CheckBox удирдлага (жишээ нь шалгах хайрцаг) ашиглан яриа таних функцийг асаах, унтраахыг зөвшөөрөхөөр шийдсэн.

    Демо программын Form1.cs файл дахь хэсэгчилсэн анги тодорхойлогдсон эх кодыг дараах хаягаар харуулав. будаа. 9. Яриа таних хөдөлгүүрийн объектыг маягтын гишүүнээр зарлаж, үүсгэсэн. Маягтын үүсгэгч дээр би SpeechRecognized үйл явдлын зохицуулагчийг холбож, дараа нь хоёр Grammars объект үүсгэж ачаална.

    public Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar = GetHelloGoodbyeGrammar(); Grammar g_SetTextGoodsBox. (g_HelloGoodby e);sre.LoadGrammarAsync(g_SetTextBox) ; // sre.RecognizeAsync() нь CheckBox үйл явдлын зохицуулагч дотор // байна)

    Цагаан будаа. 9. Windows Forms-д яриа таних дэмжлэгийг нэмнэ

    системийг ашиглах; System.Data ашиглах; System.Drawing ашиглах; System.Windows.Forms ашиглах; Microsoft.Speech.Recognition ашиглах; System.Globalization ашиглан; нэрийн орон зай WinFormSpeech ( нийтийн хэсэгчилсэн анги Form1: Маягт ( статик CultureInfo ci = new CultureInfo("en-us"); статик SpeechRecognitionEngine sre = шинэ SpeechRecognitionEngine(ci); нийтийн Form1() ( InitializeComponent(); sre.DevicesAre. .SpeechRecognized += sre_SpeechRecognized; Grammar g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodgrammarAsync(g_HelloGoods.Box). re.Recognize Async() нь CheckBox үйл явдлын зохицуулагч дотор // байна ) static Grammar GetHelloGoodbyeGrammar() ( Сонголтууд ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("сайн уу"); ch_HelloGoodbye.Add("баяртай"); GrammarBuilder gb_result = new GrammarBuilder(Граммар Builder new); үр дүн) ; буцах g_result; ) static Grammar GetTextBox1TextGrammar() ( Сонголтууд ch_Colors = new Choices(); ch_Colors.Add(шинэ мөр ( "улаан", "цагаан", "цэнхэр" )); GrammarBuilder gb_result = шинэ GrammarBuilder(); gb_result.Append("текст хайрцаг 1 тохируулах"); gb_result.Append(ch_Colors); Дүрмийн g_үр дүн = шинэ дүрэм(gb_үр дүн); g_үр дүнг буцаана; ) private void checkBox1_CheckedChanged(объект илгээгч, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // disabled srecognizelre.)C); void sre_SpeechRecognized(объект илгээгч, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf)< 0.65) return; this.Invoke(new MethodInvoker(() =>( listBox1.Items.Add("Би чамайг хэлэхийг сонссон: " + txt); ))); // WinForm-ын онцлог хэрэв (txt.IndexOf("текст") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) ( string үгс = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = үгс; ))); // WinForm-ын онцлог ) ) ) // Маягт ) // ns

    Би консол программ шиг хоёр Grammar объектыг шууд үүсгэж болох байсан ч оронд нь кодыг бага зэрэг ойлгомжтой болгохын тулд энэ ажлыг гүйцэтгэдэг туслах хоёр аргыг (GetHelloGoodbyeGrammar болон GetTextBox1TextGrammar) тодорхойлсон.

    статик дүрмийн GetTextBox1TextGrammar() ( Сонголтууд ch_Colors = шинэ Сонголт(); ch_Colors.Add(шинэ мөр ( "улаан", "цагаан", "цэнхэр" )); GrammarBuilder gb_result = шинэ GrammarBuilder(); gb_result.Append("текст тохируулах) хайрцаг 1"); gb_result.Append(ch_Colors); Дүрмийн g_үр дүн = шинэ дүрмийн (gb_үр дүн); g_үр дүнг буцаана; )

    Энэхүү туслах арга нь "текстийн хайрцаг 1 улааныг тохируулах" хэллэгийг таних болно. Гэсэн хэдий ч хэрэглэгч энэ хэллэгийг яг таг дуудах шаардлагагүй. Жишээлбэл, тэрээр "Текстийн 1-р хайрцаг дахь текстийг улаан болгож тохируулна уу" гэж хэлж болох ба яриа таних систем нь "текстийн хайрцгийг 1-р улаан болгож тохируулна уу" гэсэн хэллэгийг таньсан хэвээр байх болно. Хэдийгээр дүрмийн дүрэмтэй яг таарч байгаагаас бага итгэл үнэмшилтэй байсан. загвар. Өөрөөр хэлбэл, дүрмийн объект үүсгэхдээ хэллэгийн бүх хувилбарыг анхаарч үзэх шаардлагагүй. Энэ нь яриа таних хэрэглээг эрс хялбаршуулдаг.

    CheckBox-ийн үйл явдлын зохицуулагчийг дараах байдлаар тодорхойлсон:

    private void checkBox1_CheckedChanged(объект илгээгч, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); else if (checkBox1.Checked == false) // disabled sre.ncco);

    Яриа таних хөдөлгүүрийн объект болох sre (яриа таних хөдөлгүүр) нь Windows Forms програмын бүх хугацаанд үргэлж байдаг. Хэрэглэгч CheckBox-г сэлгэх үед энэ объектыг RecognizeAsync болон RecognizeAsyncCancel аргууд руу залгаснаар идэвхжүүлж, идэвхгүй болгодог.

    SpeechRecognized үйл явдлын зохицуулагчийн тодорхойлолт нь:

    void sre_SpeechRecognized(объект илгээгч, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf)< 0.65) return; ...

    Үр дүн нь байнга ашиглагддаг Result.Text болон Result.Confidence шинж чанаруудаас гадна өөр хэд хэдэн ашигтай, гэхдээ илүү төвөгтэй шинж чанартай байдаг. жишээ нь, Homophones болон ReplacementWordUnits. Нэмж дурдахад яриа таних систем нь SpeechHypothesized гэх мэт хэд хэдэн хэрэгтэй үйл явдлыг хангадаг.

    this.Invoke((Action)(() => listBox1.Items.Add("Би чамайг хэлэхийг сонссон: " + txt)));

    Онолын хувьд MethodInvoker төлөөлөгчийг ашиглах нь энэ нөхцөлд Үйлдлээс арай илүү үр дүнтэй байдаг, учир нь MethodInvoker нь Windows.Forms нэрийн талбарын нэг хэсэг бөгөөд тиймээс Windows Forms програмуудад зориулагдсан байдаг. Үйл ажиллагааны төлөөлөгч нь илүү уян хатан байдаг. Энэ жишээ нь яриа таних системээр дамжуулан Windows Forms програмыг бүрэн удирдах боломжтойг харуулж байна - энэ бол гайхалтай хүчирхэг бөгөөд ашигтай функц юм.

    Дүгнэлт

    Хэрэв та .NET програмууд дахь ярианы синтез болон танигдлыг судлахыг хүсвэл энэ нийтлэлд үзүүлсэн мэдээлэл нь таныг шууд эхлүүлэх болно. Анхны сургалтын муруй болон бүрэлдэхүүн хэсгүүдийг суурилуулах зэрэг бэрхшээлийг даван туулж, технологийг эзэмших нь өөрөө хялбар юм. Ярианы нийлэгжилт, танин мэдэхүйн жинхэнэ сорилт бол энэ нь хэзээ хэрэгтэй болохыг ойлгох явдал юм.

    Консолын программуудын тусламжтайгаар та хэрэглэгч асуулт асууж, программ хариулдаг сонирхолтой харилцан яриа үүсгэж, үндсэндээ Кортанатай төстэй орчинтой болно. Таны компьютерийн чанга яригчаас яриа гарахад микрофон түүнийг хүлээн авч дахин танигдах тул та болгоомжтой байх хэрэгтэй. Би асуулт асууж, апп үүнийг таньж, хариулсан ч хэлсэн хариулт нь дараагийн таних үйлдлийг эхлүүлж, инээдтэй, эцэс төгсгөлгүй ярианы давталттай болсон.

    Консолын программ дахь ярианы өөр нэг боломж бол "Тэмдэглэлийн дэвтэр эхлүүлэх", "Үг эхлүүлэх" гэх мэт командуудыг таних явдал юм. Өөрөөр хэлбэл, ийм консол программыг компьютер дээрээ гар, хулганыг маш их засварлах шаардлагатай үйлдлүүдийг гүйцэтгэхэд ашиглаж болно.

    Жеймс Маккаффри(Доктор Жеймс Маккаффри) Вашингтоны Редмонд дахь Microsoft Research-д ажилладаг. Тэрээр Internet Explorer, Bing зэрэг Microsoft-ын хэд хэдэн бүтээгдэхүүнийг бүтээхэд оролцсон. Түүнтэй холбогдож болно [имэйлээр хамгаалагдсан].

    Энэ нийтлэлийг хянаж үзсэн Microsoft судалгааны мэргэжилтнүүд Роб Груэн, Марк Маррон, Кертис фон Ве нарт баярлалаа.