本地 AI 电话机器人:通过 UDP 传输手机通话声音的 Python 脚本
一、前言
此前文章阐述了手机打电话过程中随机插播预录语音片段的功能,以及根据对方手机按下 DTMF 按键播放不同 IVR 应答语音片段的能力。
在 AI 电话沟通时,由于手机性能和算力的局限性,通常 AI 交互的模型和算法无法部署到手机上。需要将拦截到的手机通话的声音数据,通过网络(局域网或互联网)将语音包传输给 AI 算力服务器。由其对语音进行 ASR 识别和语义理解,并生成最终的应答 TTS 语音,反馈回手机注入到电话通话中。
当前市面上主流的实时语音流的传输方式主要有两种:
- SIP/WebRTC 协议及配套的 RTP/RTCP 语音数据传输。
- 直接将语音数据以 UDP 广播或组播的方式分发给局域网内多个设备。
事实上手机电话通话做 AI 呼叫,本质上跟 SIP 协议没有太大的依赖关系。手机 APP 提取到通话声音后,完全可以把这个声音数据直接传给局域网内的 AI 服务器,或者让手机自己的 AI 模型来消费和应答这个声音会话。
本文就是基于这样的场景,使局域网内部署的一台 AI 服务器,就可以通过 UDP 数据包,同时处理多台 Android 手机发来的 AI 呼叫请求,并生成对应 TTS 语音应答。
由于数据交互全在局域网内进行,因此其【端到端】通话的时延可以得到最大程度的保证(TTL 只有 1 跳或 2 跳,路由的路径非常短)。这样既能利用 AI 算力服务器的堆叠密度,又能同时处理和响应多路手机 SIM 卡的电话通话。实现高效的 AI 呼叫和成本的压缩。
二、方案的依赖配件
目前拦截手机通话声音的蓝牙电话方案,需要将 USB 蓝牙的配件插入到手机上,才能在手机 APP 拦截到电话通话的事件和声音数据。
这个方案最大的好处是:不限制手机,市面上任何品牌型号的 Android 手机,拿来装上 app,插上 USB 配件后,就能拦截到电话通话语音。普适性非常的广。市面上任何新的手机和二手的手机都支持这样用。
买来的 USB 蓝牙配件,可以直接插在手机上使用。但是因为是公共的标准配件,需要有一个 USB 转 typec 的转接头才能插到 Android 手机上,没有的话可以去电商平台买一个即可,非常的便宜。
三、方案的依赖界面
蓝牙电话方案使用 Android 手机 APP,通过插入手机的 USB 蓝牙来直接拦截电话通话的声音。因此为了能让它将语音数据和通话事件公开到手机所在的局域网中,需要对【智能拨号器 app】进行一个基础的默认设置。
【智能拨号器 app】的设置选项卡中,点击右上角齿轮图标,打开【APP 应用设置】界面后,将原先默认的'SIP 协议栈:连接 SIP 平台'关闭为'协议栈:手机 IVR-AI 语音处理'。
APP 应用设置中,做了这个默认设置切换了之后,APP 拦截到的电话通话声音将不再进行 SIP 协议的转发,而是在手机 APP 自身和局域网内,广播寻址找到【远程声音设备】进行电话通话声音数据的播放和输出。
四、Python 客户端的命令行菜单
本文的 Python 脚本的源代码,即为拨号器的远程声音设备的标准输入输出的源文件,它支持 Windows/Linux/MacOS 三大平台。
详细的 Windows 和 Ubuntu 操作系统的安装和配置步骤,已在附件下载路径中的 README.md 文件内容中描述的很清楚了。
此处简要的列举一下,执行了以下命令之后,随便输入 help 或直接按下 Enter 键,打印的命令行提示内容:
pip install sounddevice numpy colorama
python main.py
进去后输入 help 按提示逐个输入 discover / bind 21ea5105736c3285 绑定后手机 app 上会弹框出来提示是否接受远程声音设备的绑定 - 需要手机 APP 上允许。
至此,即可使用 call 10086 / hangup / dtmf 2 等指令,正常在 windows11 中使用 python 连接局域网内的智能拨号器 app 来实时通话啦。
用户可以简单的使用如下指令,来完成一个外呼的手机通话,对手机进行远程操控:
- 如常用的拨打 10086 等待接通后说话:
call 10086 - 通话中发送 DTMF 数字:
dtmf 2 - 拨打完毕后挂断电话:
hangup
五、拨号器声音程序架构
其实有 Python 脚本的源代码之后,什么架构啊、交互时序和指令内容啊,都是多余的。有啥不懂的直接跳转去看代码即可,反正就六七个 py 文件而已,非常的简洁易懂。
但这里为了便于理解,还是画蛇添足一次:Python 脚本作为【远程声音设备】的程序,主要使用 UDP+TCP 结合的方式来进行工作的。
UDP 协议负责进行广播找人、寻址和绑定双方的目标设备,以及电话通话时直接传输上行和下行的全双工的语音数据。UDP 占用 42700-42703 的 udp 端口。


