手机打电话时如何识别对方按下的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电话机器人接打电话
相关文章:
手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人
手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上ÿ…...
RabbitMQ操作实战
1.RabbitMQ安装 RabbitMQ Windows 安装、配置、使用 - 小白教程-腾讯云开发者社区-腾讯云下载erlang:http://www.erlang.org/downloads/https://cloud.tencent.com/developer/article/2192340 Windows 10安装RabbitMQ及延时消息插件rabbitmq_delayed_message_exch…...
IDEA 2024.1 最新永久可用(亲测有效)
今年idea发布了2024.1版本,这个版本带来了一系列令人兴奋的新功能和改进。最引人注目的是集成了更先进的 AI 助手,它现在能够提供更复杂的代码辅助功能,如代码自动补全、智能代码审查等,极大地提升了开发效率。此外,用…...
【R包】pathlinkR转录组数据分析和可视化利器
介绍 通常情况下,基因表达研究如微阵列和RNA-Seq会产生数百到数千个差异表达基因(deg)。理解如此庞大的数据集的生物学意义变得非常困难,尤其是在分析多个条件和比较的情况下。该软件包利用途径富集和蛋白-蛋白相互作用网络&…...
RPA 与 AI 结合:开启智能自动化新时代
RPA 与 AI 结合:开启智能自动化新时代 在当今数字化快速发展的时代,企业面临着海量的数据处理和复杂的业务流程,如何提高效率、降低成本、优化业务流程成为了企业关注的焦点。而 RPA(Robotic Process Automation,机器…...
[免费]Springboot+Vue在线文档管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue在线文档管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue在线文档管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着科学技术的飞速发展,社会的方方面…...
内容选题与商业布局
内容选题与商业布局 提示词 1:人群链(User Chain)提示词 2:需求链(Demand Chain)提示词 3:环境 需求 优势 三要素提示词 4:垂直于“人性”而非只“赛道”提示词 5:基于…...
文字描边实现内黄外绿效果
网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边(兼容Webkit内核) */text-stroke: 2px #008000; /* 标准语法 *…...
网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析
1. 基本定义 HTTP(HyperText Transfer Protocol) 应用层协议,用于客户端与服务器之间的数据传输(默认端口 80)。 HTTP/1.0:早期版本,每个请求需单独建立 TCP 连接,效率低。HTTP/1.1&…...
千峰React:Hooks(上)
什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的,如果想让一般的数据也可以得到状态的保存,可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…...
salesforce 为什么无法关闭task,显示:insufficient access rights on object id
在 Salesforce 中,如果你在尝试关闭任务(Task)时遇到 “Insufficient access rights on object id” 错误,通常是由于以下几种可能的权限问题导致的: 1. 任务的所有权问题 Salesforce 中的任务(Task&…...
机器学习:强化学习的epsilon贪心算法
强化学习(Reinforcement Learning, RL)是一种机器学习方法,旨在通过与环境交互,使智能体(Agent)学习如何采取最优行动,以最大化某种累积奖励。它与监督学习和无监督学习不同,强调试错…...
MongoDB—(一主、一从、一仲裁)副本集搭建
MongoDB集群介绍: MongoDB 副本集是由多个MongoDB实例组成的集群,其中包含一个主节点(Primary)和多个从节点(Secondary),用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…...
MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List
在 MyBatis 中,TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象,它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例…...
第二十八:5.5.【storeToRefs】5.6.【getters】
LoveTalk.vue: 调用: // 方法 const talkStore useTalkStore() function getLoveTalk(){ talkStore.getATalk() } 如果是要简短的形式调用: const talkStore useTalkStore() // user hooks 的形式调用 const {schoole,local} talkStore // …...
APISIX Dashboard上的配置操作
文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口: 配置路由 通过apisix 的API管理接口来创建(此路由,直接…...
MinIO在 Docker中修改登录账号和密码
MinIO在 Docker中修改登录账号和密码 随着云计算和大数据技术的快速发展,对象存储服务逐渐成为企业数据管理的重要组成部分。MinIO 作为一种高性能、分布式的对象存储系统,因其简单易用、高效可靠的特点而备受开发者青睐。然而,在实际应用中…...
英文论文查重,Turnitin和IThenticate两个系统哪个更合适?
Turnitin系统和IThenticate系统都是检测英文论文的查重系统,但是两者之间还是有一些不一样的。 下面针对这两个系统给大家具体分析一下。 一、Turnitin系统 Turnitin检测系统: https://truth-turnitin.similarity-check.com Turnitin是世界上主流的…...
pnpm的基本用法
以下是 pnpm 的核心命令和使用指南,涵盖从安装依赖到项目管理的常见操作: 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包(自动添加到 dependencies…...
【实战中提升自己】防火墙篇之双ISP切换与VRRP切换对于用户的体验
! 拓扑与说明 某公司的网络架构,这样的架构在目前的网络中是在常见的,假设您接收一个这样的网络,应该如何部署,该实战系列,就是一步一步讲解,如何规划、设计、部署这样一个环境,这…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
