当前位置: 首页 > news >正文

手机打电话时由对方DTMF响应切换多级IVR语音应答(一)

手机打电话时由对方DTMF响应切换多级IVR语音应答(一)

--本地AI电话机器人

  • 一、前言

经前面的系列篇章中,我们实现了拦截手机打电话的声音、根据通话对方声音提取DTMF字符。由此,我们通往AI电话机器人的道路就畅通无阻了。

如果说AI电话机器人是“全自动步枪”,那么现在成熟和大规模商用的【多级IVR语音导航】则可以看作是“半自动步枪”。虽然灵活性和智能化程度并没有AI电话机器人那么先进,但也不会被看作“智障通话”。

在本篇及后面的几篇,我们将针对多级IVR语音导航的功能,规划出一个可用的界面及操作App出来,使同一个用户,名下所有的手机,都能使用同一套多级IVR语音来进行单机化的部署。(会不会把它引导到云平台上,然后用多并发的方式来实现更加容易?但这个不是本次主题讨论的范畴,我们默认就已经具备了这个云平台功能,本次只讨论单机版)

另外,在后续的规划中,由于电话和短信基本是不分家的。后续我们估计会花费一些篇幅的内容,分析和实现Android场景下SDK是直接使用【读取缓存短信+接收广播通知】来收发短信更靠谱?或是使用蓝牙的MAP/OBEX协议来收发短信更加靠谱?

并尝试将它们都整合到拨号器SDK中,供有需要的用户进行远程群发和调用。

  • 二、多级IVR语音导航功能探讨

正常的IVR语音导航应该会存在一个简短的开场白(当然也可以没有),用于播放类似现在虚拟小号接通后首先播放的“温馨提示,来电启用隐私保护”等6秒提示音。

开场白完毕后才进入主要语音菜单,提示按1转归属地、按2转10086、按0转人工等等。

按下不同的DTMF按键后,按话术和功能的不同,将调用不同的网络接口进行查询,并将结果转为TTS语音播放。

在次级IVR菜单中,可以通过按#号键返回上一级菜单。

对于未设置的DTMF按键菜单,将提示按键错误,然后将本层的IVR菜单的语音重新播放一遍。

在IVR语音导航中,可以设置超时定时器,当一段时间用户没有操作则返回上一级菜单或结束通话。

以上的功能和操作方式只是初步设想,但我想,现在IVR语音导航已经做得这么完善,有空找一个或几个标准话术,根据这些来设计IVR语音导航和语音编辑界面即可。这种功能复杂度和风险都不大。

  • 三、同用户多个手机设备之间同步IVR语料

说实在的,如果是云平台这种“中心计算”的模式,根本不用考虑IVR逻辑和语料的同步问题(唯一只需要考虑多并发和高并发的问题即可)。

但由于我们现在采用“边缘计算”的方式,所有的业务逻辑都放入手机App中进行。这样的话,就不得不考虑如何做到一次录入,多台手机设备都能拉取已编辑好的语料的问题。

在规划中,我们将采取数据集中存储、推送同步的方式来进行多级IVR语料的数据共享,减轻操作人员的操作复杂度。

  • 四、对IVR和对方DTMF交互结果的上传汇总

此部分功能和要主动拨打哪些电话类似,拨号器SDK暂时不考虑这方面的业务逻辑。具体实现将交由上层App来进行实现。拨号器SDK仅作为一个软件模块嵌入到App,协同App进行工作即可。

此部分的逻辑,或许可以参照主动拨打外呼的电话号码列表的操作方式,用户可以自由选择从App调用拨号器SDK进行拨打、也可直接tel://10086进行拨打,或者通过电脑ADB连接手机并通过ADB下发呼叫号码等方式来拨打,甚至人工用手在手机拨号盘中点击拨打。这些操作和事件触发,均不会影响拨号器SDK对通话状态和通话语音数据的拦截效果。

  • 五、总结

从本篇开始,我们尝试花费一些篇幅来实现一套从手机本地,用普通的App实现AI电话机器人和多级IVR语音导航的功能。并对其实现原理和展示效果进行一定的探讨。

本质上,我们仍然希望像智能拨号器App这种“打通局域网和电话网之间最后一公里”的现象级应用,能获得更丰富、更繁荣的应用,能服务更多有需要的人群。


上一篇:手机SIM卡打电话时识别对方按下的DTMF按键(二)

下一篇:编写中。

http://www.xdnf.cn/news/287443.html

相关文章:

  • \documentclass[lettersize,journal]{IEEEtran}什么意思
  • 机器人强化学习入门学习笔记(二)
  • DeepSeek-Prover-V2:数学定理证明领域的新突破
  • Dify网页版 + vllm + Qwen
  • Matlab自学笔记五十三:保存save和载入load
  • 杨校老师竞赛课之C++备战蓝桥杯初级组省赛
  • Python爬虫实战:获取优美图库各类高清图片,为用户提供设计素材
  • 洛谷 P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version)
  • 【从零开始学习微服务 | 第一篇】单体项目到微服务拆分实践
  • 本地MySQL连接hive
  • ASP.NET Core 请求限速的ActionFilter
  • 算法中的数学:质数(素数)
  • 30天通过软考高项-第十一天
  • CodeBlocks25配置wxWidgets3.2
  • 004-nlohmann/json 快速认识-C++开源库108杰
  • 地埋式燃气泄漏检测装置与地下井室可燃气体检测装置有什么区别
  • 专业课复习笔记 4
  • Vue中的过滤器参数:灵活处理文本格式化
  • 5月5日日记
  • 基于 HTML5 Canvas 实现图片旋转与下载功能
  • linux tar命令详解。压缩格式对比
  • Java IO流核心处理方式详解
  • 论高并发下的高可用
  • LeetCode 热题 100 46. 全排列
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.1 描述性统计分析(均值/方差/分位数计算)
  • 代码随想录算法训练营Day45
  • 一个电商场景串联23种设计模式:创建型、结构型和行为型
  • Cordova开发自定义插件的方法
  • 多语言笔记系列:Polyglot Notebooks 中使用 xUnit 单元测试
  • WebAssembly(Wasm):现代Web开发的超级加速器