亚马逊AWS官方博客

Amazon Transcribe Streaming 现在支持 WebSocket

我喜欢 Amazon Transcribe 这样的服务。它们是像魔术一样,足以激发我的想象力的未来科技。我们的语音识别功能可以自动、准确、实时识别各种语言和口音,非常神奇。这样的使用案例非常多,而且几乎所有使用案例都很有趣。目前可用的 Amazon Transcribe Streaming API 可以通过 HTTP/2 流使用。今天,我们将添加 WebSocket 作为另一种集成选项,助您在构建内容时实现实时语音功能。

在本博文中,我们将在浏览器中仅使用客户端 JavaScript 实时转录语音。但在构建之前,我们需要先打好基础。我们将回顾所需的 Amazon Transcribe、WebSocket 和 Amazon Transcribe Streaming API 相关信息,以便概要说明本演示。有关更多详细信息,请查看 Amazon Transcribe 文档

如果您想了解实际应用,可以直接观看演示,但是我建议您先快速浏览一下这篇博文。

什么是 Amazon Transcribe

Amazon Transcribe 应用机器学习模型将音频中的语音转录为文本。Amazon Transcribe 最强大的功能之一是能够实时转录音频。目前,此功能可通过 HTTP/2 流使用。今天,我们宣布推出使用 WebSocket 连接到 Amazon Transcribe 的功能。

对于实时转录,Amazon Transcribe 目前支持英式英语 (en-GB)、美式英语 (en-US)、法语 (fr-FR)、加拿大法语 (fr-CA) 和美式西班牙语 (es-US)。

什么是 WebSocket?

WebSocket 是在 TCP 基础上构建的协议,与 HTTP 类似。虽然 HTTP 非常适合短期请求,但一直以来却不适用于处理需要持久实时通信的场景。HTTP 连接通常在消息结尾关闭,而 WebSocket 连接保持打开状态。这意味着可以双向发送消息,而无需通过握手和协商连接来增加带宽或延迟。WebSocket 连接为全双工通信,这意味着服务器和客户端可以同时传输数据。这种连接还是专门为跨域使用设计的,因此不需要像使用 HTTP 那样执行繁琐的跨域资源共享 (CORS) 任务。

HTTP/2 流解决了 HTTP 在实时通信中遇到的许多问题,推出的第一个 Amazon Transcribe Streaming API 使用的就是 HTTP/2。WebSocket 支持向更大范围的受众开放 Amazon Transcribe Streaming,以便具备 WebSocket 集成或知识的客户更轻松地进行集成。

Amazon Transcribe Streaming API 工作原理

授权

首先,我们要授予 IAM 用户使用 Amazon Transcribe Streaming WebSocket 的权限。在 AWS 管理控制台中,将以下策略附加到用户:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "transcribestreaming",
            "Effect": "Allow",
            "Action": "transcribe:StartStreamTranscriptionWebSocket",
            "Resource": "*"
        }
    ]
}

身份验证

Transcribe 使用 AWS 签名版本 4 对请求进行身份验证。对于 WebSocket 连接,请使用预签名 URL,其中包含所有必需信息,并在 URL 中作为查询参数传递。这为我们提供了经过身份验证的终端节点,可用于建立 WebSocket。

必需参数

所有必需参数都包含在预签名 URL 中,是查询字符串的一部分。它们是:

  • language-code:语言代码。en-US、en-GB、fr-FR、fr-CA、es-US 中的一个。
  • sample-rate:音频的采样率,以 Hz 为单位。对于 en-US 和 es-US,采样率最高为 16000,对于其他语言,最高为 8000
  • media-encoding:目前仅支持 pcm
  • vocabulary-nameAmazon Transcribe 允许您为希望在数据中看到的不常见或独特的字词定义自定义词汇。要使用自定义词汇,请在此处进行引用。

音频数据要求

开始发送数据之前,我们需要了解一些事项。首先,Transcribe 需要音频编码为 PCM 数据。数字音频文件的采样率与捕获音频的质量有关。采样率为每秒检查模拟信号以生成数字信号的次数 (Hz)。对于高质量数据,建议采用 16000Hz 或更高的采样率。对于低质量音频(例如电话通话),请使用采样率 8000Hz。目前,美式英语 (en-US) 和美式西班牙语 (es-US) 最高支持 48000Hz 的采样率。其他语言最高支持 16000Hz 的采样率。

在我们的演示中,文件 lib/audioUtils.js 包含 downsampleBuffer() 函数(降低浏览器的传入音频字节的采样率)和 pcmEncode() 函数(获取原始音频字节并将其转换为 PCM)。

请求格式

我们以适当的采样率将音频编码为 PCM 数据后,需要将其封装在信封中以便通过 WebSocket 连接发送。每个消息由三个标头组成,后跟消息正文中经过 PCM 编码的音频字节。然后,将整个消息编码为二进制事件流消息并发送。如果您以前使用过 HTTP/2 API,我认为有一个不同之处让使用 WebSocket 变得更简单一些,那就是您不需要对发送的每个音频数据块进行加密签名。

响应格式

我们收到的消息采用相同的常规格式:二进制编码的事件流消息,包含三个标题和一个正文。但是消息正文包含一个 Transcript 对象,而不是音频字节。确定音频中的自然停止点之前,返回部分响应。有关如何设置此响应格式的详细信息,请参阅文档并查看 main.js 中的 handleEventStreamMessage() 函数。

观看演示!

现在我们已经了解一些背景,下面我们尝试执行演示。我已使用 AWS Amplify 控制台进行了部署 – 可以看一看,或按按钮部署您自己的副本。输入您之前为 IAM 用户授予的访问 ID 和密钥,点击“开始转录”按钮,开始对着麦克风讲话。

部署到 Amplify 控制台

GitHub 上提供了完整的项目。最重要的文件是 lib/main.js。该文件定义了所有必需的依赖项,在 index.html 中将按钮和表单字段连接起来,访问麦克风流,并将数据通过 WebSocket 推送到 Transcribe。代码已添加了详尽注释,应该很容易理解,但如果您有问题,欢迎随时在 GitHub 存储库上提交问题,我很乐意为您提供帮助。我要特别感谢 Transcribe 团队的软件开发工程师 Karan Grover,感谢他提供了此演示所需的基础代码。