因为需要一个快速语音识别的方案,就到网上搜了搜,原来 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
了解这么几个属性就够了:
- lang
- continuous
- interimResults
- maxAlternatives