Znalazłem, że speech recognition API duplikuje wyniki fraz na moim Androidzie (i nie powiela się na pulpicie).Rozpoznawanie mowy API powielonych zwrotów na Androida
Dla każdej wyrażonej frazy zwraca dwa wyniki. Pierwszym z nich jest
a drugi jest
Jak widać, w drugim powrocie zdanie jest powielany, każdy egzemplarz jest oznaczony jako final
i drugi jest poza resultIndex
. Przy pierwszym powrocie jest tylko jedna kopia, to jest final
i jest poza resultIndex
.
Zrobiłbym tylko drugi zwrot, ale problemem jest to, że dzieje się to w mobilnym Chrome, ale nie dzieje się na komputerze Chrome
. Desktop Chrome
zwraca tylko pierwszy zwrot.
Pytanie brzmi: czy to zachowanie projektowe? W jaki sposób odróżnić pojedynczą ostatnią frazę, a następnie powszechnie dla wszystkich komputerów?
A może to jakiś błąd, taki jak echo dźwiękowe, wtedy pytanie brzmi: jak uniknąć/sprawdzić echo?
UPDATE
HTML jest następujący:
<input id="recbutton" type="button" value="Recognize">
<div id="output">
<div>
Initial text
</div>
</div>
Kod jest następujący:
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;
}
};
}
}
JsFiddle: https://jsfiddle.net/dimskraft/envwao8o/1/
recognition.continuous = false; nie akceptuje ciągłego wprowadzania danych od użytkownika. – dirtyhandsphp