8

私は、speech recognition APIの結果フレーズをAndroidで重複しています(デスクトップには重複しません)。Androidの音声認識API重複フレーズ

各フレーズについて、2つの結果を返します。まず一つは

enter image description here

で2つ目は、見ての通り、第2の戻りで、フレーズが複製され

enter image description here

、各コピーがfinalとしてマークされている2つ目は超えているですresultIndex。最初のリターンでは1つのコピーしかありません。それはfinalで、それはresultIndexを超えています。

私は2回目の返品しか受け付けませんが、問題はモバイルChromeで発生しますが、デスクトップでは発生しないということですChrome。デスクトップChromeは最初の返品のみを返します。

質問:これは設計上の動作ですか?その後、どのようにして一般的にすべてのコンピュータの単一の最終的なフレーズを区別するのですか?

また、これはサウンドエコーのようなエラーである可能性がありますが、次にエコーを回避/チェックする方法がありますか?

UPDATE

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/

答えて

1

これを試してみてください:

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

JSFiddle:result.isFinal財産に関するクロームモバイルに提供https://jsfiddle.net/envwao8o/4/

+1

recognition.continuousイベントハンドラのスコープの外で初期化する変数をある

if (isFinal) { transcript = result[0].transcript; if(transcript == lastDebounceTranscript) { return; } lastDebounceTranscript = transcript; } 

。ユーザーからの継続的な入力を受け付けません。 – dirtyhandsphp

0

結果は、クロームのデスクトップ上のものとは異なるために、バグやどのような場合には持っているようです。 、それはまた時々、最終的な結果は(同じconfidence値で)を2回放出されるようになります

onResultHandler(event) { 
    let i = event.resultIndex; 
    let result = event.results[i]; 
    let isFinal = result.isFinal && (result[0].confidence > 0); 
} 

その場合には、あなたがしたいことがあります。可能な回避策は、(最初​​の)代替の信頼属性をチェックすることですこのように、それをデバウンスまたは単に最初のイベントを処理:lastDebounceTranscriptはあなたが偽=