随着人工智能技术的飞速发展,自然语言处理和语音交互技术正在深刻改变人机交互的方式。语音交互正从简单的“机械应答”向更自然的“类人对话”演进。
传统的语音系统通常采用模块化架构,将语音处理流程割裂为ASR(自动语音识别)、NLP(自然语言处理)和TTS(文本转语音)等独立模块,这种管道式处理方法存在信息衰减、响应延迟和情感缺失等核心痛点。
因此,如何实现自然的语音交互与多工具协同成为技术突破的关键。Amazon Nova Sonic通过将语音理解和生成统一到单一模型中,提供了一种简化的解决方案,用于创建自然、类人的语音交互,与需要编排多个模型的传统方法不同。
本文将深入探讨Amazon Nova Sonic基础模型与MCP(Model Context Protocol,模型上下文协议)的结合,介绍基于Amazon Nova Sonic和MCP构建实时语音交互应用的技术实践,涵盖技术原理、实际开发部署等,为开发者提供全面的技术指南。
关键技术概念介绍
Amazon Nova Sonic:语音交互的颠覆性模型
Amazon Nova Sonic通过单一模型架构实现语音理解与生成的端到端处理,解决了传统多模型拼接的延迟与信息丢失问题。其核心优势包括以下方面。
1. 端到端一体化模型
Amazon Nova Sonic摒弃传统级联式语音系统的模块化设计,将语音输入到输出的全流程统一在单一神经网络中完成。
这种设计消除了不同模块间的信息割裂,保留对话中的声学语境(如语气、节奏、停顿),显著提升交互连贯性。例如,用户说话时的犹豫或打断会被实时解析并调整响应策略,而非机械式等待静音间隙。
2. 实时双向流式交互
通过Amazon Bedrock提供的双向流式API(InvokeModelWithBidirectionalStream),模型支持用户与AI同时进行语音输入输出,平均响应时间仅1.09秒,且支持用户中途打断对话而不丢失上下文。技术实现上,采用5:15的文本——语音标记混合生成比例,确保语义连贯性与实时性平衡。
3. 多语言与噪声鲁棒性
支持英语(美式、英式)多语言交互,在多语言LibriSpeech基准测试中平均词错误率(WER)低至4.2%。模型能识别主说话人并过滤背景噪声,适用于工厂、户外等复杂场景。
4. 情感感知与动态调节
模型可解析用户语音中的情绪(如兴奋、愤怒、担忧),并动态调整回应风格。例如,当客服对话中用户语气转为焦虑时,Amazon Nova Sonic会降低语速、增加安抚性词汇,同时触发企业数据库查询相关解决方案。
5. 上下文感知能力
32K token的滚动窗口支持长达8分钟的连续对话,可识别语气、停顿甚至背景噪音。
6. 原生工具调用(Tool-Use)
直接解析语音请求并触发API调用(如航班预订、数据查询),通过工具结果反馈优化响应逻辑。
MCP:实时语音交互中的大模型与Agent工具标准化连接
MCP作为开放协议,为端到端语音模型或者相关Agent提供了工具发现、安全调用与数据融合的标准化框架。在实时语音对话场景下,其价值更为突出:
- 虚拟化工具网关:通过MCP Gateway统一管理分散的API服务,解决工具碎片化问题。例如在用户询问订单状态时,可以实时调用CRM系统、物流接口,确保对话的即时性和准确性。
- 动态上下文注入:在语音交互中自动关联企业数据,通过RAG增强生成结果的事实准确性。这对speech-to-speech模型尤为重要,因为用户在实时对话中需要准确、及时的信息响应,而不是模型生成的模糊答复。
- 实时性能优化:MCP的标准化调用机制能够显著降低工具调用延迟,这在实时语音对话中至关重要,可以保持对话的自然流畅性,避免因等待外部数据而产生的停顿。
方案介绍
本节将详细介绍基于Amazon Nova Sonic和MCP的语音交互方案实现,方案实现了双向音频流、通过MCP的工具集成以及响应式Web界面。方案实时音频对话系统的总体架构分为前端和后端两大部分,采用WebSocket实现实时通信。
该方案基于以下主要技术构建:
- 运行环境:Node.js(v18.0.0+)with TypeScript
- Web框架:Node.js用于HTTP/WebSocket服务器
- 实时通信:IO用于双向WebSocket连接
- 音频处理:用于基于浏览器的音频捕获/播放的WebAudio API
- AI集成:适用于Amazon Bedrock Runtime客户端的亚马逊云科技开发工具包
- 工具集成:MCP SDK(@modelcontextprotocol/sdk)
具有以下关键组件:
- 处理WebSocket连接并与Amazon Bedrock集成的Node.js/Express服务器。
- 用于实时音频可视化和交互的现代Web界面。
- 用于自然对话流程的双向音频流。
- 支持中断检测和即时处理。
- 通过模型MCP与外部工具集成。
- 支持多种语音角色和多语言界面。
技术架构
本方案实现了一个基于WebSocket的双向音频流应用,与Amazon Nova Sonic模型集成,用于实时语音转语音对话。系统采用现代Web技术栈构建,支持双向实时音频流、多语言界面以及动态工具调用。
以下是基于您提供的内容生成的架构图,展示了一个使用Amazon Nova Sonic模型的语音交互系统。

上图系统架构展示了一个完整的语音交互流程:
客户端:
- 用户通过麦克风提供语音输入。
- 浏览器使用WebSocket技术处理实时通信。
- 系统将响应转换为音频并通过扬声器输出。
服务器:
- 使用Express框架构建的后端服务。
- 集成Socket.IO实现双向实时通信。
大模型服务:
- 利用Amazon Nova Sonic模型进行语音处理。
- 负责语音识别、理解和生成响应。
- 负责处理用户中断及响应。
- 负责对接MCP tools进行工具调用。
方案架构实现
音频处理
音频处理管道通过基于WebSocket的流式处理架构实现与AI的双向实时语音转语音对话,主要由四个主要阶段组成:
- Audio Capture:客户端麦克风输入和预处理。
- 实时流式处理:基于WebSocket的双向音频传输
- 服务器处理:Amazon Nova Sonic语音转语音模型处理
- Audio Playback:具有可视化功能的客户端缓冲音频输出
用户的语音输入经由浏览器WebSocket发送到服务器,服务器与Amazon Nova Sonic模型交互后,将结果返回给浏览器,最终转换为音频输出给用户。这种架构支持实时的语音对话体验。系统实现了一个完整的音频处理管道,调用序列如下图所示。

1.音频捕获:浏览器以16kHz采样率从用户麦克风捕获音频。
2.音频处理:对音频进行处理、分析和编码以便传输。
3.WebSocket传输:音频数据实时流式传输到服务器。
4.Amazon Nova Sonic处理:服务器通过Amazon Bedrock将音频转发到Amazon Nova Sonic。
5.响应生成:Amazon Nova Sonic处理输入并生成响应。
6.工具集成:如果需要,通过MCP框架调用工具。
7.音频播放:响应流回客户端并播放给用户。
接收和处理Tool事件
Amazon Nova Sonic可以支持Function Call具备调用外部工具的能力,首先定义函数描述Schema,将用户输入和函数描述一起输入调用LLM,解析LLM的输出,如果有输出函数名和参数则执行该函数,再将函数结果反馈给LLM,实现下一轮调用,直至输出最终结果。

在整个对话过程中,如果用户输入与ToolConfiguration中的工具规格之一匹配,Amazon Nova Sonic将触发ToolUse事件。
例如,如果用户问“今天天气怎么样?”,如下图所示,在收到用户ASR(脚本)事件后,Amazon Nova Sonic将发送一个ToolUse事件,其中包含配置中指定的toolName getWeatherTool。
Amazon Nova Sonic与MCP交互
Amazon Nova Sonic要实现MCP这种方式的工具调用,首先需要将函数或工具的描述信息schema输入给LLM,只不过Function Call是在本地生成函数描述的,而MCP则是远程从MCP Server中自动拉取的工具描述,远程MCP Server端有哪些工具的描述,是基于Server端工具在开发时用注解的方式描述函数名、用途和参数信息来自动生成的。
和Function Call机制一样,Sonic识别需要调用哪个MCP工具,并将要调用的工具名、参数以.json格式结构化文本输出,然后是由LLM所在的Host去调用。

与Amazon Bedrock上其他Amazon Nova以及Claude模型类似,可以在调用模型推理时,传递tools configure配置信息,从而触发模型function Calling,与第三方系统或者工具集成。
在与Amazon Nova Sonic启动新会话时,您可以在发送到Sonic PromptStart的第二个事件中提供Tool配置,该Tool配置是通过MCP Client的list Tools等SDK,从MCP Server端获取的tools工具schema,包含调用stdio endpoint command path/arguments,或者Streamable Http endpoint的base_url、headers等schema信息。
Amazon Nova Sonic模型tools参数获取该信息后,即可Amazon Bedrock上其他LLM一样进行function calling。

- Amazon Nova Sonic模型:模型能够识别并发起工具调用事件。
- 双向流客户端:接收模型的工具调用事件,并负责与工具处理器进行通信。
- 工具处理器(ToolHandler):负责分发和处理工具请求,是系统的中央协调器。它可以:
- 调用内置工具
- 将请求转发给MCP服务管理器
- 内置工具:系统自带的基础工具,如日期查询、天气查询等,可能需要调用外部API获取数据。
- MCP服务管理器:管理和协调多个MCP服务器,负责将请求路由到适当的服务器并收集结果。
- MCP服务器:提供专门的功能服务,如搜索工具(服务器1)和文件处理(服务器2)等。
核心组件和调用流程
MCP集成由三个主要组件组成,它们协同工作,为AI提供工具功能:
- McpManager:管理MCP服务器进程的生命周期。
- ToolHandler:编排工具执行并管理已注册的工具。
- McpConfigLoader:加载和验证服务器配置。

工具处理器(ToolHandler)
ToolHandler充当工具注册和执行的中央业务流程协调程序。它维护来自所有连接的MCP服务器的可用工具的注册表负责:
- 注册MCP工具
- 处理工具调用请求
- 执行工具逻辑
- 返回结果
// 工具处理流程
public async processToolUse(toolName: string, toolUseContent: object): Promise<Object> {
// 1. 检查是否是MCP工具
if (this.mcpTools.has(toolName)) {
const toolInfo = this.mcpTools.get(toolName);
// 2. 调用对应工具的处理函数
return await toolInfo.handler(toolUseContent);
}
// 3. 处理内置工具
switch (tool) {
case"getdateandtimetool":
returnthis.getDateAndTime();
case"getweathertool":
// 解析参数并调用天气API
returnthis.fetchWeatherData(parsedContent.latitude, parsedContent.longitude);
default:
thrownew Error(`不支持的工具 ${tool}`);
}
}
MCP管理器(Mcp Manager)
MCP Manager处理MCP服务器从初始化到清理的整个生命周期负责:
- 加载MCP配置
- 连接MCP服务器
- 注册服务器提供的工具
- 调度工具调用
调度工具调用
// 连接MCP服务器并注册工具
async connectToServer(serverName: string, config: McpServerConfig): Promise<McpTool[]> {
// 1. 创建客户端
const client = new Client({...});
// 2. 创建传输层
const transport = new StdioClientTransport({...});
// 3. 连接服务器
await client.connect(transport);
// 4. 获取工具列表
const toolsResult = await client.listTools();
// 5. 注册工具到ToolHandler
this.registerServerTools(serverName, serverTools, config.autoApprove || []);
}
MCP Tool调用流程
工具调用的完整流程如下。
配置加载:
- McpConfigLoader从配置文件加载MCP服务器配置。
服务器连接:
- McpManager连接到配置的MCP服务器。
- 获取服务器提供的工具列表。
工具注册:
- 将工具注册到ToolHandler。
- 为每个工具创建处理函数。
会话初始化:
- 创建一个会话并设置工具配置。
- 在createPromptStartEvent中包含可用工具信息。
工具调用:
- AI模型发送toolUse事件。
- 客户端接收并分发到事件处理器。
- handleToolUse记录工具调用信息。
- handleToolEnd触发工具执行。
工具执行:
- toolHandler.processToolUse调用对应工具。
- 内置工具直接执行内部逻辑。
- MCP工具通过对应服务器调用。
结果返回:
- 获取工具执行结果。
- 通过createToolResultEvents创建结果事件。
- 将结果发送回流。
以下是本方案获取MCP Server信息及加载tools的代码示例。
/**
* 初始化所有启用的 MCP 服务器
*/
async initializeServers(): Promise<void> {
const servers = Object.entries(this.config.mcpServers);
console.log(`发现 ${servers.length} 个 MCP 服务器配置`);
await Promise.all(
servers.map(async ([serverName, serverConfig]) => {
if (serverConfig.disabled !== true) {
try {
await this.connectToServer(serverName, serverConfig);
} catch (error) {
console.error(`连接到 MCP 服务器 ${serverName} 失败:`, error);
}
} else {
console.log(`MCP 服务器 ${serverName} 已禁用,跳过连接`);
}
})
);
}
/**
* 连接到指定的 MCP 服务器
*/
async connectToServer(
serverName: string,
config: McpServerConfig
): Promise<McpTool[]> {
console.log(`正在连接 MCP 服务器: ${serverName}`);
try {
// 创建客户端
const client = new Client({
name: `nova-sonic-mcp-client-${serverName}`,
version: "1.0.0",
capabilities: {
prompts: {},
resources: {},
tools: {},
},
});
let transport;
// 根据 command 类型选择不同的 transport
if (config.command === "restful") {
// 使用 StreamableHTTPClientTransport
if (!config.baseUrl) {
thrownew Error("使用 restful 模式时必须提供 baseUrl");
}
transport = new StreamableHTTPClientTransport({
baseUrl: config.baseUrl,
headers: config.headers || {}, // 可选的 HTTP 头
fetch: globalThis.fetch, // 使用全局 fetch
});
} else {
// 使用原有的 StdioClientTransport
let command = config.command;
let args = [...config.args];
if (config.command === "node") {
command = process.execPath;
}
transport = new StdioClientTransport({
command: command,
args: args,
env: {
...getDefaultEnvironment(),
...config.env,
},
stderr: "pipe",
});
transport.stderr?.on("data", (data) =>
console.info(`[MCP] Stdio stderrfor server: `, data.toString())
);
}
// 连接到服务器
await client.connect(transport);
// 保存客户端和传输
this.clients.set(serverName, client);
this.transports.set(serverName, transport);
// 获取工具列表
const toolsResult = await client.listTools();
const serverTools = toolsResult.tools.map((tool) => ({
name: tool.name,
description: tool.description,
inputSchema: tool.inputSchema,
serverName: serverName,
}));
// 保存工具列表
this.tools.set(serverName, serverTools);
// 注册工具到 ToolHandler
this.registerServerTools(
serverName,
serverTools,
config.autoApprove || []
);
console.log(
`已连接到 MCP 服务器 ${serverName},可用工具:`,
serverTools.map(({ name }) => name).join(", ")
);
return serverTools;
} catch (error) {
console.error(`连接到 MCP 服务器 ${serverName} 失败:`, error);
throw error;
}
}
/**
* 注册服务器工具到 ToolHandler
*/
privateregisterServerTools(
serverName: string,
tools: McpTool[],
autoApproveList: string[]
): void {
tools.forEach((tool) => {
// 修改: 默认所有工具都是自动批准的,不再根据 autoApproveList 判断
const isAutoApproved = true;
this.toolHandler.registerMcpTool(
tool.name,
this.callMcpTool.bind(this, serverName, tool.name),
serverName,
tool.description,
isAutoApproved
);
});
}
以下是toolConfiguration部分的示例JSON,其中包括3个MCP Server的示例配置,其中mcp-playwright和server-filesystem是stdio的MCP Server,searchWebsit_McpHttpServer是Streamable Http的MCP Server。
{
"mcpServers": {
"github.com/executeautomation/mcp-playwright": {
"disabled": false,
"command": "npx",
"args": ["-y", "@executeautomation/playwright-mcp-server"]
},
"github.com/modelcontextprotocol/servers/tree/main/src/filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/tangqy/Documents/MCP/filesystem-server"
],
"disabled": false,
"autoApprove": []
}
},
"searchWebsit_McpHttpServer":{
"transportType":"streamable_http",
"command":"restful",
"base_url":"http://ec2-35-93-77-218.us-west-2.compute.amazonaws.com:8080/message",
"headers": {
}
}
}
中断处理
Amazon Nova Sonic模型可以有效的处理用户中断,在全双工模式下,用户语音输入是单独的流channel,在该channel的audio chunk处理过程中,通过回调机制/输出检测(模型还在speaking输出)/间隔阀值…etc等机制,确认是否用户中断请求,从而在处理response的另一条流channel中,输出中断标识,从而方便指示客户端处理并响应中断。
其代码示例如下:
socket.on("contentEnd", (data) => {
console.log("Content end received:", data);
if (data.type === "TEXT") {
if (role === "USER") {
// When user's text content ends, make sure assistant thinking is shown
hideUserThinkingIndicator();
showAssistantThinkingIndicator();
} elseif (role === "ASSISTANT") {
// When assistant's text content ends, prepare for user input in next turn
hideAssistantThinkingIndicator();
}
// Handle stop reasons
if (data.stopReason && data.stopReason.toUpperCase() === "END_TURN") {
chatHistoryManager.endTurn();
} elseif (
data.stopReason &&
data.stopReason.toUpperCase() === "INTERRUPTED"
) {
console.log("Interrupted by user");
audioPlayer.bargeIn();
}
} elseif (data.type === "AUDIO") {
// When audio content ends, we may need to show user thinking indicator
if (isStreaming) {
showUserThinkingIndicator();
}
}
});
方案部署和使用指南
方案关键技术和依赖项
方案基于以下主要技术构建:
- 运行时间:Node.js(v18.0.0+)with TypeScript
- Web框架:Express.js用于HTTP/WebSocket服务器
- 实时通信:Socket.IO用于双向WebSocket连接
- 音频处理:用于基于浏览器的音频捕获/播放的WebAudio API
- AI集成:适用于Amazon Bedrock Runtime客户端的亚马逊云科技开发工具包
- 工具集成:MCP SDK(@modelcontextprotocol/sdk)
主要依赖项如下表格所示。

安装步骤
部署Amazon Nova Sonic实时语音应用需要以下步骤:
先决条件:
- Node.js(v18.0.0或更高版本)。
- 亚马逊云科技账户,并启用Amazon Bedrock访问权限。
- 已配置Amazon Web Services CLI和适当凭证。
- 麦克风和扬声器设备。
1.克隆仓库。
git clone https://github.com/aws-samples/sample-nova-sonic-mcp
cd sample-nova-sonic-mcp
2.安装依赖。
npm install
3.配置亚马逊云科技凭证。
aws configure --profile default
确保配置正确的区域(如`us-east-1`)和有效的访问密钥。
4.构建TypeScript代码。
npm run build
5.配置MCP服务器(可选):
编辑`mcp_config.json`文件,配置需要的MCP服务器。
{
"mcpServers": {
"github.com/tavily-ai/tavily-mcp": {
"command": "npx",
"args": ["-y", "tavily-mcp@0.1.4"],
"env": {
"TAVILY_API_KEY": "your-api-key"
},
"disabled": false,
"autoApprove": []
}
}
}
6.启动应用。
npm start
7.访问界面:在浏览器中打开`http://localhost:3000`
使用指南
主界面概览:

主界面包含以下主要元素:
- 连接状态指示器:左上角显示当前连接状态,如”已连接服务器”或错误信息。
- 语音角色选择:顶部中央的下拉菜单,可选择不同AI语音角色。
- 设置按钮:右上角的齿轮图标,用于打开配置面板。
- 音频可视化:中央的蓝色圆形区域,显示实时音频波形和语音活动。
- 控制按钮:
- 左下角麦克风按钮:控制麦克风开启/关闭。
- 中央通话按钮:开始/结束对话(红色表示正在对话中)。
- 右下角文本按钮:切换显示/隐藏文本对话内容。
基本操作
开启对话:
- 点击界面底部的电话按钮(绿色)开始对话。
- 系统将自动初始化会话并开启麦克风。
- 中央区域的脉动球体会根据音频活动动态变化。
语音交互:
- 对着麦克风说话,语音将被实时处理。
- 系统会显示语音转录和AI响应。
- 可以自然地中断AI说话(barge-in功能)。
- AI响应会通过扬声器播放。
结束对话:
- 点击红色电话按钮结束当前对话。
- 系统会自动清理资源并刷新页面。
高级功能
语音角色选择

点击顶部的用户头像打开语音选择菜单。
选择不同的语音角色(如tiffany、matthew、amy)。
新的语音设置将应用于下一次对话。
配置系统
1.提示词配置
2.MCP服务器配置:

点击右上角的设置图标打开配置面板:
- 提示词:选择预设提示词或自定义提示词。
- 语言:切换界面语言(中英文)。语言配置选项卡允许用户在支持的UI语言之间切换。
- MCP服务器:查看已配置的MCP服务器和工具。
MCP设置选项卡显示已配置的MCP服务器和可用工具的状态。
服务器状态显示:
- 每个MCP服务器的连接状态指示器。
- 每个服务器的可用工具列表。
- 服务器运行状况监控。
- 配置验证结果。
查看文本对话:
- 点击底部的文本按钮显示/隐藏对话内容。
- 对话历史会实时更新,包括用户输入和AI响应。
- 文本为红色表示聊天记录隐藏,绿色表示显示。
使用MCP工具
模型自动调用工具:
- 在对话中提出需要工具帮助的问题,例如“今天天气如何?
- 模型会调用相应工具并在响应中融合调用MCP Tool的结果。
以下是使用MCP Tool的实际场景示例:
文件处理示例(使用文件系统工具):
- 用户语音输入:“请帮我分析项目目录中的CSV数据文件”。
- AI声音响应:“正在处理您的文件…”(同时显示工具使用指示器)。
- 系统在后台调用read_file工具读取文件内容
- AI语音分析结果:“根据文件中的数据,我发现以下趋势…”
总结
本方案实现展示了如何使用Amazon Nova Sonic和WebSockets构建完整的语音对话系统。
通过遵循本文概述的架构和最佳实践,开发者可以创建利用Amazon Bedrock高级语音模型功能的自然、响应式语音界面。Amazon Nova Sonic的统一方法简化了开发过程,而双向流API实现了真正的交互式对话。
通过MCP添加工具集成,这些语音应用程序可以执行复杂任务并访问外部信息,使它们成为各种用例的强大助手。
随着语音界面的不断发展,诸如此类的解决方案将在创建更自然、更直观的用户与技术交互方式方面发挥越来越重要的作用。
资源链接
Amazon Bedrock文档:
https://docs.aws.amazon.com/bedrock/
Amazon Nova Sonic模型指南:
https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids-nova-sonic.html
WebAudio API文档:
https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API
IO文档:
https://socket.io/docs/v4/
MCP GitHub:
https://github.com/aws/model-context-protocol
Amazon Web Services SDK for JavaScript:
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/
MCP官方SDK:
https://modelcontextprotocol.io/specification/2025-03-26/basic/transports
作者:贺杨、唐清原、粟伟
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。