
LiveKit Phone Numbers 与语音 Agent 电话集成指南号码采购、Dispatch 规则与 SIP 实战【免费下载链接】agentsA framework for building realtime voice AI agents ️项目地址: https://gitcode.com/GitHub_Trending/agen/agents本文以 examples/homepage/knowledge_base/products/livekit-phone-numbers.md 为核心系统讲解如何在 LiveKit Cloud 上采购与管理电话号码、通过 Dispatch 规则把来电路由到语音 Agent、使用第三方程控SIP Trunk实现呼入呼出与转接以及 DTMF 按键采集等关键能力。读完本文你将掌握从买号到上线一个可接电话的语音 Agent的完整链路并能在 livekit-agents 框架中找到对应的代码级实现。一、什么是 LiveKit Phone NumbersLiveKit Phone Numbers 是 LiveKit Cloud 提供的一项托管电话能力开发者可以直接在 LiveKit Cloud 上购买和管理美国电话号码本地号与 800 免费号用于语音应用。它内置了电话基础服务Telephony Infrastructure和号码库存无需单独配置 SIP Trunk即可接收来电。核心流程只有三步搜索号码按国家与区号查找可用号码通过控制台、CLI 或 API购买号码确认并支付绑定 Dispatch 规则把号码绑定到一条 Dispatch 规则让来电被路由到 LiveKit 房间中的语音 Agent。管理入口有两个LiveKit Cloud 控制台的Telephony → Phone Numbers页面或 LiveKit CLI 的lk number系列命令。核心优势免第三方供应商直接从 LiveKit 购号不依赖 Twilio、Telnyx 等外部 SIP 供应商零 Trunk 配置呼入电话直达 LiveKit跳过 trunking 环节无需做呼入 trunk 配置或验证HD 高清语音所有通话均使用宽带wideband编解码器音质优于传统 PSTN统一管理在 LiveKit Cloud 一处完成购号、配置 Dispatch 规则、查看通话指标metrics与日志logs。二、号码管理的 CLI 参考LiveKit CLI 提供以lk number为前缀的电话号码管理命令。下表汇总了核心命令及其用途命令用途lk number search按国家和区号搜索可用号码lk number buy购买号码lk number assign将号码绑定到一条 Dispatch 规则lk number unassign移除号码上的 Dispatch 规则绑定lk number list列出所有已购买的号码lk number release释放不再需要的号码lk number get查看某个号码的详细信息注意号码按月计量计费若在月末前释放号码仍需支付整个月的费用。三、Phone Numbers API除了控制台与 CLILiveKit 还提供PhoneNumberService系列 API 用于编程化管理号码操作与 CLI 一一对应API 方法对应操作SearchPhoneNumbers查找可用号码PurchasePhoneNumber购买号码AssignPhoneNumber将号码绑定到 Dispatch 规则UnassignPhoneNumber移除 Dispatch 规则绑定ListPhoneNumbers列出全部已购号码ReleasePhoneNumber释放号码GetPhoneNumber查看单个号码详情这些 API 在 LiveKit 官方 Server SDK 中均有提供覆盖Go、JavaScript、Python、Ruby、Java五种语言。计费说明LiveKit Phone Numbers 采用按通话分钟计费 每号每月固定租金的模式通话时长按分钟计量每次资源用量向上取整到最小增量通话按 1 分钟号码租金按 1 个号码/月若在当月结束前释放号码当月整月租金仍会照常收取。四、Dispatch 规则来电如何进入房间Dispatch 规则Dispatch Rule决定来电者如何作为 SIP Participant 被加入房间。当呼入电话到达 LiveKit 后SIP 服务会查找匹配的 Dispatch 规则并据此把来电者放进对应的 LiveKit 房间。Dispatch 规则有两种主要类型Individual Dispatch Rule个体规则为每位来电者创建一个新房间可配置可选的房间名前缀room name prefixDirect Dispatch Rule直接规则把所有来电者放进一个指定名称的房间。此外Dispatch 规则还可以包含Agent Dispatch 配置指定将哪个 Agent 派发到房间可选地为房间访问设置PIN 码来电者需输入 PIN 才能加入房间。呼入电话的完整流程用户拨打你的 LiveKit Phone Number电话直接进入 LiveKit SIP不经过第三方 TrunkLiveKit SIP 查找匹配的 Dispatch 规则按 Dispatch 规则为来电者创建 SIP Participant 并放入对应 LiveKit 房间来电者先听到拨号音dial tone直到其他参与者通常是你的语音 Agent加入房间若规则配置了 PIN来电者需先输入 PIN 才能加入。与 Agent 的联动名字必须匹配在 Agents 集成场景中Dispatch 规则里配置的agent 名字必须与代码中赋给 Agent 的名字完全一致。这一点与 LiveKit Agents 的 Job 分发机制紧密相关——在 livekit-agents 中Agent 通过AgentServer注册并声明自身名字Worker 收到 Job 请求时按 agent 名匹配派发。五、第三方 SIP Trunk更灵活的替代方案如果你希望使用 Twilio、Telnyx、Plivo、Vonage 等第三方 SIP 供应商而不是 LiveKit Phone Numbers则需要自行配置呼入 TrunkInbound Trunk与 Dispatch 规则在 SIP 供应商侧把呼叫指向 LiveKit SIP 端点在 LiveKit 中创建呼入 Trunk用于认证来自供应商的呼叫创建对应的Dispatch 规则。这种方式灵活性更高但配置也更多。LiveKit CLI 提供lk sip前缀的完整 SIP 管理命令命令用途lk sip inbound create/lk sip inbound list管理呼入 Trunklk sip outbound create/lk sip outbound list管理呼出 Trunklk sip dispatch create/lk sip dispatch list管理 Dispatch 规则lk sip participant create创建 SIP Participant 发起呼出呼出电话Outbound CallingLiveKit Phone Numbers 目前仅支持呼入呼出需要第三方 SIP 供应商 呼出 Trunk。流程是使用CreateSIPParticipant API创建一个 SIP Participant指定呼出 Trunk IDsip_trunk_id要拨打的电话号码sip_call_to如12345555555或sip:userhost房间名room_nameParticipant 详情participant_identity、participant_name。在 livekit-agents/livekit/agents/job.py 中JobContext.add_sip_participant()正是这一 API 的封装它读取call_to、trunk_id、participant_identity等参数构造CreateSIPParticipantRequest并调用self.api.sip.create_sip_participant(...)。源码 docstring 明确提示使用前需先在 LiveKit 创建好呼出 SIP Trunk。呼出通话还可定制自定义来电显示Caller IDDTMF 音用于分机号码拨号拨号音播放呼叫接通期间播放拨号音。六、Agents 电话集成总览把语音 Agent 接入电话的完整思路如下构建 Agent使用 LiveKit Agents SDK即本仓库的 livekit-agents构建语音 Agent选择接入方式LiveKit Phone Number 或第三方 SIP Trunk 二选一呼入创建 Dispatch 规则来电时将 Agent 派发到房间呼出在 Agent 代码中创建 SIP Participant 拨出。Agents 框架中的 SIP 工具方法在 livekit-agents/livekit/agents/job.py 中JobContext.transfer_sip_participant()封装了冷转接能力def transfer_sip_participant( self, participant: rtc.RemoteParticipant | str, transfer_to: str, play_dialtone: bool False, ) - asyncio.Future[api.SIPParticipantInfo]:participant要转接的 SIP Participant必须是 SIP 类型或直接传 identity 字符串transfer_to转接目标电话号码12345555555或 SIP 主机sip:userhostplay_dialtone转接期间是否播放拨号音。七、DTMF 支持按键输入与 IVR 集成LiveKit 全面支持Dual-tone Multi-FrequencyDTMF双音多频按键用于对接传统 IVR 系统以及接收来电者的键盘输入发送 DTMF使用publishDtmfAPI代码层面对应房间本地参与者的publish_dtmf(code..., digit...)接收 DTMF监听sip_dtmf_received事件。仓库中提供了开箱即用的工具与任务1. GetDtmfTask采集按键输入GetDtmfTask 是一个预构建的 AgentTask用于从来电者处收集数字输入同时支持 DTMF 按键和语音朗读数字两种方式。核心参数num_digits要采集的数字个数必须大于 0ask_for_confirmation是否在收满数字后向用户语音确认dtmf_input_timeout每个数字的输入超时默认 4.0 秒dtmf_stop_event停止采集的 DTMF 事件默认#井号键。实现细节任务监听房间的sip_dtmf_received事件累积按键用防抖机制触发回复生成若超时未收满指定位数则以ToolError结束任务。2. send_dtmf_events向外发送 DTMF在 livekit-agents/livekit/agents/beta/tools/send_dtmf.py 中send_dtmf_events是一个function_tool允许 Agent 主动向电话侧发送一串 DTMF 事件例如拨分机号、穿越 IVR 菜单两次发送之间默认间隔 0.3 秒DEFAULT_DTMF_PUBLISH_DELAY。3. 实战示例basic_dtmf_agent仓库中的 examples/telephony/basic_dtmf_agent.py 演示了完整的 DTMF 采集实战Agent 先用工具向用户确认 10 位手机号再通过GetDtmfTask(num_digits1, ...)让用户按 1/2/3 选择服务选项result await GetDtmfTask( num_digits1, chat_ctxself.chat_ctx.copy( exclude_instructionsTrue, exclude_function_callTrue, exclude_handoffTrue, exclude_config_updateTrue, ), extra_instructions( Let the caller know they can choose one of three Horizon Wireless services: press 1 to hear details about their current plan, press 2 to enable international data roaming, or press 3 to explore upgrade options. Prompt them for a single digit and give them a moment to respond. ), )若输入非法捕获ToolError后重新引导用户最后根据result.user_input的取值1/2/3返回对应服务信息。4. IVR 检测Agents 框架还提供IVR 检测IVR Detection能力在AgentSession构造函数中设置ivr_detectionTrue即可启用。从 livekit-agents/livekit/agents/voice/agent_session.py 看ivr_detection默认值为False启用后会话会检测 Agent 是否正在与 IVR 系统交互例如呼出到客服热线时遇到自动语音菜单相关实现可见_start_ivr_detection。八、通话转接冷转接与暖转接LiveKit 支持两种通话转接方式冷转接Cold Transfer / Call Forwarding基于SIP REFER将通话转接到另一个电话号码或 SIP 端点。转接完成后当前会话结束。使用transfer_sip_participant方法实现即上文 job.py 中封装的TransferSIPParticipantRequest。注意使用 LiveKit Phone Numbers 时TransferSipParticipant的转发功能暂不支持。暖转接Warm Transfer暖转接是人工辅助式转接AI Agent 先拨通主管或人工客服向其提供对话上下文上下文摘要同时为原来电者播放等待音乐最后合并两路通话。仓库中的 WarmTransferTask 是一个预构建任务自动处理整个工作流为人工客服创建一个独立的房间命名规则原房间名 -human-agent通过 SIP 呼出拨通人工客服sip_call_to可携带dtmf拨分机号、ringing_timeout振铃超时向人工客服播放会话历史摘要源码中_format_conversation_history会把 caller 与 assistant 的对话整理成文本注入提示词模板为原来电者播放等待音乐默认BuiltinAudioClip.HOLD_MUSIC音量 0.8可自定义hold_audio人工客服确认后调用connect_to_caller工具通过MoveParticipantRequest把人工客服移入来电者房间完成通话合并_merge_calls。关键配置参数sip_call_to要拨打的电话号码或 SIP URI如15105550123sip_trunk_id呼出 Trunk ID未提供时回退到LIVEKIT_SIP_OUTBOUND_TRUNK环境变量dtmf接通后发送的 DTMF 音如拨分机1234#可用w插入约 0.5 秒停顿ringing_timeout等待人工客服接听的超时秒数超时则以ToolError结束并恢复与来电者的对话hold_audio来电者等待时播放的音频。九、HD 语音与安全特性HD Voice高清语音LiveKit 电话服务使用宽带编解码器wideband codec提供高清语音相比传统 PSTN 通话有更清晰的音质Agent 对话与来电者语音均受益。Secure Trunking安全 Trunking通话的信令与媒体流量可使用TLS SRTP加密防止窃听与中间人攻击满足安全通信与合规要求。Region Pinning区域固定可将网络流量限制在指定地理区域以符合当地电话法规或数据驻留要求。配置 SIP Trunk 时可以指定区域端点regional endpoint替代默认的全局端点。噪声消除Noise CancellationLiveKit 提供由Krisp驱动的背景语音消除能力在呼入 Trunk 或 SIP Participant 配置上设置krisp_enabledTrue即可开启可去除背景噪音、提升语音清晰度。十、SIP 速成关键术语术语含义SIPSession Initiation Protocol在互联网上建立语音通话的标准协议PSTNPublic Switched Telephone Network全球公共交换电话网络SIP Trunk通过 SIP Trunking 供应商把你的应用连接到 PSTN 的通道RTPReal-time Transport Protocol通话中传输实际音频数据的协议理解这些术语的意义在于LiveKit Phone Numbers 让呼叫跳过 trunking 环节直连 LiveKit而第三方 SIP Trunk 方案则需要你理解并维护从供应商到 LiveKit 的完整链路。十一、当前限制与注意事项基于原文档与仓库现状使用 LiveKit Phone Numbers 时需注意仅支持呼入当前不支持呼出呼出功能即将推出转接限制使用 LiveKit Phone Numbers 时TransferSipParticipant转发暂不支持地区限制号码目前仅在美国可用本地号与免费号计费规则月末前释放号码仍需支付整月租金Agent 命名匹配Dispatch 规则中的 agent 名必须与代码中 Agent 名一致否则无法正确派发。十二、快速上手路径阅读 examples/telephony 下的 DTMF 示例与 examples/warm-transfer 的暖转接示例了解 Agent 与电话互动的完整代码形态在 livekit-agents/livekit/agents/job.py 查看add_sip_participant与transfer_sip_participant的源码级调用链如需暖转接直接使用 WarmTransferTask如需按键采集使用 GetDtmfTask 并在AgentSession中开启ivr_detection最后用 LiveKit CLI 完成购号、Dispatch 规则配置与 Trunk 管理即可上线可接电话的语音 Agent。【免费下载链接】agentsA framework for building realtime voice AI agents ️项目地址: https://gitcode.com/GitHub_Trending/agen/agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考