ãã®èšäºã§ã¯ã家é»ãå¶åŸ¡ããå®éã®
Hello Worldã®äŸã§
ãPocketsphinxãšã³ãžã³ ïŒiOS
OpenEarsããŒãçš ïŒã§ãã·ã¢èªã®é³å£°èªèãæ£ç¢ºãã€è¿
éã«åºå®ããæ¹æ³ã詳ãã説æããŸãã
ãªããŸãã«å®¶é»è£œåãªã®ãïŒ ã¯ãããã®äŸã®ãããã§ã
Google ASRã
Yandex SpeechKitãªã©ã®ãµãŒããŒãªãã§
å®å
šã«ããŒã«ã«ãªé³å£°èªèã䜿çš
ããŠéæã§ãã
é床ãšç²ŸåºŠãè©äŸ¡ã§ãããã
ã§ã ã
ãŸããããã°ã©ã ã®ãã¹ãŠã®ãœãŒã¹ã³ãŒããšAndroidã®ã¢ã»ã³ããªãèšäºã«æ·»ä»ããŸãããªãçªç¶ã§ããïŒ
Yandex SpeechKitãiOSã¢ããªã±ãŒã·ã§ã³ã«
ãã蟌ãããšã«ã€ããŠã®èšäºã«æè¿ã€ãŸãããã®ã§
ãèè
ãããã°ã©ã ã«ãµãŒããŒããŒã¹ã®é³å£°èªèã䜿çšããçç±ã
å°ããŸãã ïŒç§ã®æèŠã§ã¯ãããã¯åé·ã§ãããããã€ãã®åé¡ãåŒãèµ·ãããŸããïŒã ç§
ã¯åè«ã
åããŸãã ïŒäœãèªèããå¿
èŠããªããèŸæžãéãããåèªã®ã»ããã§æ§æãããŠãããããžã§ã¯ãã§ã®ä»£æ¿æ¹æ³ã®äœ¿çšããã詳ãã説æã§ããŸããïŒ ã¯ãããããŠå®çšçãªã¢ããªã±ãŒã·ã§ã³ã®äŸã§...
YandexãšGoogle以å€ã®äœããå¿
èŠãªã®ã¯ãªãã§ããïŒ
éåžžã«ãå®çšçãªã¢ããªã±ãŒã·ã§ã³ã
ãšããŠãã¹ããŒãããŒã ã®é³å£°å¶åŸ¡ã®ãããã¯ãéžæããŸããã
ãªããã®ãããªäŸã§ããïŒ ãã®çç±ã¯ãã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ã䜿çšããèªèãããå®å
šã«ããŒã«ã«ãªé³å£°èªèã®å©ç¹ãããã€ãããããã§ãã ããªãã¡ïŒ
- é床 -ãµãŒããŒã«äŸåããŠããªãããããµãŒããŒã®å¯çšæ§ã垯åå¹
ãªã©ã«äŸåããŠããŸããã èŠå
- 粟床 -ç§ãã¡ã®ãšã³ãžã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã«èå³ã®ããèŸæžã§ã®ã¿åäœãããããèªèã®å質ãåäžããŸã
- ã³ã¹ã -ãµãŒããŒãžã®ãªã¯ãšã¹ãããšã«æ¯æãå¿
èŠã¯ãããŸãã
- é³å£°ã¢ã¯ãã£ããŒã·ã§ã³ -æåã®ãã€ã³ããžã®è¿œå ããŒãã¹ãšããŠ-ãã©ãã£ãã¯ãç¡é§ã«ããããµãŒããŒãããŒãããã«ãåžžã«ããããŒããã£ã¹ããèããããšãã§ããŸã
ã泚æãããã®å©ç¹ã¯ãç¹å®ã®ã¯ã©ã¹ã®ãããžã§ã¯ãã§ã®ã¿å©ç¹ãšèŠãªãããšãã§ãããŠãŒã¶ãŒãæäœããèŸæžãšææ³ãæ£ç¢ºã«äºåã«ç¥ã£ãŠããããšãããã«èšããªããã°ãªããŸããã ã€ãŸããä»»æã®ããã¹ãïŒSMSã¡ãã»ãŒãžãæ€çŽ¢ã¯ãšãªãªã©ïŒãèªèããå¿
èŠããªãå Žåã§ãã ãã以å€ã®å Žåã¯ãã¯ã©ãŠãèªèãäžå¯æ¬ ã§ãã
ãããã£ãŠãAndroidã¯ã€ã³ã¿ãŒããããªãã§é³å£°ãèªèã§ããŸãïŒ
ã¯ããã¯ã... JellyBeanã®ã¿ã ãããŠãããã0.5ã¡ãŒãã«ã§ãã ãããŠããã®èªèã¯åããã£ã¯ããŒã·ã§ã³ã§ãããããå°ããªã¢ãã«ã䜿çšããã ãã§ãã ãã®ããã管çãæ§æãã§ããŸããã ãããŠã圌女ã次ã«ç§ãã¡ã«è¿ããã®ã¯äžæã§ãã ãã ããSMSã®å Žåã¯åé¡ãããŸããã
ã©ãããïŒ
æ°ã¡ãŒãã«ãããéåžžã«å®äŸ¡ãªAndroidã¹ããŒããã©ã³ãã¿ãã¬ãããæèšã®å®äŸ¡
ãªãã¬ãŒããžã£ã³ã¯ã§ããæ£ç¢ºãã€è¿
éã«åäœãã家é»è£œåçšã®é³å£°ã³ã³ãããŒã«ããã«ãå®è£
ããŸãã
ããžãã¯ã¯ã·ã³ãã«ã§ãããéåžžã«å®çšçã§ãã ãã€ã¯ãæå¹ã«ããŠã1ã€ä»¥äžã®ããã€ã¹åãèšããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ããããèªèããçŸåšã®ç¶æ
ã«å¿ããŠãªã³/ãªãã«ããŸãã ãŸãã¯åœŒã¯ããããã幞éãåãåããæ°æãè¯ã女æ§ã®å£°ã§ãããçºé³ããã ããšãã°ãéšå±ã®çŸåšã®æž©åºŠã
é³å£°ããã€ã¯ã¢ã€ã³ã³ã®ã¯ãªãã¯ããŸãã¯åã«ç»é¢ã«æã眮ãã ãã§ããã€ã¯ãã¢ã¯ãã£ãã«ããŸãã 次ã«ãç»é¢ãå®å
šã«ãªãã«ããããšãã§ããŸãã
å®çšçãªã¢ããªã±ãŒã·ã§ã³æãç®ãéããã«ããã€ãã¹ã¿ã³ãã®ã¹ããŒããã©ã³ã®ç»é¢ã«æã®ã²ããå©ããããã¯ããããããŸãïŒããšèšããŸãã-ã¹ã¯ãªãããéå§ãããã³ãŒããŒã¡ãŒã«ãŒããªã³ã«ãªãããã¶ãŒã鳎ããå¿å°ããé³æ¥œãèãããã«ãŒãã³ãéããŸãã
å£ã®åéšå±ã«ããå®äŸ¡ãªïŒ2å°ã§æ°åå°ïŒã¹ããŒããã©ã³ã«ã¶ãäžããŸãã ç§ãã¡ã¯ä»äºã®åŸã«å®¶ã«åž°ãããã¹ããŒãããŒã ïŒ å
ããã¬ãïŒã-次ã«äœãèµ·ãããã話ãå¿
èŠã¯ãªããšæããŸãã
ãããªã¯æåŸã«äœãèµ·ãã£ããã瀺ããŠããŸãã 次ã«ãå®éã«æ©èœããã³ãŒããšå°ãã®çè«ããã®æç²ã䜿çšããæè¡çãªå®è£
ã«ã€ããŠèª¬æããŸãã
Pocketsphinxãšã¯
Pocketsphinxã¯ãAndroidçšã®ãªãŒãã³ãœãŒã¹èªèãšã³ãžã³ã§ãã ãŸã
ãiOS ã
WindowsPhone ãããã«ã¯
JavaScript çšã®ããŒãããã
ãŸã ã
ããã€ã¹ã§é³å£°èªèãçŽæ¥å®è¡ããåæã«ã¿ã¹ã¯å°çšã«æ§æããããšãã§ããŸãã ãŸãããããã«äœ¿ãããé³å£°ã¢ã¯ãã£ããŒã·ã§ã³æ©èœãæäŸããŸãïŒä»¥äžãåç
§ïŒã
èªèãšã³ãžã³ããã·ã¢èªã¢ãã«ïŒãœãŒã¹ã§èŠã€ããããšãã§ããŸãïŒãšãŠãŒã¶ãŒã¯ãšãªã®ææ³ã«ããã£ãŒããã§ããŸãã ããã¯ãŸãã«ã¢ããªã±ãŒã·ã§ã³ãèªèãããã®ã§ãã ãã以å€ã¯äœãèªèã§ããŸããã ãããŠããã®çµæãç§ãã¡ãæåŸ
ããªãäœããã»ãšãã©æ±ºããŠäžããŸããã
ææ³JSGFJSGFææ³åœ¢åŒã¯ ãä»ã®å€ãã®åæ§ã®ãããžã§ã¯ããšåæ§ã«ãPocketsphinxã«ãã£ãŠäœ¿çšãããŸãã ãŠãŒã¶ãŒãçºé³ãããã¬ãŒãºã®ããªãšãŒã·ã§ã³ãååãªæè»æ§ã§èšè¿°ããããšãã§ããŸãã ç§ãã¡ã®å Žåãææ³ã¯ãããã¯ãŒã¯äžã®ããã€ã¹ã®ååããæ§ç¯ãããŸãã次ã®ãããªãã®ã§ãã
<commands> = | | ;
Pocketsphinxã¯çµ±èšçèšèªã¢ãã«ã«ã察å¿ããŠãããã³ã³ããã¹ãããªãŒã®ææ³ã§ã¯èª¬æãããŠããªãèªçºçãªçºè©±ãèªèããããšãã§ããŸãã ããããç§ãã¡ã®ã¿ã¹ã¯ã§ã¯ãããã¯åã«å¿
èŠã§ã¯ãããŸããã ææ³ã¯ããã€ã¹åã®ã¿ã§æ§æãããŸãã èªèããã»ã¹ã®åŸãPocketsphinxã¯ããã€ã¹ã次ã
ãšç§»åããéåžžã®ããã¹ãè¡ãè¿ããŸãã
#JSGF V1.0; grammar commands; public <command> = <commands>+; <commands> = | | ;
ãã©ã¹èšå·ã¯ããŠãŒã¶ãŒã1ã€ã§ã¯ãªãè€æ°ã®ããã€ã¹ã«é£ç¶ããŠååãä»ããããšãã§ããããšã瀺ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ããŒãããŒã ã³ã³ãããŒã©ãŒïŒäžèšåç
§ïŒããããã€ã¹ã®ãªã¹ããåãåãããã®ãããªææ³ã
Grammarã¯ã©ã¹ã«çæããŸãã
転å
ææ³ã¯ã
ãŠãŒã¶ãŒãäœ
ãèšãããšãã§ãããã«ã€ããŠèª¬æã
ãŸã ã Pocketsphinxã
ã©ã®ããã«çºé³ãã
ããç¥ãããã«ã¯ãææ³ã®ååèªã察å¿ããèšèªã¢ãã«ã§ã©ã®ããã«èãããããèšè¿°ããå¿
èŠããããŸãã ãããååèªã®
転åã§ã ã ããã¯
èŸæžãšåŒã°ããŸãã
転åã¯ãç¹å¥ãªæ§æã䜿çšããŠèšè¿°ãããŸãã äŸïŒ
uu mn ay j d oo m
ååãšããŠãè€éãªããšã¯äœããããŸããã 転åã«ãããäºéæ¯é³ã¯ãã¹ãã¬ã¹ã瀺ããŸãã äºéåé³-æ¯é³ãç¶ãæãããåé³ã ãã·ã¢èªã®ãã¹ãŠã®é³ã®ãã¹ãŠã®å¯èœãªçµã¿åãã
ã¯ãèšèªã¢ãã«èªäœã«ãããŸãã
ãŠãŒã¶ãŒãããã€ã¹ã«ä»ããååãäºåã«ç¥ããªããããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®æåèµ·ãããäºåã«èª¬æã§ããªãããšã¯æããã§ãã ãããã£ãŠããã·ã¢ã®é³å£°åŠã®ããã€ãã®ã«ãŒã«ã«åŸã£ãŠããã®ãããªè»¢åãããªã³ã¶ãã©ã€ãã§çæããŸãã ãããè¡ãã«ã¯ãå
¥åã§è¡ãåãåãããã®ããã®æ£ãããã©ã³ã¹ã¯ãªãã·ã§ã³ãçæã§ãã
PhonMapperã¯ã©ã¹ãå®è£
ã§ããŸãã
é³å£°ã¢ã¯ãã£ããŒã·ã§ã³
ããã¯ãé³å£°èªèãšã³ãžã³ãäºåã«å®çŸ©ããããã¬ãŒãºã«å¿çããããã«ãåžžã«ãè³ãåŸãããèœåã§ãã ãã®å Žåãä»ã®ãã¹ãŠã®ãµãŠã³ããšé³å£°ã¯ç Žæ£ãããŸãã ããã¯ãææ³ã説æãããã€ã¯ããªã³ã«ããã ããšã¯ç°ãªããŸãã ãã®åé¡ã®çè«ãšããã®ä»çµã¿ã®ä»çµã¿ã«ã€ããŠã¯èª¬æããŸããã æè¿ãPocketsphinxã«åãçµãã§ããããã°ã©ããŒããã®ãããªé¢æ°ãå®è£
ããçŸåšã§ã¯APIã§ãããã«äœ¿çšå¯èœãã«ãªã£ããšããèšããŸããã
èšåãã䟡å€ã®ããããšã®1ã€ã¯å¿
é ã§ãã ã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã§ã¯ãæåèµ·ããã瀺ãã ãã§ãªã
ãæ床ãããå€ã®é©åãª
å€ãéžæããå¿
èŠããããŸãã å€ãå°ãããããšãå€ãã®èª€æ€ç¥ãçºçããŸãïŒããã¯ãã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºãèšããªãã£ãå Žåã§ãã·ã¹ãã ã¯ãããèªèããŸãïŒã é«ããã-å
ç«ã«ã ãããã£ãŠããã®èšå®ã¯ç¹ã«éèŠã§ãã å€ã®å€§ãŸããªç¯å²ã¯
ãã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã«å¿ããŠ1e-1ã1e-40ã§ãã
è¿æ¥ã»ã³ãµãŒã®ã¢ã¯ãã£ããŒã·ã§ã³ãã®ã¿ã¹ã¯ã¯ãããžã§ã¯ãã«åºæã®ãã®ã§ãããèªèã«çŽæ¥é¢ä¿ãããã®ã§ã¯ãããŸããã ãã®ã³ãŒãã¯ã
ã¡ã€ã³ã¢ã¯ãã£ããã£ã§èŠãããšãã§ããŸãã
SensorEventListenerãå®è£
ããè¿ã¥ããšïŒã»ã³ãµãŒã®å€ãæ倧å€ãããå°ããïŒã¿ã€ããŒãéå§ããäžå®ã®é
延ã®åŸãã»ã³ãµãŒããŸã ãããã¯ãããŠãããã©ããã確èªããŸãã ããã¯ã誀æ€ç¥ãæé€ããããã«è¡ãããŸãã
ã»ã³ãµãŒãåã³ãããã¯ãããªãå Žåãèªèãåæ¢ããçµæãåãåããŸãïŒä»¥äžã®èª¬æãåç
§ïŒã
æ¿èªãéå§
Pocketsphinxã¯ãèªèããã»ã¹ãæ§æããã³éå§ããããã®äŸ¿å©ãªAPIãæäŸããŸãã ãããã¯
SppechRecognizerããã³
SpeechRecognizerSetupã¯ã©ã¹ã§ãã
èªèã®æ§æãšããªã¬ãŒã¯æ¬¡ã®ããã«ãªããŸãã
PhonMapper phonMapper = new PhonMapper(getAssets().open("dict/ru/hotwords")); Grammar grammar = new Grammar(names, phonMapper); grammar.addWords(hotword); DataFiles dataFiles = new DataFiles(getPackageName(), "ru"); File hmmDir = new File(dataFiles.getHmm()); File dict = new File(dataFiles.getDict()); File jsgf = new File(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) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);
ããã§ã¯ããŸãå¿
èŠãªãã¹ãŠã®ãã¡ã€ã«ããã£ã¹ã¯ã«ã³ããŒããŸãïŒPocketpshinxã«ã¯ãé³é¿ã¢ãã«ãææ³ãããã³è»¢åèŸæžããã£ã¹ã¯äžã«å¿
èŠã§ãïŒã 次ã«ãèªèãšã³ãžã³èªäœãæ§æãããŸãã ã¢ãã«ãã¡ã€ã«ãšèŸæžãã¡ã€ã«ãžã®ãã¹ãããã³ããã€ãã®ãã©ã¡ãŒã¿ãŒïŒã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã®æ床ãããå€ïŒã瀺ãããŠããŸãã 次ã«ãæç« æ ¡æ£ãã¡ã€ã«ãžã®ãã¹ãšã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºãæ§æããŸãã
ãã®ã³ãŒããããããããã«ã1ã€ã®ãšã³ãžã³ã¯ãææ³ãšã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã®èªèã®äž¡æ¹ã«å¯ŸããŠçŽã¡ã«æ§æãããŸãã ãªããããè¡ãããã®ã§ããïŒ ãã®ãããçŸæç¹ã§èªèããå¿
èŠããããã®ããã°ããåãæ¿ããããšãã§ããŸãã ã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºèªèããã»ã¹ã®éå§ã¯æ¬¡ã®ããã«ãªããŸãã
mRecognizer.startListening(KWS_SEARCH);
ãããŠ-äžããããææ³ã«åŸã£ãé³å£°èªèïŒ
mRecognizer.startListening(COMMAND_SEARCH, 3000);
2çªç®ã®åŒæ°ïŒãªãã·ã§ã³ïŒã¯ã誰ãäœãèšããªãã£ãå Žåã«èªèãèªåçã«çµäºãããŸã§ã®ããªç§æ°ã§ãã
ã芧ã®ãšããã1ã€ã®ãšã³ãžã³ã®ã¿ã䜿çšããŠäž¡æ¹ã®åé¡ã解決ã§ããŸãã
èªèçµæãååŸããæ¹æ³
èªèçµæãååŸããã«ã¯ã
RecognitionListenerã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã€ãã³ããªã¹ããŒãæå®ããå¿
èŠããããŸãã
ã€ãã³ãã®1ã€ãçºçãããšãã«pocketsphinxã«ãã£ãŠåŒã³åºãããããã€ãã®ã¡ãœããããããŸãã
- onBeginningOfSpeech-ãšã³ãžã³ãäœããã®é³ãèãããããã¯ã¹ããŒãã§ãããããããªãïŒãŸãã¯ããã§ãªããããããªãïŒ
- onEndOfSpeech-ãµãŠã³ãã¯çµäºããŸãã
- onPartialResult-äžéã®èªèçµæããããŸãã ã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã®å Žåãããã¯æ©èœããããšãæå³ããŸãã 仮説åŒæ°ã«èªèããŒã¿ãå«ãŸããïŒæååãšã¹ã³ã¢ïŒ
- onResult-èªèã®æçµçµæã ãã®ã¡ãœããã¯ã SpeechRecognizer㧠stopã¡ãœãããåŒã³åºããåŸã«åŒã³åºãããŸã ã 仮説åŒæ°ã«èªèããŒã¿ãå«ãŸããïŒæååãšã¹ã³ã¢ïŒ
äœããã®æ¹æ³ã§onPartialResultããã³onResultã¡ãœãããå®è£
ããããšã«ãããèªèããžãã¯ãå€æŽããŠæçµçµæãååŸã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®å Žåã次ã®ããã«ãªããŸãã
@Override public void onEndOfSpeech() { Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) { mRecognizer.stop(); } } @Override public void onPartialResult(Hypothesis hypothesis) { if (hypothesis == null) return; String text = hypothesis.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) { startRecognition(); } else { Log.d(TAG, text); } } @Override public void onResult(Hypothesis hypothesis) { mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); String text = hypothesis != null ? hypothesis.getHypstr() : null; Log.d(TAG, "onResult " + text); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) { if (text != null) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); process(text); } mRecognizer.startListening(KWS_SEARCH); } }
onEndOfSpeechã€ãã³ããåä¿¡ããåæã«å®è¡ããã³ãã³ããèªèããå Žåãèªèãåæ¢ããå¿
èŠããããŸãããã®åŸãããã«onResultãåŒã³åºãããŸãã
OnResultã¯ãèªèãããã°ããã®ãã®ããã§ãã¯ããå¿
èŠããããŸãã ãããã³ãã³ãã§ããå Žåããããå®è¡ãããšã³ãžã³ãã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã®èªèã«åãæ¿ããå¿
èŠããããŸãã
onPartialResultã§ã¯ãã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã®èªèã«ã®ã¿é¢å¿ããããŸãã ãããæ€åºããããããã«ã³ãã³ããèªèããããã»ã¹ãéå§ããŸãã ããã¯æ¬¡ã®ãããªãã®ã§ãã
private synchronized void startRecognition() { if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) return; mRecognizer.cancel(); new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME).startTone(ToneGenerator.TONE_CDMA_PIP, 200); post(400, new Runnable() { @Override public void run() { mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, 3000); Log.d(TAG, "Listen commands"); post(4000, mStopRecognitionCallback); } }); }
ããã§ã¯ãæåã«å°ããªä¿¡å·ãåçããŠããŠãŒã¶ãŒã®å£°ãèããããŒã ã®æºåãã§ããããšããŠãŒã¶ãŒã«èŠåããŸãã ãã®æç¹ã§ãã€ã¯ããªãã«ããå¿
èŠããããŸãã ãããã£ãŠãçãã¿ã€ã ã¢ãŠãïŒãšã³ãŒãèãããªãããã«ä¿¡å·ã®æç¶æéããå°ãé·ãïŒã®åŸã«èªèãéå§ããŸãã ãŸãããŠãŒã¶ãŒãããŸãã«ãé·ãé話ããšèªèã匷å¶çã«åæ¢ããã¹ã¬ãããéå§ããŸãã ãã®å Žåã3ç§ã§ãã
èªèãããæååãã³ãã³ãã«å€æããæ¹æ³
ããŠãããã§ã¯ãã¹ãŠãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«åºæã§ãã 裞ã®äŸã®å ŽåãåçŽã«åç·ããããã€ã¹åãåŒãåºãããããããç®çã®ããã€ã¹ãæ¢ããŠãã¹ããŒãããŒã ã³ã³ãããŒã©ãŒãžã®HTTPãªã¯ãšã¹ãã䜿çšããŠç¶æ
ãå€æŽããããçŸåšã®ç¶æ
ãå ±åããŸãïŒãµãŒã¢ã¹ã¿ããã®å Žåã®ããã«ïŒã ãã®ããžãã¯ã¯ã
Controllerã¯ã©ã¹ã§ç¢ºèªã§ããŸãã
é³å£°ãåæããæ¹æ³
é³å£°åæã¯èªèã®å察ã§ãã ããã§ã¯ãéã«ããŠãŒã¶ãŒãããã¹ããèãããšãã§ããããã«ãããã¹ãã®è¡ãé³å£°ã«å€æããå¿
èŠããããŸãã
ãµãŒã¢ã¹ã¿ããã®å ŽåãAndroidããã€ã¹ã«çŸåšã®æž©åºŠã匷å¶çã«äŒããå¿
èŠããããŸãã
TextToSpeech APIã䜿çšãããš
ãããã¯éåžžã«ç°¡åã§ãïŒãã·ã¢èªã®çŸãã女æ§TTSãGoogleã«æè¬ããŸãïŒã
private void speak(String text) { synchronized (mSpeechQueue) { mRecognizer.stop(); mSpeechQueue.add(text); HashMap<String, String> params = new HashMap<String, String>(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, "true"); mTextToSpeech.speak(text, TextToSpeech.QUEUE_ADD, params); } }
ç§ã¯ãããããããªãã£ãèšãã§ãããã
ãåæããã»ã¹ã®åã«ãããªãã¯ééããªãèªèããªãã«ããå¿
èŠããããŸã ã äžéšã®ããã€ã¹ïŒããšãã°ããã¹ãŠã®SamsungïŒã§ã¯ããã€ã¯ãåæã«èããªããäœããåæã«åæããããšã¯äžè¬çã«äžå¯èœã§ãã
é³å£°åæã®çµäºïŒã€ãŸããã·ã³ã»ãµã€ã¶ãŒã«ããããã¹ãã®èªã¿äžãããã»ã¹ã®çµäºïŒã¯ããªã¹ããŒã§è¿œè·¡ã§ããŸãã
private final TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() { @Override public void onUtteranceCompleted(String utteranceId) { synchronized (mSpeechQueue) { mSpeechQueue.poll(); if (mSpeechQueue.isEmpty()) { mRecognizer.startListening(KWS_SEARCH); } } } };
ãã®äžã§ãåæã®ãã¥ãŒã«ä»ã«äœãããããã©ããã確èªããä»ã«äœããªãå Žåã¯ã¢ã¯ãã£ããŒã·ã§ã³ãã¬ãŒãºã®èªèããªã³ã«ããŸãã
ããã ãã§ããïŒ
ã¯ãïŒ ã芧ã®ãšãããPocketsphinxã®ãããªçŽ æŽããããããžã§ã¯ããååšãããããããã€ã¹äžã§é³å£°ãçŽæ¥ãã€è¿
éã«æ£ç¢ºã«èªèããããšã¯é£ãããããŸããã é³å£°ã³ãã³ãã®èªèã«é¢é£ããã¿ã¹ã¯ã®è§£æ±ºã«äœ¿çšã§ããéåžžã«äŸ¿å©ãªAPIãæäŸããŸãã
ãã®äŸã§ã¯ãèªèãå®å
šã«äžè²«æ§ã®ããã¿ã¹ã¯ãã€ãŸã
ã¹ããŒãããŒã ããã€ã¹ã®é³å£°å¶åŸ¡ã«ãã蟌ã¿ãŸããã ããŒã«ã«ã§ã®èªèã«ãããéåžžã«é«éã§ãšã©ãŒãæå°éã«æããŸããã
åãã³ãŒããé³å£°ã«é¢é£ããä»ã®ã¿ã¹ã¯ã«äœ¿çšã§ããããšã¯æããã§ãã ããã¯ã¹ããŒãããŒã ã§ããå¿
èŠã¯ãããŸããã
GitHubã®ãªããžããªã§ ããã¹ãŠã®ãœãŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ããªãèŠã€ããããšãã§ããŸãã
ãŸããç§ã®YouTubeãã£ã³ãã«ã§ã¯ãã¹ããŒãããŒã ã·ã¹ãã ã ãã§ãªããé³å£°å¶åŸ¡ã®ä»ã®å®è£
ãèŠãããšãã§ããŸãã