Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

How to play an audiofile with pyaudio?

Writer Emily Wong

I do not understand the example material for pyaudio. It seems they had written an entire small program and it threw me off.

How do I just play a single audio file?

Format is not an issue, I just want to know the bare minimum code I need to play an audio file.

3 Answers

May be this small wrapper (warning: created on knees) of their example will help you to understand the meaning of code they wrote.

import pyaudio
import wave
import sys
class AudioFile: chunk = 1024 def __init__(self, file): """ Init audio stream """ self.wf = wave.open(file, 'rb') self.p = pyaudio.PyAudio() self.stream = self.p.open( format = self.p.get_format_from_width(self.wf.getsampwidth()), channels = self.wf.getnchannels(), rate = self.wf.getframerate(), output = True ) def play(self): """ Play entire file """ data = self.wf.readframes(self.chunk) while data != b'': self.stream.write(data) data = self.wf.readframes(self.chunk) def close(self): """ Graceful shutdown """ self.stream.close() self.p.terminate()
# Usage example for pyaudio
a = AudioFile("1.wav")
a.play()
a.close()
7

The example seems pretty clear to me. You simply save the example as playwav.py call:

python playwav.py my_fav_wav.wav

The wave example with some extra comments:

import pyaudio
import wave
import sys
# length of data to read.
chunk = 1024
# validation. If a wave file hasn't been specified, exit.
if len(sys.argv) < 2: print "Plays a wave file.\n\n" +\ "Usage: %s filename.wav" % sys.argv[0] sys.exit(-1)
'''
************************************************************************ This is the start of the "minimum needed to read a wave"
************************************************************************
'''
# open the file for reading.
wf = wave.open(sys.argv[1], 'rb')
# create an audio object
p = pyaudio.PyAudio()
# open stream based on the wave object which has been input.
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()), channels = wf.getnchannels(), rate = wf.getframerate(), output = True)
# read data (based on the chunk size)
data = wf.readframes(chunk)
# play stream (looping from beginning of file to the end)
while data != '': # writing to the stream is what *actually* plays the sound. stream.write(data) data = wf.readframes(chunk)
# cleanup stuff.
stream.close()
p.terminate()
7

This way requires ffmpeg for pydub, but can play not only wave files:

import pyaudio
import sys
from pydub import AudioSegment
if len(sys.argv) <= 1: print('No File Name!') sys.exit(1)
chunk = 1024
fn = ' '.join(sys.argv[1:])
pd = AudioSegment.from_file(fn)
p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(pd.sample_width), channels = pd.channels, rate = pd.frame_rate, output = True)
i = 0
data = pd[:chunk]._data
while data: stream.write(data) i += chunk data = pd[i:i + chunk]._data
stream.close()
p.terminate()
sys.exit(0)

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy