使用Python播放音频

使用Python播放音频,python,audio,Python,Audio,如何播放Python脚本中的音频(就像1秒的声音) 最好是平台独立,但首先需要在Mac上工作 我知道我可以在Python中执行afplay file.mp3命令,但是可以在原始Python中执行吗?如果它不依赖外部库,我也会更好。您可以在这里找到有关Python音频的信息: 它看起来不能在没有外部库的情况下播放.mp3文件。您可以将.mp3文件转换为.wav或其他格式,或者使用类似的库。您最好的选择可能是使用。它是一个外部库,但它跨平台提供了强大的支持 pygame.mixer.init() p

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

最好是平台独立,但首先需要在Mac上工作


我知道我可以在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)