手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符

--安卓AI电话机器人

  • 一、前言

前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上,识别出通话时对方手机按下的DTMF按键?就那种电话打通了之后,语音提示对方“按1查话费、按2查流量、按0转人工”这种功能。之前检索了一下,Android系统截至目前,并未提供此类“DTMF解码器”的解析能力。

我们静下心来思考了一下,觉得这样的经典IVR场景的需求是非常合理的。以前我们都是建议用户直接对接到呼叫中心或CRM,由这种语音平台对通话中的DTMF频率进行解码和识别。但如果不接入呼叫中心呢?我们手机本身是否能够从语音中直接识别出来呢?

这也是本篇章内容编写的由来。用户的需求,就是我们产品演化的方向和动力。在本篇章中,我们从DTMF频率的组成、FFT过滤声音的频率,以及DTMF字符的识别等角度,一起探讨一下:Android手机中,如何通过手机app,识别出通话时对方手机到底有没有按键、按的是哪个dtmf按键

这个课题方向,估计也比较新颖,因为一般也没有人去干这种事(一般情况确实也没有这个需求,打个电话谁会关注对方按什么键呢?又不是打摩斯密码)。但是从一般应用场景来看也确实有这个需求。

  • 二、认识DTMF按键

我们一般使用电话座机或手机,拨打电话时,在振铃阶段或接通后,均可以按下键盘上的数字0-9、*、#等按键,把对应的DTMF按键值发送给对方。通话的对方接收该按键值后进行业务处理和反馈。

通常来说,人耳是无法区分不同的DTMF按键值的,这也是DTMF(双音多频)中传输的频率太高,远超出人耳能分辨的频率所致。按下按键后,通常人耳只能听到“嘟嘟”的按键提示音,具体解析要由对应的数学运算模块对语音进行处理和识别。

本篇是应用文,多余的理论就不在赘述,主要看下面这个图。对语音数据做FFT运算(从时空域转频域),把横坐标和纵坐标的两个频率确定了,DTMF的数字字符就出来了:

详细描述看这个网址:http://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling,有空自己去参考。

  • 三、对声音数据做FFT运算

FFT运算算是非常经典和基础的算法了,特别对于音频和视频图像处理领域。本来我们在做之前还在想,要不要将FFT和DTMF字符识别的功能,做成一个纯Java的jar包,供有需要的或感兴趣的同学在Android中试着调用。

但在实践中发现真没必要,直接使用TarsosDSP库就好,反正也就400KB左右,又不大。

具体案例可以参考GitHub上的开源示例代码:

https://github.com/GreyLabsDev/TarsosDSP-Example

下载下来后,将TarsosDSP-Android-2.4.jar文件丢到Android项目的app\libs目录即可。

具体的FFT运算和DTMF识别,可以参考DeepSeek中检索的代码(实际测试确实可用,不得不说,DS真TM好用。^V^),示例内容如下图所示:

  • 四、识别出DTMF字符

这个也没什么技术含量,直接按上面章节的DTMF(双音多频)的频率,进行高频和低频的解析,然后判断后即可正常识别出对方按下的DTMF按键字符。

DeepSeek中检索的内容这里也直接贴出来了,可以直接用。有兴趣的可以参考或自己在里面按关键字来提问获取代码。

有两点需要特意注明一下:

1、声音的DTMF解码处理,最好放到新的子线程当中去执行。这样可以不干扰原有业务的语音播放和识别处理。子线程中大多数时间都不反馈DTMF字符,如果有的话单独另外处理上抛的消息即可。

2、20ms一包的语音数据(每包数据320 字节)的FFT 的分辨率较低。通常需要缓存多包数据(如 40ms 或 80ms)来提高频率检测的准确性。按照一般理论,8k采样率下,采样点数量为205时,FFT运算的精度和识别的效果最好。

  • 五、最终输出结果

子线程中FFT运算后上抛的DTMF按键值,基本上准确率还是比较高的。但由于每次DTMF音的时长较长,需要对识别的按键结果做去除重复的处理。

在运算性能上,由于本篇针对的是语音通话的上行数据做的处理。运算量非常的小,测试结果表明,Android手机上DTMF软解码功能的引入,对app的运算性能几乎可以忽略不计,放心大胆的用。

  • 六、总结

本篇这个课题,通话时解码对方按下的DTMF按键值这种需求,正常使用手机的人群,偶尔可能会有这个想法一闪而过,但估计一般人也没有这个需求。毕竟我们打电话都是用人耳来接听,但人耳是无法分辨DTMF的“嘟嘟”声的。

这里之所以会出现识别的需求,前提条件是蓝牙电话方案中,已经能将手机SIM卡通话的声音给提取了出来。在这个基础之上,扩展出在手机本地进行DTMF识别来对接本地的IVR或AI电话机器人。

目前看起来,从语音中提取DTMF按键字符,还是非常简单的。在通话语音数据中挂一个子线程,把数据丢进去,等待它识别字符并上抛出来就行。

本篇章的内容,除了对手机声音IVR/AI处理功能比较刚需之外,对于的SIP坐席电话的数据处理,也能起到一定的参考作用。


上一篇:ADB点击实战-做一个自动点广告播放领金币的脚本app

下一篇:Android应用app实现AI电话机器人接打电话

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980492.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LVGL -------矩阵3

static void event_cb(lv_event_t * e) { lv_obj_t * obj lv_event_get_target(e); uint32_t id lv_btnmatrix_get_selected_btn(obj); bool prev id 0 ? true : false; bool next id 6 ? true : false; if(prev || next) { /Find the checked button/ uint32_t i; for…

新建菜单项的创建之CmpGetValueListFromCache函数分析

第一部分: PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…

大语言模型微调的基本概念介绍

大型语言模型(LLMs)正在以惊人的速度发展,LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤,今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…

三次握手内部实现原理

socket()创建一个新的套接字 int socket(int domain, int type, int protocol); 参数: domain:地址族,如 AF_INET(IPv4),AF_INET6(IPv6) type:套接字类型&…

【Mac】git使用再学习

目录 前言 如何使用github建立自己的代码库 第一步:建立本地git与远程github的联系 生成密钥 将密钥加入github 第二步:创建github仓库并clone到本地 第三步:上传文件 常见的git命令 git commit git branch git merge/git rebase …

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…

【前端基础】1、HTML概述(HTML基本结构)

一、网页组成 HTML:网页的内容CSS:网页的样式JavaScript:网页的功能 二、HTML概述 HTML:全称为超文本标记语言,是一种标记语言。 超文本:文本、声音、图片、视频、表格、链接标记:由许许多多…

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞👍🏻收藏⭐评论✍🏻 欢迎各位大佬指点…

论coding能力 new bing 对比 chatgpt

近日需要编程计算每个月的第二个星期二是哪一天,因为那一天需要做一件重要的事情,我想在这个日期做一个提醒,于是把这个重任交给当下最火的AI,微软new bing和chatGPT,实验对比结果如下:微软new bing会给你参…

C语言:51单片机 基础知识

一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…

【计算机网络入门】初学计算机网络(六)

目录 1.回忆数据链路层作用 2. 组帧 2.1 四种组帧方法 2.1.1 字符计数法 2.1.2 字节填充法 2.1.3 零比特填充法 2.1.4 违规编码法 3. 差错控制 3.1 检错编码 3.1.1 奇偶校验码 3.1.2 CRC(循环冗余校验)校验码 3.2 纠错编码 3.2.1 海明校验码…

Materials Studio MS2020在linux系统上的安装包下载地址 支持centos Ubuntu rocky等系统

下载地址:MS2020-linux官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 Materials Studio 2020是一款功能强大的材料科学计算模拟软件,以下是其详细介绍: 核心模块功能 CASTEP模块:采用平面波赝势方法,适用于周…

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema?三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例:定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

初探Ollama与deepseek

什么是Ollama?它与大模型有什么联系? 简单说,Ollama就像是你电脑上的一个 “大模型小助手”。 以前,很多强大的大语言模型,比如能回答各种问题、写文章、翻译等的那些模型,要么只能在网上的服务器上用&am…

【word】保存重开题注/交叉引用消失,全局更新域问题

目录 一、更新域是什么二、更新域常见问题及解决方法(一)更新域后内容未变化(二)域代码显示异常(三)交叉引用无法更新(四)全选更新域出现错误 三、交叉引用与题注的关系及操作&#…

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石,它像区块链世界的身份证和防伪标签,确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言,带你彻底搞懂区块链中的数字签名! 文章目录 1. 数字签名是什么?从现实世界到区块…

人工智能之数学基础:矩阵的范数

本文重点 在前面课程中,我们学习了向量的范数,在矩阵中也有范数,本文来学习一下。矩阵的范数对于分析线性映射函数的特性有重要的作用。 矩阵范数的本质 矩阵范数是一种映射,它将一个矩阵映射到一个非负实数。 矩阵的范数 前面我们学习了向量的范数,只有当满足几个条…

【MySQL】数据库初识

目录 一、什么是数据库 与数据结构的区别 各类软件(数据库)代表 关系型 vs 非关系型 关系型数据库 非关系型数据库 二、初识MySQL数据库 三、MySQL数据库安装 四、常用数据类型 内存 vs 硬盘 数值类型 字符串类型 日期类型 五、MySQL数据库…

Minio文件存储及Springboot集成

文章目录 Minio简介Minio安装使用下载Minio.exe启动访问WebUI MinIO基本概念Spingboot集成Minio设置本地Minio访问秘钥创建文件存储bucket项目pom.xml添加依赖配置文件修改Minio配置类Minio工具类定义HttpStatus定义统一返回结果定义controller类 总结 Minio简介 MinIO 是高性…

P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用

P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环,完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值,在不同的年份中应该更新2月的值 还有…