内容
如果想用Python来播放或录制声音,那您就来对地方了!在本教程中,您将学习如何使用一些最流行的音频库在Python中播放和录制声音。您将首先了解最直接的播放和录制声音的方法,然后您将了解一些能够提供更多功能的库,以替换一些多余的代码行。
当本教程结束的时候,您将知道如何实现以下各种结果:
播放MP3与WAV文件,以及其他多种音频格式的文件
播放包含声音的Numpy和Python数组
使用Python录制音频
用多种不同的文件格式保存您所录制的结果或各种音频文件
Playing Audio Files
下面您将看到如何使用选定的Python库播放音频文件。其中一些库允许您播放一系列的音频格式文件,包括MP3和NumPy数组。下面的所有库都允许您播放WAV文件,有些库的代码行要比其他库的多一些:
playsound 如果您只想播放WAV或MP3文件,playsound是最简单的软件包。它只提供简单的回放功能。
simpleaudio 允许您播放WAV文件和NumPy数组,并为您提供检查文件是否仍在播放的选项。
winsound 允许您播放WAV文件或发出扬声器哔声,但它只能在Windows上工作。
python-sounddevice和pyaudio 为portaudio库提供绑定,用于跨平台播放WAV文件。
pydub 需要pyaudio来播放音频,但是安装了ffmpeg后,它可以让您只使用几行代码来播放大量的音频格式。
让我们看一下这些库,逐个录制和播放一下音频。
playsound
from playsound import playsound
playsound('myfile.wav')
有关playsound的文档 表示这个库虽然只是针对WAV和MMP3文件进行了测试,但是也可能能够执行其他格式的文件。
这个库最后一次更新于2017年的6月份。到这篇文章的写作时间(2019年5月)为止,它似乎一直都是能够正常工作的,但是不清楚它是否支持更新的Python版本。
simpleaudio
simpleaudio是一个跨平台的库,可以回放WAV文件而不需要任何依赖关系。下面的代码可以用于播放WAV文件,并且等到文件播放完毕才结束脚本的运行:
import simpleaudio as sa
filename = 'myfile.wav'
wave_obj = sa.WaveObject.from_wave_file(filename)
play_obj = wave_obj.play()
play_obj.wait_done() # Wait until sound has finished playing
各个WAV文件都包含着表示原始音频数据的一个字节序列,以及使用RIFF(Resource Interchange File, 资源交换文件格式)格式的带元数据的头文件。
对于CD录音来说,相应的工业标准是将每个音频样本(与气压相关的单个音频数据点)存储为一个16-byte的值,每秒44100个样本。
为了减小文件大小,以较低的采样率(如每秒8000个采样率)存储一些记录(例如人类语音)可能就足够了,尽管这意味着较高的音频可能无法准确地表示出来。
本教程中讨论的一些库可以播放和录制bytes对象,而其他库则使用NumPy数组存储原始音频数据。
两者都对应于一系列数据点,这些数据点可以以指定的采样率回放以播放声音。对于一个bytes对象,每个样本存储为两个8-byte值的集合,而在NumPy数组中,每个元素可以包含一个与单个样本对应的16-byte值。
这两种数据类型之间的一个重要区别是bytes对象是不可变的,而numpy数组是可变的,使后者更适合生成声音和更复杂的信号处理。有关如何使用numpy的更多信息,请查看我们的NumPy 教程.
simpleaudio允许您使用simpleaudio.play_buffer()播放NumPy和Python数组以及bytes对象。确保您已经安装了NumPy包以及simpleaudio包,以使以下示例能够正常工作。(安装pip后,您可以通过从控制台运行pip install numpy