2016-01-15 11 views
7

Próbuję zrobić ciągłą mowę do transkrypcji tekstu, ale nie wydaje się, aby uzyskać WebkitSpeechRecognition działa jak reklamowane. Wydaje się, że przestaje on nagrywać losowo (zazwyczaj po długim okresie ciszy), mimo że ustawiam ciągły = true i interimResults = true. Nie mogę nawet dowiedzieć się, co jest przyczyną tego losowego przestoju, ponieważ umieszczam prostą instrukcję dziennika w KAŻDYM SINGLE.EVENT. to narzędzie WebkitSpeechRecognition zostało oparte na dokumentach, które mogłem znaleźć. Oto skrypt, co mam (w zasadzie niewielki mod na demo https://www.google.com/intl/en/chrome/demos/speech.html)WebkitSpeechRecognition przestaje nagrywać losowo

co wiem:

żadne błędy są rejestrowane przed nagraniem.

Mam połączenie gigabitowe, więc nie ma związku z opóźnieniami.

Zatrzymuje się normalnie po dłuższej przerwie, ale czasami zatrzymuje się bez podania przyczyny.

Może się zdarzyć po 2 minutach lub tylko 30 sekundach.

Skomentowałem niektóre z poniższych, ale wypróbowałem je wszystkie bez powodzenia w śledzeniu problemu.

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

Mam ten sam problem, czy kiedykolwiek to rozgryzłeś? –

+1

@NickJonas Nie mogłem dowiedzieć się, co było przyczyną problemu, więc po prostu dodałem trochę logiki, aby to uwzględnić. Zachowałem stan tego, co zostało przepisane 10 sekund temu i porównałem to z najnowszą transkrypcją z przedziału czasowego. Jeśli nie zostaną wykryte żadne zmiany, ręcznie zatrzymam i zrestartuję transkrypcję. –

Odpowiedz

0

Można sprawdzić realizację próbki w pliku player.html w moją stronę github https://github.com/pantprateek/genieYT. Logika wygląda następująco:

Utwórz zegar, który przestaje rozpoznawać po każdych 10 sekundach.

setInterval(resetVoiceRecog, 10000);

function resetVoiceRecog() {

`recognition.stop();` 

}

gdy recognition.stop nazywa go na pewno wywołuje onend a następnie ponownie uruchomić uznanie.

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

Ta metoda działa u mnie przez wiele godzin, nawet jeśli nic nie mówię. Może pomóc.