Voximplant
通过 Media Streams 将 VoxEngine 场景中的 Voximplant 通话流式传输到 ElevenAgents。
Voximplant 集成目前处于有限可用阶段,需按工作区启用。在路由客户流量前,请联系 ElevenLabs 代表。
概览
Voximplant 集成通过 Voximplant Media Streams,将 VoxEngine 场景中的通话经由 WebSocket 直接连接到 ElevenAgents 中的智能体。Voximplant 负责电话通信:它拨打或接听电话,并决定后续操作。ElevenAgents 负责 对话。无需 SIP 中继或中间件。
呼入和呼出通话的工作方式相同:通话接通后,场景会为每通电话向 ElevenLabs 打开一个 WebSocket。对话结束时,ElevenLabs 会向场景发送一个决策事件,说明是将来电者转接给人工、挂断电话,还是将通话视为 超时。
集成工作原理
- VoxEngine 场景接听呼入电话或发起呼出电话。
- 场景向智能体的 ElevenLabs 端点打开 WebSocket,并使用 ElevenLabs API 密钥作为 bearer token 进行身份验证。
- 场景通过
call.sendMediaTo()启动媒体流,并传入任意customParameters。 ElevenLabs 会将每个参数转换为动态变量,并返回自己的start。 - Voximplant 和 ElevenLabs 在
media消息中交换 8 kHz、16 位线性 PCM 音频。 - 对话结束时,ElevenLabs 会发送智能体最后一句话的剩余内容、一个
elevenlabs-decision自定义事件和一条stop消息。场景随后关闭 WebSocket 并根据决策执行操作。
要求
开始前,请确保具备:
- 一个 Voximplant 账户,包含应用、电话号码或呼出功能,以及编辑场景的权限。
- 一个已启用 Voximplant 集成的 ElevenLabs 工作区。
- 一个 ElevenLabs 智能体和专用 API 密钥。
配置 ElevenLabs
添加 Voximplant 转接规则(可选)
如需让智能体将来电者转接给人工,请为其添加 转接至号码 系统工具,并设置提供商配置为 voximplant 的
转接规则。该规则没有目标号码:对话将以 transfer-to-agent 决策结束,由场景负责路由来电者。
转接规则通过 API 配置。使用 PATCH 请求为智能体添加该工具:
发送智能体完整的 built_in_tools 对象,包括其已有的工具,例如 end_call。
智能体返回的选项是固定令牌 voximplant,因此每个工具只需一条 Voximplant 规则。
为其他提供商配置的电话号码和 SIP URI 不会用于 Voximplant
通话。
转接规则由 API 管理。请通过上述 API 配置和更新使用这些规则的智能体的 转接至号码 工具; 控制台的工具编辑器适用于按号码配置的转接列表。
创建专用 API 密钥
在与智能体相同的工作区中创建 API 密钥,并将其范围限定为 ElevenAgents。如需仅接受来自 Voximplant 的
连接,请将密钥允许的 IP 地址限制为 Voximplant 的媒体服务器,Voximplant 在以下地址列出了这些服务器:
https://api.voximplant.com/getMediaResources?with_mediaservers。
记录 WebSocket URL
场景会连接到一个包含智能体 ID 的 URL:
如需固定使用智能体的某个分支,请添加 ?branch_id=<branch_id>。
如果 ElevenLabs 账户位于独立的数据驻留环境,请将 <region> 替换为区域代码。请参阅
数据驻留 查看可用区域。
设置 Voximplant
创建应用
在 Voximplant 控制面板中,打开 Applications,
然后点击 Create application。为应用命名,例如 elevenlabs-agent,然后点击
Create。

将 API 密钥存为密钥
在应用中,打开 Secrets 并点击 Add secret。将其命名为 ELEVENLABS_API_KEY,把为智能体工作区创建的
API 密钥粘贴到 Value,然后点击 Add secret。场景通过 VoxEngine.getSecretValue() 读取密钥,
因此密钥不会出现在场景代码中。

创建场景
打开 Scenarios,点击 Create scenario,将其命名为 elevenlabs_agent,粘贴以下代码,
替换 ELEVENLABS_URL 中的智能体 ID,然后点击 Save。它会接听呼入电话,将其流式传输给智能体,
并在对话结束时根据决策执行操作。对于呼出电话,请在所发起通话的 CallEvents.Connected 处理程序中打开
WebSocket。

将通话路由到场景
打开 Routing,点击 Create rule,为规则命名,并分配 elevenlabs_agent
场景。默认模式 .* 会将应用的每通电话通过该场景处理;
如果应用还处理其他通话,请将其限制为特定电话号码。要路由电话号码,请在 Numbers 下将其附加到应用。

拨打测试电话
无需电话号码,也可以通过浏览器呼叫应用:
-
打开 Users,点击 Create user,然后创建一个设有密码的用户。

-
在 Routing 中,点击 Test tools,然后点击 Softphone。以该用户身份登录,允许 访问麦克风,输入任意目标号码后拨号。智能体会以首条消息接听。
-
通话结束后,打开 Call history。每通电话会在通话记录旁列出一个 WebSocket 分支。 点击 View log 查看会话。

日志会显示 ElevenLabs 发送的决策、WebSocket 关闭以及场景接下来执行的操作。 在本示例中,来电者请求转人工,因此决策为
transfer-to-agent, 并附带智能体给出的原因。
请根据 elevenlabs-decision 事件执行操作,而不是 MEDIA_ENDED。Voximplant 会在约 1 秒未收到 ElevenLabs 音频后触发 MEDIA_ENDED,
而这种情况可能发生在对话过程中。
动态变量
customParameters 中的每个键都会成为同名动态变量。非字符串值会转换为文本,例如 true 会变为
"true"。customParameters 可以是对象或 JSON 编码的字符串。以 system__ 或 integration__ 开头的键为保留键,
会被丢弃。
决策事件
对话结束时,ElevenLabs 会在 stop 消息之前准确发送一个决策:
如果场景先发送 stop 或关闭 WebSocket,例如来电者挂断电话,
ElevenLabs 不会发送决策。
音频
Voximplant 和 ElevenLabs 双向交换 8 kHz、16 位单声道线性 PCM 音频。ElevenLabs 会以接近实时的速度播放智能体音频, 因此当来电者打断智能体时,最多仍会播放约 0.4 秒被打断的回复。
身份验证错误
当 Authorization 标头缺失或格式错误、API 密钥无效或不允许来自连接 IP 地址、密钥属于其他工作区,
或者密钥所属用户无权访问已启用身份验证的智能体时,ElevenLabs 会以代码 1008 和原因 bad auth token 关闭
WebSocket。
限制与不支持的功能
- 不支持客户端工具和 播放按键音 系统工具。转接至 号码 只能通过 Voximplant 转接规则使用;场景决定来电者 的去向。
- 无法从场景传入配置覆盖项,例如不同的首条消息; 只能传入动态变量。
- 数据收集结果不会发送到场景。请通过 通话后 webhook 获取。