0

A、B、C、D 等出现在屏幕上,然后我希望用户说出相同的字母。但我的问题是语音识别没有捕捉到我大声说出的字母......有时它会说我说A,有时“大多数时候”,它没有......

下面的链接使用相同的代码,但由于某种原因,它不能以相同的方式识别我的单词/字母?

https://davidwalsh.name/demo/speech-recognition.php

window.SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition;
//speech te söylenen harflerin varyasyonlarını zannediyor bazen. Burada varyasyonlar tanıtılıyor.

var letters = [
{'letter': 'A' , 'morphs' : ['a','ah','ay']},
{'letter': 'B' , 'morphs' : ['b','be','beh']},
{'letter': 'C' , 'morphs' : ['c','ce','ceh']}
];

let finalTranscript = '';
let recognition = new window.SpeechRecognition();
//interimResults her kelimeyi tutuyor. Bizde uzun bir konuşma olmadığı için interimresults false
recognition.interimResults = false;

//maxAlternatives kelime alternatiflerini getiriyor. biz sadece bir tane alternatif istiyoruz.
recognition.maxAlternatives = 1;

//continious mode devamlı açık tutuyor. Biz sadece bir harf bekledğimiz için onresult fonksiyonunu tetiklesin diye continous mod kapalı ama onend ile arada keslince tekrar start ediyoruz.
recognition.continuous = false;

recognition.lang = 'tr-TR';

//Burada çıkacak harlerin dizisi
var LetterArray = ['A','B','C'];
//bu değişken setinterval ile dönen döngüde şu andaki harfi tutuyor.
var ThisLetter = '';
//bu değişken yukarıdaki harfin morph larını tutuyor.
var filteredletter;

recognition.onresult = (event) => {
    //eğer isfinal se yani
    if (event.results[0].isFinal)
        finalTranscript = event.results[0][0].transcript;
    //result değişkeni eğer şu anki harfle söylenen eşleşiyorsa true oluyor.
    var result= false;
    console.log(finalTranscript);
    //şu anki harfin morph ları kontrol ediliyor. Eğer morphlardan herhangi biri eşleşirse result değişkeni true olacak.
    $(filteredletter[0].morphs).each(function() { result = finalTranscript != this ? result : true; });
    //subdiv e sunucu yazıyor.
    $('.SubDiv').html(result.toString());
}
//i değişkenini harf dizisinin sonuna ulaşıp ulaşmadığımı kontrol etmek için kullanıyorum.
var i = 0;
//jQuery eğer document hazırsa
$( document ).ready(function() {
    //ses tanımayı başlat
    recognition.start();
    //setinterval ilk başlatıldığında verilen saniye sonra ilk çalışmasının yapıyor. biz hemen çalışmasının istediğimiz için yapacağım işlemleri bir fonksiyon altına tanımlıyorum.
    function ControlLetters() {
        //şu anki harfi yazıyor.
        $('.MainDiv').html('<i style="color:#000; font-size:150px;">' + LetterArray[i] + '</>');    
        //durumu temisliyor
        $('.SubDiv').html('');
        //eğer harf dizinin sonuna gelmişsek intervali sonlandırıyorum.
        if(i>= LetterArray.length - 1){
            IntervalForFiveSeconds.stop();
        }
        //şu anki harf değişkenine dizinin şu anki elemanını atıyorum.
        ThisLetter = LetterArray[i];
        //harfin morphları için en üstteki objeden şu anki harfi filtreliyorum.
        filteredletter = letters.filter(function(obj) {
            return (obj.letter == ThisLetter);
        });
        //dizinin bir sonraki elemanın için i bir artıyor.
        i++;
        //continous mode'da olmadığımız için eğer dinleme sonlanırsa ve benim hala intervalim çalışıyorsa dinlemeyi tekrar başlatıyorum.
        recognition.onend = function() {
            //eğer interval hala çalışıyorsa
            if (IntervalForFiveSeconds.isRunning())
                recognition.start();
        }
    }
    //yukarıdaki fonksiyonu çalıştır.
    ControlLetters();
    //5 sn intervali başlatıyorum.
    var IntervalForFiveSeconds = new Interval(ControlLetters,5000);
    IntervalForFiveSeconds.start();
});
//setinterval i (döngüyü) oluşturup, devam edip etmediğini ve bitirmek istediğimde bitirmek için gerekli tanımlamaları kolaylaştırmak için fonksiyon.
function Interval(fn, time) {
    var timer = false;
    //setinterval başlat
    this.start = function () {
        if (!this.isRunning())
        timer = setInterval(fn, time);
    };
    //setinterval bitir.
    this.stop = function () {
        clearInterval(timer);
        timer = false;
    };
    //çalışıyor mu
    this.isRunning = function () {
        return timer !== false;
    };
}
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Speech Recording</title>
</head>
<body>
<script type="text/javascript" src="jquery-3.2.1.js"></script>
<script type="text/javascript" src="script.js"></script>

<div class="MainDiv"></div>
<div class="SubDiv"></div>

</body>
</html>

4

1 回答 1

0

即使在 Chrome 上也不能 100% 支持 webkitspeechrecognition。例如,语法现在直接没有实现。

我遇到了类似的问题,最终设置了识别.maxAlternatives = 20;

然后,我循环查找可以设置为“a”、“b”、“c”等的模式。

例如,在我的应用程序中,我最终匹配了以下任何单词:

a: ['alpha', 'office', 'off of', 'also', 'how'],
b: ['bravo', 'beta', 'beat', 'bee', 'be'],
c: ['charlie', 'sea', 'see', 'si'],
d: ['delta', 'the', 'dee', 'de'],
e: ['echo', 'eat'],

如果这没有意义,请告诉我,我可以提供更多细节!

于 2021-03-03T13:52:03.370 回答