Web Speech语音转文本支持检测及前缀API含义技术咨询
我正试图深入了解Web Speech语音转文本功能的实际可用性,过程中发现网上大量用于检测浏览器是否支持该功能的代码如下:
const NativeSpeechRecognition = typeof window !== 'undefined' && ( window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition || window.oSpeechRecognition )
根据浏览器兼容性数据,所有实际支持该功能的浏览器(Chrome、Opera、UC、三星浏览器、Safari、QQ浏览器、百度浏览器)均使用webkit前缀:window.webkitSpeechRecognition。但兼容性数据显示Edge(含109版本)不支持语音转文本,而我的Windows电脑上,Edge 109.0.1518.78在自己的JS网页应用(使用react-speech-recognition包)及在线语音听写工具中均可正常使用该功能。
我搜索oSpeechRecognition、mozSpeechRecognition、msSpeechRecognition未找到有效信息,于是运行了以下代码沙箱查看这些API是否已定义:
var recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition)(); recognition.lang = "en-US"; recognition.interimResults = false; recognition.maxAlternatives = 5; recognition.start(); console.log("window.SpeechRecognition", window.SpeechRecognition); console.log("window.webkitSpeechRecognition", window.webkitSpeechRecognition); console.log("window.mozSpeechRecognition", window.mozSpeechRecognition); console.log("window.msSpeechRecognition", window.msSpeechRecognition); console.log("selected recognition", recognition); recognition.onresult = function (event) { console.log("You said: ", event.results[0][0].transcript); };
Chrome 109的控制台输出:
window.SpeechRecognition undefined window.webkitSpeechRecognition ƒ SpeechRecognition() {} window.mozSpeechRecognition undefined window.msSpeechRecognition undefined selected recognition EventTarget {grammars: Object, lang: "en-US", continuous: false, interimResults: false, maxAlternatives: 5…}
Edge 109的控制台输出完全相同:
window.SpeechRecognition undefined window.webkitSpeechRecognition ƒ SpeechRecognition() {} window.mozSpeechRecognition undefined window.msSpeechRecognition undefined selected recognition EventTarget {grammars: Object, lang: "en-US", continuous: false, interimResults: false, maxAlternatives: 5…}
Firefox 109中代码沙箱无法运行,报错:
TypeError: undefined is not a constructor $csb$eval /src/index.js:1:18
var recognition = new (window.SpeechRecognition ||
我希望了解以下问题:
- 为何兼容性数据显示Edge不支持语音转文本,但实际可用?
- 为何Firefox 109无法运行该代码?
mozSpeechRecognition、msSpeechRecognition、oSpeechRecognition的起源和用途是什么?这类代码被大量复制但无注释说明,似乎是过时的历史代码却仍被广泛使用。
问题解答
Edge显示不支持但实际可用的原因
Edge从版本79开始基于Chromium内核开发,完全继承了Chrome对Web Speech API的支持,包括带webkit前缀的webkitSpeechRecognition。兼容性数据可能未及时更新,或者在标注时未明确区分旧版Edge(EdgeHTML内核)和新版Chromium Edge。旧版Edge确实不支持该API,但新版Chromium Edge和Chrome的支持情况完全一致,所以你的Edge 109能正常使用。Firefox 109无法运行的原因
Firefox从未正式支持Web Speech API的语音转文本功能(SpeechRecognition),仅在早期有过实验性的实现计划,但最终没有落地。目前Firefox只支持Web Speech API的文本转语音部分(SpeechSynthesis),不支持语音转文本,因此代码中找不到任何可用的Recognition构造函数,导致报错。带前缀的Recognition API的起源
mozSpeechRecognition:Mozilla早期为Firefox规划的实验性前缀API,但该功能从未正式发布,仅停留在内部测试阶段,最终被放弃,所以实际环境中找不到这个对象。msSpeechRecognition:微软旧版Edge(EdgeHTML内核)曾计划支持该API,但同样没有正式推出,仅存在于早期的开发预览版中,正式版从未上线,因此现在也无法找到。oSpeechRecognition:Opera早期基于Presto内核时,曾考虑过添加该API的支持,但后来Opera切换到Chromium内核,直接使用了webkit前缀的版本,这个前缀的API从未实际发布过。
这类带多前缀的检测代码是早期Web API发展阶段的遗留产物——当时各浏览器厂商习惯用私有前缀实现未标准化的API,开发者为了兼容不同浏览器会同时检测多个前缀。即使这些前缀的API从未正式上线或已被淘汰,代码仍被大量复制传播,至今还能在网上看到。
内容的提问来源于stack exchange,提问作者John Rizzo

