2016-01-15 119 views
7

我試圖對文本轉錄做連續的演講,但似乎無法讓webkitSpeechRecognition像廣告一樣工作。它似乎停止隨機記錄(通常在很長一段時間的沉默之後),即使我設置了連續= true和interimResults = true。我甚至無法弄清楚導致這個隨機停頓的原因,因爲我在EVERY.SINGLE.EVENT中放了一個簡單的日誌語句。該webkitSpeechRecognition基於我可以找到的文檔。下面是我有什麼腳本WebkitSpeechRecognition隨機停止錄製

我所知道的(本質上演示https://www.google.com/intl/en/chrome/demos/speech.html略有修改):

沒有錯誤之前的錄音記錄。

我在千兆連接,所以沒有滯後相關。

長時間停頓後,它會正常停止,但有時會無緣無故地停下來。

它可能發生在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(); 
    } 

即使我不說一句話,這種方法對我來說也是幾個小時。 可能會有所幫助。