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
});
Mam ten sam problem, czy kiedykolwiek to rozgryzłeś? –
@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ę. –