用Python播放audio

如何从Python脚本播放audio(它会像1秒的声音)?

如果它是平台独立的,那么最好,但首先它需要在Mac上工作。

我知道我可以在Python中执行afplay file.mp3命令,但是可以在原始Python中执行吗? 如果不依靠外部的图书馆,我也会更好。

您可以在这里find关于Pythonaudio的信息: http : //wiki.python.org/moin/Audio/

它看起来不像它可以播放.mp3文件没有外部库。 您可以将.mp3文件转换为.wav或其他格式,或者使用像PyMedia这样的库。

你最好的select是使用pygame / SDL 。 这是一个外部图书馆,但它跨平台有很大的支持。

 pygame.mixer.init() pygame.mixer.music.load("file.mp3") pygame.mixer.music.play() 

您可以在pygame.mixer.music文档中find关于audio混音器支持的更多特定文档

在pydub中,我们最近select使用ffmpeg工具套件中的ffplay (通过子 进程 ) ,这套工具在内部使用SDL。

它适用于我们的目的 – 主要是在交互模式下testingpydub代码的结果更容易 – 但是它有缺点,例如导致一个新的程序出现在mac上的dock中。

我已经链接上面的实现,但简化版本如下:

 import subprocess def play(audio_file_path): subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path]) 

-nodisp标志使-nodisp停止显示新窗口, -autoexit标志使-autoexit退出,并在audio文件播放完成时返回状态码。

编辑 :现在pydub使用pyaudio安装时回放,并回落到ffplay,以避免我提到的缺点。 上面的链接也显示了这个实现。

看看Simpleaudio ,这是一个相对较新的轻量级库,

 > pip install simpleaudio 

然后:

 import simpleaudio as sa wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav") play_obj = wave_obj.play() play_obj.wait_done() 

确保使用未压缩的16位PCM文件。

对不起,迟到的回复,但我认为这是一个很好的地方,宣传我的图书馆…

AFAIK,标准库只有一个播放audio模块: ossaudiodev 。 不幸的是,这只适用于Linux和FreeBSD。

更新:还有winsound ,但显然这也是平台特定的。

对于更平台无关的东西,你需要使用外部库。

我的build议是sounddevice模块(但要小心,我是作者)。

该软件包包括用于Mac OS X和Windows的预编译的PortAudio库,可以通过以下方式轻松安装:

 pip install sounddevice --user 

它可以播放来自NumPy数组的声音,但也可以使用普通的Python缓冲区(如果NumPy不可用)。

要播放一个NumPy数组,这就是你所需要的(假设audio数据的采样频率为44100Hz):

 import sounddevice as sd sd.play(myarray, 44100) 

有关更多详细信息,请查看文档 。

它不能读/写声音文件,你需要一个单独的库。

如果您需要可移植的Pythonaudio库,请尝试PyAudio 。 它当然有一个mac端口。

至于mp3文件:在“原始的”Python中当然是可行的,只怕我不得不自己编码一切:)。 如果你能买得起一些外部库,我已经在这里find了一些PyAudio – PyLame示例 。

Pyglet能够通过称为AVbin的外部库来播放audio。 Pyglet是在它支持的每个平台上围绕本地系统调用的一个ctypes包装器。 不幸的是,我不认为标准库中的任何东西都会播放audio。

你可以看到这个: http : //www.speech.kth.se/snack/

 s = Sound() s.read('sound.wav') s.play() 

同样在OSX上,使用OSX的afplay命令:

 import subprocess subprocess.call(["afplay", "path/to/audio/file"]) 

亚伦的答案似乎比需要的要复杂10倍左右。 只要做到这一点,如果你只需要一个适用于OS X的答案:

 from AppKit import NSSound sound = NSSound.alloc() sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True) sound.play() 

有一件事…这立即返回。 所以你可能也想这样做,如果你想要阻止直到声音结束播放。

 from time import sleep sleep(sound.duration()) 

编辑:我采取了这个function,并与Windows和Linux的变种相结合。 结果是一个纯粹的python跨平台模块,没有依赖关系,叫做playsound 。 我已经上传到pypi。

 pip install playsound 

然后像这样运行它:

 from playsound import playsound playsound('/path/to/file.wav', block = False) 

MP3文件也适用于OS X. WAV应该可以在所有平台上运行。 我不知道平台/文件格式还有什么其他组合可以工作 – 我还没有尝试过。

没有一个非标准的库你不能这样做。

对于最终在此线程中的Windows用户,请尝试pythonwin 。 PyGame有一些良好的支持。 对于硬件加速游戏audio,您可能需要通过ctypes调用OpenAL或类似的。

VLC有一些很好的python绑定在这里,对我来说,这比pyglet更好,至less在Mac OS上:

https://wiki.videolan.org/Python_bindings

但不幸的是,它确实依赖于VLC应用程序

可以在OS X中播放audio,而无需使用以下代码模拟器的任何第三方库。 原始audio数据可以用wave_wave.writeframesinput。 该代码从input文件中提取4秒钟的audio。

 import wave import io from AppKit import NSSound wave_output = io.BytesIO() wave_shell = wave.open(wave_output, mode="wb") file_path = 'SINE.WAV' input_audio = wave.open(file_path) input_audio_frames = input_audio.readframes(input_audio.getnframes()) wave_shell.setnchannels(input_audio.getnchannels()) wave_shell.setsampwidth(input_audio.getsampwidth()) wave_shell.setframerate(input_audio.getframerate()) seconds_multiplier = input_audio.getnchannels() * input_audio.getsampwidth() * input_audio.getframerate() wave_shell.writeframes(input_audio_frames[second_multiplier:second_multiplier*5]) wave_shell.close() wave_output.seek(0) wave_data = wave_output.read() audio_stream = NSSound.alloc() audio_stream.initWithData_(wave_data) audio_stream.play() 

尝试使用PortAudio进行播放的PySoundCard ,这在许多平台上都可用。 此外,它还承认有很多频道的“专业”音响设备。

这里有一个自述文件的小例子:

 from pysoundcard import Stream """Loop back five seconds of audio data.""" fs = 44100 blocksize = 16 s = Stream(samplerate=fs, blocksize=blocksize) s.start() for n in range(int(fs*5/blocksize)): s.write(s.read(blocksize)) s.stop() 

如果你在OSX上,你可以使用“os”模块或“subprocess”等来调用OSX“play”命令。 从OSXshell看起来像

播放“bah.wav”

它在我的机器上开始播放大约半秒。

简单的你可以在cvlc的帮助下做到这一点 – 我是这样做的:

 import os os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit") 

/home/maulo/selfProject/task.mp3。 这是我的mp3文件的位置。 在“ – 播放和退出”的帮助下,您将能够播放声音而不会结束vlc进程。

把它放在你正在写的python脚本的顶部:

 import subprocess 

如果wav文件是在python脚本的目录中:

 f = './mySound.wav' subprocess.Popen(['aplay','-q',f) 

如果wav文件不在python脚本的目录中:

 f = 'mySound.wav' subprocess.Popen(['aplay','-q', 'wav/' + f) 

如果你想了解更多关于aplay:

 man aplay 

这是最简单和最好的iv'e发现。 它支持Linux / pulseaudio,Mac / coreaudio和Windows / WASAPI。

 import soundfile as sf import soundcard as sc default_speaker = sc.default_speaker() samples, samplerate = sf.read('bell.wav') default_speaker.play(samples, samplerate=samplerate) 

请参阅https://github.com/bastibe/PySoundFile和https://github.com/bastibe/SoundCard获取大量其他超级有用的function。;