音频信号的读写、播放及录音
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的配置来说,它的比特率就为44100161=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格式支持多种压缩算法、音频位数、采样频率和声道。
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更准确的说:等于整个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数据
版本1:C语言实现wave to pcm
#include <stdio.h>
/**
* wav2pcm ***.wav **.pcm
* @param argc 命令行参数的长度
* @param argv 命令行参数,argv[0]是程序名称
* @return
*/
int main(int argc, char *argv[]) {
FILE *wavfile;
FILE *pcmfile;
char buf[1024];
int read_len;
if (argc != 3) {
printf("usage:\n"
"\t wav2pcm ***.wav **.pcm\n");
}
wavfile = fopen(argv[1], "rb");
if (wavfile == NULL) {
printf("!Error: Can't open wavfile.\n");
return 1;
}
pcmfile = fopen(argv[2], "wb");
if (pcmfile == NULL) {
printf("!Error: Can't open pcmfile.\n");
return 1;
}
fseek(wavfile, 44, SEEK_SET); // 将文件指针移动到文件开头,后移44字节
while ((read_len = fread(buf, 1, sizeof(buf), wavfile)) != 0) {
fwrite(buf, 1, read_len, pcmfile);
}
fclose(pcmfile);
fclose(wavfile);
return 0;
}
版本2:shell实现 wave to pcm
dd if=1.wav of=1.pcm bs=1 skip=44
版本3:使用python的
def wav2pcm(wavfile, pcmfile, data_type=np.int16):
f = open(wavfile, "rb")
f.seek(0)

本文介绍了Python中处理音频信号的方法,包括WAV格式的读写,使用pyAudio和pyMedia库进行实时输入输出和MP3解码播放。还讨论了音频信号的关键参数如声道数、采样率和量化位数,并提供了将WAV转换为PCM的C语言、shell和Python代码示例。此外,提到了其他音频格式如MP3、ARM、Ogg和AAC的特点和用途。
最低0.47元/天 解锁文章

1万+

被折叠的 条评论
为什么被折叠?



