如何从 Python 脚本播放音频(就像 1 秒的声音)?
如果它是独立于平台的,那将是最好的,但首先它需要在 Mac 上工作。
我知道我可以afplay file.mp3在 Python 中执行命令,但是可以在原始 Python 中执行吗?如果它不依赖外部库,我也会更好。
您最好的选择可能是使用pygame/SDL。它是一个外部库,但它具有跨平台的强大支持。
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
您可以在pygame.mixer.music 文档中找到有关音频混音器支持的更具体的文档
试试playsound,它是一个纯 Python、跨平台、单一功能模块,不依赖于播放声音。
通过 pip 安装:
$ pip install playsound
安装后,您可以像这样使用它:
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
看看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 文件。
您可以在此处找到有关 Python 音频的信息:http ://wiki.python.org/moin/Audio/
它看起来不像没有外部库就可以播放 .mp3 文件。您可以将 .mp3 文件转换为 .wav 或其他格式,或者使用PyMedia 之类的库。
在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 以避免我提到的缺点。上面的链接也显示了该实现。
抱歉回复晚了,但我认为这是为我的图书馆做广告的好地方......
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)
有关更多详细信息,请查看文档。
它不能读/写声音文件,你需要一个单独的库。
你可以看到这个:http ://www.speech.kth.se/snack/
s = Sound()
s.read('sound.wav')
s.play()
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 应该适用于所有平台。我不知道平台/文件格式的其他组合是否有效 - 我还没有尝试过。
这是我发现的最简单和最好的。它支持 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/PySoundFile和https://github.com/bastibe/SoundCard。
可以使用以下代码的模拟在 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()
使用安装playsound包:
pip install playsound
用法:
from playsound import playsound
playsound("file location\audio.p3")
尝试使用 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()
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
在 Colab 笔记本中,您可以执行以下操作:
from IPython.display import Audio
Audio(waveform, Rate=16000)
这很简单。我是这样做的。
对于 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')
该库旨在简单、跨平台并具有许多功能: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)
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
要使用 python 播放通知声音,请调用音乐播放器,例如 vlc。VLC 提示我改用它的命令行版本 cvlc。
from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])
它需要在设备上预装 vlc。在 Linux 上测试(Ubuntu 16.04 LTS);运行 Python 3.5。
试试声音设备
如果您没有模块
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 数组和列表。
我最近让我的音乐播放器支持本地的所有音频文件。我通过找出一种使用 vlc python 模块以及 VLC dll 文件的方法来做到这一点。你可以看看: https ://github.com/elibrovtw/music-caster/blob/master/audio_player.py
对于那些使用 Linux 和其他软件包没有处理 MP3 文件的人,audioplayer对我来说工作得很好:
https://pypi.org/project/audioplayer/
from audioplayer import AudioPlayer
AudioPlayer("path/to/somemusic.mp3").play(block=True)
如果你在 OSX 上,你可以使用“os”模块或“subprocess”等来调用 OSX 的“play”命令。从 OSX 外壳来看,它看起来像
播放“bah.wav”
它开始在我的机器上播放大约半秒。
简单地你可以在 cvlc 的帮助下做到这一点——我是这样做的:
import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")
/home/maulo/selfProject/task.mp3。这是我的 mp3 文件的位置。在“--play-and-exit”的帮助下,您将能够在不结束 vlc 进程的情况下再次播放声音。