使用Python播放音频
如何播放Python脚本中的音频(就像1秒的声音) 最好是平台独立,但首先需要在Mac上工作使用Python播放音频,python,audio,Python,Audio,如何播放Python脚本中的音频(就像1秒的声音) 最好是平台独立,但首先需要在Mac上工作 我知道我可以在Python中执行afplay file.mp3命令,但是可以在原始Python中执行吗?如果它不依赖外部库,我也会更好。您可以在这里找到有关Python音频的信息: 它看起来不能在没有外部库的情况下播放.mp3文件。您可以将.mp3文件转换为.wav或其他格式,或者使用类似的库。您最好的选择可能是使用。它是一个外部库,但它跨平台提供了强大的支持 pygame.mixer.init() p
我知道我可以在Python中执行
afplay file.mp3
命令,但是可以在原始Python中执行吗?如果它不依赖外部库,我也会更好。您可以在这里找到有关Python音频的信息:
它看起来不能在没有外部库的情况下播放.mp3文件。您可以将.mp3文件转换为.wav或其他格式,或者使用类似的库。您最好的选择可能是使用。它是一个外部库,但它跨平台提供了强大的支持
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
您可以在中找到有关音频混音器支持的更多具体文档。您可以看到:
在本文中,我们最近从ffmpeg工具套件中了解到,该套件在内部使用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以避免我提到的缺点。上面的链接也显示了该实现。如果您在OSX上,您可以使用“os”模块或“subprocess”等调用OSX“play”命令。从OSX外壳来看,它看起来像 播放“bah.wav” 它在我的机器上大约半秒钟后开始播放。在OSX上也是如此,使用OSX的命令:
更新:所有这些都是指定如何做OP希望首先避免做的事情。我想我把这个贴在这里是因为OP想要避免的是我正在寻找的信息。哎呀。很抱歉回复太晚,但我认为这是一个为我的图书馆做广告的好地方 另外,标准库只有一个用于播放音频的模块:。 遗憾的是,这只适用于Linux和FreeBSD 更新:也有,但显然这也是特定于平台的 对于更独立于平台的内容,您需要使用外部库 我的推荐是模块(但请注意,我是作者) 该软件包包括适用于Mac OS X和Windows的预编译库,可通过以下方式轻松安装:
pip install sounddevice --user
它可以播放来自NumPy数组的声音,但也可以使用普通Python缓冲区(如果NumPy不可用)
要播放NumPy阵列,您只需要这样做(假设音频数据的采样频率为44100 Hz):
有关更多详细信息,请查看
它无法读取/写入声音文件,您需要一个单独的库来读取/写入声音文件。在没有任何第三方库的情况下,可以使用以下类似代码在OS X中播放音频。原始音频数据可通过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()
似乎比必要的复杂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的跨平台模块,没有调用依赖项。我已经上传到pypi了
pip install playsound
然后按如下方式运行:
from playsound import playsound
playsound('/path/to/file.wav', block = False)
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
MP3文件也可以在OSX上使用。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过程的情况下再次播放声音。看一看,这是一个相对较新的轻量级库,用于此目的:
> pip install simpleaudio
然后:
确保使用未压缩的16位PCM文件。尝试使用PortAudio进行播放,这在许多平台上都可用。
此外,它还能识别具有多个频道的“专业”声音设备
下面是自述文件中的一个小示例:
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)
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
如果wav文件不在python脚本的目录中:
f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)
f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)
如果您想了解有关aplay的更多信息:
man aplay
这是最容易和最好的静脉注射。它支持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)
请参阅和,以了解大量其他超级有用的功能。试试这是一个纯Python、跨平台、单功能模块,不依赖于播放声音
通过pip安装:
$ pip install playsound
安装后,您可以像这样使用它:
from playsound import playsound
playsound('/path/to/file.wav', block = False)
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
有音乐中python的模块列表。我最喜欢的是因为它有更多的音乐资源和音乐库。作为从中播放单个音符的代码示例:
要使用python播放通知声音,请调用音乐播放器,如vlc。VLC促使我改用它的命令行版本cvlc
它要求在设备上预先安装vlc。在Linux上测试(Ubuntu 16.04 LTS);运行Python3.5。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
导入pygame
导入时间
pygame.mixer.init()
pygame.init()
pygame.mixer.music.load('fire alarm sound.mp3')*在我的项目文件夹中*
i=0
当我安装playsound
软件包时,请使用:
pip install playsound
用法:
from playsound import playsound
playsound("file location\audio.p3")
试试sounddevice
如果没有模块,请输入
pip安装sounddevice
在您的任期内
pip install playsound
from playsound import playsound
playsound("file location\audio.p3")
import sounddevice as sd
pip install librosa
audio, sr = librosa.load('wave_file.wav')
from IPython.display import Audio
Audio(waveform, Rate=16000)
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)
import IPython.display import Audio
Audio('audio_file_name.mp3')
from audioplayer import AudioPlayer<br>
AudioPlayer("path/to/somemusic.mp3").play(block=True)