掘金 人工智能 07月17日 10:05
基于 Amazon Nova Sonic 和 MCP 构建语音交互 Agent
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何利用Amazon Nova Sonic基础模型和MCP(模型上下文协议)构建实时语音交互应用。通过结合端到端语音模型、双向流式API和工具集成,实现了自然的语音交互,并支持多种应用场景,如智能座舱、企业客服等。文章详细阐述了技术原理、架构设计、关键组件和部署流程,为开发者提供了全面的技术指南。

🗣️ Amazon Nova Sonic 采用单一模型架构,实现语音理解与生成的端到端处理,解决了传统多模型拼接的延迟与信息丢失问题,提升了交互连贯性。

💬 实时双向流式交互技术使得用户与AI可以同时进行语音输入输出,平均响应时间短,并支持用户中途打断对话,保证了对话的流畅性。

🌐 MCP(模型上下文协议)作为开放协议,为端到端语音模型提供了工具发现、安全调用与数据融合的标准化框架,在实时语音对话场景下,MCP 虚拟化工具网关,动态上下文注入,实时性能优化等特性。

⚙️ 方案架构由前端和后端两部分组成,采用WebSocket实现实时通信,核心组件包括处理WebSocket连接的Node.js/Express服务器、实时音频可视化和交互的Web界面,以及用于自然对话流程的双向音频流等。

🛠️ 方案通过MCP实现了工具集成,使得语音应用能够执行复杂任务并访问外部信息。用户可以通过语音指令调用工具,例如查询天气、分析文件等,从而扩展了应用的功能。

1、引言

随着人工智能技术的飞速发展,自然语言处理和语音交互技术正在深刻改变人机交互的方式。语音交互正从简单的“机械应答”向更自然的“类人对话”演进 。传统的语音系统通常采用模块化架构,将语音处理流程割裂为 ASR(自动语音识别)、NLP(自然语言处理)和 TTS(文本转语音)等独立模块,这种管道式处理方法存在信息衰减、响应延迟和情感缺失等核心痛点 。因此,如何实现自然的语音交互与多工具协同成为技术突破的关键。Amazon Nova Sonic 通过将语音理解和生成统一到单一模型中,提供了一种简化的解决方案,用于创建自然、类人的语音交互,与需要编排多个模型的传统方法不同 。本文将深入探讨 Amazon Nova Sonic 基础模型与 MCP(Model Context Protocol,模型上下文协议)的结合,介绍基于 Amazon Nova Sonic 和 MCP 构建实时语音交互应用的技术实践,涵盖技术原理、实际开发部署等,为开发者提供全面的技术指南。

📢限时插播:无需管理基础设施,利用亚马逊技术与生态,快速集成与部署生成式AI模型能力。

✨ 精心设计,旨在引导您深入探索Amazon Bedrock的模型选择与调用、模型自动化评估以及安全围栏(Guardrail)等重要功能。

⏩快快点击进入《多模一站通 —— Amazon Bedrock 上的基础模型初体验》实验

构建无限, 探索启程!

应用场景与行业价值

Amazon Nova Sonic 模型凭借其低延迟、自然对话流和工具调用能力,适用于广泛的应用场景:

1. 车载智能座舱

Amazon Nova Sonic 模型凭借其在自然度、实时性、鲁棒性、上下文感知和工具调用等方面的优势,为构建新一代智能座舱提供了强大的技术支撑,使得车载语音助手不再是简单的指令执行工具,而是能够与用户进行自然、高效、个性化交互的智能伙伴,极大地提升了驾驶的安全性和乐趣。通过与 MCP 等工具协议的结合,端到端语音模型可以直接解析用户的语音请求,并触发相应的车辆控制 API 或第三方服务调用(如调节空调、播放音乐、发送消息、查询附近餐厅等)。这使得语音成为控制整个智能座舱生态的中心枢纽。

2. 企业客服与电销自动化

在客户服务领域,Amazon Nova Sonic 可自动处理咨询、退货、订单查询等高频需求,支持与 CRM 系统集成实时调取用户数据。例如,电信行业 AI 助手能根据用户语音情绪自动升级服务优先级,并在对话中完成套餐变更操作。

3. 教育与语言学习

作为智能语言教练,Amazon Nova Sonic 模型可以提供实时发音纠正与场景化对话练习。例如,Education First(EF)利用其分析非母语学习者的口音偏差,并通过动态调整语速和重复关键短语辅助学习。

4. 医疗与健康管理

支持医生通过语音快速录入病历,或为患者提供症状自检指导。在远程问诊中,模型可识别患者咳嗽声等生理信号,结合电子健康档案生成初步诊断建议。

2、关键技术概念介绍

2.1 Amazon Nova Sonic:语音交互的颠覆性模型

Amazon Nova Sonic 通过单一模型架构实现语音理解与生成的端到端处理,解决了传统多模型拼接的延迟与信息丢失问题。其核心优势包括:

1. 端到端一体化模型

Amazon Nova Sonic 摒弃传统级联式语音系统的模块化设计,将语音输入到输出的全流程统一在单一神经网络中完成。这种设计消除了不同模块间的信息割裂,保留对话中的声学语境(如语气、节奏、停顿),显著提升交互连贯性。例如,用户说话时的犹豫或打断会被实时解析并调整响应策略,而非机械式等待静音间隙。

2. 实时双向流式交互

通过 Amazon Bedrock 提供的双向流式 API(InvokeModelWithBidirectionalStream),模型支持用户与 AI 同时进行语音输入输出,平均响应时间仅 1.09秒(优于 GPT-4o 的 1.18 秒),且支持用户中途打断对话而不丢失上下文。技术实现上,采用 5:15 的文本-语音标记混合生成比例,确保语义连贯性与实时性平衡。

3. 多语言与噪声鲁棒性

支持英语(美式/英式)多语言交互,在多语言 LibriSpeech 基准测试中平均词错误率(WER)低至 4.2%,在嘈杂环境(如多人对话)下错误率比 GPT-4o Transcribe 低 46.7%。模型能识别主说话人并过滤背景噪声,适用于工厂、户外等复杂场景。

4. 情感感知与动态调节

模型可解析用户语音中的情绪(如兴奋、愤怒、担忧),并动态调整回应风格。例如,当客服对话中用户语气转为焦虑时,Nova Sonic 会降低语速、增加安抚性词汇,同时触发企业数据库查询相关解决方案。

5. 上下文感知能力:32K token 的滚动窗口支持长达 8 分钟的连续对话,可识别语气、停顿甚至背景噪音。

6. 原生工具调用(Tool-Use) :直接解析语音请求并触发 API 调用(如航班预订、数据查询),通过工具结果反馈优化响应逻辑。

2.2 MCP:实时语音交互中的大模型&智能体工具标准化连接

MCP 作为开放协议,为端到端语音模型或者相关智能体提供了工具发现、安全调用与数据融合的标准化框架。在实时语音对话场景下,其价值更为突出:

3、方案介绍

接下来我们将详细介绍基于 Nova Sonic 和 MCP 的语音交互方案实现,方案实现了双向音频流、通过 MCP 的工具集成以及响应式 Web 界面。方案实时音频对话系统的总体架构分为前端和后端两大部分,采用 WebSocket 实现实时通信。该方案基于以下主要技术构建:

具有以下关键组件:

3.1 技术架构:

本方案实现了一个基于 WebSocket 的双向音频流应用,与 Amazon Nova Sonic 模型集成,用于实时语音转语音对话。系统采用现代 Web 技术栈构建,支持双向实时音频流、多语言界面以及动态工具调用。以下是基于您提供的内容生成的架构图,展示了一个使用 Amazon Nova Sonic 模型的语音交互系统:

上图系统架构展示了一个完整的语音交互流程:

1、客户端:

2、服务器:

3、大模型服务:

3.2 方案架构实现

音频处理

音频处理管道通过基于 WebSocket 的流式处理架构实现与 AI 的双向实时语音转语音对话,主要由四个主要阶段组成:

    Audio Capture – 客户端麦克风输入和预处理实时流式处理 – 基于 WebSocket 的双向音频传输服务器处理 – Amazon Nova Sonic 语音转语音模型处理Audio Playback – 具有可视化功能的客户端缓冲音频输出

用户的语音输入经由浏览器 WebSocket 发送到服务器,服务器与 Amazon Nova Sonic 模型交互后,将结果返回给浏览器,最终转换为音频输出给用户。这种架构支持实时的语音对话体验。系统实现了一个完整的音频处理管道,调用序列如下:

    音频捕获:浏览器以 16kHz 采样率从用户麦克风捕获音频音频处理:对音频进行处理、分析和编码以便传输WebSocket 传输:音频数据实时流式传输到服务器Amazon Nova Sonic 处理:服务器通过 Amazon Bedrock 将音频转发到 Amazon Nova Sonic响应生成:Amazon Nova Sonic 处理输入并生成响应工具集成:如果需要,通过 MCP 框架调用工具音频播放:响应流回客户端并播放给用户

接收和处理 Tool 事件

Nova Sonic 可以支持 Function Call 具备调用外部工具的能力,首先定义函数描述 Schema,将用户输入和函数描述一起输入调用 LLM,解析 LLM 的输出,如果有输出函数名和参数则执行该函数,再将函数结果反馈给 LLM,实现下一轮调用,直至输出最终结果。

在整个对话过程中,如果用户输入与 ToolConfiguration 中的工具规格之一匹配,Nova Sonic 将触发 ToolUse 事件。例如,如果用户问“今天天气怎么样?”,如下图所示,在收到用户 ASR(脚本)事件后,Sonic 将发送一个 ToolUse 事件,其中包含配置中指定的 toolName getWeatherTool

3.3 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 上其他 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 信息。Sonic 模型 tools 参数获取该信息后,即可像 Amazon Bedrock 上其他 LLM 一样进行 function calling。

3.4 核心组件和调用流程

MCP 集成由三个主要组件组成,它们协同工作,为 AI 提供工具功能:

工具处理器 (ToolHandler)

ToolHandler 充当工具注册和执行的中央业务流程协调程序。它维护来自所有连接的 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":      return this.getDateAndTime();    case "getweathertool":      // 解析参数并调用天气API      return this.fetchWeatherData(parsedContent.latitude, parsedContent.longitude);    default:      throw new Error(`不支持的工具 ${tool}`);  }}

MCP 管理器 (McpManager)

McpManager 处理 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 调用流程

工具调用的完整流程如下:

以下是本方案获取 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) {          throw new 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 stderr for 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   */  private registerServerTools(    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": {      }    }}

中断处理

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();    } else if (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();    } else if (      data.stopReason &&      data.stopReason.toUpperCase() === "INTERRUPTED"    ) {      console.log("Interrupted by user");      audioPlayer.bargeIn();    }  } else if (data.type === "AUDIO") {    // When audio content ends, we may need to show user thinking indicator    if (isStreaming) {      showUserThinkingIndicator();    }  }});

4、方案部署和使用指南

4.1 方案关键技术和依赖项

方案基于以下主要技术构建:

主要依赖项

4.2 安装步骤

安装指南

部署 Amazon Nova Sonic 实时语音应用需要以下步骤:

先决条件

– Node.js(v18.0.0 或更高版本)– 亚马逊云科技用 Amazon Bedrock 访问权限– 已配置 Amazon和适当凭证– 麦克风和扬声器设备

1. 克隆仓库

git clone https://github.com/aws-samples/sample-nova-sonic-mcpcd 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

4.3 使用指南

主界面概览

主界面包含以下主要元素:

1、连接状态指示器:左上角显示当前连接状态,如”已连接服务器”或错误信息

2、语音角色选择:顶部中央的下拉菜单,可选择不同 AI 语音角色

3、设置按钮:右上角的齿轮图标,用于打开配置面板

4、音频可视化:中央的蓝色圆形区域,显示实时音频波形和语音活动

5、控制按钮:

基本操作

1、开启对话:

2、语音交互:

3、结束对话:

高级功能

语音角色选择

– 点击顶部的用户头像打开语音选择菜单– 选择不同的语音角色(如 tiffany、matthew、amy)– 新的语音设置将应用于下一次对话

配置系统

提示词配置

MCP 服务器配置

点击右上角的设置图标打开配置面板

提示词:选择预设提示词或自定义提示词

语言:切换界面语言(中英文)

Language configuration (语言配置) 选项卡允许用户在支持的 UI 语言之间切换。

MCP 服务器:查看已配置的 MCP 服务器和工具

MCP settings 选项卡显示已配置的 MCP 服务器和可用工具的状态。

服务器状态显示:

查看文本对话

– 点击底部的文本按钮显示/隐藏对话内容– 对话历史会实时更新,包括用户输入和 AI 响应– 文本为红色表示聊天记录隐藏,绿色表示显示

使用 MCP 工具

模型自动调用工具

– 在对话中提出需要工具帮助的问题(如”今天天气如何?”)– 模型会调用相应工具并在响应中融合调用 MCP Tool 的结果

以下是使用 MCP Tool 的实际场景示例:

文件处理示例(使用文件系统工具)

5、结论

本方案实现展示了如何使用 Amazon Nova Sonic 和 WebSockets 构建完整的语音对话系统。通过遵循本文概述的架构和最佳实践,开发人员可以创建利用 Amazon Bedrock 高级语音模型功能的自然、响应式语音界面。Amazon Nova Sonic 的统一方法简化了开发过程,而双向流 API 实现了真正的交互式对话。通过 MCP 添加工具集成,这些语音应用程序可以执行复杂任务并访问外部信息,使它们成为各种用例的强大助手。随着语音界面的不断发展,像这样的解决方案将在创建更自然、更直观的用户与技术交互方式方面发挥越来越重要的作用。

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

资源

本篇作者

本期最新实验《多模一站通 —— Amazon Bedrock 上的基础模型初体验

✨ 精心设计,旨在引导您深入探索Amazon Bedrock的模型选择与调用、模型自动化评估以及安全围栏(Guardrail)等重要功能。无需管理基础设施,利用亚马逊技术与生态,快速集成与部署生成式AI模型能力。

⏩️[点击进入实验] 即刻开启 AI 开发之旅

构建无限, 探索启程!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Amazon Nova Sonic MCP 语音交互 实时语音 AI
相关文章