使用Python播放声音

116

使用Python播放音频文件(.wav)最简单的方法是什么? "最简单"的意思是最具平台独立性且需要最少的依赖项。Pygame当然是一个选择,但它似乎对于仅需播放音频来说有些过度。


非常类似于 https://dev59.com/hXVC5IYBdhLWcg3wixs0 的问题。 - Paige Ruten
或者这个:https://dev59.com/cnVC5IYBdhLWcg3wfxM8 - lpfavreau
10个回答

120

对于 Windows 操作系统,您可以使用内置的 winsound 模块。

import winsound

winsound.PlaySound('sound.wav', winsound.SND_FILENAME)

你应该能够在Linux中使用ossaudiodev:

from wave import open as waveOpen
from ossaudiodev import open as ossOpen
s = waveOpen('tada.wav','rb')
(nc,sw,fr,nf,comptype, compname) = s.getparams( )
dsp = ossOpen('/dev/dsp','w')
try:
  from ossaudiodev import AFMT_S16_NE
except ImportError:
  from sys import byteorder
  if byteorder == "little":
    AFMT_S16_NE = ossaudiodev.AFMT_S16_LE
  else:
    AFMT_S16_NE = ossaudiodev.AFMT_S16_BE
dsp.setparameters(AFMT_S16_NE, nc, fr)
data = s.readframes(nf)
s.close()
dsp.write(data)
dsp.close()

(ossaudiodev致谢:Bill Dandreta http://mail.python.org/pipermail/python-list/2004-October/288905.html)


3
避免使用OSS,这是一个老旧的软件。我甚至不认为我还安装了它。 - Jeffrey Aylesworth
8
OSS并不过时,只是Linux的人们出于政治和自尊心等原因选择用ALSA代替它。尽管如此,OSS仍然是唯一的跨平台UNIX音频系统,并且在可预见的未来可能仍将如此。 - Martin Tournoij
我认为这是最直接的方法。我仍然使用Windows,我认为这个解决方案可行。 - swdev
4
我开始翻译这个答案,增加了一种在 OS X 上也适用的变体,并将其作为一个纯 Python、跨平台、单功能模块上传到了 PyPI 中,称之为 playsound。可以通过 pip install playsound 安装。享受吧! - ArtOfWarfare
2
我收到了一个FileNotFoundError错误:[Errno 2]没有这样的文件或目录:'/dev/dsp',这个答案是否应该在/dev上打开另一个文件? - lapisdecor
显示剩余4条评论

30

这似乎有些荒谬且难以实现,但你可以始终使用Windows(或您喜欢的任何操作系统)来为您管理声音!

import os
os.system("start C:/thepathyouwant/file")

简单,没有扩展功能,有点慢且有些瑕疵,但可用。


2
不错。知道Python有这个功能,开启了许多可能性。 - swdev
15
这不是Python的特性,而是调用操作系统中的一个进程。它无法跨平台,并且非常昂贵。 - ealfonso
23
跨平台: 导入sys 从子进程中导入调用 如果sys.platform == 'linux2': 调用(["xdg-open","sound.mp3"]) elif sys.platform == 'darwin': 调用(["afplay","sound.mp3"]) 说实话,浪费时间在所有这些不正常的声音库上是很昂贵的。将xdg-open替换为mpg123将在Linux上提供afplay功能。 - Louis Maddox
2
是的,OSX不起作用:sh: start: command not found - Julio Marins
11
这真的很糟糕,因为(在Windows下),我可以将音频文件的默认操作设置为在音频编辑器中打开。声音永远不会播放,而是因为某种奇怪的原因,我的音频编辑器总是会自动打开... - RedX
显示剩余3条评论

30

Snack 似乎无法在某些嵌入式系统环境中正常工作。 - Xun Yang
4
很抱歉,它在Pypi上也无法获得。 :-( - Danimal
35
零食似乎已经没有更新了(最新的更新是2005年,即十年前)。 - Olli
1
你可以使用2to3.py将tkSnack.py转换为Python 3。将tkSnack.py放入Python目录中的“Lib”文件夹中。然后将snacklib文件夹放入Python目录中的“tcl”文件夹中。在Python 3.2上进行测试。 - jacobtohahn

19

对于这个问题,绝对要使用Pyglet。它是一个相当大的包,但它是纯Python编写的,没有扩展模块。这肯定是最容易部署的。它还具有出色的格式和编解码器支持。

import pyglet

music = pyglet.resource.media('music.mp3')
music.play()

pyglet.app.run()

2
这个例子只有一个问题:媒体文件需要在(Python)路径上。 - Steen
2
没问题 - 只要你不介意 pyglet 接管 Python 进程。 - Tom
pyglet.media.sources.riff.WAVEFormatException: Not a WAVE file - Schütze
@Steen,当使用music=pyglet.media.load(path)而不是music=pyglet.resource.media(path)时,您可以指定文件的绝对路径。 - Sayyor Y

9
在play()命令后添加一个10秒左右的延迟,它就会起作用。
import pygame

import time

pygame.init()

pygame.mixer.music.load("test.wav")

pygame.mixer.music.play()

time.sleep(10)

这也可以播放 .mp3 文件。


pygame 对我使用的波形文件没有使用正确的采样率。 - Octopus
1
不总是有效,有时会抛出分段错误等问题。我不建议使用这个。 - Schütze

6

pyMedia的声音示例就是这样。这应该是你所需要的全部。

import time, wave, pymedia.audio.sound as sound
f= wave.open( 'YOUR FILE NAME', 'rb' )
sampleRate= f.getframerate()
channels= f.getnchannels()
format= sound.AFMT_S16_LE
snd= sound.Output( sampleRate, channels, format )
s= f.readframes( 300000 )
snd.play( s )

哈哈,那很好用,但是零食的例子需要更少的代码行!我相信pymedia更灵活。 - Claudiu

3

我喜欢pygame,下面的命令应该可以工作:

pygame.init()
pygame.mixer.Sound('sound.wav').play()

但是在我的两台电脑上都无法运行,而且关于这个问题的帮助有限。编辑:我找出了pygame声音不能正常工作的原因,它没有正确加载大多数声音,当我加载它们时,“长度”属性为~0.0002。也许使用其他方法加载它们会更普遍地使其工作。
使用pyglet时,我遇到了“资源未找到”错误,使用上述示例,使用相对路径和完整路径到文件。
使用pyglet.media.load()而不是pyglet.resource.media()可以让我加载文件。
但是sound.play()只播放文件的前一小部分,除非我运行pyglet.app.run(),否则会阻塞其他所有事情...

1
从手册中: "混音器模块必须像其他pygame模块一样进行初始化,但它有一些额外的条件。 pygame.mixer.init-初始化混音器模块函数需要几个可选参数来控制播放速率和采样大小。 Pygame将默认合理的值,但pygame无法执行声音重采样,因此混音器应该被初始化以匹配您的音频资源的值。" - 这可能是为什么您的资源加载不正确的原因... - Dominic Scheirlinck

2

wxPython支持在Windows和Unix上播放wav文件,但我不确定是否包括Mac。然而,据我所知,它只支持wav文件 - 不支持其他常见格式,如mp3或ogg。


2
我刚刚发布了一个简单的Python包装器,它可以使用Python播放声音。安装非常容易,您只需要Python 2.6或更高版本、sox(大多数架构都有易于获取的二进制文件)和包装器(https://github.com/standarddeviant/sound4python)。如果您没有sox,请访问这里:http://sourceforge.net/projects/sox/files/sox/ 您可以通过以下方式播放音频:
from sound4python import sound
import random
a = []
for idx in xrange(1*16000):
    a.append(random.randint(-16384,16384))
sound(a)

记住,实际上参与播放音频的部分只有这些:
from sound4python import sound
...
sound(a)    

1

对于Linux用户,如果需要进行低级PCM数据操作,请尝试alsaaudio模块。该包中还有一个playwav.py示例。


请看此链接:http://larsimmisch.github.io/pyalsaaudio/libalsaaudio.html#playwav-py - Seph Reed
不支持Python 3。 - Schütze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接