用Python播放声音

用Python播放声音,python,audio,platform-independent,Python,Audio,Platform Independent,在Python中播放声音文件(.wav)最简单的方法是什么?我所说的“最简单”是指最独立于平台和要求最少依赖性的两个方面。pygame当然是一种选择,但仅仅是声音似乎有点过头了。pyMedia的声音示例确实如此。这应该是你所需要的 import time, wave, pymedia.audio.sound as sound f= wave.open( 'YOUR FILE NAME', 'rb' ) sampleRate= f.getframerate() channels= f.getnch

在Python中播放声音文件(.wav)最简单的方法是什么?我所说的“最简单”是指最独立于平台和要求最少依赖性的两个方面。pygame当然是一种选择,但仅仅是声音似乎有点过头了。

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 )
可以播放wav、au和mp3文件

s = Sound() 
s.read('sound.wav') 
s.play()
一定要用这个。这是一个很大的包,但它是纯python,没有扩展模块。这肯定是最容易部署的。它也有很好的格式和编解码器支持

import pyglet

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

pyglet.app.run()

对于Windows,您可以使用winsound。它是内置的

import winsound

winsound.PlaySound('sound.wav', winsound.SND_FILENAME)
您应该能够使用OSSAdiodev for linux:

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)

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

pygame.init()
pygame.mixer.Sound('sound.wav').play()
但在我的两台电脑上都没有,而且在这方面的帮助也很有限。编辑:我弄明白了为什么pygame声音对我不起作用,它没有正确加载大多数声音,加载时“长度”属性为~0.0002。也许用mygame以外的东西加载它们会让它更普遍

在pyglet中,我使用上面的示例得到了一个ResourceNotFound错误,包括文件的相对路径和完整路径

使用
pyglet.media.load()
而不是
pyglet.resource.media()
可以加载文件


但是
sound.play()
只播放文件的前一部分,除非我运行
pyglet.app.run()
,这会阻止其他一切…

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

在play()命令添加10秒左右的延迟后,它就可以工作了

import pygame

import time

pygame.init()

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

pygame.mixer.music.play()

time.sleep(10)

这也可以播放.mp3文件。

我刚刚发布了一个简单的围绕sox的python包装,它将用python播放声音。它非常容易安装,因为您需要Python2.6或更高版本、sox(对于大多数体系结构,易于获取二进制文件)和包装器()。如果您没有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)    

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

这似乎很荒谬,也很牵强,但你可以随时使用Windows(或任何你喜欢的操作系统)为你管理声音

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


简单,没有扩展,有点慢,有点垃圾,但是工作正常。

非常类似的问题。或者这个:呵呵,这很好,但是零食示例所需的代码行要少得多!我相信pymedia更灵活这很好——构建一个至少能为这两个平台工作的包装器似乎很容易。Savoid oss已经过时了。我想我甚至都没有安装它了。OSS并不老。只是Linux用户选择用ALSA取代它,原因更多的是政治和自我,而不是软件开发。无论如何,OSS仍然是唯一的跨平台UNIX声音系统,而且在可预见的未来可能仍将如此。我从这个答案开始,添加了一个同样适用于OS X的变体,并将其作为纯python、跨平台、单功能模块上传到pypi,名为<代码>pip安装playsound。享受吧!我得到一个FileNotFoundError:[Errno 2]没有这样的文件或目录:'/dev/dsp',这个答案应该是在/dev上打开另一个文件吗?这个例子只有一个问题:媒体文件需要在(python-)上路径那很好-只要你不介意pyglet接管python进程。
pyglet.media.sources.riff.WAVEFormatException:不是WAVE文件
@Steen你可以在使用
music=pyglet.media.load(path)
而不是使用手册中的
music=pyglet.resource.media(path)
时指定文件的绝对路径:混音器模块必须像其他pygame模块一样初始化,但它有一些额外的条件。pygame.mixer.init-初始化混合器模块函数采用几个可选参数来控制播放速率和样本大小。Pygame将默认为合理的值,但Pygame无法执行声音重采样,因此应初始化混音器以匹配音频资源的值。“-这可能是您的资源加载不正确的原因…pygame没有对我使用的wave文件使用正确的采样率。它并不总是有效,有时会抛出分段错误等。我不建议这样做。很好。”。了解python具有这一特性并不是python的特性,而是对操作系统中进程的调用。它不是跨平台的,而且非常昂贵跨平台:
从子流程导入调用导入sys
如果sys.play='linux2':
调用([“xdg open”,“sound.mp3]”)
调用([“afplay”,“sound.mp3]”)
代价高昂的是在所有这些出现故障的声音库上浪费时间。用
xdg open
替换
mpg123
将在Linuxyeah上提供
afplay
功能,osx不工作:
sh:start:command not found
这真的很糟糕,因为(在windows下)我可以在音频编辑器中打开音频文件的默认操作。声音永远不会播放,出于某种奇怪的原因,我的音频编辑器会一直打开…Snapshot似乎无法与某些嵌入式系统环境配合使用它在Pypi上也不可用:-(Snapshot似乎已过时(2005年的最新更新-十年前)。您可以使用2to3.py将tkSnack.py转换为Python 3。将tkSnack.py放入“库”Python目录中的文件夹。然后将snacklib文件夹放入Python目录中的“tcl”文件夹中。在Python 3.2上测试。link不适用于Python 3。