用 Python 播放音频

如何播放 Python 脚本中的音频(类似于1秒钟的声音) ?

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

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

272170 次浏览

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

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

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

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

您可以在 混音器,音乐文档中找到更多关于音频混音器支持的具体文档

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

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

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

它可以满足我们的目的——主要是让在交互模式下测试 pydub 代码的结果变得更加容易——但是它也有缺点,比如导致一个新程序出现在 Mac 的底座上。

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

import subprocess


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

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

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

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

玩“ bah.wav”

在我的机器上半秒钟后就开始播放了。

同样在 OSX 上——从 那么开始,使用 OSX 的 一场闹剧命令:

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

更新: 所有这些操作都指定 怎么做来完成 OP 最初想要避免做的事情。我想我把这个贴在这里是因为观察所想要避免的是我想要的信息。哎呀。

很抱歉这么晚才回复,但我认为这是一个为我的图书馆做广告的好地方..。

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

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

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

我的推荐是 音响设备模块(但请注意,我是作者)。

该软件包包括 Mac OS X 和 Windows 预编译的 波特奥迪奥库,可以很容易地安装:

pip install sounddevice --user

它可以从 NumPy 数组回放声音,但也可以使用纯 Python 缓冲区(如果 NumPy 不可用)。

要回放 NumPy 数组,这就是您所需要的全部内容(假设音频数据的采样频率为44100赫兹) :

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

有关更多细节,请参见 文件

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

它可以在 OS X 中播放音频,而不需要任何第三方库,使用下面代码的模拟。原始音频数据可以通过 wave _ wave 进行输入。写帧。此代码从输入文件中提取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()

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

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

/home/maulo/self Project/task.mp3. 这是我的 mp3文件的位置。 在“——播放和退出”的帮助下,您将能够再次播放声音而无需结束 vlc 过程。

看看 简单,它是一个相对较新的轻量级库:

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

尝试 PySoundCard,它使用 PortAudio 播放在许多平台上都可用。 此外,它还能识别拥有多个频道的“专业”声音设备。

这里有一个来自 Readme 的小例子:

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()
把这个放在你正在写的 Python 脚本的顶部:
import subprocess
如果 wav 文件在 python 脚本的目录中:
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
如果 wav 文件不在 python 脚本的目录中:
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
如果你想了解更多关于游戏的知识:
man aplay

这是最简单和最好的 iv’e 发现。它支持 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获得大量其他超级有用的特性。

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

通过 pip 安装:

$ pip install playsound

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

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')

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!

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

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

它需要在设备上预先安装 vlc。

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

使用以下方法安装 playsound软件包:

pip install playsound

用法:

from playsound import playsound
playsound("file location\audio.p3")

试试音响设备

如果没有模块,请输入 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个数据点)的随机数组。巨蟒把它演奏成白噪音。声音设备模块也播放数字数组和列表。

在 Colab 笔记本上,你可以做:

from IPython.display import Audio
Audio(waveform, Rate=16000)

我最近让我的音乐播放器支持本地所有的音频文件。为此,我找到了使用 VLC python 模块和 VLC dll 文件的方法。 你可以看看: Https://github.com/elibroftw/music-caster/blob/master/audio_player.py

很简单,我是这么做的。

一个 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')

对于那些使用 Linux 和其他软件包却不能处理 MP3文件的人来说,audioplayer对我来说还不错:

Https://pypi.org/project/audioplayer/

from audioplayer import AudioPlayer
AudioPlayer("path/to/somemusic.mp3").play(block=True)

这个库的目标是简单、跨平台,并具有许多特性: https://github.com/libwinmedia/libwinmedia-py

它需要一个 Libwinmedia共享库,您可以在“发布”选项卡中下载该库。

您可以使用 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)

这应该适用于 Linux、 Mac 或 Windows:

from preferredsoundplayer import *
soundplay("audio.wav")

也可以用在 mp3上。

在 Linux 中,它将尝试多达4种不同的方法。在 Windows 中它使用 winmm.dll。在 Mac 中使用 afplay。

我这么写是因为:

  • 我一直对播放声音的交叉兼容性有问题。
  • 它还在 Windows 中手动垃圾收集对 winmm.dll 播放器的调用,并适当关闭完成的声音。
  • 除了 Windows 10、标准 Linux 内核、 MacOS 10.5或更高版本以及 Python 标准库之外,它没有任何依赖性。

您可以使用 pip install preferredsoundplayer(见项目)进行安装,也可以只使用单个文件 (源代码)的源代码进行安装。