我发现,语音识别 API 在我的 Android 上重复结果短语(并且在桌面上不重复)。
对于所说的每个短语,它返回两个结果。第一个是
第二个是
如您所见,在第二个回报中,短语是重复的,每个副本都标记为
final
,第二个副本超出 resultIndex
。第一次返回时只有一个副本,它是final
并且超出了resultIndex
。
我只会第二次返回,但问题是它发生在移动 Chrome 上,但不会发生在桌面上
Chrome
。桌面Chrome
仅返回第一个返回。
所以,问题是:这是设计行为吗?那么如何区分所有计算机通用的单个最后短语呢?
或者这可能是一些错误,例如声音回声,那么问题是如何避免/检查回声?
更新
Html如下:
<input id="recbutton" type="button" value="Recognize">
<div id="output">
<div>
Initial text
</div>
</div>
代码如下:
var recognition = null;
var recognitionStarted = false;
var printcount = 1;
var lastPhrase = null;
$(function() {
attachRecognition();
});
$('#recbutton').click( function() {
if( !recognitionStarted ) {
recognition.start();
}
else {
recognition.stop();
}
});
function printOut(text) {
var id = 'printcount' + printcount;
printcount++;
$('#output').append(
"<div id='" + printcount + "'>" + text + "</div>"
);
$("#output").animate({ scrollTop: $("#output").prop('scrollHeight')});
return printcount;
}
function attachRecognition() {
if (!('webkitSpeechRecognition' in window)) {
$('button').prop('disabled', true);
recognition = null;
} else {
$('button').prop('disabled', false);
recognition = new webkitSpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = "en-US";
recognition.onstart = function(event) {
recognitionStarted = true;
printOut("speech recognition started");
};
recognition.onend = function(event) {
recognitionStarted = false;
printOut("speech recognition stopped");
};
recognition.onresult = function(event) {
var finalPhrase = '';
var interimPhrase = '';
var result;
var printcount;
for(var i=0; i<event.results.length; ++i) {
result = event.results[i];
if( result.isFinal ) {
finalPhrase = finalPhrase.trim() + ' ' + result[0].transcript;
}
else {
interimPhrase = interimPhrase.trim() + ' ' + result[0].transcript;
}
}
if( !lastPhrase ) {
printcount = printOut('');
lastPhrase = $('#' + printcount);
}
lastPhrase.html(finalPhrase.trim() + ' ' + interimPhrase.trim());
if( finalPhrase.trim() ) {
lastPhrase = null;
}
};
}
}
Chrome 移动版上提供的有关
result.isFinal
属性的结果似乎存在错误,或者在任何情况下都与 Chrome 桌面版上的结果不同。一种可能的解决方法是检查(第一个)替代方案的置信度属性:
onResultHandler(event) {
let i = event.resultIndex;
let result = event.results[i];
let isFinal = result.isFinal && (result[0].confidence > 0);
}
看起来有时最终结果会发出两次(具有相同的
confidence
值),在这种情况下,您可能想要对其进行反跳或只处理第一个事件,如下所示:
if (isFinal) {
transcript = result[0].transcript;
if(transcript == lastDebounceTranscript) {
return;
}
lastDebounceTranscript = transcript;
}
其中
lastDebounceTranscript
是在事件处理程序范围之外初始化的变量
试试这个:
recognition.continuous = false;
recognition.interimResults = false;
recognition.maxAlternatives = 1;
JSFiddle:https://jsfiddle.net/envwao8o/4/
https://www.npmjs.com/package/react-speech-recognition
这个库解决了这个问题。 无论是手机还是PC,都可以使用。
import SpeechRecognition, {
useSpeechRecognition,
} from "react-speech-recognition";
const {
transcript,
listening,
resetTranscript,
browserSupportsSpeechRecognition,
} = useSpeechRecognition(...options);
const MyMicButton = () => (
<button
onClick={(e) => {
e.preventDefault();
SpeechRecognition.startListening({
continuous: true,
interimResults: true,
...otherOptions
});
}}
>
STT
</button>
);