# 声音的输入输出
在本章我们将学习如何读写WAV文件,如何利用声卡实时地进行声音的输入输出。标准的Python已经支持WAV文件的读写,而实时的声音输入输出需要安装pyAudio([http://people.csail.mit.edu/hubert/pyaudio](http://people.csail.mit.edu/hubert/pyaudio))。最后我们还将看看如何使用pyMedia([http://pymedia.org](http://pymedia.org))进行Mp3的解码和播放。
掌握了上面的基础知识之后,就可以做许多有趣的声效处理的算法实验了。声效处理方面的内容将在以后的章节详细介绍。
## 读写Wave文件
WAV是Microsoft开发的一种声音文件格式,虽然它支持多种压缩格式,不过它通常被用来保存未压缩的声音数据(PCM脉冲编码调制)。WAV有三个重要的参数:声道数、取样频率和量化位数。
* 声道数:可以是单声道或者是双声道
* 采样频率:一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz, 11.025kHz, 22.05kHz, 44.1kHz
* 量化位数:用多少bit表达一次采样所采集的数据,通常有8bit、16bit、24bit和32bit等几种
例如CD中所储存的声音信号是双声道、44.1kHz、16bit。
如果你需要自己录制和编辑声音文件,推荐使用Audacity([http://audacity.sourceforge.net](http://audacity.sourceforge.net)),它是一款开源的、跨平台、多声道的录音编辑软件。在我的工作中经常使用Audacity进行声音信号的录制,然后再输出成WAV文件供Python程序处理。
### 读Wave文件
下面让我们来看看如何在Python中读写声音文件:
```
# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np
# 打开WAV文档
f = wave.open(r"c:\WINDOWS\Media\ding.wav", "rb")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# 读取波形数据
str_data = f.readframes(nframes)
f.close()
#将波形数据转换为数组
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data.shape = -1, 2
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)
# 绘制波形
pl.subplot(211)
pl.plot(time, wave_data[0])
pl.subplot(212)
pl.plot(time, wave_data[1], c="g