2016-01-15 6 views
7

Sto provando a fare un discorso continuo alla trascrizione del testo ma non riesco a far funzionare webkitSpeechRecognition come pubblicizzato. Sembra che smetta di registrare casualmente (in genere dopo una lunga durata di silenzio) anche se imposto continuous = true e interimResults = true. Non riesco nemmeno a capire cosa stia causando questa interruzione casuale mentre inserisco una semplice istruzione di log in OGNI SINGOLO.EVENTO. che webkitSpeechRecognition si basa sui documenti che ho trovato. Ecco lo script di ciò che ho (essenzialmente un leggero mod sul demo https://www.google.com/intl/en/chrome/demos/speech.html)WebkitSpeechRecognition interrompe la registrazione in modo casuale

Quello che so:

Nessun errore vengono registrati prima della registrazione.

Sono in una connessione gigabit quindi non correlato al ritardo.

Si arresta normalmente dopo una lunga pausa ma a volte si ferma senza causa.

Può accadere dopo 2 minuti o solo 30 secondi.

Ho commentato alcuni di seguito, ma li ho provati tutti senza alcun successo per tracciare il problema.

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

Sto avendo lo stesso problema, hai mai capito? –

+1

@NickJonas Non sono riuscito a capire cosa causasse il problema, quindi mi sono limitato ad aggiungere un po 'di logica per renderlo conto. Ho mantenuto lo stato di ciò che era stato trascritto 10 secondi fa e lo confronterei con la trascrizione più recente in un intervallo. Se non sono state rilevate modifiche, interrompo manualmente e riavvio la trascrizione. –

risposta

0

È possibile controllare esempio di implementazione nel file di player.html nella mia pagina github https://github.com/pantprateek/genieYT. La logica è la seguente:

Creare un timer che arresta il riconoscimento dopo ogni 10 secondi.

setInterval(resetVoiceRecog, 10000);

function resetVoiceRecog() {

`recognition.stop();` 

}

quando recognition.stop si chiama sicuramente invoca onend e quindi avviare di nuovo il riconoscimento.

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

Questo metodo funziona per me per ore anche se non parlo una parola. Potrebbe aiutare.