Android では音声認識 APIが結果のフレーズを複製する (デスクトップでは複製しない)ことがわかりました。
語句ごとに、2 つの結果が返されます。最初のものは
そして2つ目は
ご覧のとおり、2 番目のリターンでは、フレーズが複製され、各コピーは としてマークされfinal
、2 番目のコピーは を超えてresultIndex
います。最初のリターンでは、コピーは 1 つしかなく、ありfinal
、それを超えていresultIndex
ます。
私は 2 回目の返品のみを行いますが、問題は、モバイル 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;
}
};
}
}