python解析wav语音文件

本文介绍了使用Python解析WAV语音文件的原理和实现方法,详细讲解了WAV文件的结构,包括ChunkID、ChunkSize、Format、fmt子chunk和data子chunk等,并提供了Python程序的实现过程和运行结果。
摘要由CSDN通过智能技术生成

说明

本文主要使用python编程,实现解析wav语音文件,得到.wav语音文件的声道数,量化位数,采样频率,采样点数。编写python程序使用pycharm。
下面简单介绍一下wav文件结构。

一 解析.wav文件原理

WAVE文件本质上就是一种RIFF格式,它可以抽象成一颗树(数据结构的一种)来看。

在这里插入图片描述
​ 如图所示,从上到下分别对应着二进制数据在文件中相对于起始位置的偏移量。每一个格子对应一个字段,field size表示每个字段所占据的大小,根据这个大小以及当前的偏移量,可以计算出下一个字段的起始地址(偏移量)。

​ 根据RIFF的规范,整个WAV文件的顶级chunk就是最顶上的ChunkID为RIFF的这个chunk,这也可以解释为什么wav文件开头都是RIFF几个字母。而接下来的ChunkSize则表示这个chunk下的那些子chunk的大小,如果按照“树结构”来理解,那么每一个子chunk(Subchunk)则为树的树枝。而Format则为这个chunk的实际数据。

​ 一个chunk结构包括三个部分,第一个部分标识符用于说明这个chunk是存什么内容的,第二个部分则是说明这个chunk的内容到底有多大,用于让程序知道如果要找到下一个chunk该把地址偏移多少去读取,而第三个部分则是实际内容。

​ 上面说的是顶级chunk,接下来是子chunk。第一个子chunk的Subchunk1ID在WAV文件中恒定为fmt,表示该subchunk的内容为该WAV音频文件的一些元数据,也就是该WAV音频的一些格式信息。比如说AudioFormat这个字段一般为1,表示这个WAV音频为PCM编码。NumChannels则是该WAV音频文件的声道数量。SampleRate则为采样率,ByteRate则为采样率。BlockAlign则是每个block的平均大小,它等于NumChannels * BitsPerSample/8。BitsPerSample则为每秒采样比特,有的地方称它为量化精度或者PCM位宽。

​ 另一个子chunk也就是Subchunk2ID是在WAV文件中恒定为data,也就是这个WAV音频文件的实际音频数据,也就是音频的采样数据。但是我们的音频如果是双声道,那么实际上某一个采样时刻采样的数据是由左声道和右声道共同组成的。而这个共同组成的采样我们把他成为block。前面有讲到BlockAlign = NumChannels * BitsPerSample / 8,计算机中是以8个二进制数表示一个字节,所以要除以8来求出字节数。

​ 至于音频的持续长度,我们可以通过Subchunk2Size除以ByteRate,也就是实际音频data的chunk总长度除以每秒字节数得到持续多少秒。

详细的wav文件结构参考:wav文件格式分析与详解

二 python编程实现解析.wav文件

采用命令行传参的形式,将输入的语音文件和输出的解析数据保存的文件均从命令行输入。

程序

#解析.wav文件,得到采样频率,声道数,量化位数,采样点数
import numpy as np
import sys
import wave   #语音文件处理包
import getopt

def main(argv):  #定义一个函数
    try:  #首先执行try后的程序,如果输入格式不对,则执行except getopt.GetoptError:后的程序
        opts,<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值