Web Speech API "Обнаружение известных слов"

Я нахожусь в процессе разработки приложения, которое может определять определенные ключевые слова. Я использую веб-речь Google.

Я могу записать голос пользователя и распечатать его, но я хочу быть в состоянии обнаружить определенные слова.

Я не могу найти способ сделать это. Я нашел этот вопрос Обнаружение известных слов с помощью Web Speech API, но сайт в ответе, на который он ссылается, пропал.

Кто-нибудь может пролить свет на это? любая помощь будет отличной. Ура! вот скрипка

  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]);
        }
}

3 ответа

Вы категорически не можете каким-либо образом изменять API, чтобы добавлять словари или влиять на результаты.

ОДНАКО вы можете свести результаты к словам, которые фонетически похожи, чтобы повлиять на интерпретацию вашего кода.

В данный момент вы выполняете "точные" совпадения для определенных слов. Так что, если двигатель думает, что слышит "тайский" вместо "галстук"... этот результат не приведет к совпадению.

Решение состоит в том, чтобы добавить "нечеткость" к соответствующей логике. Рассматривали ли вы такую ​​библиотеку, как FuzzySet.js?

Вы можете найти множество других примеров, выполнив поиск по слову "нечеткое совпадение строк JS" или "фонетически похожий JS".

Внутри функции matchKeyWords для цикла. Измените keyWords[1] на keyWords[i], затем попробуйте. Также измените условие if на

if(conversation.indexof(keyWords[i]) > -1)

Я вижу, что этому вопросу восемь месяцев, и вы, вероятно, уже нашли ответ, но в случае, если кто-то еще ищет - я думаю, вам нужно дать приложению некоторую "грамматику" для проверки, например так:

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, которое похоже на то, что вы пытаетесь сделать (если я правильно понимаю). Вы читаете фразу вслух, и она говорит вам, поняла ли она.

http://mdn.github.io/web-speech-api/phrase-matcher/

Другие вопросы по тегам