唯一公网入口是 CloudFront。静态站在 S3(OAC 保护),API 走 API Gateway。语音与 AI 全部由 Amazon Connect 托管,工具以 MCP 暴露。
橙色箭头=控制/HTTP 路径;青色箭头=语音与工具调用路径。浏览器媒体流经 WebRTC 与 Connect 双向流动。
关键澄清:ASR 和 TTS 都由 “Amazon Connect agentic voice” 这一个 provider 完成(同一个提供方,两个环节)。Lex V2 不是 ASR 引擎——它是对话/编排层(NLU),负责管理回合、把识别出的文字交给 QInConnect intent,并通过 x-amz-lex 会话属性控制 ASR 行为(结束回合判定、barge-in)。下图按数据形态把链路拆开:青色=音频流,橙色=文字。
一句话记法:耳朵和嘴(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 全程处理文字。
以“西雅图天气怎么样?”为例,从点击开始到听见回答的完整链路。
网页向 /webcall 发请求;后端 Lambda 调用 StartWebRTCContact,返回 Chime 会议/参会者信息。浏览器用 Amazon Chime SDK 建立 WebRTC 语音流。UI 显示「⏳ 连接中」。
Contact 进入 Flow:Set logging → Set voice(agentic voice, Matthew)→ CreateWisdomSession 建立 Q in Connect 会话 → Get customer input 交给 Lex bot,并把 session-arn 作为 Lex 会话属性传入。Matthew 播报开场白,UI 切到「🎙️ 正在听」。
“What's the weather in Seattle?” — agentic voice 的流式 ASR 识别语音;用户停顿时结束回合。UI 切到「💭 思考中」。
Lex 的 AMAZON.QInConnectIntent 把话交给 orchestrator AI agent。Claude 依据 orchestration prompt 判断需要天气数据,决定调用 get_weather 工具。
AI agent 经 AgentCore Gateway(CUSTOM_JWT 授权,audience = Gateway ID)以 MCP 协议调用工具;Gateway 路由到我们的工具 Lambda 执行 get_weather("Seattle"),返回确定性结果。
拿到工具结果后,Claude 生成一句自然语言回复,用 <message> 包裹(orchestrator 要求)。
回复文本经 agentic voice 合成为语音,通过 WebRTC 播回浏览器。UI 切到「🔊 正在回答」。
Connect 把 TRANSCRIPT_ORCHESTRATION_MESSAGE(含 CUSTOMER / BOT 文本)投递到 CloudWatch;网页每 1.5 秒轮询 /transcript(FilterLogEvents,非索引查询)把双方对话渲染成字幕,便于对比识别与回答。
| 组件 | 谁负责 | 实现 |
|---|---|---|
| ASR / TTS(agentic voice) | Amazon Connect 托管 | Contact Flow 的 Set voice 块 |
| 大脑(推理 + 选工具) | Connect orchestrator AI agent | Wisdom AIAgent + AIPrompt(Claude) |
| 工具执行逻辑 | 我们的 Lambda | lambda/tools/(Python,确定性) |
| 工具暴露为 MCP | AgentCore Gateway | AWS::BedrockAgentCore::Gateway |
| 浏览器语音接入 | Connect web calling + Chime SDK | lambda/webcall/ + web/ |
| 公网入口(合规) | CloudFront → S3(OAC) + API Gateway | 不暴露任何 Lambda Function URL |
| 对话字幕 | AI agent 日志 → 前端轮询 | EVENT_LOGS + /transcript |