Python 打开wav文件的操作

wav文件

利用python打开一个wav音频文件,然后分析wav文件的数据存储格式,有了格式之后就能很方便的进行一些信号处理的操作。Wikipedia给出的wav文件的资料如下

Waveform Audio File Format (WAVE, or more commonly known as WAV due to its filename extension - both pronounced "wave"")(rarely, Audio for Windows) is a Microsoft and IBM audio file format standard for storing an audio bitstream on PCs. It is an application of the Resource Interchange File Format (RIFF) bitstream format method for storing data in "chunks", and thus is also close to the 8SVX and the AIFF format used on Amiga and Macintosh computers, respectively. It is the main format used on Windows systems for raw and typically uncompressed audio. The usual bitstream encoding is the linear pulse-code modulation (LPCM) format.

音频格式资料在网上也有一些标准格式的说明,比如WAVE PCM soundfile format http://soundfile.sapp.org/doc/WaveFormat/

当然大多数情况下,很需要对信息进行筛选的能力,在使用python来处理wav文件的时候仅仅需要其中的几个操作,并不一定要每个都掌握,在需要的时候查询文档。

注意

大段的文字来叙述wav音频文件是什么并不是作为编程练习的目的,人的精力是有限的不可能同时掌握所有的知识点。一开始,就学习声音的原理,然后再验证,这些工作应该是由搞信息编码的研究者来完成,而作为一个工程师应该集中精力研究代码上的复现。不如反其道行之,读取音频文件,根据系统提供的API获得各种参数,再去查询参数的信息。编程练习要思考怎么用一般在处理音频文件的时候。有个流程就是将音频文件导入,分析波形,进行傅里叶变换之类的操作,作为数据的预处理,才可以进行下一步数值数据的处理,其实音频处理最想要的过程无非如上所述。所以正常情况下,还要知道音频文件中的数据的含义,用计算机科学的思想分析就是需要知道它的数据结构。

音频文件信息

用到了python 处理wav文件的包 wave,读取wave 信息,遍历参数

importwave as we

filename= "child1.wav"WAVE=we.open(filename)for item inenumerate(WAVE.getparams()):print(item)

查询官方文档中对于wave.getparams()的描述

Wave_read.getparams()

Returns a namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname), equivalent to output of the get*() methods.

输出信息(声道,采样宽度,帧速率,帧数,唯一标识,无损)

采样点的个数为 2510762,采样的频率为44100HZ,通过这两个参数可以得到声音信号的时长

每个采样点是16 bit = 2 bytes ,那么将采样点的个数 2510762*2/(1024*1024)=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”的存储块用来存实际听到的声音的信息,物理上描述的振幅和时间:长度(时间)和振幅,当然人的耳朵听加的是时长,以及音调高低。有这么一个概念之后,才联想到“单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点”,有这么一个印象,音频信号处理实质就是对这个数组进行处理。也就是说可以读取这个数组,在配合频率的信息直接画出波形图。

注意一下几点

1.一个采样点的值代表了给定时间内的音频信号,一个采样帧由适当数量的采样点组成并能构成音频信号的多个通道。

2.对于立体声信号一个采样帧有两个采样点,一个采样点对应一个声道。一个采样帧作为单一的单元传送到数/模转换器(DAC),以确保正确的信号能同时发送到各自的通道中。

3.单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,那么将来文件的信息处理通过一个矩阵来实现

WAV文件波形

为了绘制波形图,需要的参数有时间和振幅的信息,完整的步骤如下:

1.将WAV文件导入到Python的工作环境中。

2.设置参数,声音信号(时间、振幅、频率)。

3.将这些信息通过 matplotlib.pyplot提供的接口绘画出来。

可以得到一个振幅随着时间变化的函数。

1 importwave as we2 importmatplotlib.pyplot as plt3 importnumpy as np4 from scipy.io importwavfile5

6 filename = "child1.wav"

7 WAVE =we.open(filename)8 print("---------声音信息------------")9 for item inenumerate(WAVE.getparams()):10 print(item)11 a = WAVE.getparams().nframes #帧总数

12 f = WAVE.getparams().framerate #采样频率

13 sample_time = 1/f #采样点的时间间隔

14 time = a/f #声音信号的长度

15 sample_frequency, audio_sequence =wavfile.read(filename)16 print(audio_sequence) #声音信号每一帧的“大小”

17 x_seq =np.arange(0,time,sample_time)18

19 plt.plot(x_seq,audio_sequence,"blue")20 plt.xlabel("time (s)")21 plt.show()

WAV文件的存储格式

通过上述操作流程,了解了几个信息:

1.通过python现有包wave 可以获取wav文件几个基础信息,比如文件的声道,声音的采样宽度,帧速率,帧数,是否唯一标识,是否无损,关于WAV文件处理的入门信息,可先用几行代码获得WAV文件基本处理信息,然后将这些信息通过画图的形式绘画出来。

2.WAV文件中的时间,可以按照采样点数目,以及频率的大小获得,将来可以加窗口,进行数字信号处理上的一些操作,对声音信号作进一步的分析。

3.WAV文件中将声音信号存为n*1矩阵点或者n*2矩阵点,区分条件为是单声道还是双声道,对声音信号的研究可以转化为这个数组的研究。

python学习音频-Python学习笔记--音频处理相关推荐

  1. python学习音频-Python 音频数据扩充的技巧

    经典的深度学习网络AlexNet使用数据扩充(Data Augmentation)的方式扩大数据集,取得较好的分类效果.在深度学习的图像领域中,通过平移. 翻转.加噪等方法进行数据扩充.但是,在音频( ...

  2. 20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放

    20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放 文章目录 202205 ...

  3. 唤醒手腕Python全栈工程师学习笔记(网络爬虫篇)

    唤醒手腕Python爬虫学习笔记,喜欢的同学们可以收藏下,谢谢支持. 01.基础语法知识点 字符串的分割 webString = 'www.baidu.com' print(webString.spl ...

  4. [深度学习]Part1 Python学习进阶Ch23爬虫Spider——【DeepBlue学习笔记】

    本文仅供学习使用 Python高级--Ch23爬虫Spider 23. 爬虫Spider 23.1 HTTP基本原理 23.1.1 URI与URL 23.1.2 超文本 23.1.3 HTTP 和 H ...

  5. java和python的比较-java学习笔记(与python对比来学)

    写在前头 自己之前一直是从事python的,因为部分业务要求需要进行Java的学习,顺道记录一点笔记. 不同在于Java是偏向编译性的语言,python是解释性语言(下面conner只针对java与p ...

  6. 机器学习实战笔记(Python实现)-01-机器学习实战

    今天发布一篇图片博客,看一下效果如何,如果效果,以后的博客尽量发图片上来. 机器学习实战 本博客来自于CSDN:http://blog.csdn.net/niuwei22007/article/det ...

  7. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  8. 阿里云天池 Python训练营Task4: Python数据分析:从0完成一个数据分析实战 学习笔记

    本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5 ...

  9. 阿里云天池 Python训练营Task3: Python基础进阶:从函数到高级魔法方法 学习笔记

    本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5 ...

  10. 阿里云天池 Python训练营Task2: Python基础练习:数据结构大汇总 学习笔记

    本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5 ...

最新文章

  1. STM32 KEIL MDK 本地时间和Unix timestamp相互转换
  2. 并发编程——进程——生产者消费者模型
  3. 解决 IDEA 调用其他类的时候自动加上包路径和类名的情况_idea 快捷键汇总(转)...
  4. 带你反编译APP然后重新打包「MacOS」
  5. 傅里叶变换频谱的可视化保存
  6. JNI-获取Java对象的成员变量-GeInttField()
  7. oracle 11g 延迟验证,取消 11G延迟密码验证
  8. java aqs实现原理_JAVA基础学习之-AQS的实现原理分析
  9. 什么是树(Tree),数据结构中一般有哪些树?
  10. SSM框架-实现Mybatis分页功能-foreknow_cms
  11. Linux 中断学习之前言篇---中断之原理篇
  12. MATLAB 语言基础知识 矩阵和数组 从矩阵中删除行或列
  13. php初级入门教程_PHP初学者教程
  14. Edge浏览器检查更新时出错: 无法创建该组件(错误代码 3: 0x80004002 -- system level)如何更新
  15. java backoff_Java BackOff类代码示例
  16. 迷宫 动画 java_Java实现可视化迷宫
  17. LayUi集成下载Excel、word、PDF、CSV扩展
  18. 图解 802.11wifi协议
  19. Android 图片压缩之多种压缩方式结合使用,阿里Android开发面试解答
  20. uboot什么意思(uboot fastboot)

热门文章

  1. Vue开发跨端应用(四)electron发布web应用并打包app
  2. 【C/C++应用实例】基于线性结构的1KB内存IC存储模拟展示(C/C++)
  3. Python——线程1
  4. js常用阻止冒泡事件
  5. jquery中一些容易忽略的方法
  6. .NET MessageBox 网页弹出消息框
  7. ArrayList 解释
  8. [翻译]敏捷软件开发 一 之简要介绍
  9. Shellz中awk的简单用法
  10. 实例方法-扩展器-生命zhou