操作系统 :Windows 10_x64

Python版本:3.9.2

从事FreeSwitch相关工作,大概率会遇得到DTMF,DTMF的传递方式有三种:

  • In-band
  • RFC2833
  • SIP-INFO

使用RFC2833或SIP-INFO传递方式的DTMF,FreeSwitch可以在日志中打印出来,但遇到inband模式的DTMF,FreeSwitch的日志就打印不出来了。

如果是会议场景,使用In-band模式(比如固话)发送DTMF,DTMF按键的声音和音频流混合在一起发送到对端:

1)在传输过程转换为2833格式dtmf后,会添加2833格式的DTMF按键信息,混合在音频流里面的DTMF按键未移除;

2)会出现在会议系统中可以听到座机传来的DTMF按键音。

这个问题目前没有比较好的解决办法,这里记录一下。但这个问题引发了我的思考:

In-band模式的DTMF能识别吗?如果可以识别,怎么识别?

今天整理下In-band模式DTMF识别的笔记。我将从以下几个方面进行展开:

  • DTMF介绍

  • 如何生成包含DTMF按键音的wav文件

  • 如何使用python脚本解析wav文件获取DTMF按键值

  • 运行效果截图及配套资源下载

一、DTMF介绍

DTMF信号即双音多频信号,网上介绍的资料比较多,这里主要关注的是频率信息,可以参考下pypi上关于DTMF的介绍:
https://pypi.org/project/dtmf/

二、生成包含DTMF按键音的wav文件

1、使用Audacity生成wav文件

Audacity版本:3.1.3这里使用Audacity进行噪音文件的生成,如果不了解Audacity软件,可参考这篇文章:

1)选择"生成->DTMF音..."

2)生成0123456789音频

3)导出音频

这里使用8000hz导出音频。

如果想直接使用导出的音频文件(dtmf-au.wav),可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240803 获取。

2、使用软电话模拟inband模式生成wav文件

1)配置软电话,使用inband模式

2)用会议室模拟通话过程的DTMF按键

conference test bgdial user/1001
conference test bgdial user/1002

1001按键,在会议室的1002可以听见按键音(按键值:123456789*0#)。

3)执行会议室录音

命令如下:

conference test recording start /tmp/dtmf-fs.wav

这里描述下大概流程,如果想直接使用导出的音频文件(dtmf-fs.wav),可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240803 获取。

三、python解析wav文件获取DTMF按键值

在GitHub上找到一个解析dtmf的库:

https://github.com/ribt/dtmf-decoder

如果无法打开,可从文末提供的渠道获取下载的源码压缩包。

其核心是 dtmf.py 文件,运行效果如下:

也可直接使用我修改过的代码(dtmf2.py):

完整代码可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240803 获取。

运行效果如下:

四、资源下载

本文涉及源码及相关文件,可从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240803 获取。

好,就这么多了,别忘了点赞哈!

python3解析wav文件获取dtmf值的更多相关文章

  1. Python解析Wav文件并绘制波形的方法

    资源下载 #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在 ...

  2. Python3解析dex文件

    一.说明 1.1 背景说明 看<加密与解密>的时候反复听说“PE文件格式”,到Android安全兴起就不断听说“dex文件格式”.意思是看得懂的,但自己不能手解析一番总觉得不踏实,所以决定 ...

  3. Python3 解析excel文件

    Python3 解析读取excel文件 一.第三方库 import xlrd 二.代码示例 import xlrd ''' 读取Excel每个sheet的第一列和第二列的值,拼接成json串,写入文件 ...

  4. 在java项目中怎样利用Dom4j解析XML文件获取数据

    在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进 ...

  5. python3解析XML文件

    软硬件环境 Ubuntu 15.10 32bit Python 3.5.1 PyQt 5.5.1 前言 Python解析XML的方法挺多,本文主要是利用ElementTree来完成. 实例讲解 解析X ...

  6. python xml.etree.ElementTree解析xml文件获取节点

    <?xml version = "1.0" encoding = "utf-8"?> <root> <body name=&quo ...

  7. 在tomcat启动时解析xml文件,获取特定标签的属性值,并将属性值设置到静态变量里

    这里以解析hibernate.cfg.xml数据库配置信息为例,运用dom4j的解析方式来解析xml文件. 1.在javaWeb工程里新建一个java类,命名为GetXmlValue.java,为xm ...

  8. 音视频学习系列第(三)篇---wav文件的存储和解析

    音视频系列 什么是wav wav是一种无损的音频文件格式,wav文件有两部分,第一部分是文件头,记录一些重要的参数信息,如音频的采样率,通道数,数据位宽,第二部分是数据部分,数据部分可以是PCM,也可 ...

  9. java解析属性文件

    -----------------------解析属性文件----------------------------- /**   * 获取src下属性文件   * @param params   * ...

  10. WAV文件读取

    WAV是一种以RIFF为基础的无压缩音频编码格式,该格式以Header.Format Chunk及Data Chunk三部分构成. 本文简要解析了各部分的构成要素,概述了如何使用C++对文件头进行解析 ...

随机推荐

  1. String Record

    T1. P5840 算法:ACAM+BIT+树链剖分 自然地,我们会对 \(s_i\) 建 ACAM,然后建出一颗 fail 树. 此时我们考虑集合内加入一个新的字符串.每一个匹配到的点我们都会给从这 ...

  2. JVM垃圾回收器(详解)

    引言 垃圾回收(GC,Garbage Collection) 在笔者上一篇文章中(JVM内存模型),介绍了JVM内存模型以及JVM运行时的数据区,堆是JVM内存区域里面最大的一块区域,用于存放实例数据 ...

  3. output打印ElasticSearch搜索条件searchSourceBuilder对象 toString方法

    打印搜索条件:log.info(searchSourceBuilder.toString());log.info("es搜索条件:[{}]", searchSourceBuilde ...

  4. RequestBodyAdvice和注解方式进行统一参数处理demo

    RequestBodyAdvice和注解方式进行统一参数处理demo @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(Rete ...

  5. 没有 Git,如何下载 Gitee 代码?

    目录 没有 Git,如何下载 Gitee 代码? 注册 Gitee 账号 下载代码压缩包 没有 Git,如何下载 Gitee 代码? 鉴于看我博客的人很多都是大学本科生.非 CS 专业,大部分人都不会 ...

  6. poj1163 the triangle 题解

    Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a progr ...

  7. 下载 Linux 内核的脚本

    介绍 在 类UNIX 环境下运行比较好(基于wget) 包括了 2.6 ~ 4.x 内核的地址. 5.x 因为 还在更新因此不做记录. 脚本下载地址: https://files.cnblogs.co ...

  8. QuartzNet暂停恢复会执行多次的问题解决

    ' var config = new System.Collections.Specialized.NameValueCollection { { "quartz.jobStore.misf ...

  9. Linux 特权 SUID/SGID 的详解

    导航 0 前言 1 权限匹配流程 2 五种身份变化 3 有效用户/组 4 特权对 Shell 脚本无效 5 Sudo 与 SUID/SGID 的优先级 6 SUID.SGID.Sticky 各自的功能 ...

  10. dig 命令详解及使用示例

    一.背景知识 CNAME CNAME 是 Canonical Name 的缩写,它是 DNS(域名系统)记录的一种类型.CNAME 记录用于将一个域名映射(别名)到另一个域名.换句话说,当你访问一个设 ...