Ekrana sırayla A, B ve C harfleri gelmekte ve sesli bir şekilde tekrar edilmesi istenmekte. Harfleri doğru bir şekilde algılatmada sorun yaşıyorum. Mesela A harfini bazen doğru bazen yanlış algılıyor. Mesela aşağıdaki linkte aynı yöntem kullanılmasına rağmen daha doğru bir şekilde algılıyor.
https://davidwalsh.name/demo/speech-recognition.php
Speech Recording
<script></script>
<script></script>
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('' + 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;
};
}