WebkitSpeechRecognition随机停止录制 [英] WebkitSpeechRecognition stops recording randomly
问题描述
我正在尝试对文本转录进行连续发言,但似乎无法让webkitSpeechRecognition像宣传的那样工作。它似乎随机停止录制(通常在长时间的静音之后),即使我设置了continuous = true和interimResults = true。我甚至无法弄清楚导致这种随机停止的原因,因为我在EVERY.SINGLE.EVENT中添加了一个简单的日志语句。 webkitSpeechRecognition基于我能找到的文档。这是我所拥有的脚本(基本上是演示 https ://www.google.com/intl/zh-CN/chrome/demos/speech.html )
I'm trying to do a continuous speech to text transcription but can't seem to get webkitSpeechRecognition working as advertised. It seems to stop recording randomly (typically after a long duration of silence) even though I set continuous = true and interimResults = true. I can't even figure out what is causing this random stoppage as I put a simple log statement in EVERY.SINGLE.EVENT. that webkitSpeechRecognition has based on the docs I could find. Here is the script of what I have (essentially a slight mod on the demo https://www.google.com/intl/en/chrome/demos/speech.html)
我所知道的:
在录制之前没有记录错误。
No errors are logged prior to the recording.
我正处于千兆位连接,因此没有延迟相关。
I'm on a gigabit connection so not lag related.
长时间暂停后会正常停止,但有时会无故停止。
It stops normally after a long pause but sometimes stops without cause.
可能会在2分钟或30秒后发生。
It can happen after 2 minutes or only 30 seconds.
我已经注释了下面的一些内容,但我已经尝试了所有这些,但没有成功跟踪问题。
I commented out some of the below but I've tried all of them without any success as to tracing the issue.
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
});
推荐答案
您可以检查文件player.html中的示例实现我的github页面 https://github.com/pantprateek/genieYT 。逻辑如下:
You can check sample implementation in file player.html in my github page https://github.com/pantprateek/genieYT. The logic is as follows :
创建一个计时器,每10秒后停止识别。
Create a timer which stops recognition after every 10secs .
setInterval(resetVoiceRecog, 10000);
function resetVoiceRecog() {
recognition.stop();
}
当调用recognition.stop时,它肯定会调用onend然后再次开始识别。
when recognition.stop is called it surely invokes onend and then start recognition again.
recognition.onend = function(event) {
recognition.start();
}
即使我不说一句话,这种方法对我有好几个小时的作用。
可能会有帮助。
This method works for me for hours even if I don't speak a word. Might help .
这篇关于WebkitSpeechRecognition随机停止录制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!