14

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;
      }


    };
  }
}

JsFiddle: https://jsfiddle.net/dimskraft/envwao8o/1/

4

2 に答える 2