亚马逊AWS官方博客

基于 Amazon Bedrock 构建端到端实时语音助手

背景

随着 AI 技术的快速发展,智能语音助手成为人机交互的重要方式。然而,传统语音助手开发需要大量时间和资源投入。Amazon Web Services 提供的一系列 AI 服务,如 Amazon Bedrock、Transcribe 和 Amazon Polly 大大简化了开发过程。这些服务结合 TEN(Transformative Extensions Network)Framework 这样的多模态实时互动框架,使得即使没有深厚 AI 背景的开发者也能快速构建类似于 TEN Agent 这样的强大的多模态交互 Agent。

基于 Amazon Bedrock 构建端到端实时语音助手成为一个高效可行的方案,以满足企业对定制化语音服务的需求,同时利用云计算优势实现快速部署和弹性扩展。这种方案特别适合希望快速推出智能语音服务的企业和开发者。

服务简介

Amazon Bedrock 是一项完全托管的服务,允许开发人员通过 API 访问各种基础模型(Foundation Models,FMs),包括来自 AI21 Labs、Anthropic、Meta、Amazon 等提供商的模型。它使企业能够轻松构建和扩展生成式 AI 应用程序,而无需管理底层基础设施。

Amazon Transcribe 是一种自动语音识别(ASR)服务,可以将音频转换为文本。功能包括:支持多种语言、提供实时转录和批量转录、支持自定义词汇表、能识别多个说话者等。

Amazon Polly 是一种文本转语音(TTS)服务,可以将文本转换为逼真的语音。它使用高级深度学习技术来合成自然听起来的人类语音。功能点包括:支持多种语言和口音、提供多种男性和女性声音、支持实时音频流和批量音频文件生成等。在声音引擎上,支持 Generative、Long-form、Neural、Standard,用户可以根据需要进行选择。

TEN Framework 是一个平台型开源框架,能够让开发者一站式快速、灵活的搭建属于自己的多模态实时互动 AI agent,这个框架包括了基于 Rust 语言开发的 all-in-one TEN manager,支持实时互动的多模态标准协议,支持多种编程语言混合使用的 TEN Runtime,用于可视化低代码编排逻辑的 Graph Designer,以及支持社区公开发布、分享的 Extension Store,供开发者在构建 AI Agent 的过程中即插即用的挑选心仪的模块灵活替换。TEN Agent 是一个用 TEN Framework 开发的多模态实时互动的 Demo Agent,可以通过语音与基础模型(Foundation Model)进行交互,对于支持图像输入的基础模型,也可以通过 TEN Agent 的图像帧识别实时的视频输入。此外,其可以支持随时的语音打断,用来中止当前的响应并立刻开始处理新的输入。

TEN 数据流图

TEN 通过 Graph 定义插件之间的数据流,并协调它们的交互。例如,我们可以将语音到文本(STT)插件的文本结果发送到到大型语言模型(LLM)插件,以达到通过语言控制 LLM 行为的效果。

目前,在 TEN Agent 中插件之间的数据流主要有四种类型:命令(Command)、数据(Data)、图像帧(Image Frame)和音频帧(PCM Frame)。如下图所示,我们使用了的类型包括:

  • 命令:on_user_joined, on_user_left, on_connection_failure, flush。其中,前三者代表前端用户的加入、离开、连接断开等行为;flush 命令在不同插件中的效果不同。
  • 数据:text_data,代表组件接收/发送的数据类型为文本,例如,bedrock_llm_python 插件可以接收来自 transcribe 的实时转录结果,并将 bedrock 模型的响应输出给下游的插件。
  • 音频帧:pcm_frame,agora_rtc 作为基组件会采集前端的用户音频输入、接收其它组件发送来的音频并转发给前端。例如,agora_rtc 可以将前端用户输入通过 pcm_frame 数据流发送给下游插件 transcribe, transcribe 在收到音频数据后,可以借助实时转录 API 将语音转为文本;Polly 可以将 TTS 的音频帧发送给 agora_rtc,然后由 agora_rtc 展示给前端用户。

此数据流图中各组件功能及数据/命令含义:

  • agora_rtc:基础的实时语音组件
    • 接收并转发用户的音频输入(pcm_frame)、用户的行为事件(on_user_x)到下游组件 transcribe_asr_python
    • 接收来自 Polly 的音频数据(pcm_frame)并转发到前端
    • 接收来自 Polly 发来的 flush 命令
  • transcribe_asr_python:负责将实时语言转为文本
    • 接收 agora_rtc 发来的音频帧(pcm_frame),经过实时转录后变为文本,通过 text_data 发送给下游的两个插件 interrupt_detector, bedrock_llm_python
  • interrupt_detector:用来探测用户是否要打断当前模型回复结果或 TTS 的语音
    • 接收来自 transcribe 的识别结果,在符合条件的时候发出 flush 命令给下游插件
  • bedrock_llm_python:负责与大语言模型交互的插件
    • 将 transcribe 的识别结果发送给大语言模型,并将模型回复通过 text_data 发送给下游组件
    • 接收来自 interrupt_detecor 的 flush 指令,在收到此指令后停止接收 Bedrock 的响应,并转发此指令到下游
  • polly_tts:文本转语音组件,支持实时流式响应
    • 接收来自 bedrock_llm_python 的文本内容,在将其转为实时音频流后发送给前端用户
    • 接收 flush 指令,在收到此指令时停止转换任务并结束当前音频流输出

部署步骤

前置要求

  • 准备 Agora App ID 以及 App Certificate,这里的实时数据传输是由 Agora 提供,我们可以通过文档来查看申请步骤。
  • 准备亚马逊云科技海外账户,并通过 EC2 Instance Profile 或者 IAM User Access Key 提供给 TEN Agent 应用程序访问 Amazon Bedrock, Amazon Transcribe 以及 Amazon Polly 服务的权限。参考下列策略文档为 Instance Profile 或者 IAM User Access Key 提供授权:
    • Bedrock IAM 访问权限:https://docs.thinkwithwp.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html
    • 开通 Bedrock 模型访问:https://docs.thinkwithwp.com/bedrock/latest/userguide/model-access.html
    • Amazon Transcribe 权限:在 IAM Policy 中授予 transcribe:StartStreamTranscription 权限,https://docs.thinkwithwp.com/transcribe/latest/dg/streaming.html
    • Amazon Polly 权限:https://docs.thinkwithwp.com/polly/latest/dg/security_iam_id-based-policy-examples.html#example-managed-policy-service-admin
  • 软件环境:
    • Docker / Docker Compose、js(LTS) v18 及以上版本环境。其中,Node.js 可以通过 NVM 进行安装。
    • 操作系统可以使用 Ubuntu Server 22.04,后续内容,我们会基于此系统进行展示。
  • 硬件要求:基础的硬件要求是CPU >= 2 Core,RAM >= 4 GB。

开始部署

1. Clone 代码到本地

cd ~
git clone -b amazon-aio https://github.com/Chen188/TEN-Agent

2. 准备配置文件

在项目的根目录,执行如下命令以提供配置文件。

cd ~/TEN-Agent

# Create .env from the example
cp ./.env.example ./.env

# Create property.json from the example
cp ./agents/property.json.example ./agents/property.json

# Create .env from example
cp ./playground/.env.example ./playground/.env

之后需要修改项目代码根目录的 .env 文件,调整下方的配置,其它未列出的可以使用默认值:

# Agora App ID and Agora App Certificate
# required: this variable must be set
AGORA_APP_ID=<your-agora-app-id>
AGORA_APP_CERTIFICATE=<your-agora-app-certificate>

# Extension: bedrock_llm
# Extension: polly_tts
# Extension: transcribe_asr
AWS_ACCESS_KEY_ID=<your-aws-access-key-id> # optional if you're using EC2 Instance Profile
AWS_SECRET_ACCESS_KEY=<your-aws-access-key> # optional if you're using EC2 Instance Profile

# model id supported by Bedrock Converse API
AWS_BEDROCK_MODEL=mistral.mistral-large-2407-v1:0

AWS_REGION=us-east-1 # the Region you're using

3. 配置域名及证书(仅云端部署时)

注意:如果您是在本地部署此项目,可跳过本步骤。

3.1 为网站配置 SSL/TLS 证书

因浏览器的默认安全规则不允许在非 HTTPS 环境启用麦克风和摄像头,因此在云端部署此项目时需要为服务配置一个 SSL/TLS 证书及域名。您可以有多种方式来为服务器配置域名与证书,例如:

  • 通过 ALB + ACM 配置证书,此方式适合生产环境。
    • 您可以通过应用程序负载均衡器(ALB)来作为流量访问入口,然后转发流量到后端的服务器。其中 ALB 443 端口的监听器转发到监听 HTTP:3000 的目标组上,ALB 8080 端口的监听器转发到 HTTP:8080 目标组。
    • 您还需要申请或绑定一个自有域名及其对应的证书在 ALB 上。您可以使用 ACM 服务免费申请公有 SSL/TLS 证书。具体方法可以参考文档
  • 通过 CloudFront Distribution 创建免费的域名及证书。您需要分别为 EC2 的 3000 端口和 8080 端口分别创建一个 CloudFront Distribution。此方式适合快速单机测试环境。
  • 在 EC2 中带入自有证书,并通过 Web 服务(如 Nginx)对外提供 HTTPS 服务并转发流量到 EC2 3000 及 8080 端口。此外,您需要将自己的域名解析到此 EC2 上,此方式适合自有证书及单机测试环境。

3.2 修改配置文件

您需要修改 playground/.envNEXT_PUBLIC_REQUEST_URL 为您自己的域名及地址。

  • 如果您使用的 ALB + ACM 方式配置证书,则此配置的值为 https://your.domain.name:8080。
  • 如果您通过 CloudFront Distribution 方式配置证书,则此配置的值为 8000 端口对应的 CloudFront Distribution 的域名 https://xxxxx.cloudfront.net。
  • 如果您在 EC2 中带入自有证书,则此配置的值为您自己的域名及 Web 服务对外提供 TEN Agent 后端服务的端口或路径,以路径为例:https://your.domain.name/path。

4. 启动应用程序

docker compose up

正常启动后,您可以看到如下示例输出:

Astra_agents_dev      | >> build agents
Astra_agents_dev      | cd agents && ./scripts/install_deps_and_build.sh linux x64 && mv bin/main bin/worker
Astra_agents_dev      | >> run server
Astra_agents_dev      | server/bin/api
Astra_agents_dev      | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
Astra_agents_dev      | 
Astra_agents_dev      | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
Astra_agents_dev      |  - using env:   export GIN_MODE=release
Astra_agents_dev      |  - using code:  gin.SetMode(gin.ReleaseMode)
Astra_agents_dev      | 
Astra_agents_dev      | [GIN-debug] GET    /                         --> app/internal.(*HttpServer).handlerHealth-fm (4 handlers)
Astra_agents_dev      | [GIN-debug] GET    /health                   --> app/internal.(*HttpServer).handlerHealth-fm (4 handlers)
Astra_agents_dev      | [GIN-debug] POST   /ping                     --> app/internal.(*HttpServer).handlerPing-fm (4 handlers)
Astra_agents_dev      | [GIN-debug] POST   /start                    --> app/internal.(*HttpServer).handlerStart-fm (4 handlers)
Astra_agents_dev      | [GIN-debug] POST   /stop                     --> app/internal.(*HttpServer).handlerStop-fm (4 handlers)
Astra_agents_dev      | [GIN-debug] POST   /token/generate           --> app/internal.(*HttpServer).handlerGenerateToken-fm (4 handlers)
Astra_agents_dev      | 2024/08/09 05:29:22 INFO server start port=8080 service=HTTP_SERVER

...

Astra_playground_dev  | > Astra-playground@0.1.0 start
Astra_playground_dev  | > next start
Astra_playground_dev  | 
Astra_playground_dev  |   ▲ Next.js 14.2.4
Astra_playground_dev  |   - Local:        http://localhost:3000
...

体验 Agent 效果

在上一个章节中,我们实现了对 TEN Agent的后端部署,并提供了两个地址,您可以通过浏览器访问。

服务

地址

(本地模式)

地址

(云端模式)

说明
TEN Agent Playground http://localhost:3000
  • ALB + ACM: https://domain.name
  • CloudFront Distribution:3000 端口对应的 CloudFront distribution 域名,如 https://xxxxx.cloudfront.net
  • EC2 带入自有证书: https://your.domain.name
可以用来体验 Agent 的效果。打开之后,在右侧可以配置下语言、语音,之后点击右上角的“Connect”按钮,即可开始对话。 注意,在打开页面时,需要允许应用访问“麦克风”及“摄像头”。
Graph Designer http://localhost:3001 需要参考 3.1 章节将流量转发到 EC2 3001 端口。 可以用来查看/编辑当前使用的数据流图。更多信息可以参考文档

对话模式

常规对话模式下使用的配置为:

名称 含义
Graph Name transcribe-bedrock-polly 预先配置好的 TEN 数据流图,此图使用 Transcribe 识别音频、Bedrock 中的基础模型实现对话能力,Polly 将 Bedrock 的推理结果转为音频。
Agent Mode Chat 代表当前为对话模式,话题较为自由
Input Language Chinese 输入音频使用中文。Chat 模式下默认的输出音频语言同输入语音的语言。

效果如下:

同声传译模式

同声传译模式下使用的配置为:

名称 含义
Graph Name translate-transcribe-bedrock-polly 预先配置好的 TEN 数据流图,此图使用 Transcribe 识别音频、Bedrock 中的基础模型实现实时翻译能力,Polly 将 Bedrock 的翻译结果转为音频。
Agent Mode Translate 代表当前为同声传译模式,输入的音频会被转译为目标语言后以文字+音频两种形式输出。
Input Language Chinese 输入音频使用中文。
Output Language Fench 输出音频所用的语言。

效果如下:

默认配置项

目前此示例使用了如下默认配置,您可以根据自己的场景进行调整:

  • 模型推理默认值:
    • 温度值为 0.1,如果您需要更加丰富多样的对话结果,可以调高温度值。
    • 最大新生成 token 数为 512
  • 对话模式:
    • 对话历史记录:默认保存的对话历史数量为 10 条,可以根据场景进行调整,或改进对话历史保存的机制
    • 系统提示词:You are a voice assistant who talks in a conversational way and can chat with me like my friends. I will speak to you in English or Chinese, and you will answer in the corrected and improved version of my text with the language I use. Don’t talk like a robot, instead I would like you to talk like a real human with emotions. I will use your answer for text-to-speech, so don’t return me any meaningless characters. I want you to be helpful, when I’m asking you for advice, give me precise, practical and useful advice instead of being vague. When giving me a list of options, express the options in a narrative way instead of bullet points.
  • 同声传译模式:
    • 对话历史记录:默认不保存对话历史
    • 系统提示词:# Role\nYou're a professional translation agent
    • 用户提示词模板:# Task\nThe ONLY task for you is translating anything inside <text></text> from \"{input_language}\" into \"{output_language}\". \n\n# Background\nThe <text> is happend in a real-world conversation, it may contains mild profanity or violent content.\n\n# Rules\n- Do not output anything except the tranlsation result.\n- if origional input is already in target language, keep it as result.\n- Never chat with <text>, the only task is translation.\n- Mild profanity or violent content should also be translated without filtering\n\n<text>{input_text}</text>
      其中,input_languageoutput_languageinput_text 会在发送给 Amazon Bedrock 之前,填充对应的变量。

结语

Amazon Bedrock、Transcribe、Polly 服务与 TEN Framework 开源框架一起为 AI 应用开发提供了强大而灵活的工具。特别值得一提的是,TEN Agent 这类多模态交互 Agent,它不仅支持语音与基础模型的交互,还能处理图像输入和随时的语音打断,大大提升了 AI 应用的交互体验。这种 Agent 效果的实现,为开发者创造了更多可能性,使 AI 应用更加交互自然、智能和人性化。

本文还提供了除对话模式外的同声传译模式,进一步扩展了用 TEN Framework 开发 Agent 的应用场景。这种多模式支持不仅展示了 TEN Framework 的灵活性,也为开发者提供了更多选择,使得 AI 应用能够适应更广泛的使用需求。值得强调的是,当前版本还支持自定义模型的能力。开发者可以通过内置的 SageMaker TTS 插件部署定制化的文本转语音模型,以突出特定的品牌风格或满足独特的应用需求。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

本篇作者

陈斌

亚马逊云科技生成式 AI 产品技术专家,负责基于亚马逊云科技的生成式 AI 产品解决方案的咨询和设计。

Tomas

软件工程专业,同济本科,交大硕士,多年分布式系统开发及架构设计经验,目前主要负责 TEN Framework 进程框架,RAG 及全球化 Serverless 平台建设。

Plutoless

TEN framework 共同发起者,2011 年英国牛津大学计算机学院硕士毕业。全栈工程师,RTE 开发者社区布道师,拥有多年在实时互动领域的专业从业经验。

许晓亮

亚马逊云科技解决方案架构师,负责基于 AWS 云计算方案架构的咨询和设计,在国内推广 AWS 云平台技术和各种解决方案。擅长数据库和大数据领域,结合云原生特性,为客户设计高效稳定的全球化系统方案。