Chrome 语音识别
2019-06-07

因为需要一个快速语音识别的方案,就到网上搜了搜,原来 W3C 已经有标准,叫做 Web Speech API,而且 Chrome 早就实现了。

Web Speech API 分两大块,一是文字转语音,二是语音转文字。W3C 文档有详细的解释。这个文档有处细节发现没有,三名作者全都是 Google 员工。

可见这块领域基本上 Google 一手遮天,更何况连微软都转投了 Chromium,所以可以认为 Chrome 的实现就是标准。

本文的两个例子基于 Chrome v75。据说 Chrome v33 就已经实现了 Speech API,简直不能太超前。废话少说,来看例子吧(需要能翻墙):

例 1:复仇者联盟

你可以念出名字,英雄就会出现。比如念 hawkeye,鹰眼出现:

再比如念 iron man,钢铁侠出现:

可以点击链接体验(Chrome 浏览器): Avengers

例 2:听写

这个就比较简单了,你说它写。默认一上来是英文听写,不过埋了个隐藏功能,当你说出单词 Chinese,就会自动变成中文听写。中文识别率会差一些,字正腔圆一般也问题不大。

可以点击链接体验(Chrome 浏览器): Dictation

技术踩坑

只允许一个页面处于听写状态

如果开了多个标签页,而且还都处在听写的状态,就会出问题。

出错时会触发 onerror 和 onend 回调函数,其中 onerror 回调函数的事件参数的 error 属性值是 aborted。遇到这种情况,可以明示用户让用户关掉一个,也可以等待一会再重试。切记不要立即重试,因为那样会立即失败,陷入失败重试的死循环,毫无间隔的话,CPU 负载马上飚起来。

HTTPS

出于对用户隐私的保护,调用麦克风必须要 HTTPS,自己在本机调试的时候可以参考这篇文章 How to set up HTTPS on localhost for macOS

Grammar

Grammar 是个坑,还弄了个 JSGF 格式跟回事儿似的,很有欺骗性。不过经过测试发现 Grammar 没有任何卵用,应该不会是我打开的方式不对。

SpeechRecognition 的重要属性

想知道有哪些可选参数,最不浪费时间的办法就是读这个文档:

https://w3c.github.io/speech-api/#speechreco-attributes

了解这么几个属性就够了:

其他值得关注的点

SpeechRecognitionAlternative

SpeechRecognitionResult

END