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


