用 Python 播放声音 [重复]

Posted

技术标签:

【中文标题】用 Python 播放声音 [重复]【英文标题】:Play a Sound with Python [duplicate] 【发布时间】:2008-11-20 23:40:34 【问题描述】:

在 Python 中播放声音文件 (.wav) 的最简单方法是什么?最简单的意思是最独立的平台和需要最少的依赖项。 pygame 当然是一种选择,但对于声音来说似乎有点过分了。

【问题讨论】:

与***.com/questions/260738/play-audio-with-python非常相似的问题。 或者这个:***.com/questions/276266/… 【参考方案1】:

对于 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

【讨论】:

这很好 - 构建一个至少适用于这两个平台的包装器似乎很容易 避免使用oss,它已经过时了。我想我什至没有安装它了。 OSS 并不老。只是 Linux 人选择用 ALSA 代替它,其原因更多地与政治和自我有关,而不是与软件开发有关。无论如何,OSS 仍然是唯一的跨平台 UNIX 声音系统,并且在可预见的未来很可能仍然如此。 我从这个答案开始,添加了一个也适用于 OS X 的变体,并将其作为纯 python、跨平台、单功能模块上传到 pypi,称为playsound。 pip install playsound。享受吧! 我得到一个 FileNotFoundError: [Errno 2] No such file or directory: '/dev/dsp',这个答案是否应该在 /dev 上打开另一个文件?【参考方案2】:

The Snack Sound Toolkit可以播放wav、au、mp3文件。

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

【讨论】:

Snack 似乎不适用于某些嵌入式系统环境 它在 Pypi 上也不可用 :-( Snack 似乎已经死了(2005 年最新更新 - 十年前)。 您可以使用 2to3.py 将 tkSnack.py 转换为 Python 3。将 tkSnack.py 放入 Python 目录的“Lib”文件夹中。然后将snacklib 文件夹放入Python 目录中的“tcl”文件夹中。在 Python 3.2 上测试。【参考方案3】:

这似乎很荒谬且牵强,但您始终可以使用 Windows(或您喜欢的任何操作系统)为您管理声音!

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

简单,没有扩展,有点慢和垃圾,但工作。

【讨论】:

不错。知道python有这个功能打开了很多可能性 这不是 python 的特性,它是对操作系统中进程的调用。它不是跨平台的,而且非常昂贵 跨平台:import sysfrom subprocess import callif sys.platform == 'linux2':call(["xdg-open","sound.mp3"])elif sys.platform == 'darwin':call(["afplay","sound.mp3"])在所有这些故障声音库上浪费时间是昂贵的。将xdg-open 替换为mpg123 将在Linux 上提供afplay 功能 是的,osx 不工作:sh: start: command not found 这真的很糟糕,因为(在 Windows 下)我可以在音频编辑器中打开音频文件的默认操作。声音永远不会播放,并且出于某种奇怪的原因,我的音频编辑器会一直打开......【参考方案4】:

为此绝对使用Pyglet。这是一个大包,但它是纯python,没有扩展模块。这肯定是最容易部署的。它还具有出色的格式和编解码器支持。

import pyglet

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

pyglet.app.run()

【讨论】:

这个例子只有一个问题:媒体文件需要在(python-)路径上 没关系 - 只要你不介意 pyglet 接管 python 进程。 pyglet.media.sources.riff.WAVEFormatException: Not a WAVE file @Steen 你可以在使用music=pyglet.media.load(path)而不是music = pyglet.resource.media(path)时指定文件的绝对路径【参考方案5】:

在 play() 命令后添加 10 秒左右的延迟,它会起作用

import pygame

import time

pygame.init()

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

pygame.mixer.music.play()

time.sleep(10)

这也可以播放 .mp3 文件。

【讨论】:

pygame 没有对我使用的波形文件使用正确的采样率 并不总是有效,有时会抛出分段错误等。我不推荐这个。【参考方案6】:

pyMedia 的声音示例是 just that。这应该就是您所需要的。

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 更灵活【参考方案7】:

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

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

但它在我的任何一台计算机上都没有,并且在该主题上的帮助有限。编辑:我知道为什么 pygame 声音对我不起作用,它没有正确加载大多数声音,当我加载它们时,“长度”属性为 ~0.0002。也许使用 mygame 以外的其他东西加载它们会更普遍。

使用 pyglet 时出现资源未找到错误 使用上面的示例,获取文件的相对路径和完整路径。

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

sound.play() 只播放文件的前一秒,除非我运行pyglet.app.run() 会阻止其他所有内容...

【讨论】:

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

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

【讨论】:

【参考方案9】:

我刚刚发布了一个简单的围绕 sox 的 python 包装器,它将用 Python 播放声音。它很容易安装,因为您需要 Python 2.6 或更高版本、sox(对于大多数架构来说很容易获得二进制文件)和包装器(https://github.com/standarddeviant/sound4python)。如果你没有袜子,去这里: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)    

【讨论】:

【参考方案10】:

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

【讨论】:

链接larsimmisch.github.io/pyalsaaudio/libalsaaudio.html#playwav-py 不适用于 Python 3。

以上是关于用 Python 播放声音 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

声音不会一直播放! - Pygame,Python

播放随机声音而不重复

如何播放简单的系统声音[重复]

Java - 我的声音剪辑无法播放/播放[重复]

如何在 python (Windows) 中播放声音

在 Swift 中重复播放声音文件?