2016-01-15 6 views
7

私はテキストの転写に連続的なスピーチをしようとしていますが、宣伝されているように動作するwebkitSpeechRecognitionを取得できないようです。私は、continuous = trueとinterimResults = trueを設定していても、ランダムに録音を停止しているように見えます(通常、長い間の無音の後)。私はEVERY.SINGLE.EVENTに単純なログステートメントを入れると、このランダムな停止の原因を突き止めることさえできません。そのwebkitSpeechRecognitionは私が見つけることができるドキュメントに基づいています。ここで私は(デモhttps://www.google.com/intl/en/chrome/demos/speech.html上、基本的にわずかなMOD)持っているもののスクリプトは、私が知っている何WebkitSpeechRecognitionは無作為に録音を停止します

です:

エラーが記録前に記録されません。

私はギガビット接続になっていますので、ラグ関連はありません。

長いポーズで正常に停止しますが、原因がなくても停止することがあります。

2分後または30秒後に発生する可能性があります。

私は以下のいくつかをコメントしましたが、私は問題を追跡することについて成功していないすべてを試しました。

var final_transcript = ''; 
    var recognizing = false; 
    var ignore_onend; 
    var start_timestamp; 
    if (!('webkitSpeechRecognition' in window)) { 
     upgrade(); 
    } else { 
     var recognition = new webkitSpeechRecognition(); 
     recognition.continuous = true; 
     recognition.interimResults = true; 

     recognition.onstart = function() { 
      recognizing = true; 
     }; 

     recognition.onerror = function (event) { 
      console.log("ERROR") 
      recognizing = false 
      recognition.stop() 
      recognizing = true 
      recognition.start() 
      if (event.error == 'no-speech') { 
       console.log("NO SPEECH") 
      } 
      if (event.error == 'audio-capture') { 
       console.log("Capture Problem") 
      } 
      if (event.error == 'not-allowed') { 
       if (event.timeStamp - start_timestamp < 100) { 
        console.log("Block") 
       } else { 
        console.log("Deny") 
       } 
      } 
     }; 

     recognition.onend = function() { 
      console.log("ONEND") 
      recognition.stop() 
      recognizing = false 
      recognition.start() 
     }; 

     recognition.onresult = function (event) { 
      var interim_transcript = ''; 
      if (typeof(event.results) == 'undefined') { 
        console.log("undefined start") 
        recognition.stop() 
        recognizing = false 
        recognition.start() 
        console.log("undefined end") 
        return; 
       } 
      for (var i = event.resultIndex; i < event.results.length; ++i) { 
       if (event.results[i].isFinal) { 
        final_transcript += event.results[i][0].transcript; 
       } else { 
        interim_transcript += event.results[i][0].transcript; 
       } 
      } 
      final_transcript = capitalize(final_transcript); 
      final_span.innerHTML = linebreak(final_transcript); 
      interim_span.innerHTML = linebreak(interim_transcript); 
     }; 

{#   recognition.onspeechend = function() {#} 
{#    console.log("SpeechEND")#} 
{#   };#} 
{##} 
{#   recognition.onpause = function() {#} 
{#    console.log("PAUSE")#} 
{#   }#} 
{##} 
{#   recognition.onsoundend = function() {#} 
{#    console.log("Sound")#} 
{#   }#} 
{##} 
{##} 
{#   recognition.onaudioend = function() {#} 
{#    console.log("AUDIO")#} 
{#   }#} 
{##} 
{##} 
{#   recognition.onnomatch = function() {#} 
{#    console.log("NOMATCH")#} 
{#   }#} 
{##} 
{#   recognition.onmark = function() {#} 
{#    console.log("MARK")#} 
{#   }#} 
{##} 
{#   recognition.onboundary = function(){#} 
{#    console.log("BOUNDARY")#} 
{#   }#} 

     } 
    var two_line = /\n\n/g; 
    var one_line = /\n/g; 
    function linebreak(s) { 
     return s.replace(two_line, '<p></p>').replace(one_line, '<br>'); 
    } 

    var first_char = /\S/; 
    function capitalize(s) { 
     return s.replace(first_char, function (m) { 
      return m.toUpperCase(); 
     }); 
    } 

    $("#start_call").click(function() { 
     $("#start_call").addClass('hidden'); 
     $("#end_call").removeClass('hidden'); 
     final_transcript = ''; 
     recognition.lang = 'en-US'; 
     recognition.start(); 
     ignore_onend = false; 
    }); 
    $("#end_call").click(function() { 
     $("#end_call").addClass('hidden'); 
     $("#start_call").removeClass('hidden'); 
     stopwatchClock.addClass('hidden'); 
     recognition.stop(); 
     recognizing = false 
    }); 
+0

私はこの同じ問題を抱えています。 –

+1

@NickJonas問題を引き起こしていた原因を突き止めることができなかったので、それを説明するロジックを追加するだけです。私は10秒前に転写されたものの状態を保持し、それをある間隔で最新の転写と比較します。変更が検出されなかった場合、私は手動で転写を停止して再開します。 –

答えて

0

あなたは私のgithubのページhttps://github.com/pantprateek/genieYTにファイルplayer.htmlでサンプル実装を確認することができます。ロジックは次のとおりです。

10秒ごとに認識を停止するタイマーを作成します。

setInterval(resetVoiceRecog, 10000);

function resetVoiceRecog() {

`recognition.stop();` 

}

recognition.stopが呼び出されたとき、それは確かにonend起動し、再度認識を開始します。

recognition.onend = function(event) { 
     recognition.start(); 
    } 

この方法は、私が単語を話さなくても数時間働きます。

関連する問題