Architecture · 系统架构

整体架构总览

唯一公网入口是 CloudFront。静态站在 S3(OAC 保护),API 走 API Gateway。语音与 AI 全部由 Amazon Connect 托管,工具以 MCP 暴露。

浏览器 / 边缘 我们的无服务器后端 Amazon Connect 托管 Q in Connect / Bedrock
↩ WebRTC 语音回放(agentic voice 合成的音频) CLIENT 🎙️ 浏览器 Chime SDK · WebRTC Start / 字幕 / 状态 EDGE CloudFront 唯一公网入口 OAC 签名 BACKEND · 无服务器 S3 静态站 index / app.js / 页面 API Gateway /webcall · /transcript → webcall Lambda AMAZON CONNECT · 托管 Connect 实例 StartWebRTCContact Contact Flow Set voice:agentic voice Get customer input Lex V2 bot + QInConnectIntent(转发) Q IN CONNECT · Bedrock Orchestrator AI agent Claude · 多步推理 AIPrompt + Guardrail AgentCore Gateway (MCP) CUSTOM_JWT 授权 工具发现 / 路由 工具 Lambda get_current_time get_weather

橙色箭头=控制/HTTP 路径;青色箭头=语音与工具调用路径。浏览器媒体流经 WebRTC 与 Connect 双向流动。

Voice Pipeline · 语音数据形态流转

音频 ↔ 文字:谁做 ASR、谁做 TTS

关键澄清:ASR 和 TTS 都由 “Amazon Connect agentic voice” 这一个 provider 完成(同一个提供方,两个环节)。Lex V2 不是 ASR 引擎——它是对话/编排层(NLU),负责管理回合、把识别出的文字交给 QInConnect intent,并通过 x-amz-lex 会话属性控制 ASR 行为(结束回合判定、barge-in)。下图按数据形态把链路拆开:青色=音频流橙色=文字

① 上行 · 听懂你(音频 → 文字) 🎙️ 浏览器麦克风 Chime SDK 采集 Connect 媒体侧 接收 WebRTC 媒体 交给 ASR agentic voice · ASR Advanced 流式识别 语音 → 文字 + 回合判定 (bot 的 Speech-to-Text 配置) Lex V2 bot 接入门户(Connect 必需) QInConnect:整句转发 非 ASR · 非大脑 Opus / WebRTC 音频流 8/16kHz PCM 文字 ② 下行 · 回答你(文字 → 音频) AI agent · Orchestrator Claude 多步推理 经 MCP 调 get_weather 产出 <message> 文字 agentic voice · TTS Matthew 语音合成 (Set voice 配置) Connect 媒体侧 WebRTC 回放 🔊 扬声器 浏览器 文字 <message> 合成音频 Opus/WebRTC

一句话记法:耳朵和嘴(ASR / TTS)= agentic voice;思考与选工具= orchestrator AI agent;Lex V2 只是接线盒——Connect 的语音入口只能接一个 Lex bot,它用 QInConnect intent 把整句原样转发给 AI agent,并承载 ASR 的会话控制参数(x-amz-lex),自身不做 ASR、不做对话逻辑。音频只在浏览器 ↔ Connect 之间以 WebRTC 流动,进入 Connect 后立刻转成文字,AI 全程处理文字。

Scenario Data Flow · 场景数据流(核心)

一次语音提问,数据怎么走

以“西雅图天气怎么样?”为例,从点击开始到听见回答的完整链路。

1
浏览器 · 点击「开始通话」

网页向 /webcall 发请求;后端 Lambda 调用 StartWebRTCContact,返回 Chime 会议/参会者信息。浏览器用 Amazon Chime SDK 建立 WebRTC 语音流。UI 显示「⏳ 连接中」。

2
Connect · Contact Flow · 建立会话并问候

Contact 进入 Flow:Set logging → Set voice(agentic voice, Matthew)→ CreateWisdomSession 建立 Q in Connect 会话 → Get customer input 交给 Lex bot,并把 session-arn 作为 Lex 会话属性传入。Matthew 播报开场白,UI 切到「🎙️ 正在听」。

3
· 说出问题

“What's the weather in Seattle?” — agentic voice 的流式 ASR 识别语音;用户停顿时结束回合。UI 切到「💭 思考中」。

4
AI agent · Orchestrator · 推理 + 选择工具

Lex 的 AMAZON.QInConnectIntent 把话交给 orchestrator AI agent。Claude 依据 orchestration prompt 判断需要天气数据,决定调用 get_weather 工具。

5
MCP · AgentCore Gateway · 工具调用

AI agent 经 AgentCore Gateway(CUSTOM_JWT 授权,audience = Gateway ID)以 MCP 协议调用工具;Gateway 路由到我们的工具 Lambda 执行 get_weather("Seattle"),返回确定性结果。

6
AI agent · 生成回答

拿到工具结果后,Claude 生成一句自然语言回复,用 <message> 包裹(orchestrator 要求)。

7
Connect · agentic voice · 合成并回放

回复文本经 agentic voice 合成为语音,通过 WebRTC 播回浏览器。UI 切到「🔊 正在回答」。

8
字幕 · 异步 · 从日志补齐双方文本

Connect 把 TRANSCRIPT_ORCHESTRATION_MESSAGE(含 CUSTOMER / BOT 文本)投递到 CloudWatch;网页每 1.5 秒轮询 /transcriptFilterLogEvents,非索引查询)把双方对话渲染成字幕,便于对比识别与回答。

Ownership · 我们写什么 vs Connect 托管什么
组件谁负责实现
ASR / TTS(agentic voice)Amazon Connect 托管Contact Flow 的 Set voice 块
大脑(推理 + 选工具)Connect orchestrator AI agentWisdom AIAgent + AIPrompt(Claude)
工具执行逻辑我们的 Lambdalambda/tools/(Python,确定性)
工具暴露为 MCPAgentCore GatewayAWS::BedrockAgentCore::Gateway
浏览器语音接入Connect web calling + Chime SDKlambda/webcall/ + web/
公网入口(合规)CloudFront → S3(OAC) + API Gateway不暴露任何 Lambda Function URL
对话字幕AI agent 日志 → 前端轮询EVENT_LOGS + /transcript
▶ 打开实时演示 看部署流程与调优细节