Android 上的语音识别 API 重复短语

问题描述 投票:0回答:3

我发现,语音识别 API 在我的 Android 上重复结果短语(并且在桌面上不重复)。

对于所说的每个短语,它返回两个结果。第一个是

enter image description here

第二个是

enter image description here

如您所见,在第二个回报中,短语是重复的,每个副本都标记为

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


    };
  }
}

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

javascript android google-chrome speech-recognition webkitspeechrecognition
3个回答
6
投票

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
是在事件处理程序范围之外初始化的变量


2
投票

试试这个:

recognition.continuous = false;
recognition.interimResults = false;
recognition.maxAlternatives = 1;

JSFiddle:https://jsfiddle.net/envwao8o/4/


0
投票

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>
);
© www.soinside.com 2019 - 2024. All rights reserved.