

WAVE音频格式及及转换代码 - 凌逆战
source link: https://www.cnblogs.com/LXP-Never/p/15234298.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

音频信号的读写、播放及录音
python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio)。最后我们还将使用pyMedia(http://pymedia.org)进行Mp3的解码和播放。
音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行算法操作,WAV是Microsoft开发的一种声音文件格式,通常被用来保存未压缩的声音数据。
语音信号有四个重要的参数:声道数、采样频率、量化位数(位深)和比特率。
- 声道数:可以是单声道、双声道 ...
- 采样频率(Sample rate):每秒内对声音信号采样样本的总数目,44100Hz采样频率意味着每秒钟信号被分解成44100份。换句话说,每隔144100144100秒就会存储一次,如果采样率高,那么媒体播放音频时会感觉信号是连续的。
- 量化位数(Bit depth):也称为“位深”,每个采样点中信息的比特(bit)数。1 byte等于8 bit。通常有8bit、16bit、24bit、32bit...
- 比特率(Bit rate):每秒处理多少个Bit。比如一个单声道,用44.1KHz/16Bit的配置来说,它的比特率就为44100*16*1=705600,单位是bit/s(或者bps),因为通常计算出来的数字都比较大,大家就用kbit/s了,也就是705.6kbit/s。在对音频进行压缩时,比特率就成为了我们的一个要选的选项了,越高的比特率,其音质也就越好。一些常用的比特率有:
- 32kbit/s: 一般只适用于语音
- 96kbit/s: 一般用于语音或低质量流媒体
- 128或160kbit/s: 中等比特率质量
- 192kbit/s: 中等质量比特率
- 256kbit/s: 常用的高质量比特率
- 320kbit/s: MP3标准支持的最高水平
如果你需要自己录制和编辑声音文件,推荐使用Audacity,它是一款开源的、跨平台、多声道的录音编辑软件。在我的工作中经常使用Audacity进行声音信号的录制,然后再输出成WAV文件供Python程序处理。
如果想要快速看语音波形和语谱图,推荐使用Adobe Audition,他是Adobe公司开发专门处理音频的专业软件,微博关注vposy,下载地址见置顶。他破解了很多adobe公司的软件,包括PS、PR...
WAV格式是微软公司开发的一种无损声音文件格式,也称为波形声音文件,WAV格式支持多种压缩算法、音频位数、采样频率和声道。
WAV 符合 RIFF(Resource Interchange File Format) 规范,所有的WAV都由 44字节 头文件 和 PCM文件 组成,这个文件头包含语音信号的所有参数信息(声道数、采样率、量化位数、比特率....)
44个字节的 头文件由 3个区块组成:
- RIFF chunk:WAV文件标识
- Format chunk: 声道数、采样率、量化位数、等信息
- Data chunk:存放数据
相反的,在PCM文件头部添加44个字节的WAV文件头,就可以生成WAV格式文件
RIFF区块
规范的WAVE格式遵循RIFF头
名称 | 字节数 | 内容 |
ChunkID | 4 | "RIFF" 标识符 |
ChunkSize | 4 |
表示从下个地址开始到文件尾的总字节数 更准确的说:等于整个wav文件大小-8 |
Format | 4 | "WAVE" 标识符 |
FORMAT区块
描述声音数据的格式
名称 | 字节数 | 内容 |
Subchunk1ID | 4 | "fmt " 标识符,最后一位是空格 |
Subchunk1Size | 4 | 该区块数据的长度(不包含该区块ID和Size的长度) |
AudioFormat | 2 | 音频格式,PCM音频数据的值为1 |
NumChannels | 2 | 通道数 |
SampleRate | 4 | 采样率 |
ByteRate | 4 | 每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8 |
BlockAlign | 2 | 每个采样点所需的字节数 = NumChannels * BitsPerSample / 8 |
BitsPerSample | 2 | 量化位数(bit) |
DATA区块
包含数据的大小和实际声音
名称 | 字节数 | 内容 |
Subchunk2ID | 4 | "data" 标识符 |
Subchunk2Size | 4 | 该区块数据的长度,(不包含该区块ID和Size的长度),也就是PCM字节数 |
Data | * | 音频数据 |
文件实例:

RIFF区块
- ChunkID(4字节 52 49 46 46):对应ASCII中的 RIFF,这里是ASCII码对照表。
- ChunkSize(4字节 76 01 03 00):表示WAV文件的大小,不包含了前面8个字节,所以真正的大小等于文件总字节减去8。76 01 03 00 对应的正序16进制为 00 03 01 76大小为196982
- Format(4字节 57 41 56 45):对应ASCII中的WAVE
FORMAT区块
- Subchunkl ID(4字节 66 6d 74 20):对应ASCII中的fmt
- Subchunkl Size(4字节 10 00 00 00):正序16进制 00 00 00 10 对应16
- AudioFormat(2字节 01 00):正序16进制 00 01,对应数字1,表示编码格式“WAVE_FORMAT_PCM”
- NumChannels(2字节 01 00):正序16进制 00 01,对应数字1,表示声道数为1
- SampleRate(4字节 80 bb 00 00):正序16进制 00 00 bb 80,表示采样率为48000
- ByteRate(4字节 00 77 01 00):正序16进制 00 01 77 00,表示传输速率为96000
- BlockAlign(2字节 02 00):正序16进制 00 02,每个采样所需的2字节数
- BitsPerSample(2字节 10 00):正序16进制 00 10,采样大小为16 Bits
DATA区块
- Subchunk2ID(4字节 64 61 74 61):表示为ASCII的data,开始数据区
- Subchunk2 Size(4字节 52 01 03 00):正序16进制 00 03 01 52,PCM字节数,大小为196946
- wav文件(wav字节-44字节):pcm音频数据
WAV转PCM
因为wav比pcm多44个字节的文件头,也就是说44字节后的信息,就是pcm数据
wav2pcm.c
wav2pcm.sh
wav2pcm.py
还有一个github开源代码:wavutils
当我们读取pcm数据的时候,我们需要弄清楚语音每个采样点的位深是多少bit,一般来说是16bit,那么我们去pcm数据的时候就应该2个字节的去取,应该创建short的buf。
读取pcm数据
RAW、PCM、SAM
RAW、PCM(Pulse Code Modulation)、SAM 都是一种存储 原始数据 的音频文件格式,未经过任何编码和压缩处理,他们的本质一样,只是文件扩展名不同,也可以没有扩展名。与WAV或AIFF的大小相比,这音频文件不包含任何标题信息(采样率、位深度、通道数)。
如果在PCM文件的前面添加WAV文件头,就可以生成WAV格式文件。
如果是16位的话,pcm每个采样点的值在0~215−1,因为第一位是符号位。所以我们有时候用librosa读取的音频每个采样点都是0~1之间的,如果该音频是16bit的,如果想将他换成short型应该乘以215。
pcm转wav
版本一:代码参考自:https://github.com/pliu6/pcm2wav
pcm2wav.c
版本二:代码参考自:https://github.com/jwhu1024/pcm-to-wav
pcm2wav.c
版本三:使用python的wave库
View Code
还有一个github开源代码:wavutils
其他音频格式
MP3利用MPEG Audio Layer3 压缩方式进行压缩,所以简称为MP3,是一种有损压缩格式。 MPEG Audio Layer 3 压缩技术可以将音乐以1:10 甚至 1:12 的压缩率,能够在音质丢失很小的情况下把文件压缩到更小的程度。由于MP3体积小,音质高互联网上音乐几乎都是这种格式。但Mp3最高比特率320K,高频部分一刀切是他的缺点,对音质要求高的话还是建议wav格式。
ARM格式全称Adaptive Multi-Rate 和 Adaptive Multi-Rate Wideband,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,多用于人声,通话,是一种有损压缩格式。
Ogg全称应该是OGG Vobis(ogg Vorbis) 是一种新的音频压缩格式,类似于MP3等现有的音乐格式。相对于MP3压缩技术它是完全免费、开放和没有专利限制的,是一种有损压缩格式。
AAC(Advanced Audio Coding),中文称为“高级音频编码”,出现于1997年,基于 MPEG-2的音频编码技术,是一种有损压缩技术。
LAC即是Free Lossless Audio Codec的缩写,为无损音频压缩编码,由于不会丢失任何音频信息可以利用算法恢复原始编码,前景广阔。
作者:凌逆战
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
本文章不做任何商业用途,仅作为自学所用,文章后面会有参考链接,我可能会复制原作者的话,如果介意,我会修改或者删除。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK