SpeechRecognition 无法识别正确的单词或字母
SpeechRecognition Is not recognizing the correct words or letters
A、B、C、D 等出现在屏幕上,之后我希望用户说出相同的字母。但我的问题是 speechrecognition 没有捕捉到我大声说出的字母......有时它会说 İ 说 A,有时 'most of the times',它不会......
下面的 link 使用相同的代码,但由于某种原因它不能以相同的方式识别我的 words/letters?
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>
webkitspeechrecognition 即使在 Chrome 上也未得到 100% 的支持。例如,语法是直截了当的,现在还没有实现。
我遇到了和你类似的问题,最后设置
recognition.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'],
如果这没有意义,请告诉我,我可以提供更多细节!
A、B、C、D 等出现在屏幕上,之后我希望用户说出相同的字母。但我的问题是 speechrecognition 没有捕捉到我大声说出的字母......有时它会说 İ 说 A,有时 'most of the times',它不会......
下面的 link 使用相同的代码,但由于某种原因它不能以相同的方式识别我的 words/letters?
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>
webkitspeechrecognition 即使在 Chrome 上也未得到 100% 的支持。例如,语法是直截了当的,现在还没有实现。
我遇到了和你类似的问题,最后设置 recognition.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'],
如果这没有意义,请告诉我,我可以提供更多细节!