python处理wav音频文件:音频信息,读取内容,获取时长,切割音频,pcm与wav互转_soundfile统计wav时长-程序员宅基地

技术标签: python  python_wav  python wav  wav  

因为工作中用到了wav格式的音频,所以就搜集了一些关于wav音频的处理。
主要包括:音频信息,读取内容,获取时长,切割音频,pcm与wav互转

获取音频信息:

with wave.open(wav_path, "rb") as f:
    f = wave.open(wav_path)
    print(f.getparams())

返回内容为:
声道,采样宽度,帧速率,帧数,唯一标识,无损

返回信息

 

音频信息


采样点的个数为 2510762,采样的频率为44100HZ,通过这两个参数可以得到声音信号的时长
每个采样点是16 bit = 2 bytes ,那么将采样点的个数 25107622/(10241024)=4.78889MB,那么这个信息就是文件大小信息。

检验一下声音波形的时间
child1.wav 4.78MB,时长56s
time = 56.93337868480726
根据上面WAVE PCM soundfile format 的资料信息查询。有一个印象:WAV文件中由以下三个部分组成:

1."RIFF" chunk descriptor 2.The "fmt" sub-chunk 3.The "data" sub-chunk 存这些信息的时候都要要有 “ID”、“大小”、“格式”,这些信息标注了数据的位置,
“WAV”格式由“fmt”和“data”,两个部分组成,其中“fmt”的存储块用来存音频文件的格式,“data”的存储块用来存实际听到的声音的信息,物理上描述的振幅和时间:长度(时间)和振幅,当然人的耳朵听听见的是长度和音调。

也就是说可以读取这个数组,在配合频率的信息直接画出波形图。

波形图

 file = wave.open(wave_path)
# print('---------声音信息------------')
# for item in enumerate(WAVE.getparams()):
#     print(item)
a = file.getparams().nframes  # 帧总数
f = file.getparams().framerate  # 采样频率
sample_time = 1 / f  # 采样点的时间间隔
time = a / f  # 声音信号的长度
sample_frequency, audio_sequence = wavfile.read(wave_path)
# print(audio_sequence)  # 声音信号每一帧的“大小”
x_seq = np.arange(0, time, sample_time)

plt.plot(x_seq, audio_sequence, 'blue')
plt.xlabel("time (s)")
plt.show()

音频的截取,通过时间片段来获取部分音频
因为音频以毫秒计时,在截取音频时,我统统转为了毫秒

按毫秒截取
start_time = int(start_time)
end_time = int(end_time)

sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]

word.export(part_wav_path, format="wav")

调用:

# 音频切片,获取部分音频 时间的单位是毫秒
start_time = 13950
end_time = 15200
get_ms_part_wav(main_wav_path, start_time, end_time, part_wav_path)

如果需要写入秒,我也是将其转为了毫秒单位

start_time = int(start_time) * 1000
end_time = int(end_time) * 1000

sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]

word.export(part_wav_path, format="wav")

有时会有比较大的音频文件,我是将分钟和秒进行结合,然后在自己拆分

start_time = (int(start_time.split(':')[0])*60+int(start_time.split(':')[1]))*1000
end_time = (int(end_time.split(':')[0])*60+int(end_time.split(':')[1]))*1000

sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]

word.export(part_wav_path, format="wav")

调用格式

# 音频切片,获取部分音频 时间的单位是分钟和秒 样式:0:12
start_time = "0:35"
end_time = "0:38"
get_minute_part_wav(main_wav_path, start_time, end_time, 
minute_part_wav_path)

其他更多详见代码,都加油注释
函数使用都有说明

函数

函数调用

函数调用

 

GitHub代码,公众号:python疯子    后台回复:wav

python疯子

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010070526/article/details/85218613

智能推荐

开源埋点工具分析比较_开源埋点系统-程序员宅基地

文章浏览阅读1w次。开源埋点工具分析查找和比较_开源埋点系统

vite+vue3 2-程序员宅基地

文章浏览阅读63次。答:选择To check syntax, find problems, and enforce code style(检查语法、发现问题并强制执行代码风格)1.在vue3中,规则vue/name-property--casing已经被vue/component-definition-name-casing代替,在使用前者会出错。a).安装postcss和postcss-preset-env插件:npm install postcss postcss-preset-env -D。(你想遵循哪一种风格指南?

使用IDM下载百度云盘文件提示“此站点/路径要求授权”解决方法_idm此站点路径要求授权-程序员宅基地

文章浏览阅读1.4w次,点赞6次,收藏11次。使用IDM下载百度云盘文件提示“此站点/路径要求授权”解决方法问题描述解决方法问题描述利用IDM下载百度云盘文件时,未下载完成时提示“此站点/路径要求授权”,要求输入账户和密码,然而输入啥都没用。解决方法停止下载,右键下载项目——属性,可以发现下载的URL改变了。所以要把URL改回来。在浏览器再次下载文件,IDM会弹出“下载文件信息”将图中的URL信息放到之前下载项目右键——属性的..._idm此站点路径要求授权

idea新版UI的TODO工具栏位置_idea将todo添加到侧边栏-程序员宅基地

文章浏览阅读595次,点赞7次,收藏6次。_idea将todo添加到侧边栏

2018年中国SDN、NFV优秀案例评选 正式启动-程序员宅基地

文章浏览阅读208次。【IT168报道】为适应网络强国和数字中国的发展战略,奠定互联网+发展的网络基础,满足垂直行业对网络的多样化需求,迎接万物互联的网络新时代,传统网络向开放化、软件化、智能化的新一代信息网络演进成为产业界的广泛共识。国内三大运..._sdn2018中国

基于微信小程序的校园点餐系统小程序(源码+文档+部署+讲解)_微信点餐小程序源代码-程序员宅基地

文章浏览阅读1.1k次,点赞18次,收藏26次。校园点餐系统小程序采用B/S模式、采用JAVA语言、springboot框架、mysql数据库、小程序框架uniapp等开工具,促进了校园点餐系统小程序的业务发展。与传统线下点餐相比,校园点餐系统小程序不但节省了卖家的线下运营的成本和门店曝光等难题,对学生而言提供了足不出户送餐上门的服务,针对现代校园而言,出门用餐路程远,排队麻烦等问题,特开发校园点餐系统小程序。本系统使用动态网页开发技术JSP,Java作为系统的开发语言,采用springboot框架、mysql作为后台数据库。_微信点餐小程序源代码

随便推点

数据结构笔记(5)树的基础介绍_三叉树-程序员宅基地

文章浏览阅读1k次。前言接下来就是数据结构的第二大板块:树之前的第一板块:线性表中的顺序表和链表已经更完。但由于队列和栈是特殊的线性表,既然特殊,实际上就普通的顺序表和链表也能实现,加上队列和栈可直接STL实现。故由此,先暂时跳过队列和栈的实现(实际上队列和栈的实现也是仿STL的)笔记(1)为顺序表仿STL的实现,笔记(2)为链表的实现,笔记(3)为队列的仿STL实现,笔记(4)为栈的仿STL实现,而本篇笔记(5)则介绍树形结构树的定义树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系_三叉树

《转载》struts旅程《1》-程序员宅基地

文章浏览阅读54次。struts简介Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。Struts发展历史Struts是作为ApacheJakarta项目的组成部分,...

javaweb分页查询实现-程序员宅基地

文章浏览阅读391次。Javaweb分页技术实现分页技术就是通过SQL语句(如下)来获取数据,具体实现看下面代码//分页查询语句select * from 表名 where limit page , count;和//获取表中的总数据,确定页数select count(*) from 表名;不说废话直接上代码前端代码:<!DOCTYPE html>..._javaweb之分页查询 post请求写

linux内核 异常 log,Linux Kernel WARN()/BUG(), Oops/Panic, Tainted分析-程序员宅基地

文章浏览阅读2.7k次。稳定性范畴, 参考5.x kernel。kernel OopsOops指的就是内核的不正确行为,比如对驱动来说:static int i82092aa_pci_probe(struct pci_dev *dev,const struct pci_device_id *id){unsigned char configbyte;int i, ret;ret = pci_enable_device(de..._kernel warn

forward和redirect区别_forward 和 redirect 区别?-程序员宅基地

文章浏览阅读266次。_forward 和 redirect 区别?

tekla插件_CAD三维线模导入Tekla快速建模图文教程-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏7次。前几天我发了个cad三维线模导入Tekla快速建模的文章,有不少朋友让我做个具体的操作视频教程,说实在的,我这把年纪你让我录个视频教程,还要语音的,那真是要我老命了,普通话都讲不好,想来想去还是做个图文教程吧。言归正传首先要快速导入之前,需要下载两个小插件(都是完全免费的)1、SSBIM for CAD下载地址及安装方法:http://zt.ggditu.com/Proscenium/w..._cad三维建模导图插件

推荐文章

热门文章

相关标签