通话中放音与转 IVR 接口

适用于:坐席通话进行中的语音注入——给客户播放免责声明/确认音/业务提示语(PLAY_VOICE_IN_CALL),把通话转接到 IVR 语音菜单或机器人(TALKING_CALLER_TO_IVR),以及对自动外呼的"放音呼叫"追加/更换播放内容(PLAY_VOICE)。 配套:放音前可用 ivr-outbound-voice §3.2 的 CHECK_VOIC_NAME 校验语音资源;转 IVR 后的按键结果走该文档的话单/结果查询。

所有接口均为 GET http://{cti_host}:12121/bridge/callctrl,HTTP 状态码恒为 200,业务码写在响应体(README §3)。

1. 通话中放音:PLAY_VOICE_IN_CALL

坐席与客户通话中,向指定一侧(或双方)混入播放一段语音。播放期间原对话继续(混音),适合播确认语、免责声明、背景提示。

GET http://{cti_host}:12121/bridge/callctrl?extnum=801&toneid=15&mixside=callee&opt=PLAY_VOICE_IN_CALL
参数类型必填说明
extnumString是通话中任一方分机号(一般为坐席分机);该分机须有且仅有一通进行中通话
toneid / filepath / cordialvoicekeyString三选一音源:toneid=后台语音库编号;filepath=服务器本地语音文件绝对路径(需 URL 编码);cordialvoicekey=亲切语配置键
mixsideString否播放给谁听:callee(缺省)/caller/both/none,语义见下表
optString是固定 PLAY_VOICE_IN_CALL

mixside 语义(重要)

mixside 按通话的两条腿实现:caller=第一腿、callee=第二腿。第一腿/第二腿与场景的对应:

场景第一腿(caller)第二腿(callee)
点击外呼(坐席发起)坐席客户
呼入(客户打进来)客户坐席

因此**"只让客户听到"**:外呼场景传 mixside=callee,呼入场景传 mixside=caller;both=双方都听;none=双方都不听(仅打保持标记,相当于静默保持)。

响应

业务码含义
200已开始播放(异步,播完自动结束)
400参数错误:extnum/音源缺失,或 filepath 解码失败
404extnum 不是系统分机
480该分机当前没有进行中的通话(或找不到可注入的通话实例)

2. 停止放音与播放状态

2.1 STOP_VOICE_IN_CALL

GET http://{cti_host}:12121/bridge/callctrl?extnum=801&opt=STOP_VOICE_IN_CALL

停止该分机通话中的进行中放音。业务码:200 成功 / 404 无相关通话 / 400 参数错误。

2.2 STATE_VOICE_IN_CALL

GET http://{cti_host}:12121/bridge/callctrl?extnum=801&opt=STATE_VOICE_IN_CALL

响应体为文本:playing(放音中)/ standby(空闲,含无通话)。

2.3 DIA_NUM_VOICE_IN_CALL:坐席自录语音接入号

GET http://{cti_host}:12121/bridge/callctrl?opt=DIA_NUM_VOICE_IN_CALL

返回"录制语音"功能的外呼接入号(软参 assis.record.voice.num 配置)。坐席拨该号码可自行录制亲切语,录制的语音供 PLAY_VOICE_IN_CALL 的 cordialvoicekey 引用。未配置时返回空。

3. 通话中转 IVR:TALKING_CALLER_TO_IVR

把进行中的一通通话整体转接到指定 IVR 语音菜单/机器人流程(原坐席退出,客户听到菜单)。适合:坐席判断后转自助、转 AI 机器人、转按键收集流程。

GET http://{cti_host}:12121/bridge/callctrl?caller=801&callee=13512340001&ivrid=12&biz_data=crm-order-8877&queue_priority=5&opt=TALKING_CALLER_TO_IVR
参数类型必填说明
callerString是当前通话主叫号码
calleeString是当前通话被叫号码
ivridint是目标语音菜单/IVR 编号(须为数字)
biz_dataString否业务数据,转接时透传给 IVR/机器人流程
queue_priorityint否若 IVR 流程转入排队,指定排队优先级
optString是固定 TALKING_CALLER_TO_IVR
业务码含义
200转接已受理
400参数错误(含 ivrid 非数字)
404找不到 caller+callee 对应的进行中通话
486/500 等转接执行失败,以现场日志为准

4. 放音呼叫中主动放音:PLAY_VOICE

针对自动外呼的"放音呼叫"(media call)——即通过 IVR_TTS_CALL、机器人等发起的、由系统播报的呼叫——按 callid 播放一段网络语音。常用于机器人对话流程中由第三方系统动态指定下一句播报内容。

GET http://{cti_host}:12121/bridge/callctrl?callid=8db03e9d-a07e-4d0d-9cee-9ed1470b8e76@127.0.0.1&voiceurl=http://192.168.1.80:12121/voice/next.wav&opt=PLAY_VOICE
参数必填说明
callid是放音呼叫的 call-id(需 URL 编码);测试场景可用 test@127.0.0.1 命中任一放音呼叫
voiceurl是语音文件 URL(http 地址,需 URL 编码),系统拉取后播放
opt是固定 PLAY_VOICE

业务码:200 已开始播放 / 400 参数错误 / 404 没有匹配的放音呼叫(普通坐席通话不能用本接口,须用 §1 的 PLAY_VOICE_IN_CALL)。

5. curl 示例

CTI=http://192.168.1.80:12121

# 1. 呼入通话中,只让客户听到免责声明(呼入场景第一腿=客户 → mixside=caller)
curl "$CTI/bridge/callctrl?extnum=801&toneid=15&mixside=caller&opt=PLAY_VOICE_IN_CALL"

# 2. 查播放状态 / 需要时停止
curl "$CTI/bridge/callctrl?extnum=801&opt=STATE_VOICE_IN_CALL"    # → playing
curl "$CTI/bridge/callctrl?extnum=801&opt=STOP_VOICE_IN_CALL"     # → 200

# 3. 坐席判断后整通转 IVR 菜单 12,带业务标记
curl "$CTI/bridge/callctrl?caller=801&callee=13512340001&ivrid=12&biz_data=crm-order-8877&opt=TALKING_CALLER_TO_IVR"

6. 常见问题排查

现象原因与处理
PLAY_VOICE_IN_CALL 返回 480坐席当前无通话,或该分机名下有多通并行通话导致无法定位;确认通话存在且唯一后重试
客户听不到放音mixside 传反了:外呼场景客户是第二腿(callee),呼入场景客户是第一腿(caller),见 §1 对照表
播放没声音但返回 200音源三选一都没传全(如 toneid 不存在时 file 为空被拒,返回 400);或文件路径需 URL 编码未编码
TALKING_CALLER_TO_IVR 返回 404caller/callee 与实际通话方向不匹配(主被叫须与通话记录一致)
PLAY_VOICE 返回 404callid 不是放音呼叫(media call),普通通话请用 PLAY_VOICE_IN_CALL
none 之后通话单边无声none 是静默保持,双方都听不到混音,恢复通话需重新放音或由坐席操作;确认业务预期后再使用