質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

1521閲覧

Web Speech API Speech Recognitionを無音の後も途切れさせずに認識させたい

miyaken912

総合スコア15

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/11/07 10:48

編集2019/11/08 11:43

前提・実現したいこと

ChromeのWeb Speech API Speech Recognitionを使いマイクから音声認識によるテキスト入力を実装しようとしています。
その中で、無音の状態が続いた後も途切れず音声認識状態を続けさせていたいと考えています。

発生している問題・エラーメッセージ

5秒ほど無音の状態が続くと、音声認識が終わってしまいそれ以上音声入力が出来ません。
console.logで見たところ、recognition.onresultの中でresultsのisFinalプロパティがtrueに変化してしまうのが原因のようです。

そこで、isFinalにtrueがセットされた場合は、一度stop()した後に再度start()する処理を行いたいと考えました。
しかし、なぜかstop()とstart()を順番通りに行えず、start()した後にstop()の処理が走ってしまいます。

非同期処理が原因と考えasync awaitを使うなど試してみましたが上手く行きません。
対応方法についてご教示頂きたく、どうぞ宜しくお願い致します。
(初心者のため、分かりにくい点もあるかと思いますが、何卒どうぞ宜しくお願い致します)

該当のソースコード

jquery

1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge" /> 7 <title>Voice Input</title> 8 </head> 9 10 <body> 11 <textarea id="voiceInputBox" cols="30" rows="10"></textarea> 12 13 <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 14 <script> 15 const SpeechRecognition = webkitSpeechRecognition || SpeechRecognition; 16 const recognition = new SpeechRecognition(); 17 recognition.lang = "ja-JP"; 18 recognition.interimResults = true; 19 recognition.continuous = true; 20 recognition.maxAlternatives = 1; 21 let isListening = false; 22 23 function voiceRecognizeStart(outputBox) { 24 recognition.onerror = event => { 25 if (isListening) { 26 voiceRecognizeStart(); 27 } 28 }; 29 recognition.onsoundend = event => { 30 if (isListening) { 31 voiceRecognizeStart(); 32 } 33 }; 34 recognition.onresult = event => { 35 $(outputBox).val(event.results[0][0].transcript); 36 if (event.results[0].isFinal) { 37 isListening = false; 38 recognition.stop(); 39 voiceRecognizeStart(outputBox); 40 } 41 }; 42 43 try { 44 recognition.start(); 45 isListening = true; 46 } catch (e) { 47 console.log("音声認識を既に開始しています"); 48 } 49 } 50 51 $("#voiceInputBox").on("click", function() { 52 voiceRecognizeStart("#voiceInputBox"); 53 }); 54 </script> 55 </body> 56</html> 57

試したこと

recognition.stop()、recognition.start()の部分を以下のようにasync awaitや、コールバックで処理するように書き換えてみたりもしましたが、上手く行きませんでした。

jquery

1 async function voiceRecognizeReStart(outputBox) { 2 await recognition.stop(); 3 voiceRecognizeStart(outputBox); 4 }

追記

完全な自己解決とは言えませんが、onresultの部分で以下のようにsetTimeoutを利用することで、stop()の前にstart()が実行されてしまうのを防ぐことは一応実現出来ました。
ただあくまでsetTimeoutを用いた実行時間に依存する綱渡りな処理であるため、他にもっとスマートなやり方があればぜひ教えて頂きたいです。

jquery

1 recognition.onresult = event => { 2 $(outputBox).val(recognizedText); 3 if (event.results[0].isFinal) { 4 isListening = false; 5 recognition.stop(); 6 setTimeout(function() { 7 voiceRecognizeStart(outputBox); 8 }, 400); 9 } 10 };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問