我正在开发一款可以检测某些关键词的应用。我一直在使用谷歌网络演讲。
我能够录制用户的声音并将其打印出来,但我希望能够检测到某些单词。
我似乎找不到这样做的方法。我发现了这个问题Detecting known words using the Web Speech API但是它链接到的答案中的网站已经消失了。
任何人都可以对此有所了解吗?任何帮助都会很棒。干杯! here is a fiddle
var recognition = new webkitSpeechRecognition(); // google voice recognition start
recognition.continuous = true; //so that recognition will continue even if the user pauses while speaking
document.getElementById('startSpeech').addEventListener('click', function() {
startSpeech();
});
document.getElementById('stopRecognizing').addEventListener('click', function() {
stopRecognizing();
});
var startSpeech = function(){
var lang = ['en-GB', 'United Kingdom'];
final_transcript = '';
recognition.lang = recognition.lang
recognition.start() //activates the speech recognizer
}
var stopRecognizing = function(){
recognition.stop();//stops the mic from listening
return;
}
recognition.onresult = function(event) {
console.log('event', event);
// This handler concatenates all
// the results received so far into two strings final_transcript & interim_transcript
var interim_transcript = '';
for (var i = event.resultIndex; i < event.results.length; ++i) {
if (event.results[i].isFinal) {
final_transcript += event.results[i][0].transcript;
} else {
interim_transcript += event.results[i][0].transcript;
}
}
//final_transcript = capitalize(final_transcript);
final_span.innerHTML = linebreak(final_transcript);
interim_span.innerHTML = linebreak(interim_transcript);
// console.log('final_transcript' , typeof final_transcript);
// console.log('interim_transcript' , interim_transcript);
if (final_transcript.length > 0) {
matchingKeyWords(final_transcript);
}
};
function linebreak(s) {
var two_line = /\n\n/g;
var one_line = /\n/g;
return s.replace(two_line, '<p></p>').replace(one_line, '<br>');
}
function capitalize(s) {
var first_char = /\S/;
return s.replace(first_char, function(m) { return m.toUpperCase(); });
}
var matchingKeyWords = function(conversation){
var keyWords = ['power', 'tie', 'imaginary' ,'bomb', 'drink', 'underwear', 'chance', 'type', 'historical',
'society' ,'collect' ,'sugar']
for (var i = 0; i < keyWords.length; ++i) {
console.log(conversation[0]);
if (conversation === keyWords[1]) {
console.log('hit');
}
// console.log('keyWords[i]', keyWords[i]);
}
}
答案 0 :(得分:1)
在for循环中的matchingKeyWords函数中请将keyWords [1]更改为keyWords [i]然后尝试。同时将if条件更改为
if(conversation.indexof(keyWords[i]) > -1)
答案 1 :(得分:1)
我看到这个问题已经八个月了,你可能已经找到了答案,但万一其他人还在寻找 - 我认为你需要给应用程序一些&#34;语法&#34 ;检查,像这样:
var colors = [ 'aqua' , 'azure' , 'beige', 'bisque', 'black', 'blue', 'brown', 'chocolate', 'coral' ... ];
var grammar = '#JSGF V1.0; grammar colors; public <color> = ' + colors.join(' | ') + ' ;'
MDN有一个Web Speech API演示,类似于您尝试做的事情(如果我理解正确的话)。你大声朗读了一个短语,它告诉你它是否被理解。
答案 2 :(得分:0)
您绝对不能以任何方式修改API以附加词典或影响结果。
但,您可以将结果归结为语音相似的字词,以影响代码的解释。
目前,您似乎正在表演&#39;确切地说&#39;匹配某些单词。因此,如果引擎认为它听到&#34; Thai&#34;而不是&#34; Tie&#34; ...结果不会产生匹配。
解决方案是添加模糊性&#39;到匹配逻辑。 您是否考虑过像FuzzySet.js这样的图书馆?
你可以通过搜索&#34;模糊字符串匹配JS&#34;等等来找到更多的例子。或&#34;语音相似的JS&#34;