用Python播放音频

Jos*_*unt 101 python audio

如何从Python脚本播放音频(它可能就像1秒声音)?

如果它与平台无关,那将是最好的,但首先它需要在Mac上运行.

我知道我可以afplay file.mp3从Python中执行命令,但是可以在原始Python中执行吗?如果它不依赖外部库我也会更好.

TML*_*TML 40

你最好的选择可能是使用pygame/SDL.它是一个外部库,但它跨平台提供了很好的支持.

pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
Run Code Online (Sandbox Code Playgroud)

您可以在pygame.mixer.music文档中找到有关音频混音器支持的更多特定文档

  • 请发布一个如何执行此操作的示例 (16认同)
  • 对我来说,这是行不通的。我的意思是,它正在播放但没有声音。我在最后添加了 `time.sleep(5)` 并且奏效了。Windows 8.1 上的 Python 3.6 (4认同)
  • 你也必须初始化pygame混音器.在这些命令之前使用pygame.mixer.init(). (2认同)

Jer*_*ten 18

您可以在此处找到有关Python音频的信息:http://wiki.python.org/moin/Audio/

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

  • 但是如何播放`.wav`文件呢? (10认同)

Erw*_*yer 16

看看Simpleaudio,它是一个相对较新且轻量级的库,用于此目的:

> pip install simpleaudio
Run Code Online (Sandbox Code Playgroud)

然后:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()
Run Code Online (Sandbox Code Playgroud)

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


小智 15

尝试playound,这是一个纯Python,跨平台,单一功能模块,没有依赖播放声音.

通过pip安装:

$ pip install playsound
Run Code Online (Sandbox Code Playgroud)

安装完成后,您可以像这样使用它:

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
Run Code Online (Sandbox Code Playgroud)

  • 读这个让我如此情绪化.我的眼睛真的很幸福.没想到我自己的那种反应.(它们与我制作的模块有关.) (27认同)
  • Playsound 依赖于 python 2 子进程。如果您希望 Playsound 更高效地运行,请使用“pip3 install PyObjC”。 (2认同)

Jia*_*aro 13

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

它适用于我们的目的 - 主要是让它更容易在交互模式下测试pydub代码的结果 - 但它有它的缺点,比如导致新程序出现在mac上的dock中.

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

import subprocess

def play(audio_file_path):
    subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path])
Run Code Online (Sandbox Code Playgroud)

-nodisp标志使ffplay停止显示新窗口,该-autoexit标志导致ffplay退出并在音频文件播放完毕后返回状态代码.

编辑:pydub现在使用pyaudio进行播放,然后回到ffplay以避免我提到的缺点.上面的链接也显示了实现.

  • Pydub 看起来作为包装库有相当大的潜力 - 我现在正在安装它。 (2认同)
  • 该死的 PyDub 看起来不错,而且仍然非常活跃。 (2认同)

Mat*_*ias 12

很抱歉迟到的回复,但我认为这是宣传我的图书馆的好地方...

AFAIK,标准库只有一个用于播放音频的模块:ossaudiodev.遗憾的是,这只适用于Linux和FreeBSD.

更新:还有胜利,但显然这也是特定于平台的.

对于更独立于平台的东西,您需要使用外部库.

我的建议是声音设备模块(但要注意,我是作者).

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

pip install sounddevice --user
Run Code Online (Sandbox Code Playgroud)

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

要播放NumPy阵列,这就是您所需要的(假设音频数据的采样频率为44100 Hz):

import sounddevice as sd
sd.play(myarray, 44100)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 伟大的!这正是我制作有关波浪的课堂演示程序所需要的。 (2认同)

小智 5

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

s = Sound() 
s.read('sound.wav') 
s.play()
Run Code Online (Sandbox Code Playgroud)

  • 看起来很干净,我希望有一个pip包.易于安装是关键 (3认同)

小智 5

可以使用以下代码的类似物在 OS X 中播放音频,而无需任何第三方库。原始音频数据可以通过wave_wave.writeframes输入。此代码从输入文件中提取 4 秒的音频。

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()
Run Code Online (Sandbox Code Playgroud)


Art*_*are 5

Aaron 的答案似乎比必要的复杂 10 倍。如果您只需要一个适用于 OS X 的答案,请执行此操作:

from AppKit import NSSound

sound = NSSound.alloc()
sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True)
sound.play()
Run Code Online (Sandbox Code Playgroud)

一件事......这会立即返回。因此,如果您希望在声音播放完毕之前阻止呼叫,您可能还想这样做。

from time import sleep

sleep(sound.duration())
Run Code Online (Sandbox Code Playgroud)

编辑:我使用了这个函数并将它与 Windows 和 Linux 的变体结合起来。结果是一个纯 python 跨平台模块,没有依赖项,称为playsound。我已将其上传到 pypi。

pip install playsound
Run Code Online (Sandbox Code Playgroud)

然后像这样运行它:

from playsound import playsound
playsound('/path/to/file.wav', block = False)
Run Code Online (Sandbox Code Playgroud)

MP3 文件也适用于 OS X。WAV 应该适用于所有平台。我不知道平台/文件格式的其他组合是否有效 - 我还没有尝试过。

  • @ArtOfWarfare 那简直是_不_真的。它与系统 python 一起安装,但不与大多数发行版一起安装,包括来自 python.org 的官方发行版。我认识的大多数使用 python 的人安装其中一个发行版来绕过 SIP 限制。要获得大多数发行版的 AppKit,用户需要 pip install pyobjc。这使得它最_绝对_依赖。 (2认同)

n00*_*00p 5

这是我发现的最简单、最好的。它支持 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)
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/bastibe/PySoundFilehttps://github.com/bastibe/SoundCard了解大量其他超级有用的功能。