用Python播放音频

时间:2008-11-04 03:11:04

标签: python audio

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

最好是平台无关,但首先需要在Mac上运行。

我知道我可以在Python中执行afplay file.mp3命令,但是可以在原始Python中执行吗?如果它不依赖外部库我也会更好。

23 个答案:

答案 0 :(得分:38)

您最好的选择可能是使用pygame/SDL。它是一个外部库,但它在各个平台上都有很好的支持。

pygame.mixer.init()
pygame.mixer.music.load("file.mp3")
pygame.mixer.music.play()

您可以在pygame.mixer.music documentation

中找到有关音频混音器支持的更多具体文档

答案 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/PySoundFilehttps://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)

把它放在你正在编写的python脚本的顶部:
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过程的情况下再次播放声音。