128

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

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

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

4

25 回答 25

48

您最好的选择可能是使用pygame/SDL。它是一个外部库,但它具有跨平台的强大支持。

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

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

于 2008-11-04T04:40:50.157 回答
36

试试playsound,它是一个纯 Python、跨平台、单一功能模块,不依赖于播放声音。

通过 pip 安装:

$ pip install playsound

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

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
于 2017-11-27T13:57:00.860 回答
21

看看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 文件。

于 2016-03-29T12:17:17.980 回答
18

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

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

于 2008-11-04T03:27:13.457 回答
15

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

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

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

import subprocess

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

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

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

于 2013-12-23T15:54:08.293 回答
14

抱歉回复晚了,但我认为这是为我的图书馆做广告的好地方......

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

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

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

我的推荐是sounddevice模块(但请注意,我是作者)。

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

pip install sounddevice --user

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

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

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

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

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

于 2015-12-09T12:37:18.297 回答
5

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

s = Sound() 
s.read('sound.wav') 
s.play()
于 2012-12-24T07:48:54.450 回答
5

Aaron 的答案似乎比必要的复杂 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())

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

pip install playsound

然后像这样运行它:

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

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

于 2016-01-25T02:24:09.093 回答
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)

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

于 2017-10-05T21:40:14.880 回答
3

同样在 OSX - 来自SO,使用 OSX 的afplay命令:

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

更新:所有这一切都是指定如何做 OP 想要避免做的事情。我想我在这里发布这个是因为 OP 想要避免的是我正在寻找的信息。哎呀。

于 2015-01-31T05:45:03.183 回答
3

可以使用以下代码的模拟在 OS X 中播放音频而无需任何 3rd 方库。可以使用 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()
于 2016-01-02T16:53:43.613 回答
3

使用安装playsound包:

pip install playsound

用法:

from playsound import playsound
playsound("file location\audio.p3")
于 2019-12-20T00:31:10.147 回答
2

尝试使用 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()
于 2016-05-28T17:30:18.083 回答
2

Mac OS 我尝试了很多代码,但这对我有用

import pygame
import time
pygame.mixer.init()
pygame.init()
pygame.mixer.music.load('fire alarm sound.mp3') *On my project folder*
i = 0
while i<10:
    pygame.mixer.music.play(loops=10, start=0.0)
    time.sleep(10)*to protect from closing*
    pygame.mixer.music.set_volume(10)
    i = i + 1
于 2018-11-19T21:15:05.530 回答
1

Pypi有一个音乐中的 python 模块列表。我最喜欢的是jython,因为它有更多的音乐资源和库。作为从教科书中播放单个音符的代码示例:

# playNote.py 
# Demonstrates how to play a single note.

from music import *   # import music library
note = Note(C4, HN)   # create a middle C half note 
Play.midi(note)       # and play it!
于 2018-02-16T15:08:37.603 回答
1

在 Colab 笔记本中,您可以执行以下操作:

from IPython.display import Audio
Audio(waveform, Rate=16000)
于 2020-06-10T15:13:01.010 回答
1

这很简单。我是这样做的。

对于 wav 文件

from IPython.display import Audio
from scipy.io.wavfile import read

fs, data = read('StarWars60.wav', mmap=True)  # fs - sampling frequency
data = data.reshape(-1, 1)
Audio(data = data[:, 0], rate = fs)

对于 mp3 文件

import IPython.display import Audio

Audio('audio_file_name.mp3')
于 2020-11-13T12:29:33.283 回答
1

该库旨在简单、跨平台并具有许多功能:https ://github.com/libwinmedia/libwinmedia-py

它需要一个libwinmedia共享库,您可以在 Releases 选项卡中下载它。

您可以使用安装它pip install libwinmedia

例子:

import libwinmedia

player = libwinmedia.Player(True)

player.set_position_callback(lambda position: print(f"{position} ms."))
media = libwinmedia.Media("test.mp3")

player.open(media)
于 2021-09-11T13:43:52.790 回答
0
把它放在你正在编写的 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
于 2016-11-11T22:16:02.483 回答
0

要使用 python 播放通知声音,请调用音乐播放器,例如 vlc。VLC 提示我改用它的命令行版本 cvlc。

from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])

它需要在设备上预装 vlc。在 Linux 上测试(Ubuntu 16.04 LTS);运行 Python 3.5。

于 2018-02-22T13:10:47.130 回答
0

试试声音设备

如果您没有模块 pip install sounddevice,请在终端中输入。

然后在您首选的 Python 脚本(我使用 Juypter)中,输入

import sounddevice as sd

sd.play(audio, sr)将通过 Python 播放您想要的内容

获得所需音频和采样率的最佳方法是使用 librosa 模块。如果您没有 librosa 模块,请在终端中输入。

pip install librosa

audio, sr = librosa.load('wave_file.wav')

无论您想播放什么 wav 文件,只要确保它与您的 Python 脚本位于同一目录中即可。这应该允许您通过 Python 播放所需的 wav 文件

干杯,查理

附言

一旦音频是一个“librosa”数据对象,Python 将其视为一个 numpy 数组。作为一个实验,尝试播放一个长的(尝试 20,000 个数据点)随机 numpy 数组的东西。Python 应该把它当作白噪声来播放。sounddevice 模块也播放 numpy 数组和列表。

于 2020-04-11T17:42:01.837 回答
0

我最近让我的音乐播放器支持本地的所有音频文件。我通过找出一种使用 vlc python 模块以及 VLC dll 文件的方法来做到这一点。你可以看看: https ://github.com/elibrovtw/music-caster/blob/master/audio_player.py

于 2020-08-03T22:21:55.327 回答
0

对于那些使用 Linux 和其他软件包没有处理 MP3 文件的人,audioplayer对我来说工作得很好:

https://pypi.org/project/audioplayer/

from audioplayer import AudioPlayer
AudioPlayer("path/to/somemusic.mp3").play(block=True)
于 2020-12-26T23:34:36.157 回答
-1

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

播放“bah.wav”

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

于 2014-03-27T13:33:35.500 回答
-1

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

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

/home/maulo/selfProject/task.mp3。这是我的 mp3 文件的位置。在“--play-and-exit”的帮助下,您将能够在不结束 vlc 进程的情况下再次播放声音。

于 2016-03-20T14:41:10.187 回答