语音驱动的 Web 应用 - Web Speech API 简介

新的 JavaScript Web Speech API 可让您轻松为网页添加语音识别功能。借助此 API,您可以精细地控制 Chrome 25 及更高版本中的语音识别功能,并灵活控制这些功能。例如,系统会在用户说话时几乎立即看到识别出的文本。

Web Speech API 演示

演示 / 来源

让我们一探究竟。首先,我们通过检查 webkitSpeechRecognition 对象是否存在,来检查浏览器是否支持 Web Speech API。否则,我们建议用户升级浏览器。(由于该 API 仍处于实验阶段,因此目前带有供应商前缀。)最后,我们创建提供语音接口的 webkitSpeechRecognition 对象,并设置其一些属性和事件处理脚本。

if (!('webkitSpeechRecognition' in window)) {
    upgrade();
} else {
    var recognition = new webkitSpeechRecognition();
    recognition.continuous = true;
    recognition.interimResults = true;

    recognition.onstart = function() { ... }
    recognition.onresult = function(event) { ... }
    recognition.onerror = function(event) { ... }
    recognition.onend = function() { ... }
    ...

continuous 的默认值为 false,表示当用户停止说话时,语音识别功能就会结束。此模式非常适合简短输入字段等简单文本。在此演示中,我们将其设为 true,这样即使用户在讲话时停顿,识别操作也不会中断。

interimResults 的默认值为 false,表示识别器仅返回最终结果,且不会改变。本演示将它设置为 true,以便我们尽早获得可能发生变化的临时结果。请仔细观看演示,灰色文本是临时文本,有时会发生变化,而黑色文本是识别器标记为最终响应,不会发生变化。

首先,用户点击麦克风按钮,从而触发以下代码:

function startButton(event) {
    ...
    final_transcript = '';
    recognition.lang = select_dialect.value;
    recognition.start();

我们设置语音识别程序“lang”的讲话语言。用户通过选择下拉列表选择的 BCP-47 值,例如“en-US”表示英语-美国。如果未设置,则默认为 HTML 文档根元素和层次结构的 lang。Chrome 语音识别功能支持多种语言(请参阅演示源代码中的“langs”表格),以及此演示中未包含的一些从右到左的语言,例如 he-IL 和 ar-EG。

设置语言后,我们调用 recognition.start() 来激活语音识别器。一旦开始捕获音频,它会调用 onstart 事件处理脚本,然后,对于每组新的结果,它都会调用 onresult 事件处理脚本。

recognition.onresult = function(event) {
    var interim_transcript = '';

    for (var i = event.resultIndex; i < event.results.length; ++i) {
        if (event.results[i].isFinal) {
            final_transcript += event.results[i][0].transcript;
        } else {
            interim_transcript += event.results[i][0].transcript;
        }
    }
    final_transcript = capitalize(final_transcript);
    final_span.innerHTML = linebreak(final_transcript);
    interim_span.innerHTML = linebreak(interim_transcript);
    };
}

此处理程序会将到目前为止收到的所有结果串联成两个字符串:final_transcriptinterim_transcript。生成的字符串可能包含“\n”(例如,当用户说出“new paragraph”时),因此我们使用 linebreak 函数将这些字符串转换为 HTML 标记 <br><p>。最后,该代码将这些字符串设为其相应 <span> 元素的 innerHTML:final_span(采用黑色文本样式)和 interim_span(采用灰色文本样式)。

interim_transcript 是一个局部变量,每次调用此事件时都会完全重新构建,因为自上次 onresult 事件以来,所有临时结果都可能发生改变。我们只需从 0 开始 for 循环,即可对 final_transcript 执行相同的操作。不过,由于最终文本永远不会更改,因此我们将 final_transcript 设为全局变量,让此处的代码效率更高一些,这样此事件就可以在 event.resultIndex 处启动 for 循环,并且仅附加任何新的最终文本。

这样就搞定啦!其余代码只是为了让一切看起来都很美观。它会保持状态,向用户显示一些信息性消息,并在静态麦克风、麦克风正斜线图片以及麦克风动画(带有闪烁的红点)之间切换麦克风按钮上的 GIF 图片。

调用 recognition.start() 时会显示麦克风斜杠图片,并在触发 onstart 时替换为 mic-animate。通常情况下,此过程非常快,以至于斜杠不明显。但是,首次使用语音识别时,Chrome 需要向用户请求使用麦克风的权限,在这种情况下,onstart 仅在用户授予权限时才会触发。通过 HTTPS 托管的网页无需重复请求权限,而 HTTP 托管的网页则需要重复请求权限。

所以,让您的网页能够倾听用户心声,让网页更生动有趣!

我们非常期待收到您的反馈...

请参阅 Chrome 隐私权白皮书,了解 Google 如何处理来自此 API 的语音数据。