ä»åã¯ãVoicePingã®é³å£°å ¥åæ©èœïŒSpeech-to-TextïŒä»¥äžSTTïŒã«ã€ããŠè©³ããã玹ä»ããŠãããŸããã©ã®ããã«ã·ã¹ãã ãæ§ç¯ãçµã¿èŸŒãã§ãã£ãã®ãããŸããã¯ã©ãŠããµãŒãã¹ãšãã圢ããšããªãããã©ã®ããã«ããŠæå€§éã®å¹çæ§ãšå質ã远æ±ããããšãã§ããã®ãèŠãŠãããŸãããã
å¿«é©ãªãªã¢ãŒãã¯ãŒã¯ãå®çŸããæ©èœãæºèŒã®VoicePingã¯ãé¢ããŠä»äºããããªã¢ãŒãããŒã ã«ãšã£ãŠãŸãã«çæ³çãªããŒã«ã§ããçŸåšVoicePingã§ã¯ããã¬ãã¢ã ãã©ã³ã1幎éç¡æã§æäŸããŠããŸãããç³èŸŒã¿ã¯https://voice-ping.com/ ããïŒ
èšäºæŠèŠ
é³å£°èªèããããã¹ãåãŸã§è¡ãã·ã¹ãã ïŒSTTïŒããŒãããæ§ç¯ããé«ã質ã粟床ãŸã§ãã£ãŠããããšããã®ã¯ãšãŠãé£ããããšãªã®ã§ããã ããããå€ãã®äŒæ¥ãéçºè ãã¡ã¯ãèªåãã¡ã§ã·ã¹ãã ãæ§ç¯ããããããæ¢åã®SaaSãœãªã¥ãŒã·ã§ã³ãéžæãããšããåŸåã«ããã®ã§ããæ¢åã®ãµãŒãã¹ã¯ã質ãé«ããããŸããŸãªèšèªã«ã察å¿ã§ããŠããŸãããã§ãã
ããããã®å Žåã«èª²é¡ãšãªãã®ãã³ã¹ãã§ããå€ãã®ãµãŒãã¹ã¯ãã䜿ã£ãåã ãæ¯æãããšããæéäœç³»ãåã£ãŠãããäœ¿ãæ¹ã«ãã£ãŠã¯å®ãæžãããšããããããããŸããããéã«å°ãã§ã䜿ãéãããšé«ãã€ããŠããŸããŸãããã©ã®ããã«ãã©ãã ã䜿ããããšããã®ããã€ã³ãã§ãã
ä»åã¯ãSTTæ©èœãæ¡çšãããããVoicePingããããã«ã³ã¹ããåæžãããããã玹ä»ããŸããè²»çšãããããã¡ãªSTTããããã«å®äŸ¡ã«å°å ¥ããã®ããç§ãã¡ãç«ãŠãæŠç¥ã§ãã
VoicePingã¯ãäŒè°äžããŠãŒã¶ãŒã®å€§åã¯èã圹ã«åŸ¹ããŠããããã€ãŸããçºèšããªãç¶æ ã«ããããšããäºå®ã«ç®ãã€ããVADïŒVoice Activity DetectionïŒã©ã€ãã©ãªã䜿ãããã®ãïŒãŠãŒã¶ãŒã声ãçºããªãæéã«çããïŒç¡é³ã®é³å£°ãæŸããªãããšããæŠç¥ãç«ãŠããšããããéçºãé²ããŸããã
éçºã«ãããç§ãã¡ãçŽé¢ãã課é¡ã«ã€ããŠããã©ã®ããã«è§£æ±ºçããšã£ãã®ãã玹ä»ããŠãããŸãã
ã¯ããã«
ãSpeech-to-TextïŒSTTïŒãã¯ããèªåé³å£°èªèïŒASRïŒAutomatic Speech RecognitionïŒããšãåŒã°ããYouTubeã®èªååå¹çæãSiriã»ã¢ã¬ã¯ãµã»ã³ã«ã¿ããªã©ã®ããŒãã£ã«ã¢ã·ã¹ã¿ã³ãããã®ä»æ°å€ãã®ã¢ããªã«æŽ»çšãããŠããããšã§ç¥ãããŠããŸãã
VoicePingã§ã¯ãäŒè°äžã«çºèšãšåæã«ãªã¢ã«ã¿ã€ã ã§ããã¹ãåãããæåèµ·ããæ©èœããšããŠäœ¿çšãããŠããŸããåæã«èšèªç¿»èš³ãè¡ãã翻蚳ããã¹ãã衚瀺ãããããšãã§ããŸããããã«Slackãšåæããããšã§ããã®ããã«æåèµ·ãããããæ å ±ãã¯ãŒã¯ã¹ããŒã¹äžã§å ±æããããšãã§ããäŒè°ã§è©±ãåãããæ å ±ãå®å šã«èšé²ããããšãã§ããŸãã
æåèµ·ãããããè°äºé²ãšSlackãåæããããšã§ãäŒè°äžã«è©±ãåãããè°é¡ãå¿ããªããããã³çãããããç¹å®ã®çºèšãããã¯ããŒã¯ãããªã©ãSlackäžã®ããŸããŸãªæ©èœãšé¢é£ã¥ããŠæŽ»çšããããšãã§ããŸããèªåã«å²ãæ¯ãããã¿ã¹ã¯ãããã«æ¯ãè¿ã£ããããããã¯äŒè°æéãè¶³ãã話ãåããååã«è¡ãããªãã£ã課é¡ã«ã€ããŠSlackã¹ã¬ããäžã§åŒãç¶ãè°è«ããããããšãã£ãããšãå¯èœã«ãªãã®ã§ãã
ã€ã³ããªã¡ã³ããŒã·ã§ã³
ãé³å£°ãããã¹ã倿ããAIã·ã¹ãã ã®æ§ç¯ããšããã®ã¯æ±ºããŠç°¡åãªããšã§ã¯ãããŸããããã®ããã«ãããã°èšäº1æ¬ã§èªãããšãã§ãããããªè©±é¡ã§ã¯ãããŸãããããŸããã²ãšãã§ããªãããããªä»äºã§ããããŸãããAIã«åŠç¿ããããã®äœ¿çšå¯èœæ§ãæ€èšŒãèªèšŒããããã«ã¯ãèšå€§ãªé³å£°ãã¡ã€ã«ãããã¹ãåæ å ±ãå¿ èŠã«ãªã£ãŠããŸããããã«ä»èšèªãµããŒããè¡ãã·ã¹ãã ã®å Žåãããããä»èšèªã®æ å ±ãªã©ãå¿ èŠãšãªããããä»äºã¯å¢ãã°ããã§ããããã«ã€ããŠã¯ãç§èªèº«ããã£ãã説æãããããšæããã®ã®ãæ£çŽã©ããã説æãå§ããã°ããã®ãæ€èšãã€ããŸããã
幞ããçŸåšã§ã¯æ°å€ãã®ãããããµãŒãã¹ãå©çšããããšãã§ããŸãããè³ªãæ¥ã åäžããŠããŸããå Žåã«ãã£ãŠã¯ããããè¡ãããŒãèµ·ããã®è³ªã«å¹æµãã粟床ã®ãã®ãååšããŸãããããåé¡ã¯ã³ã¹ãã§ããéå¶ããããŒã«ã®ãŠãŒã¶ãŒæ°ãåçã«ããããŸããããããããµãŒãã¹ã¯äžè¬çã«è²»çšãé«ããç¶ç¶å©çšãé£ãããšããå Žåãå€ãã§ããããããã§ã解決çã2ã€ã玹ä»ããŸãã
ãŸãã²ãšã€ãã¯ãç¡æãµãŒãã¹ã®å©çšã§ããã»ãšãã©ã®ãµãŒãã¹ã¯ãå©çšæéãäœ¿çšæ¡ä»¶ã«å¶éããããã®ã®ãç¡æçãæäŸããŠããŸãããç¡æçã§ã¯ãã¯ãç©è¶³ããªãããšããå Žåã¯ãææã®SaaSãœãªã¥ãŒã·ã§ã³ã䜿ãã»ããããŸããããå®éšçã«æäŸãããŠããWeb Speech APIãå©çšãããšããæããGoogle ChromeãMicrosoft Edgeã®ããã«ããã§ã«Web Speech APIãå®è£ ããŠãããã©ãŠã¶ããããŸãã
ããããçŽ æŽãããããŒã«ã§ã¯ãããã®ã®ããã¯ããå¶éãèšããããŠããããšããããšããããŠãããŸã§å®éšçãªAPIã§ãããããããã¹ãŠã®ãã©ãŠã¶ãå®è£ ããŠããããã§ã¯ãªãããšããç¹ã課é¡ã§ãããŠãŒã¶ãŒã«ãç¹å®ã®ãã©ãŠã¶ã䜿ãããä¿ããªããã°ãªããªããªã£ãŠããŸããšãªããšãããŒã«èªäœã®è©äŸ¡äœäžã«ã€ãªããããšãèããããŸãã
ããã«ãAPIèªäœã«ãå¶éããä»ã®ãšããã䜿çšããå
¥åããã€ã¹ãéžæããæ¹æ³ã¯ãªãã.start()
ãåŒã³åºãããšã§ãã€ãã«ããã©ã«ãã®å
¥åããã€ã¹ããé³å£°é²é³ãéå§ãããšããæ¹æ³ãåããããããŸããã
ãããã課é¡ããããç§ãã¡ã¯ã第3è ãæäŸãããµãŒãã¹ãå©çšããããšã«ãåœç¶çµè²»ãããããããã³ã¹ãåæžã®æ¹æ³ã暡玢ããããšã«ãªããŸããããããç§ãã¡ãææ¡ãããµãã€ç®ã®è§£æ±ºçãšããããšã«ãªããŸãããããã«ã€ããŠã¯æ¬¡ã®ç« ã§è©³ããèŠãŠãããŸãããã
Â
ã³ã¹ãåæž
ãããããµãŒãã¹ãå©çšããå Žåãè²»çšã¯äœæ¥éã«å¿ã課ããããšããã®ãäžè¬çã§ããSTTãœãªã¥ãŒã·ã§ã³ã®å Žåã1æéãããå¹³å1ïœ1.5ãã«çšåºŠãšèšãããŠããŸãã䜿çšéãå€ãå Žåãæ8äžæéã«ãçžåœããããšãèãããããã®å Žåã1æé0.5ãã«ã»ã©ã³ã¹ããããããŸãã
ãããããµãŒãã¹ã«é³å£°ããŒã¿ãéä¿¡ããå Žåãå®éã«é³å£°ãå«ãŸããŠãããã©ãããšããç¹ã¯èæ ®ãããŸãããé³ãå ¥ã£ãŠããããããŸããããŒã¿å šäœãåŠçãããŠããŸããããç¡é³ã®éšåã«ã€ããŠãããŒã¿åŠçãããã®ãšèŠãªãããæéãçºçããŠããŸãã®ã§ããç§ãã¡ãåé¡èŠããã®ã¯ãã®ç¹ã§ããã
ãã®ãããªæéäœç³»äžã5人ãåå ããäŒè°ã1æéè¡ããšããŸããããããã§ãããè²»çšã¯5ãã«çšåºŠãšããããšã«ãªããŸãããããã«ããã®ããŒã ãåæ§ã®ããŒãã£ã³ã°ãæã«6åè¡ããã®ãšãããšãããã ãã§æ30ãã«ã»ã©ã®è²»çšãããããŸããåå è ãã5人ã§ã¯ãªã10人ããšãã£ãå Žåã¯ããã®ããŒã ã ãã§æ60ãã«ãããã«10ããŒã ãåæ§ã®ããŒãã£ã³ã°ãéå¬ããã°ãã²ãšæã ã600ãã«ãã®ã³ã¹ããããã£ãŠããŸããšããããã§ããã³ã¹ããããã£ãŠããããã«èŠåã£ããµãŒãã¹å©çšãã§ããŠããã°åé¡ãªãã§ãããããã ã10人ãã®ã¡ã³ããŒãåå ããäŒè°ã«ãããŠããããããSTTãµãŒãã¹ãæå€§é掻çšããïŒããšããã®ã¯æ£çŽé£ãããšããã§ããã10äººå šå¡ãåæã«çºèšããããªã©ãšããå Žé¢ã¯èµ·ããåŸãªãããã§ããéåžžãã²ãšãã ããçºèšãããç¶æ ã§äŒè°ã¯é²ããããã§ãããã
ã¢ãžã£ã€ã«ããŒã ã®ãæ¯ãè¿ãããŒãã£ã³ã°ïŒã¹ããªã³ãã»ã¬ããã¹ãã¯ãã£ãïŒãã«åå ããããšã¯ãããŸããïŒããã¯ãæéãåºåããªãããã¡ã³ããŒå šå¡ãã¹ããªã³ãïŒã¹ã¯ã©ã ããŒã ãäœæ¥ãå¹çããè¡ãããã«èšå®ããçãæéïŒã«ã€ããŠãè¯ãã£ãç¹ã»æ¹åãã¹ãç¹ãæžãåºããšããããŒãã£ã³ã°ã¹ã¿ã€ã«ã§ãåå ããããšããã人ã¯åããããšæããŸãããããã§ã¯çºèšãããå¿ èŠããããŸãããSTTãå©çšããã®ã§ããã°ãããã¯å€§ããªç¡é§ã§ãã
ããããç¡é§ããªããããã«ã¯ã©ããããããã§ããããåãããããã®ã¯ãããã€ã¯ããã¥ãŒãæã¯STTããªãã«ããããšããæ¹æ³ã§ããããããã°å€§å¹ ã«ç¡é§ãåæžããããšãã§ããŸããããåãŠãŒã¶ãŒãéœåºŠãã€ã¯ããªãã«ããããšããã®ã¯ããŸãçŸå®çãªåŸçãšã¯èšããŸãããäŒè°ã®åå è ãå€ããªãã°ãªãã®ããšãå šå¡ã確å®ã«ãã€ã¯ãåã£ããã€ãããããã®ã¯ã»ãŒäžå¯èœã§ãã誰ãããã話ããŠããªãç¶æ ã§ããã€ã¯ããªã³ã«ãããŸãŸã«ããŠããã§ãããã
Â
ãçºèšãããŠããªãã®ã«ãã€ã¯ããªã³ç¶æ ã«ããŠããããšãæªãããšããããšã§ã¯ãããŸãããçºèšã®ãã³ããã€ã¯ãã€ãããæ¶ãããããã®ã¯å®éããããããã§ããã声ãé³ãçºããªãéãããã€ã¯ããªã³ã«ããç¶æ ã«ããŠããŠãäœãåé¡ã¯ãããŸããã
ãã€ã¯ããªãç¶æ ã§è©±ããå§ããå Žåããªã³ã«ãããããªãã€ã³ãããŠãããã¢ã©ãŒãæ©èœãä»ããŠã¯ãããã®ã®ãVoicePingã¯ããäŒè°äžã¯åºæ¬çã«ãã€ã¯ããªã³ã«ããŠãããæ¹ãããããšæã£ãŠããŸãããã¥ãŒãæ©èœã¯ãé»è©±ãä»ã®èŠä»¶ãªã©ã®ããããã£ããäŒè°ãšã¯é¢ä¿ãªãçºèšããªããã°ãªããªãå Žåã«éã䜿ããããã®ã ãšæããŸãã
ãŸããVoicePingã¯åªãããã€ãºãªãã¯ã·ã§ã³ãæèŒããŠãããããäŒè°äžãã£ãšãã€ã¯ããªã³ã«ããŠããŠããéé³ãªã©ã§ä»è ãéªéããå¿é ããããŸããããã®ãã€ãºãªãã¯ã·ã§ã³æ©èœã«ã€ããŠã¯å¥èšäºããåç §ãã ããã
ãã å®éãå€ãã®ãŠãŒã¶ãŒãã話ãããªãç¶æ ã«ãããªãããã€ã¯ããªã³ã«ããŠãããããããã®åã®ããŒã¿ã«ã€ããŠã¯ç¡é§ãçããªããŠã¯ãªããŸãããããã§ç§ãã¡ã¯ãé³å£°ããµãŒãã¹ã«éãïŒé³å£°ããŒã¿ãããã¹ãåãããšããäœæ¥ãè¡ãããïŒåã«ãVADïŒVoice Active DetectionïŒã䜿ãé³å£°ãååŠçããããšãæãã€ããŸããã
ããããã¯ã³ãŒããã玹ä»ããŸãããŸãã¯åæèšå®ãšãããã«ããçµæããèŠãŠãããŸãããã
Â
åæèšå®
ç§ãã¡ã䜿ã£ãŠããã®ã¯ReactãšTypeScriptãä»åã¯Reactã®ããã¯ã䜿çšããäŸã玹ä»ããŸããç§ãã¡ã¯Azure Speech to TextãµãŒãã¹ã䜿çšããŠããããäŸã§ã¯Azure APIãåºãŠããŸããã䜿çšéãæžããããã®æ¹æ³ãšããŠã¯ãã©ããªãµãŒãã¹ã«ãæå¹ã§ãã
ã«ã¹ã¿ã ããã¯useSpeechToText
ãäœæããŸãããåŸã»ã©ã³ãŒãã玹ä»ããŠãããŸãããã«ãŒãã³ã³ããŒãã³ãã®äŸããèŠãããŸãã
ãã®ã³ãŒãã¯ãäžèš2ç¹ã衚ããŠããŸãã
- ãã€ã¯ããã¥ãŒã/ãã¥ãŒãè§£é€ãããã¿ã³ã
- èªèãããé³å£°ãªã¹ãã
âéšåç/éäžçµæã¯èµ€ã§è¡šç€º
âæçµçµæã¯é»ã§è¡šç€º
ã³ã³ããŒãã³ãäžã«çµæé
åãå®çŸ©ãã颿°showMessage
ã«ã¯ãæåŸã®STTçµæããããã¯éšåçãªçµæãèŠçŽ ãšããŠçœ®ãæããã ãã§ããäžèšã®ãããªãåèã«ããŠã¿ãŠãã ããã
âã¯ãªãã¯ããã¥ãŒããè§£é€ããåŸãããã¹ããèªèãããã
âéçºããŒã«ïŒDev ToolsïŒã®ãããã¯ãŒã¯ã¿ããèŠããšããã¥ãŒãã«ãªã£ãŠããªãç¶æ
ã§ã¯ããŒã¿ãéä¿¡ãããŠããããšãåããã
äžèšã³ãŒããèŠãã°ãããããã«ãSTTãµãŒãã¹ãåŒã³åºãããã®æ³åã¯ãããŸãããæ³åã¯ãã¹ãŠãŠuseSpeechToText
ããã¯å
ã«ãããäžèšã®ã³ãŒããã確èªããããšãã§ããŸãã
现ããç¹ã¯å€æ°ãããŸãããããã§æãéèŠãªã®ã¯ããŒã¿ããµãŒãã¹ã«éä¿¡ããå Žæã§ããéä¿¡ã¯ã颿°onAudioProcess
å
ãå
·äœçã«ã¯pushStream.write(block.bytes);
ã®åŒã³åºã(73è¡ç®)ã§è¡ãããŠããŸãã䜿çšéãæžããããã®å€§ããªå€æŽç¹ã¯ããã®ãããã«ãªããŸãã
ãã®ãããªã§åãããšããããã€ã¯ããã¥ãŒãã«ãããŠããªãå Žåãç¶ããŠãµãŒãã¹ã«ããŒã¿éä¿¡ããŠããŸãããããä¿®æ£ããããã«ããã®ããã¯ã«VADãçµ±åããŸãã
Â
ãã€ã¹ã»ã¢ã¯ãã£ãã»ãã£ãã¯ã·ã§ã³ïŒVAD=é³å£°åºéæ€åºïŒ
é³å£°ãèªèãæåèµ·ããããã®ã¯å®¹æãªããšã§ã¯ãããŸãããèªåãã¡ã®åã§ããŒãããããããæ©èœãåã蟌ããšããã®ã¯å®éãšãŠãè€éã§ããã ãããããµãŒãã¹ã«å¯ŸäŸ¡ãæ¯æã䟡å€ãããã®ã§ãããããšèšã£ãŠå®éãç¡é³ã®é³å£°ã«ã¯ããã¹ãåããèŠçŽ ããããŸããããããèå¥ããã®ã¯ãã»ã©è€éã§ã¯ãªããç§ãã¡ã§ãã§ããã®ã§ããããããä»ã®äººããã§ã«äœãäžããŠãããç¡æããŒã«ããããŸããç§ãã¡ãéçºããå¿ èŠã¯ãªããäžèš2æ©èœããã§ã«å«ãŸããŠããŸãã
âhttps://www.npmjs.com/package/hark
âhttps://www.npmjs.com/package/voice-activity-detection
ç§ãã¡ã¯ã䜿ããããharkãå©çšãããã¯ãäœãããšã«ããŸããã
ãã®ã³ãŒãã§ã¯ããã§ã«åã蟌ãŸããŠããMediaStream
ããã©ã¡ãŒã¿ãšããŠåãåããã¹ããªãŒã äžã§harkãã€ã³ã¹ã¿ã³ã¹åããharkã®ã€ãã³ã speaking
ãš stopped_speaking
ã®äž¡æ¹ã«ããŠãŒã¶ãŒã話ããŠãããã©ããã瀺ãããŒã«å€ãèšå®ãã颿°ããã€ã³ãããŸããããã䜿ããSTTã®ãªã³ã»ãªããåãæ¿ããŸãããããããã¯ããã»ã©ç°¡åãªäœæ¥ã§ã¯ãªãããŸãã¯ããã€ã課é¡ãè§£æ¶ããå¿
èŠããããŸãã
Â
VADã³ãŒããSTTã³ãŒããžçµ±å
useSpeechToText
ããã¯ã®åããŒãžã§ã³ã§ã¯ããµãŒãã¹ã«ããŒã¿ãéä¿¡ãã¹ããã©ããããã§ãã¯ããããããã®React RefmutedRef
ã䜿ã£ãäžèšã³ãŒãããããŸããã
muted
ãã©ã¡ãŒã¿ãçŽæ¥ç¢ºèªãã代ããã«ããã®refã䜿çšããªãããšãããšã颿°onAudioProcess
ã¯ãAzureã®ã€ã³ã¹ã¿ã³ã¹SpeechRecognizer
ãã€ã³ã¹ã¿ã³ã¹åããã®ãšåãuseEffect
ããã¯ã®äžã§å®çŸ©ãããŠãããããAzureã€ã³ã¹ã¿ã³ã¹ã®åçæãé²ãå¿
èŠãããã®ã§ãã
VADãçµ±åããããã«ã  streamingFlagRef
ãšããæ°ãããã©ã°ã䜿ã£ãŠãããŸããããã¯ãã¥ãŒãç¶æ
ïŒmuted
ãã©ã¡ãŒã¿ ïŒãšã useAudioActive
ããã¯ã§å®çŸ©ããVADã®ç¶æ
ïŒããã§ã¯speakerActive
倿°ã§äœ¿çšïŒã«åºã¥ããŠããŸãããŸããrunning.current
ã䜿çšããAzure ã€ã³ã¹ã¿ã³ã¹ãåæåãããåã«ã¹ããªãŒãã³ã°ãããªãããã«ããŠããŸãã
ãããã®å€æ°ã¯ãã¹ãŠãshouldStream
倿°ã«ANDããŒã«åŒã§ä¿æããŠãããããã§ã®å€åã¯refstreamingFlagRef
ã®å€ãå€ããuseEffect
ã®èŠå ãšãªããŸãã
ãããŠããµãŒãã¹ã«ããŒã¿éä¿¡ãããããpushStream.write(block.bytes);
ãåŒã³åºãéã«ãif (!mutedRef.current)
ã§ã¯ãªããif (streamingFlagRef.current)
ã確èªããããã«å€æŽããŸããããããã³ãŒãã®å€æŽç¹ã«ãªããŸãã
äžèšãããªã§ç¢ºèªã§ããããã«ãäŒè©±ãäžæãããšããŒã¿éä¿¡ã忢ãããŸãããããã§æ°ããªåé¡ãçºçããŸãã
ãããªã®éããã¹ããªãŒãã³ã°ãããŸãã«æ©ãäžæãããŠããŸããããªã®ã§ãããã®åå ãšããŠèããããã®ã¯äžèšã®ãããªç¹ã§ãã
âèµ€ã§è¡šç€ºãããŠããéšåçãªçµæã«ã²ã£ããã£ãŠããŸãã
âéãããåã³è©±ãå§ãããšãæ°ããæãšããŠèªèãããã®ã§ã¯ãªããééã空ããããšãªãåã®æã«ãã®ãŸãŸç¶ãèªèãããŠããŸãã
ããã¯ããµãŒãã¹ããæã®çµããããšãå§ãŸãããèªèãããããäžæåæ¢ãå¿ èŠãšããããšã«èµ·å ããŸããå°ãã§ããç¡é³ã®é³å£°ããæµããªãéãããµãŒããŒã¯2æã1æãšããŠèªèããŠããŸãã®ã§ããïŒå³ã»å³ã®ç·ã§è¡šç€ºãããŠããéããïŒ

Â
ãã®åé¡ãè§£æ¶ããã«ã¯ãã¹ããªãŒãã³ã°ã忢ããåã«ã¿ã€ã ã¢ãŠãããå¿ èŠããããŸããäžèšããã€ã©ã€ããããéšåãå«ã¿è©ŠããŠã¿ãŸãããã
ããäžåºŠè©ŠããŠã¿ããšããã®ãããªçµæã«ãªããŸãã
確èªã§ããéããã¹ããªãŒãã³ã°åæ¢åã«ã¿ã€ã ã¢ãŠããå ¥ããããšã§ãåæã®çµãããšå§ãŸããèªèãããç°ãªã2æãšããŠèå¥ãããŸããããã ãæ©å£ã§è©±ããŠããŸããšãæã®å§ãŸãéšåãã«ãããããŠããŸãããã§ããåã³è©±ãå§ããŠãããVADã©ã€ãã©ãªãäœããã®é³ãæ€åºããŠåã³ã¹ããªãŒã éä¿¡ãéå§ãããŸã§ã«é å»¶ãçããããã§ãã
æãå§ããéãVADæ€åºåäœã«é å»¶ãããããšã念é ã«çœ®ããŠãããŸãããã

Â
ã¹ããªãŒã éä¿¡ãéå§ãããšããã®é å»¶ã®ãããæåã®åèªãæŒããç¶æ ã«ãªã£ãŠããŸããŸãããææ«ã§ã䌌ããããªåé¡ãçºçããŸããããããã«ã¯ã¿ã€ã ã¢ãŠãã远å ããããšã¯ã§ããŸãããã¿ã€ã ã¢ãŠãã¯ãã§ã«èšå®ãããŠããå¿ èŠããããããããšããšè¿œå ããããšãã§ããªãã®ã§ãã
VADã©ã€ãã©ãªããšãŠãææã«åå¿ãããšããã®ãããã®åé¡ãæªåãããŠããŸããã©ããªã«äºçްãªäžæåæ¢ãhark_stopped
ã®åŒãéãšãªã£ãŠããŸããããçš®ã®ããŠã³ã·ã³ã°å¹æã«ãã£ãŠãæã®äžã§äœåºŠãã¹ããªãŒãã³ã°ãéå§ããããæ¢ãŸã£ãããšãã£ãç¶æ³ãèµ·ãã£ãŠããŸãã®ã§ãã
Â
æçµè§£æ±ºç
ãã®èª²é¡2ç¹ã¯é¢ããåã£ãŠããããã«ãããªãããæãã«ããŠã³ã·ã³ã°åé¡ãåŠçããããšã¯é£ãããããäž¡æ¹ã®åé¡ãåæã«æ±ã£ãŠãããŸãã
ã«ãããªãã®åé¡ã解決ããããã«ã¯ãçºèšã®é ã«ã¿ã€ã ã¢ãŠãã远å ãããšããŠããæåŸã«è¿œå ããã®ãšåãã§ã¯æå³ããªããããæåŸ2ç§éã®é³å£°ãä¿æããŠãããããããã¡ãã远å ããå¿ èŠããããŸãããã®ãããharkãé³å£°ãæ€åºãããšãã©ã€ãã¹ããªãŒãã³ã°ãéä¿¡ããçŽåããŸããããã¡å šäœãéä¿¡ããŸããé å»¶æéã¯ãã»ã©å€§ãããããŸããããèšèªã«ãã£ãŠã¯ãé³å£°éå§åã«ç©ºçœãç¡é³ããã£ãæ¹ã粟床ãé«ããªãå ŽåãèŠãããããã2ç§ãšããŸããã
ããŠã³ã·ã³ã°å¹æãä¿®æ£ãããããharkã€ãã³ãstop_speaking
ãèªå ããããã³ã2ç§éã®ã¿ã€ã ã¢ãŠããå
¥ãããã®2ç§ãçµéããåŸã«ã®ã¿ã¹ããªãŒã éä¿¡ã忢ããããã«ããŸãããããããã®éã«äœããã®é³å£°ïŒspeaking
harkïŒãæ€åºãããå Žåã¯ãã¿ã€ã ã¢ãŠããäžæ¢ã忢ããªãã£ããã®ããã«ã¹ããªãŒã éä¿¡ãç¶ç¶ããŸãã
äžèšã倿Žç®æã§ãã
- ãã¡ã€ã«ã®é ã«å®æ°
BUFFER_SECONDS
ã远å ãããããã¡ãµã€ãºãç§åäœã«ä¿ã¡ãŸãã - ãããã¡é
åãä¿æãããããããã¯ãã€ã³ããªã¡ã³ããŒã·ã§ã³é ã«ref
bufferBlocks
ã远å ã - ããŠã³ã·ã³ã°å¹æãåŠçããã¿ã€ã ã¢ãŠãããref
streamingFlagRef
ãã³ã³ãããŒã«ããuseEffect
å ã«è¿œå ã - é³å£°ããµãŒãã¹ã«éä¿¡ã§ããŠãããã©ããã
onAudioProcess
å ã確èªã
âå¯èœã§ããã°ãŸããããã¡ãéä¿¡ãïŒç©ºã§ã¯ãªãå ŽåïŒã次ã«ã©ã€ãã¹ããªãŒãã³ã°ã«é¢ããçŸãããã¯ãéä¿¡ããã
âã§ããªãå Žåã¯ãçŸãããã¯ããããã¡é åã®æåŸã«è¿œå ãããæå€§å€ã«éããå Žåããããã¡æåã®èŠçŽ ãåé€ãã宿°BUFFER_SECONDS
ã«å®çŸ©ãããã®ãšåããããã¡ãµã€ãºãç¶æãããÂ
- æåŸã®
useEffect
ã¯ãªãŒã³é¢æ°ã§ãããã¡å ãæŽçãããã€ã¯ã®ãã¥ãŒãã»ãã¥ãŒãè§£é€ã«åããããããªç¶æ ã§ãããã¡ãéå§ã§ããããã«ããŠããã
ã©ã®ããã«è¡ãã®ãèŠãŠãããŸãããã
é³å£°ãæ€åºãã©ã€ãã¹ããªãŒã ãéå§ããåã«ããã€ã§ãæåŸã®æ°ç§éãéä¿¡ã§ãããããããã¡ãå©çšãããšã次ã®ããã«ãªããŸãã

Â
æåŸã«
ChromeéçºããŒã«ã®ããããã¯ãŒã¯ãã¿ãã§ã確èªã§ããããã«ãAzureãµãŒãã¹ã«éä¿¡ãããã®ã¯ãç§ãã¡ã話ããŠããéã«éã£ãããŒã¿ã§ãããã®èšäºã§è§£æ±ºæ¹æ³ãã玹ä»ãã課é¡ã¯ãVoicePingéçºæã«å®éç§ãã¡ãçŽé¢ãããã®ã§ãããçŸåšç§ãã¡ã䜿çšããã³ãŒãã¯ãããã§ã玹ä»ããã³ãŒããšã¯å€å°éãç¹ããããŸãããã®ã²ãšã€ãšããŠãAudioWorkletNodeã®ä»£ããã«ãcreateScriptProcessor
ïŒéæšå¥šAPI) ã代çšããŠãããšããç¹ã§ããããã¯ãWeb Workersã䜿ããã¢ããªã®ã¡ã€ã³ã€ãã³ãã«ãŒãå
ã§ã®ãªãŒãã£ãªåŠçãé¿ãããšãããã®ã§ãããä»åã¯åããããã説æãããããã¹ã¯ãªãããããã§ããµãäŸã«ãšããŸããã
ããäžç¹ãããŠã³ã·ã³ã°å¹æåŠçããã©ã°å€Â streamingFlagRef
ãå®çŸ©ããã³ãŒãå
ã«æ··åšãããã®ã§ã¯ãªããharkã®äœ¿çšãã«ãã»ã«åãã useAudioActive
å
ã«ä¿æãããšããæ§é äžã®åé¡ããããŸãã ç§ãã¡ã®ã³ãŒãäžã§ã¯ã useAudioActive
ãè€æ°ç®æã§äœ¿çšããŠãããããã«ããããä»ã®ç®æã«ãããŠã¯ããŠã³ã·ã³ã°å¹æããã®ãŸãŸã«ããŠããããã£ããããããã«å€æŽãå ããŸããã
VoicePingããã²äžåºŠã詊ããã ããã https://voice-ping.com/
Â
æçµã³ãŒã
ãã¹ãŠã®å€æŽç¹ãåæ ãããæçµã³ãŒãã¯ãã¡ãã§ãã