Play audio with Python

PythonAudio

Python Problem Overview


How can I play audio (it would be like a 1 second sound) from a Python script?

It would be best if it was platform independent, but firstly it needs to work on a Mac.

I know I could just execute the afplay file.mp3 command from within Python, but is it possible to do it in raw Python? I would also be better if it didn't rely on external libraries.

Python Solutions


Solution 1 - Python

Your best bet is probably to use pygame/SDL. It's an external library, but it has great support across platforms.

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

You can find more specific documentation about the audio mixer support in the pygame.mixer.music documentation

Solution 2 - Python

Try playsound which is a Pure Python, cross platform, single function module with no dependencies for playing sounds.

Install via pip:

$ pip install playsound

Once you've installed, you can use it like this:

from playsound import playsound
playsound('/path/to/a/sound/file/you/want/to/play.mp3')

Solution 3 - Python

Take a look at Simpleaudio, which is a relatively recent and lightweight library for this purpose:

> pip install simpleaudio

Then:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

Make sure to use uncompressed 16 bit PCM files.

Solution 4 - Python

You can find information about Python audio here: <http://wiki.python.org/moin/Audio/>

It doesn't look like it can play .mp3 files without external libraries. You could either convert your .mp3 file to a .wav or other format, or use a library like PyMedia.

Solution 5 - Python

In pydub we've recently opted to use ffplay (via subprocess) from the ffmpeg suite of tools, which internally uses SDL.

It works for our purposes – mainly just making it easier to test the results of pydub code in interactive mode – but it has it's downsides, like causing a new program to appear in the dock on mac.

I've linked the implementation above, but a simplified version follows:

import subprocess

def play(audio_file_path):
    subprocess.call(["ffplay", "-nodisp", "-autoexit", audio_file_path])

The -nodisp flag stops ffplay from showing a new window, and the -autoexit flag causes ffplay to exit and return a status code when the audio file is done playing.

edit: pydub now uses pyaudio for playback when it's installed and falls back to ffplay to avoid the downsides I mentioned. The link above shows that implementation as well.

Solution 6 - Python

Sorry for the late reply, but I think this is a good place to advertise my library ...

AFAIK, the standard library has only one module for playing audio: ossaudiodev. Sadly, this only works on Linux and FreeBSD.

UPDATE: There is also winsound, but obviously this is also platform-specific.

For something more platform-independent, you'll need to use an external library.

My recommendation is the sounddevice module (but beware, I'm the author).

The package includes the pre-compiled PortAudio library for Mac OS X and Windows, and can be easily installed with:

pip install sounddevice --user

It can play back sound from NumPy arrays, but it can also use plain Python buffers (if NumPy is not available).

To play back a NumPy array, that's all you need (assuming that the audio data has a sampling frequency of 44100 Hz):

import sounddevice as sd
sd.play(myarray, 44100)

For more details, have a look at the documentation.

It cannot read/write sound files, you'll need a separate library for that.

Solution 7 - Python

You can see this: http://www.speech.kth.se/snack/

s = Sound() 
s.read('sound.wav') 
s.play()

Solution 8 - Python

Aaron's answer appears to be about 10x more complicated than necessary. Just do this if you only need an answer that works on OS X:

from AppKit import NSSound

sound = NSSound.alloc()
sound.initWithContentsOfFile_byReference_('/path/to/file.wav', True)
sound.play()

One thing... this returns immediately. So you might want to also do this, if you want the call to block until the sound finishes playing.

from time import sleep

sleep(sound.duration())

Edit: I took this function and combined it with variants for Windows and Linux. The result is a pure python, cross platform module with no dependencies called playsound. I've uploaded it to pypi.

pip install playsound

Then run it like this:

from playsound import playsound
playsound('/path/to/file.wav', block = False)

MP3 files also work on OS X. WAV should work on all platforms. I don't know what other combinations of platform/file format do or don't work - I haven't tried them yet.

Solution 9 - Python

This is the easiest & best iv'e found. It supports Linux/pulseaudio, Mac/coreaudio, and 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)

See https://github.com/bastibe/PySoundFile and https://github.com/bastibe/SoundCard for tons of other super-useful features.

Solution 10 - Python

Also on OSX - from SO, using OSX's afplay command:

import subprocess
subprocess.call(["afplay", "path/to/audio/file"])

UPDATE: All this does is specify how to do what the OP wanted to avoid doing in the first place. I guess I posted this here because what OP wanted to avoid was the info I was looking for. Whoops.

Solution 11 - Python

It is possible to play audio in OS X without any 3rd party libraries using an analogue of the following code. The raw audio data can be input with wave_wave.writeframes. This code extracts 4 seconds of audio from the input file.

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()

Solution 12 - Python

Install playsound package using :

pip install playsound

Usage:

from playsound import playsound
playsound("file location\audio.p3")

Solution 13 - Python

Try PySoundCard which uses PortAudio for playback which is available on many platforms. In addition, it recognizes "professional" sound devices with lots of channels.

Here a small example from the Readme:

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()

Solution 14 - Python

Mac OS I tried a lot of codes but just this works on me

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

Solution 15 - Python

Pypi has a list of modules for python in music. My favorite would be jython because it has more resources and libraries for music. As example of of code to play a single note from the 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!

Solution 16 - Python

In a Colab notebook you can do:

from IPython.display import Audio
Audio(waveform, Rate=16000)

Solution 17 - Python

It's Simple. I did it this way.

For a wav file

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)

For mp3 file

import IPython.display import Audio

Audio('audio_file_name.mp3')

Solution 18 - Python

This library aims to be simple, cross-platform and have many features: https://github.com/libwinmedia/libwinmedia-py

It requires a libwinmedia shared library, which you can download in Releases tab.

You can install it using pip install libwinmedia

Example:

import libwinmedia

player = libwinmedia.Player(True)

player.set_position_callback(lambda position: print(f"{position} ms."))
media = libwinmedia.Media("test.mp3")

player.open(media)

Solution 19 - Python

####Put this at the top of your python script you are writing:

import subprocess

####If the wav file IS in the directory of the python script:

f = './mySound.wav'
subprocess.Popen(['aplay','-q',f)

####If the wav file IS NOT in the directory of the python script:

f = 'mySound.wav'
subprocess.Popen(['aplay','-q', 'wav/' + f)

####If you want to learn more about aplay:

man aplay

Solution 20 - Python

To play a notification sound using python, call a music player, such as vlc. VLC prompted me to use its commandline version, cvlc, instead.

from subprocess import call
call(["cvlc", "--play-and-exit", "myNotificationTone.mp3"])

It requires vlc to be preinstalled on the device. Tested on Linux(Ubuntu 16.04 LTS); Running Python 3.5.

Solution 21 - Python

Try sounddevice

If you don't have the module enter pip install sounddevice in your terminal.

Then in your preferred Python script (I use Juypter), enter

import sounddevice as sd

sd.play(audio, sr) will play what you want through Python

The best way to get the audio and samplerate you want is with the librosa module. Enter this in terminal if you don't have the librosa module.

pip install librosa

audio, sr = librosa.load('wave_file.wav')

Whatever wav file you want to play, just make sure it's in the same directory as your Python script. This should allow you to play your desired wav file through Python

Cheers, Charlie

P.S.

Once audio is a "librosa" data object, Python sees it as a numpy array. As an experiment, try playing a long (try 20,000 data points) thing of a random numpy array. Python should play it as white noise. The sounddevice module plays numpy arrays and lists as well.

Solution 22 - Python

I recently made my Music Player support all audio files locally. I did this by figuring out a way to use the vlc python module and also the VLC dll files. You can check it out: https://github.com/elibroftw/music-caster/blob/master/audio_player.py

Solution 23 - Python

For those who use Linux and the other packages haven't worked on MP3 files, audioplayer worked fine for me:

https://pypi.org/project/audioplayer/

from audioplayer import AudioPlayer
AudioPlayer("path/to/somemusic.mp3").play(block=True)

Solution 24 - Python

If you're on OSX, you can use the "os" module or "subprocess" etc. to call the OSX "play" command. From the OSX shell, it looks like

play "bah.wav"

It starts to play in about a half-second on my machine.

Solution 25 - Python

Simply You can do it with the help of cvlc- I did it in this way:

import os
os.popen2("cvlc /home/maulo/selfProject/task.mp3 --play-and-exit")

/home/maulo/selfProject/task.mp3. This is the location of my mp3 file. with the help of "--play-and-exit" you will be able to play again the sound without ending the vlc process.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJosh HuntView Question on Stackoverflow
Solution 1 - PythonTMLView Answer on Stackoverflow
Solution 2 - Pythonyehan jayaView Answer on Stackoverflow
Solution 3 - PythonErwin MayerView Answer on Stackoverflow
Solution 4 - PythonPaige RutenView Answer on Stackoverflow
Solution 5 - PythonJiaaroView Answer on Stackoverflow
Solution 6 - PythonMatthiasView Answer on Stackoverflow
Solution 7 - Pythonuser1926182View Answer on Stackoverflow
Solution 8 - PythonArtOfWarfareView Answer on Stackoverflow
Solution 9 - Pythonn00pView Answer on Stackoverflow
Solution 10 - PythonMikeiLLView Answer on Stackoverflow
Solution 11 - PythonAaronView Answer on Stackoverflow
Solution 12 - PythonHarishView Answer on Stackoverflow
Solution 13 - PythonStefan BalkeView Answer on Stackoverflow
Solution 14 - PythonCaptain DjangoView Answer on Stackoverflow
Solution 15 - PythonKardi TeknomoView Answer on Stackoverflow
Solution 16 - PythonAxel BregnsboView Answer on Stackoverflow
Solution 17 - PythonAastha VarmaView Answer on Stackoverflow
Solution 18 - PythonmytjaView Answer on Stackoverflow
Solution 19 - PythonCrawsomeView Answer on Stackoverflow
Solution 20 - PythonamarVashishthView Answer on Stackoverflow
Solution 21 - PythonCharlie CarreraView Answer on Stackoverflow
Solution 22 - PythonElijahView Answer on Stackoverflow
Solution 23 - PythongleitonfrancoView Answer on Stackoverflow
Solution 24 - PythonMoondoggyView Answer on Stackoverflow
Solution 25 - PythonpyAddictView Answer on Stackoverflow