Python播放mp3,python mp3播放器

  Python播放mp3,python mp3播放器

  下载#下载本文的PDF版本

  Python Wav文件解析及波形绘制方法

  #本文代码下载

  Wav波形绘制代码

  #下载本例的音频文件night.wav。

  音频文件下载(史进-夜的钢琴曲)

  前言在现在忙碌的生活中,我们经常听一些歌曲来放松自己。我们经常会从各种播放软件上听自己喜欢的歌曲,也会经常下载一些歌曲。现在的音频种类很多,有Wav,Mp3,FLAC,AAC等多种格式。最近我们需要做一个可以分析Wav格式音频的波形来获取一些数据,比如人是否录完了。本周我们将分析Wav并用Python绘制其波形。

  Wav文件格式我们先来看看维基百科上对wav音频格式的解释:

  波形音频文件格式(WAVE,或因其扩展名而为公众所知的WAV)是微软和IBM开发的一种编码格式,用于在个人计算机上存储音频流。其应用软件在Windows平台上得到广泛支持,地位类似于AIFF在麦金塔电脑中的地位。这种格式属于资源交换文件格式(RIFF)的应用之一,通常以块为单位存储脉冲编码调制的音频数据。也是其音乐发烧友常用的规格之一。因为这种音频格式没有经过压缩,所以在音质方面不会有失真,但是文件的体积在众多音频格式中是比较大的。”

  我们可以看到上面提到了两个关键词RIFF和脉码调制。那么我们先来解释一下什么是RIFF“资源交换文件格式”。

  RIFF格式我们也来看看维基百科对RIFF的解释。

  “资源交换文件格式(Resource Interchange File Format,简称RIFF),资源交换文件格式,是一种通用的文件存储格式,按照标记的组块存储数据。它主要用于存储音频和视频等多媒体数据。AVI、阿尼、瓦夫等。微软的windows下的都是基于RIFF实现的。

  RIFF是微软和IBM于1991年在windows 3.1中推出的,作为windows 3.1的默认多媒体文件格式。RIFF指的是交换文件格式,两者的主要区别是大端和小端的问题。基于IBM的80x86系列主机下,RIFF的字节顺序是小端;在IFF的原始格式中,整数数据是按照大端存储的。"

  即兴重复由组块组成,组块是即兴重复的基本单位。每个组块都可以看作是一帧视频数据,也可以看作是一帧音频数据,所以我们来讨论一下组块的结构。

  CHUNK的结构CHUNK由三部分组成:

  FOURCC使用4字节ASIIC字符来标识字体大小数据的大小。数据用于存储数据。结构图如下:

  组块结构

  组块一般不能嵌套,但是当组块的FOURCC为“RIFF”或“LIST”时,数据可以嵌套。“RIFF”的第一个组块的FOURCC一定是“RIFF”,所以有FOURCC的列表一定是子组块和子组块。下面是包含子组块的结构图:

  包含子块的结构图。

  “RIFF”的组块在称为“表单类型”的数据区的前四个字节中记录数据的类型。例如,我们的wav文件的表单类型是“WAV”。结构图如下:

  包括表单类型的结构图。

  同样,FOURCC为LIST的子块的数据区也包含LIST Type,用于指示LIST中的数据区格式PCM。我们先来看看百度百科对它的解释:

  “PCM脉码调制是脉码调制的缩写,脉码调制是数字通信的编码方式之一。主要过程是以固定的时间间隔对声音和图像等模拟信号进行采样,使其离散。同时,采样值按层次单位进行四舍五入和量化,采样值用一组二进制码表示。”

  从上面的介绍我们可以了解到:

  通过采样、量化和编码三个过程,音频的模拟信号被转换成数字信号。

  采样是因为模拟信号是连续的,模拟信号是以一定的频率采样的,这是近似得到的。例如,下图中的灰框是以某一频率采样的示意图:

  取样过程示意图

  采样就是从模拟信号中提取频率大于其信号带宽两倍的样本,在时间轴上变成*离散*的采样信号,这样就可以得到可以代替原来连续音频信号的采样信号。通过对正弦信号进行采样而获得的采样信号是脉冲幅度调制(PAM)信号,然后对采样信号进行检测和平滑以恢复原始模拟信号。量化采样信号的离散模拟信号,采样值在一定范围内,各种值有无限可能。为了用数字代码表示样本值,我们采用“四舍五入”的方法,对不同级别的样本值进行四舍五入,使一定范围内的样本值由无穷大变为有限值。

  量化后的采样信号在一定范围内只有有限数量的期望样本,信号正负幅度分布的对称性使得正负样本数量相等,正负量化级别对称分布。

  WAV文件的块信息WAV文件由几个块组成。按照块在文件中出现的顺序,分别是Riff块、Format块、Fact块和Data块,其中Fact块是不必要的部分,其结构如下图所示:

  WAV文件头文件的块组成

  RIFF是头块,格式块记录WAV的各种参数信息。详细的参数信息如下:

  标签音频数据的编码模式,其中PCM模式为1声道数,单声道为1,双耳声道为2SamplesPerSec采样率(每秒采样数)*音频数据传输速率BlockAlign*每个采样位的大小Sample*每个声道的采样精度。FACT CHUNK的作用是它们中的一部分不使用PCM格式,所以需要一个FACT CHUNK来记录数据和解压数据大小。

  最后一个数据块包含真实声音数据,一般按照WAVE_FORMAT_PCM的数据格式存储,即脉码调制PCM。

  WAV的数据部分的数据块中的信息是根据格式块中的信息确定的。它由量化位数/通道数/采样率共同决定。下图显示了四种情况下存储在数据区中的信息格式:

  数据块的格式

  在python中读取python wav文件的信息,我们可以通过很多音频库直接操作wav文件,比如我们自带的标准库wave库,还有比如eyeD3,PyAudio,Audacity等。先不介绍这个方法,我们先通过传统的文件操作读取二进制形式的WAV文件,我们来分析一下它的头文件,验证一下我们之前关于CHUNK的知识。对音频文件进行二进制操作,得到前四个字节的代码如下:(我们的测试音频是night.wav,已经放在github里了。可以通过我博客花园右上角的绿色图标链接到我的github界面。找到lab102下的w8目录获取该资源,或者找到该博客园的顶级资源):

  # Read wav-XLXWFILE=open( night . wav , rb) s=file.read (4) print (s)程序运行截图:

  我们可以看到第一个字节是RIFF,我们认为是对的。让我们读取44个字节,看看信息是什么样的:

  # Read wav-XLXWFILE=open( night . wav , rb) s=file.read (44) print (s)程序运行截图:

  我们可以看到RIFF后面的字符串是Form Type of WAVE,fmt,data,是FOURCC,而其他用十六进制表示的字符是数据大小/数据。所以我们通过二进制读取的WAV文件的信息与我们之前学习的CHUNK中的内容是一致的。

  利用wav库从wav文件中提取信息,可以知道wav文件的存储方式,可以简单的从中提取信息。我们知道WAV文件最重要的是声音信息的存储。这部分我们也可以分析CHUNK的数据,但是我们有一个更简单的方法来获取python中的声音,就是使用python自己的WAV库。先介绍一些WAV库的方法,为下文做铺垫。

  首先将wave open()导入wave库打开一个声音文件,使用wave.open(声音文件地址,模式)方法。

  声音文件的地址是wav文件的位置,模式类似于文件读写,比如“WB”——只写;“Rb”——只读模式B表示以二进制模式打开。

  Close()关闭声音文件。

  Getparams()获取wav文件的参数(输出为元组),分别是(通道数,采样精度,采样率,帧数,)

  以下是本文中示例night.wav的getparams()的信息:

  Readframes()获取每一帧的声音数据,返回值为二进制数据。在python中,二进制数据是用字符串表示的,如下图所示,所以我们以后再转换。

  获取night.wav的前10帧数据,如下图所示:

  以上基本是波库常用的方法。它将在下面应用。

  绘制WAV文件的波形我们经常可以在很多声音软件中看到声音文件的波形,比如CoolEdit,Audition等等,所以我们在这里尝试用Python和前面提到的wave库,辅以numpy和Matplotlib来绘制night.wav文件的波形。

  先简单说一下绘制波形的步骤:(以night.wav为例)

  通过wav库获取night.wav头文件中的信息,如采样率/通道数等。提取数据区信息,用numpy将字符串格式数据转换成数组,通过确定通道数(转换数组矩阵)处理数据区数据,得到每个绘图点的时间(x坐标),用matplotlib库提供的方法绘制波形图。让我们详细解释其中的一些步骤:

  因为晚上处理数据区。wav是一个两通道的WAV文件,从上面对数据区格式的介绍我们可以知道,存储形式是左通道/右通道,所以这里我们要对提取的数据进行处理。这里的numpy库为我们提供了一个很好的解决方案,我们主要使用改变形状的形状法和T转置法。这里我们举一个例子:

  让我们创建一个包含8个元素的数组[1,2,3,4,5,6,7,8]。这时候按照我们的分离方法,应该分为左声道[1,3,5,7]和右声道[2,4,6,8]。我们可以通过shape来改变矩阵的形状,使数据分成两列,即左右通道,然后

  将数据分为左声道和右声道的示例

  用于绘制波形的matplotlib库。这里我们要画波形,所以使用matplotlib库大大降低了我们绘图的难度。我们主要用plt.subplot和plt.plot,所以对这两种方法进行说明。

  Plt.subplot()这是matplotlib绘制多个子图的方法,因为这里音频文件分为两部分(左声道/右声道)

  也就是分为2X1的形式,所以分别用我们的第一张图和第二张图。

  Plt.subplot(211)和plt.subplot(212),如下图所示:

  Matplotlib子图

  Plt.plot plt.plot()是一个画线的方法,我们使用三个参数。

  (x坐标,y坐标,颜色)

  Plot可以用来绘制最终的波形。

  其他方法这里就不介绍了,不过matplotlib的绘图功能还是挺强大的。

  绘制night.wav波形的代码绘制wav文件波形的代码如下(这里我们还是以night.wav为例)

  # wave data-xlxw # import导入wave as Wei导入numpy as NP导入matplotlib。py plot as PLT def wav read(path):wav file=we。打开(path, Rb )params=wav文件。getparams()frames ra,frames VAV=params[2],params[3]data wav=wav file。读取帧(帧VAV)wav文件。close()数据使用=NP。from string(data wav,dtype=NP . short)data use . shapet time=NP . arange(0,Frames VAV)*(1.0/Frames ra)return data use,timedef main():Path=input( Path is:)wav data,wav time=wav read(Path)PLT。标题(‘夜。wav的框架)PLT。子情节(211)情节。plot(wav time,wavdata[0],color= green )。子情节(212)情节。图(wav时间,wavdata[1])程序绘制出的波形图的截图:

  night.wav声音文件的双声道波形

  总结拓展在本周我学到了声音资源文件文件的存贮格式以及怎么用大蟒读取声音资源文件文件信息并且绘制出波形图。其中在绘制了波形图后,我们可以对波形多透露出的信息进行分析,比如:

  得到声音的特征分析录音时被录音者是否停止说话等等用途,可以用于许多方面,如声音识别,断句(音频分割)等等许多的场景。这里在以后我也会继续进行探索。

  转载于:https://www。cn博客。com/lzxwalex/p/6922099。超文本标记语言

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: