如何从Python脚本播放音频(就像1秒声音)?
最好是平台无关,但首先需要在Mac上运行。
我知道我可以在Python中执行afplay file.mp3
命令,但是可以在原始Python中执行吗?如果它不依赖外部库我也会更好。
答案 0 :(得分:38)
您最好的选择可能是使用pygame/SDL。它是一个外部库,但它在各个平台上都有很好的支持。
pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()
中找到有关音频混音器支持的更多具体文档
答案 1 :(得分:18)
您可以在此处找到有关Python音频的信息:http://wiki.python.org/moin/Audio/
看起来它不能播放没有外部库的.mp3文件。您可以将.mp3文件转换为.wav或其他格式,也可以使用PyMedia之类的库。
答案 2 :(得分:15)
看看Simpleaudio,这是一个相对较新且轻量级的库,用于此目的:
import java.awt.BorderLayout;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class StopTheLights extends JFrame implements ActionListener {
JButton start;
JButton stop;
Boolean i;
//create constructor method
public StopTheLights(String title) {
// create Start button
start = new JButton("Start");
//create Stop button
stop = new JButton("Stop");
//add Action listeners
start.addActionListener(this);
stop.addActionListener(this);
//create new Button Panel
JPanel buttonPanel = new JPanel();
buttonPanel.add(start);
buttonPanel.add(stop);
Container c = getContentPane();
c.add(buttonPanel, BorderLayout.SOUTH);
setSize(200, 425);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.black);
g.fillOval(50,50,100,100);
g.fillOval(50,155,100,100);
g.fillOval(50,260,100,100);
}
public static void main(String[] args) {
new StopTheLights("Stop The Lights");
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == start){
i = true;
new ThreadExtend(this).start();
}else{
i = false;
}
}
public class ThreadExtend extends Thread {
Graphics g;
JFrame frame;
public ThreadExtend(JFrame frame){
this.frame = frame;
g = frame.getGraphics();
}
public void run(){
while(i) {
try{
red(g);
if(!i) {
break;
}
Thread.sleep(1000);
amber(g);
if(!i) {
break;
}
Thread.sleep(1000);
green(g);
if(!i){
break;
}
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void red(Graphics g){
g.setColor(Color.black);
g.fillOval(52, 262, 96, 96);
g.setColor(new Color(255,0,0));
g.fillOval(52, 52, 96, 96);
}
public void amber(Graphics g){
g.setColor(Color.black);
g.fillOval(52, 52, 96, 96);
g.setColor(new Color(250,170,0));
g.fillOval(52, 157, 96, 96);
}
public void green(Graphics g){
g.setColor(Color.black);
g.fillOval(52, 157, 96, 96);
g.setColor(new Color(0,250,0));
g.fillOval(52, 262, 96, 96);
}
}
然后:
> pip install simpleaudio
确保使用未压缩的16位PCM文件。
答案 3 :(得分:13)
我们最近{fmmpeg工具套件pydub opted to use ffplay (via subprocess),内部使用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以避免我提到的缺点。上面的链接也显示了实现。
答案 4 :(得分:13)
尝试playsound这是一个纯Python,跨平台,单一功能模块,没有依赖播放声音。
通过pip安装:
$ pip install playsound
安装完成后,您可以像这样使用它:
from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')
答案 5 :(得分:11)
很抱歉迟到的回复,但我认为这是宣传我的图书馆的好地方......
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)
有关详细信息,请查看documentation。
它无法读取/写入声音文件,您需要一个单独的库。
答案 6 :(得分:5)
您可以看到:http://www.speech.kth.se/snack/
s = Sound()
s.read('sound.wav')
s.play()
答案 7 :(得分:3)
同样在OSX上 - 来自SO,使用OSX的afplay命令:
import subprocess
subprocess.call(["afplay", "path/to/audio/file"])
更新:所有这一切都是指定如何来做OP想要避免做的事情。我想我在这里发布了这个,因为OP想要避免的是我正在寻找的信息。糟糕。
答案 8 :(得分:3)
Aaron's answer似乎比必要的复杂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应该适用于所有平台。我不知道平台/文件格式的其他组合是做什么还是不起作用 - 我还没有尝试过它们。
答案 9 :(得分:2)
尝试PySoundCard使用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()
答案 10 :(得分:2)
可以使用以下代码的模拟在没有任何第三方库的情况下在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()
答案 11 :(得分:1)
这是最简单的&最好的发现。它支持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了解大量其他超级实用的功能。
答案 12 :(得分:1)
Pypi有一个音乐python模块列表。我最喜欢的是jython,因为它有更多的资源和音乐库。作为从textbook:
播放单个音符的代码示例# 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!
答案 13 :(得分:1)
使用以下命令安装playsound
软件包:
pip install playsound
用法:
from playsound import playsound
playsound("file location\audio.p3")
答案 14 :(得分:0)
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
答案 15 :(得分:0)
如果您使用的是OSX,则可以使用" os"模块或"子过程"打电话给OSX"播放"命令。从OSX shell看起来像
播放" bah.wav"
它开始在我的机器上播放大约半秒钟。
答案 16 :(得分:0)
要使用python播放通知声音,请调用音乐播放器,例如vlc。 VLC促使我使用其命令行版本cvlc,而不是
from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])
它要求在设备上预安装vlc。在Linux上测试(Ubuntu 16.04 LTS);运行Python 3.5。
答案 17 :(得分:0)
在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
答案 18 :(得分:0)
尝试使用声音设备
如果没有模块,请输入
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文件
干杯, 查理
P.S。
一旦音频是“ librosa”数据对象,Python会将其视为一个numpy数组。作为实验,尝试播放一个长(尝试20,000个数据点)的随机numpy数组。 Python应该把它当作白噪声播放。 sounddevice模块也播放numpy数组和列表。
答案 19 :(得分:0)
在Colab笔记本中,您可以执行以下操作:
from IPython.display import Audio
Audio(waveform, Rate=16000)
答案 20 :(得分:0)
我最近使我的音乐播放器在本地支持所有音频文件。我通过找出使用vlc python模块以及VLC dll文件的方法来做到这一点。 您可以查看一下: https://github.com/elibroftw/music-caster/blob/master/audio_player.py
答案 21 :(得分:0)
很简单。我是这样做的。
对于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')
答案 22 :(得分:-1)
您可以在cvlc-的帮助下完成 我是这样做的:
import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")
/home/maulo/selfProject/task.mp3。这是我的mp3文件的位置。 在&#34; - 播放和退出&#34;的帮助下您将能够在不结束vlc过程的情况下再次播放声音。