最近在研究实时语音对话的实现,发现 ElevenLabs Agents Platform 提供了非常强大的 WebSocket API。经过一番探索,我完成了一个可以直接在浏览器中运行的实时语音对话 demo。今天就来分享一下这个项目的实现细节和使用体验。
项目链接:https://demo.navtalk.ai/11labs/zh/index.html

一、为什么选择 ElevenLabs?

在开始之前,你可能想知道为什么选择 ElevenLabs 而不是其他方案。我对比了 ElevenLabs 和 OpenAI Realtime API,发现 ElevenLabs 在音色选择、模型灵活性等方面有独特优势。不过这个对比我会在文章后面详细展开。

二、项目概览

这个 demo 基于 ElevenLabs Agents Platform WebSocket API 实现,支持:

  • ✅ 完整的 WebSocket 连接管理
  • ✅ 实时语音输入输出
  • ✅ 文本消息支持
  • ✅ 丰富的自定义配置选项
  • ✅ 完整的消息处理机制

整个项目可以直接在浏览器中运行,无需后端服务器,非常适合快速原型开发和学习。

三、核心功能特性

3.1 完整的 WebSocket 连接

项目实现了完整的 WebSocket 连接管理,包括:

  • 自动获取签名 URL
  • 建立安全的 WSS 连接
  • 完善的连接状态和错误处理

3.2 实时语音对话

语音处理是核心功能,包括:

  • 麦克风音频采集
  • 16kHz PCM 音频编码
  • 实时音频流传输
  • Agent 音频播放

3.3 完整的消息处理

支持 ElevenLabs 提供的所有消息类型:

  • conversation_initiation_metadata - 会话初始化
  • user_transcript - 用户语音转文字
  • agent_response - Agent 文字回复
  • agent_response_correction - Agent 回复修正
  • audio - Agent 音频响应
  • interruption - 打断检测
  • ping/pong - 心跳检测
  • client_tool_call - 工具调用支持
  • contextual_update - 上下文更新
  • vad_score - 语音活动检测分数

3.4 文本消息支持

除了语音输入,还支持发送文本消息到 Agent,并且有一个很实用的特性:文本消息可以打断 Agent 正在进行的语音回应,这让对话更加自然。

3.5 自定义配置

提供了丰富的配置选项:

  • 自定义 Agent Prompt
  • 自定义首次消息
  • 语言覆盖
  • TTS 语音 ID 覆盖
  • 动态变量支持
  • 自定义 LLM 参数(temperature / max_tokens)

四、详细使用方法

4.1 准备配置

打开文件

使用浏览器打开 https://demo.navtalk.ai/11labs/zh/index.html 即可开始使用。

必需配置项

API Key (xi-api-key):

  • ElevenLabs API Key
  • 格式: sk-... 或 xi-api-key
  • 获取方式: 登录 ElevenLabs 控制台,创建或查看 API Key

Agent ID:

  • ElevenLabs Agent ID
  • 格式: agent_...
  • 获取方式: 在 ElevenLabs Agents 页面 创建或查看 Agent,复制 Agent ID

可选配置项(按界面顺序)

自定义 Prompt:

  • 覆盖 Agent 的默认 prompt
  • 留空则使用 Agent 配置中的默认 prompt
  • 可用于临时修改 Agent 的行为和对话风格

首次消息:

  • Agent 连接后说的第一句话
  • 留空则使用 Agent 配置中的默认首次消息
  • 例如: "你好,我是你的 AI 助手,有什么可以帮助你的吗?"

语言:

  • 覆盖 Agent 的默认语言设置
  • 支持的语言代码: en (英语)、zh (中文)、es (西班牙语)、fr (法语)、de (德语)、ja (日语) 等
  • 留空则使用 Agent 配置中的默认语言

TTS 语音:

  • 覆盖 Agent 的默认语音设置
  • 从下拉菜单中选择不同的语音 ID
  • 留空则使用 Agent 配置中的默认语音
  • 注意: 需要先填写 API Key 才能加载语音列表

动态变量:

  • 用于在对话中动态替换 Prompt 中的变量占位符
  • 格式: JSON 对象,例如 {"user_name": "John", "greeting": "Hello"}
  • 使用场景: 当 Agent 的 Prompt 中包含变量(如 {{user_name}}、{{greeting}})时,可以通过动态变量传入实际值
  • 示例:
    {
      "user_name": "张三",
      "company": "ABC公司",
      "product": "智能助手"
    }
    
  • 如果 Agent 的 Prompt 中包含 你好,{{user_name}},欢迎使用{{product}},动态变量会自动替换为 你好,张三,欢迎使用智能助手
  • 留空则不使用动态变量

LLM Temperature:

  • 控制 LLM 生成文本的随机性和创造性
  • 取值范围: 0.0 - 2.0
  • 值越低,输出越确定和一致(更保守);值越高,输出越随机和创造性(更灵活)
  • 推荐值: 0.7 - 1.0(平衡创造性和一致性)
  • 留空则使用 Agent 配置中的默认值

LLM Max Tokens:

  • 限制 LLM 单次回复的最大 token 数量
  • 取值范围: 正整数
  • 用于控制回复长度,避免过长的回复
  • 留空则使用 Agent 配置中的默认值

2. 开始对话

  1. 点击 "连接并开始对话" 按钮
  2. 浏览器会请求麦克风权限,请允许
  3. 连接成功后会自动开始录音
  4. 开始说话,Agent 会实时响应

3. 功能操作

  • 停止录音: 停止发送音频,但保持连接
  • 断开连接: 完全断开 WebSocket 连接
  • 文本消息: 在文本输入框中输入消息并发送

API 文档参考

demo 实现基于 ElevenLabs Agents Platform WebSocket API

WebSocket 端点

wss://api.elevenlabs.io/v1/convai/conversation?agent_id={agent_id}

完整通话流程

1. 连接建立阶段

步骤 1: 建立 WebSocket 连接

客户端 → 服务器: 建立 WebSocket 连接
wss://api.elevenlabs.io/v1/convai/conversation?agent_id={agent_id}

步骤 2: 发送初始化数据

  • 连接成功后,立即发送 conversation_initiation_client_data 消息
  • 包含 Agent 配置覆盖(可选)、动态变量(可选)、自定义 LLM 参数(可选)
  • 等待服务器返回 conversation_initiation_metadata 事件

步骤 3: 接收会话元数据

  • 服务器返回 conversation_initiation_metadata 事件
  • 需要处理的内容:
    • 保存 conversation_id(用于后续会话管理)
    • 记录音频格式信息(agent_output_audio_format、user_input_audio_format)
    • 开始音频采集(调用 getUserMedia 获取麦克风权限)

2. 对话进行阶段

音频输入流程:

用户说话 → 麦克风采集 → 音频处理(降采样到16kHz) → 转换为16-bit PCM → Base64编码 → 发送 user_audio_chunk

服务器响应流程:

服务器接收音频 → 语音识别(ASR)→ 发送 user_transcript → LLM 处理 → 生成回复 → 发送 agent_response → TTS 合成 → 发送 audio 块

关键事件处理顺序:

  1. 用户说话时:

    • 持续发送 user_audio_chunk(每 4096 个采样点发送一次)
    • 服务器处理音频流,可能返回 vad_score(语音活动检测分数)
  2. 服务器识别用户语音:

    • 收到 user_transcript 事件
    • 可以在 UI 中显示用户说的话(用于调试)
  3. 服务器生成回复:

    • 收到 agent_response 事件
    • 可以在 UI 中显示 Agent 的文字回复
    • 可能收到 agent_response_correction(如果 Agent 修正了回复)
  4. 服务器发送音频:

    • 收到 audio 事件(可能多次,流式传输)
    • 处理方式:
      • 将 Base64 音频数据解码
      • 加入音频播放队列
      • 按顺序播放音频块
  5. 打断处理:

    • 如果用户在 Agent 说话时发送新消息,可能收到 interruption 事件
    • 需要立即停止当前音频播放,清空音频队列

3. 心跳保持阶段

心跳机制:

  • 服务器定期发送 ping 事件
  • 需要立即响应 pong 消息,包含相同的 event_id
  • 用于保持连接活跃,检测连接状态

4. 工具调用流程(如果启用)

工具调用步骤:

  1. 服务器发送 client_tool_call 事件
  2. 处理流程:
    • 解析工具调用信息(tool_name、parameters、tool_call_id)
    • 执行相应的工具/函数
    • 发送 client_tool_result 返回结果
  3. 服务器继续处理,可能发送新的 agent_response 和 audio

5. 上下文更新流程(如果启用)

上下文更新:

  • 客户端可以主动发送 contextual_update 更新对话上下文
  • 服务器也可能发送 contextual_update 事件
  • 根据业务需求处理上下文更新

6. 文本消息流程

发送文本消息:

  • 客户端发送 user_message 事件
  • 特点:可以打断 Agent 正在进行的音频回应(ElevenLabs 特有功能)
  • 处理方式:
    • 如果 Agent 正在播放音频,立即停止播放(收到 interruption 事件)
    • 等待服务器处理文本消息并返回新的回复

7. 连接关闭阶段

正常关闭:

  • 停止发送音频(调用 stopRecording)
  • 关闭 WebSocket 连接
  • 释放音频资源(关闭 AudioContext、停止 MediaStream)

异常处理:

  • 监听 WebSocket 的 error 和 close 事件
  • 实现重连逻辑(可选)
  • 清理所有资源

事件处理详细说明

客户端需要处理的事件

事件类型何时收到需要处理可选操作
conversation_initiation_metadata连接建立后保存 conversation_id,开始录音显示会话信息
user_transcript用户说话后-显示用户说的话
agent_responseAgent 生成回复后-显示 Agent 文字回复
agent_response_correctionAgent 修正回复时-显示修正信息
audioAgent 音频合成后解码并播放音频显示播放状态
interruption检测到打断时停止播放,清空队列显示打断提示
ping服务器心跳检测立即发送 pong-
client_tool_callAgent 需要调用工具时执行工具并返回结果显示工具调用信息
vad_score语音活动检测时-可视化语音活动

客户端发送消息的时机

消息类型发送时机频率
conversation_initiation_client_data连接建立后立即发送1次
user_audio_chunk录音过程中持续发送高频(约每 250ms)
user_message用户输入文本时按需
user_activity需要通知用户活动时按需
pong收到 ping 时立即响应按需
client_tool_result工具执行完成后按需
contextual_update需要更新上下文时按需

音频格式要求

ElevenLabs 对音频格式有明确要求:

  • 采样率: 16kHz
  • 声道: 单声道 (mono)
  • 编码: 16-bit PCM
  • 格式: Base64 编码的二进制数据

技术实现

音频处理流程

  1. 采集: 使用 getUserMedia API 获取麦克风音频流
  2. 处理: 使用 AudioContext 和 ScriptProcessorNode 处理音频
  3. 降采样: 如果采样率不是 16kHz,自动降采样
  4. 编码: 将 Float32 音频数据转换为 16-bit PCM
  5. 编码: Base64 编码后通过 WebSocket 发送

音频播放流程

  1. 接收: 从 WebSocket 接收 Base64 编码的音频
  2. 解码: Base64 解码为二进制数据
  3. 播放: 优先尝试作为 MP3 播放,失败则作为 PCM 播放

ElevenLabs vs OpenAI Realtime API 详细对比

在开发过程中,我也研究了 OpenAI Realtime API,发现两个平台各有特色。下面是我整理的详细对比:

快速对比总览

对比项ElevenLabs Agents PlatformOpenAI Realtime API
多模态支持❌ 不支持,即不支持摄像头识别(图像输入)✅ 支持(GPT-4o)
音色选择✅ 100+ 种预设音色,支持语音克隆⚠️ 10 种预设音色
LLM 模型✅ 多模型支持(ElevenLabs、OpenAI、Google、Anthropic)✅ GPT-4o、GPT-4o-mini
知识库✅ 支持✅ 支持(通过 Assistants API)
Function Call✅ 支持✅ 支持
文本打断 AI 回应✅ 支持(发送文本消息可打断 AI 正在进行的回应)❌ 不支持
延迟✅ 取决于模型(163ms-3.87s)✅ 低(300-800ms)
价格💰 按分钟计费(根据模型,0.0033-0.1956/分钟)💰 按 token 计费(GPT-4o-mini 更经济)

详细对比信息请查看下方各功能点的详细说明。

各重点详细对比

1. 多模态支持(摄像头识别)

平台支持情况详细信息参考链接
ElevenLabs Agents Platform❌ 目前不支持专注于语音对话,暂不支持视觉输入(摄像头/图像识别)ElevenLabs Agents Platform WebSocket API 文档
OpenAI Realtime API✅ 支持(通过 GPT-4o)支持视觉输入,可处理图像和视频帧,支持摄像头实时识别。GPT-4o 模型原生支持多模态输入OpenAI Realtime API 文档
OpenAI GPT-4o 视觉能力

说明:OpenAI Realtime API 基于 GPT-4o 模型,支持多模态输入,可以处理图像和视频内容。ElevenLabs 目前专注于语音对话场景,暂不支持视觉输入。

参考来源:

2. 音色选择性和对比

平台音色数量音色特点自定义能力参考链接
ElevenLabs Agents Platform✅ 100+ 种预设音色高质量、多语言、支持情感表达、语音克隆支持自定义语音 ID、情感控制、语气调整、语音克隆ElevenLabs 语音库
ElevenLabs 语音克隆
OpenAI Realtime API⚠️ 有限选择(10种音色)主要依赖 TTS API,提供 10 种预设音色(alloy, echo, fable, onyx, nova, shimmer...)音色控制能力有限,不支持语音克隆OpenAI TTS 文档
OpenAI TTS 音色列表

详细对比:

  • ElevenLabs:提供超过 100 种预设音色,涵盖多种语言、年龄、性别和风格。支持语音克隆(Voice Cloning),可以从少量样本创建自定义音色。支持情感和语气控制,可调整音色的表达方式。音色质量高,适合专业应用。
  • OpenAI:TTS API 提供 10 种预设音色(alloy, echo, fable, onyx, nova, shimmer...),选择相对有限。不支持语音克隆,音色控制能力较弱。

参考来源:

3. 支持的 LLM 模型

平台支持的模型模型特点参考链接
ElevenLabs Agents Platform✅ 多模型支持支持 ElevenLabs 自有模型及多个第三方模型(OpenAI、Google、Anthropic 等),用户可根据需求选择,支持自定义 LLM 参数ElevenLabs Agents 文档
ElevenLabs LLM 配置
OpenAI Realtime API✅ GPT-4o, GPT-4o-mini支持 GPT-4o(多模态、更强能力)和 GPT-4o-mini(轻量级、更快速、成本更低),可切换模型OpenAI Realtime API 模型
OpenAI 模型对比

ElevenLabs Agents Platform 支持的模型列表:

ElevenLabs 自有模型:

  • GLM-4.5-Air: 适合 agentic use cases,延迟 ~631ms,成本 ~$0.0600/分钟
  • Qwen3-30B-A3B: 超低延迟,延迟 ~163ms,成本 ~$0.0168/分钟
  • GPT-OSS-120B: 实验性模型(OpenAI 开源模型),延迟 ~314ms,成本 ~$0.0126/分钟

其他提供商模型(在 ElevenLabs 平台上可用):

OpenAI 模型:

  • GPT-5 系列:GPT-5(延迟 ~1.14s,成本 ~0.0826/分钟)、GPT-5.1、GPT-5 Mini(延迟 ~855ms,成本 ~0.0165/分钟)、GPT-5 Nano(延迟 ~788ms,成本 ~$0.0033/分钟)
  • GPT-4.1 系列:GPT-4.1(延迟 ~803ms,成本 ~0.1298/分钟)、GPT-4.1 Mini、GPT-4.1 Nano(延迟 ~478ms,成本 ~0.0065/分钟)
  • GPT-4o(延迟 ~771ms,成本 ~0.1623/分钟)、GPT-4o Mini(延迟 ~738ms,成本 ~0.0097/分钟)
  • GPT-4 Turbo(延迟 ~1.28s,成本 ~0.6461/分钟)、GPT-3.5 Turbo(延迟 ~494ms,成本 ~0.0323/分钟)

Google 模型:

  • Gemini 3 Pro Preview(延迟 ~3.87s,成本 ~$0.1310/分钟)
  • Gemini 2.5 Flash(延迟 ~752ms,成本 ~0.0097/分钟)、Gemini 2.5 Flash Lite(延迟 ~505ms,成本 ~0.0065/分钟)
  • Gemini 2.0 Flash(延迟 ~564ms,成本 ~0.0065/分钟)、Gemini 2.0 Flash Lite(延迟 ~547ms,成本 ~0.0049/分钟)

Anthropic 模型:

  • Claude Sonnet 4.5(延迟 ~1.5s,成本 ~0.1956/分钟)、Claude Sonnet 4(延迟 ~1.31s,成本 ~0.1956/分钟)
  • Claude Haiku 4.5(延迟 ~703ms,成本 ~$0.0652/分钟)
  • Claude 3.7 Sonnet(延迟 ~1.12s,成本 ~0.1956/分钟)、Claude 3.5 Sonnet(延迟 ~1.14s,成本 ~0.1956/分钟)
  • Claude 3 Haiku(延迟 ~608ms,成本 ~$0.0163/分钟)

自定义模型:

  • 支持添加自定义 LLM

ElevenLabs Agents Platform 支持的 LLM 模型选择界面

上图展示了 ElevenLabs Agents Platform 中可选择的 LLM 模型列表,包括延迟和价格信息

详细说明:

  • ElevenLabs:提供丰富的模型选择,包括自有模型和多个第三方提供商的模型。用户可以根据延迟、成本和功能需求选择最适合的模型。支持通过 custom_llm_extra_body 自定义 LLM 参数(如 temperature、max_tokens)。
  • OpenAI:明确支持 GPT-4o(支持多模态、更强推理能力)和 GPT-4o-mini(更快速、成本更低),用户可以根据需求选择。两个模型都支持实时对话。

参考来源:

4. 知识库支持

平台知识库支持实现方式参考链接
ElevenLabs Agents Platform✅ 支持通过 Agent 配置支持知识库集成,可上传文档和设置知识库,Agent 可在对话中引用知识库内容ElevenLabs Agents 文档
ElevenLabs Agent 配置
OpenAI Realtime API✅ 支持(通过 Assistants API 或 Function Calling)可通过 Assistants API 集成知识库(文件上传、向量存储),或通过 function calling 访问外部数据源和 APIOpenAI Assistants API
OpenAI Function Calling

详细说明:

  • ElevenLabs:在 Agent 配置中支持知识库功能,可以上传文档供 Agent 参考。知识库内容会在对话中被自动引用。
  • OpenAI:通过 Assistants API 可以创建带知识库的助手(支持文件上传和向量存储),或通过 function calling 访问外部数据源和 API,实现更灵活的知识检索。

参考来源:

5. Function Call 支持

平台支持情况实现方式参考链接
ElevenLabs Agents Platform✅ 支持通过 client_tool_call 和 client_tool_result 消息类型实现工具调用,支持在 Agent 中定义工具ElevenLabs WebSocket API - 工具调用
ElevenLabs Agent 工具配置
OpenAI Realtime API✅ 支持通过 tool_calls 和 tool_results 事件实现 function calling,支持在会话中定义工具OpenAI Realtime API - Function Calling
OpenAI Function Calling 指南

详细对比:

  • ElevenLabs:使用 client_tool_call 事件请求客户端执行工具,通过 client_tool_result 返回结果。工具在 Agent 配置中定义。
  • OpenAI:使用标准的 function calling 机制,通过 tool_calls 事件触发,通过 tool_results 返回结果。支持在会话中动态定义工具。

参考来源:

6. 文本打断 AI 回应

平台支持情况详细信息参考链接
ElevenLabs Agents Platform✅ 支持发送文本消息(user_message)可以打断 AI 正在进行的语音回应,实现更自然的对话交互ElevenLabs WebSocket API - 用户消息
OpenAI Realtime API❌ 不支持发送文本消息无法打断 AI 正在进行的回应,需要等待当前回应完成OpenAI Realtime API 文档

详细对比:

  • ElevenLabs:支持通过发送文本消息打断 AI 正在进行的回应。当用户在 AI 说话时发送文本消息,AI 会立即停止当前回应并处理新的文本输入,这使得对话更加自然和流畅,类似于真人对话中的打断行为。
  • OpenAI:不支持文本消息打断功能。如果 AI 正在回应,用户发送的文本消息需要等待当前回应完成后才会被处理,这可能会影响对话的流畅性和实时性。

使用场景:

  • ElevenLabs:适合需要快速交互和打断的场景,如实时客服、快速问答等
  • OpenAI:适合需要完整回应的场景,但交互可能不够灵活

7. 延迟对比

平台延迟表现优化特点参考链接
ElevenLabs Agents Platform✅ 取决于模型选择延迟范围从 163ms 到 3.87s,取决于选择的 LLM 模型。低延迟模型如 Qwen3-30B-A3B(~163ms)适合实时交互,高性能模型如 GPT-5(~1.14s)或 Claude Sonnet(~1.5s)延迟较高但能力更强。支持流式响应ElevenLabs Agents Platform 文档
ElevenLabs WebSocket API
OpenAI Realtime API✅ 低延迟实时流式响应,延迟通常在 300-800ms(取决于模型和网络),GPT-4o-mini 通常更快OpenAI Realtime API 文档
OpenAI 性能优化

详细说明:

  • ElevenLabs:延迟取决于选择的 LLM 模型。如果选择低延迟模型(如 Qwen3-30B-A3B ~163ms、GPT-3.5 Turbo ~494ms),延迟可以很低,适合实时交互。如果选择高性能模型(如 GPT-5 ~1.14s、Claude Sonnet ~1.5s),延迟会更高但推理能力更强。支持流式音频响应,减少首字节延迟。
  • OpenAI:延迟相对稳定,GPT-4o-mini 通常比 GPT-4o 响应更快。支持流式响应优化。

实际延迟会受以下因素影响:

  • 网络条件和地理位置
  • 模型选择(ElevenLabs 平台上有多种模型可选,OpenAI 主要是 GPT-4o vs GPT-4o-mini)
  • 请求复杂度
  • 服务器负载

以上数据为典型值,实际表现可能因使用场景而异。

参考来源:

8. 价格对比

平台计费方式价格详情参考链接
ElevenLabs Agents Platform💰 按对话分钟数计费(根据选择的模型)价格取决于选择的 LLM 模型,通常包含语音合成、语音识别和 LLM 调用的综合费用。具体模型价格请参考上面的"支持的 LLM 模型"部分ElevenLabs 定价页面
ElevenLabs 计费说明
OpenAI Realtime API💰 按 token 和音频时长计费GPT-4o: 输入 2.50/1M tokens,输出 10/1M tokens
GPT-4o-mini: 输入 0.15/1M tokens,输出 0.60/1M tokens
音频输入/输出:$0.015/分钟
(价格可能随时间变化)
OpenAI 定价页面
OpenAI Realtime API 定价

详细对比:

  • ElevenLabs:采用按对话分钟数计费的模式,价格取决于选择的 LLM 模型。通常包含语音合成、语音识别和 LLM 调用的综合费用,计费方式简单明了。具体模型价格请参考上面的"支持的 LLM 模型"部分。
  • OpenAI:采用按 token 计费的模式,不同模型价格差异较大:
    • GPT-4o-mini:更经济,适合高频使用场景
    • GPT-4o:功能更强但价格更高,适合需要多模态或更强推理能力的场景
    • 音频处理按分钟额外计费

成本估算示例(仅供参考):

  • 短对话场景(5分钟,约1000 tokens):OpenAI GPT-4o-mini 约 0.0015 + 0.075 = $0.0765
  • 长对话场景(30分钟,约5000 tokens):OpenAI GPT-4o-mini 约 0.0075 + 0.45 = $0.4575

建议:根据实际使用场景和预算选择合适的平台:

  • 如果主要使用语音对话且使用量大,ElevenLabs 的按分钟计费可能更简单,可根据需求选择不同模型以平衡成本和性能
  • 如果需要多模态能力或更强的 LLM 能力,OpenAI 可能更合适
  • 对于高频使用,GPT-4o-mini 通常更经济

参考来源:

总结

ElevenLabs Agents Platform WebSocket API 为实时语音对话提供了强大的支持。通过这个 demo,我实现了完整的实时语音对话功能,包括音频采集、处理、传输和播放。

相比 OpenAI Realtime API,ElevenLabs 在音色选择、模型灵活性等方面有明显优势,特别适合需要特定音色或语音克隆的场景。不过,如果需要多模态能力,OpenAI 可能是更好的选择。

如果你也想尝试实现实时语音对话,这个 demo 应该能给你提供一个不错的起点。项目代码已经开源,你可以直接使用或在此基础上进行扩展。