2013-05-30 2 views
0

Я пытаюсь использовать веб-Speech API в Chrome 27 со следующим кодом -Web Speech API: Dom Exception 11

$(function(){ 
    initRecognition(); 
}); 

function initRecognition(){ 
    if(window.recognition !== undefined){ 
     window.recognition.stop(); 
     window.recognition.start(); 
     // ^--- Exception is being thrown at this line 
    }else{ 
     window.recognition = new webkitSpeechRecognition(); 
     window.recognition.onresult = function(event) { 
      if (event.results.length > 0) { 
      command.value = event.results[0][0].transcript; 
      return execute(); 
      }else{ 
      command.value = "*&#^$&@^#?"; 
      return execute(); 
      } 
     }; 
     window.recognition.continuous = true; 
     window.recognition.start(); 
    } 
} 

function execute(){ 
    // some code 
    initRecognition(); 
    return false; 
} 

При загрузке страницы, он просит разрешения начать признание. Он признает одно слово или фразу, а затем останавливается со следующей ошибкой -

Uncaught Error: InvalidStateError: DOM Exception 11 
initRecognition 
execute 
window.recognition.onresult 

Там, как представляется, нехватка ресурсов для этого. Так что есть некоторые проблемы при поиске и устранении неисправностей. Есть идеи?

+0

Скорее всего, метод остановки является асинхронным (см. Https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechreco-methods). В частности, обратитесь к документации относительно исключения InvalidStateError, если вы начинаете запуск с уже запущенного объекта. – veritasetratio

ответ

0

Кажется, если я изложу continuous к true, я не должен stop() и start() каждый раз. И вызов stop() является тем, что вызывало проблему, я думаю. Поэтому я удалил эти заявления, и он работает нормально. :)

$(function(){ 
    initRecognition(); 
}); 

function initRecognition(){ 
    window.recognition = new webkitSpeechRecognition(); 
    window.recognition.onresult = function(event) { 
     console.log(event.results); 
     console.log(event.results.length); 
     if (event.results.length > 0) { 
     command.value = event.results[event.results.length-1][0].transcript; 
     return execute(); 
     }else{ 
     command.value = "*&#^$&@^#?"; 
     return execute(); 
     } 
    }; 
    window.recognition.continuous = true; 
    window.recognition.start(); 
} 

function execute(){ 
    // some code 
    return false; 
} 

Хотя, по какой-то причине, event.results действует как стек, если continuous = true. Поэтому я получаю последний результат стека. Но я уверен, что меня ждут другие ошибки.

Смежные вопросы