如何从 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 进程的情况下再次播放声音。