顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-大模型电话机器人

语音流直接对接Realtime API(端对端音频大模型)

直接把音频流输出给大模型,大模型返回音频流。

顶顶通提供了以下2个APP可对接任意音频输入输出(比如RTC)的语音大模型

  • cti_audio_stream 通过TCP推流和播放流,适合用于人机对话场景。

  • cti_unicast_start 通过旁路的方式UDP或者TCP推流和播放流,对接Realtime API 的同时还支持对通道进行放音操作。 适合于质检,机器人辅助场景。

通过TCP推流和播放流,适合用于人机对话场景

app: cti_audio_stream
参数 remote-ip:remote-port <native> <param>

  • native 可选参数 如果不设置,流格式为 8000hz 16位,如果设置了,就是原始的音频格式, 如要要转换声音频率可以设置为 sendrate&recvrate,比如 16000&16000
  • param 自定义参数

推流协议

  1. 前面4字节 引导数据长度 网络字节顺序
  2. 时间戳 8字节
  3. 引导数据 {"uuid":"","codec":"","rate":8000,"param":"自定义参数"}
  4. 数据流

连接断开后会自动重连,并且重发引导数据。
返回的放音流需要和推流的编码一样,不需要引导数据。

缓存问题:

实现方式是每20ms,从tcp读取320字节(8000hz频率时),也就是每20ms从tcp读取20ms的声音。tcp默认接收缓冲区是操作系统设置的,监听端口时可以设置的,具体可用关键词SO_SNDBUF搜索。 建议设置为 1280 或者 5120 1280 /320*20也就是在8000hz时tcp会缓存80ms-400ms的声音。如果是阻塞模式超过部分调用tcp的send是会卡住的。比如大模型一次性返回了16K的声音数据,可以一次性发送20ms的,8000hz时也就是320字节。循环发送,如果要打断,只需要把未发送的声音丢去就可以。已经进入 tcp缓存区的声音还是会给播放了,可以通过修改tcp缓冲区,比如把接收缓冲区改成 1280 大小,这样tcp缓冲区的声音只有120毫秒。

旁路的方式UDP或者TCP推流和播放流,适合于质检,机器人辅助场景

app: cti_unicast_start 启动推流
参数 tcp|udp remote-ip remote-port <local-ip> <local-port> <play|mix> <sendrate> <recvrate> <param>

  • tcp|udp 使用tcp还是udp协议推流
  • remote-ip 远端 ip
  • remote-port 远端端口,
  • local-ip 本地IP,不设置用0.0.0.0
  • local-port 本地端口,不设置用0,随机端口
  • play|mix
    • play 支持播放远端返回的流,发送方必须是远端IP和远端端口
    • mix 把远端的流和本地放音混音
  • sendrate 发送声音频率,0或空字符串 使用通话编码采样率
  • recvrate 接收声音频率,0或空字符串 使用通话编码采样率
  • param tcp传输时候的引导数据,具体请看cti_audio_stream说明,udp不使用这个参数

api: uuid_cti_unicast_start 启动推流
参数 uuid tcp|udp remote-ip remote-port <local-ip> <remote-ip> <play|mix> <sendrate> <recvrate> <param>

api: uuid_cti_unicast_stop 停止推流
参数 uuid