This recipe shows how to use PyAudio, a 3rd-party Python audio toolkit, to play a list of WAV files on your computer. This is an enhanced version of a basic WAV code example on the PyAudio site. You can specify either one WAV filename on the command line, like this:
py pyaudio_play_wav.py chimes.wav
or specify a text file containing names of WAV files to play, like this:
py pyaudio_play_wav.py -f wav_fil_list.txt
The only dependency is PyAudio, which you can install with pip.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | '''
Module to play WAV files using PyAudio.
Author: Vasudev Ram - http://jugad2.blogspot.com
Adapted from the example at:
https://people.csail.mit.edu/hubert/pyaudio/#docs
PyAudio Example: Play a wave file.
'''
import pyaudio
import wave
import sys
import os.path
import time
CHUNK_SIZE = 1024
def play_wav(wav_filename, chunk_size=CHUNK_SIZE):
'''
Play (on the attached system sound device) the WAV file
named wav_filename.
'''
try:
print 'Trying to play file ' + wav_filename
wf = wave.open(wav_filename, 'rb')
except IOError as ioe:
sys.stderr.write('IOError on file ' + wav_filename + '\n' + \
str(ioe) + '. Skipping.\n')
return
except EOFError as eofe:
sys.stderr.write('EOFError on file ' + wav_filename + '\n' + \
str(eofe) + '. Skipping.\n')
return
# Instantiate PyAudio.
p = pyaudio.PyAudio()
# Open stream.
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(chunk_size)
while len(data) > 0:
stream.write(data)
data = wf.readframes(chunk_size)
# Stop stream.
stream.stop_stream()
stream.close()
# Close PyAudio.
p.terminate()
def usage():
prog_name = os.path.basename(sys.argv[0])
print "Usage: {} filename.wav".format(prog_name)
print "or: {} -f wav_file_list.txt".format(prog_name)
def main():
lsa = len(sys.argv)
if lsa < 2:
usage()
sys.exit(1)
elif lsa == 2:
play_wav(sys.argv[1])
else:
if sys.argv[1] != '-f':
usage()
sys.exit(1)
with open(sys.argv[2]) as wav_list_fil:
for wav_filename in wav_list_fil:
# Remove trailing newline.
if wav_filename[-1] == '\n':
wav_filename = wav_filename[:-1]
play_wav(wav_filename)
time.sleep(3)
if __name__ == '__main__':
main()
|
After writing it, I tried running the program with many WAV files from the c:\windows\media directory. It worked well for all of them. The sounds were clear.
More details here:
http://jugad2.blogspot.in/2015/10/play-list-of-wav-files-with-pyaudio.html