【问题标题】:Using grammar with Web Speech API for a sentence (correct way)使用带有 Web Speech API 的语法来造句(正确的方法)
【发布时间】:2025-12-22 20:20:07
【问题描述】:

我想使用 Web Speech API 创建一个简单的语音识别。为了更准确,我想使用SpeechGrammarList()constructor。

注意:有很多过时的答案说 chrome 尚不支持语法,但基于此参考,我认为它现在已完全支持!:

https://developer.mozilla.org/en-US/docs/Web/API/SpeechGrammarList/SpeechGrammarList#Browser_compatibility

我仍然不确定 chrome 现在是否支持它?如果它在 chrome 中工作和支持,如何正确实现语法?

我已经尝试添加语法,但我不知道哪个是更好的实现(即使它不支持但有一天它会,所以我想把它放在我的代码中)

我们可以像这样根据paragraph的单词添加语法列表:

let paragraph = 'i was sent to earth to protect you to do'; 
let paragraphWords = paragraph.split(' ');

var grammar = '#JSGF V1.0; grammar paragraphWords; public <paragraphWords> = ' + paragraphWords.join(' | ') + ' ;';
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;

或者我应该插入整个句子:

let paragraph = 'i was sent to earth to protect you to do'; 
// let paragraphWords = paragraph.split(' ');

var grammar = '#JSGF V1.0; grammar paragraph ; public <paragraph> = ' + paragraph + ' ;';
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;

【问题讨论】:

    标签: javascript webspeech-api


    【解决方案1】:

    这是旧的,但我会为其他人回答它,因为我刚刚做了很多测试。

    Chrome 现在肯定支持语法,我已经用一些它没有检测到的单词和短语对此进行了测试,将它们添加到语法中可以改进检测。虽然不如云语音 API 中的语音上下文短语,但您似乎无法完全更改拼写或添加词库之外的单词。

    查看原始帖子中的短语,我不希望它需要添加到语法中,只要语言代码设置正确,它应该可以检测到它。但是,如果您确实愿意,我建议您使用split(' | ') 或在单词和短语之间手动插入|。请参阅下面的示例。

    当添加到语法以使其正常工作时,我必须按照文档中的示例使用 | 运算符,否则它将无法正常工作,我尝试的一些事情完全破坏了它。

    所以以这种方式:

      var grammar = '#JSGF V1.0; grammar words; public <word> =  put | words | and phases | in here;'
      var recognition = new webkitSpeechRecognition();
      var speechRecognitionList = new webkitSpeechGrammarList();
      speechRecognitionList.addFromString(grammar, 1);
      recognition.grammars = speechRecognitionList;
    

    https://developer.mozilla.org/en-US/docs/Web/API/SpeechGrammarList/SpeechGrammarList#Browser_compatibility

    【讨论】:

    • Chrome 似乎仍然不支持语法,即使在 MDN 上的官方示例中也是如此。 github.com/mdn/web-speech-api你仍然可以说不是颜色的词,它会检测到它们。它说它在 MDN 上是“兼容的”,但显然还没有实现。一种可能适用于未来读者的 hacky 方法是设置 recognition.maxAlternatives = 50 并循环遍历所有结果。您正在查找的单词/短语可能存在置信度较低的位置。
    • 是的,根据我的测试,提供自定义语法并没有将转录限制为仅这些单词,它只是提高了检测这些单词而不是其他类似发音单词的可能性。这在某些情况下被证明是有用的。
    • 如果没有实现,尝试创建 new webkitSpeechGrammarList() 会抛出“不是构造函数”异常。