Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to play wav file in python?

I tried pygame for playing wav file like this:

import pygame pygame.init()  pygame.mixer.music.load("mysound.wav") pygame.mixer.music.play() pygame.event.wait() 

but It change the voice and I don't know why! I read this link solutions and can't solve my problem with playing wave file!

for this solution I dont know what should I import?

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

and for this solution /dev/dsp dosen't exist in new version of linux :

from wave import open as waveOpen from ossaudiodev import open as ossOpen s = waveOpen('tada.wav','rb') (nc,sw,fr,nf,comptype, compname) = s.getparams( ) dsp = ossOpen('/dev/dsp','w') try:   from ossaudiodev import AFMT_S16_NE except ImportError:   if byteorder == "little":     AFMT_S16_NE = ossaudiodev.AFMT_S16_LE   else:     AFMT_S16_NE = ossaudiodev.AFMT_S16_BE dsp.setparameters(AFMT_S16_NE, nc, fr) data = s.readframes(nf) s.close() dsp.write(data) dsp.close() 

and when I tried pyglet It give me this error:

import pyglet  music = pyglet.resource.media('mysound.wav') music.play()  pyglet.app.run() --------------------------  nima@ca005 Desktop]$ python play.py Traceback (most recent call last):   File "play.py", line 4, in <module>     music = pyglet.resource.media('mysound.wav')   File "/usr/lib/python2.7/site-packages/pyglet/resource.py", line 587, in media     return media.load(path, streaming=streaming)   File "/usr/lib/python2.7/site-packages/pyglet/media/__init__.py", line 1386, in load     source = _source_class(filename, file)   File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 194, in __init__     format = wave_form.get_format_chunk()   File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 174, in get_format_chunk     for chunk in self.get_chunks():   File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 110, in get_chunks     chunk = cls(self.file, name, length, offset)   File "/usr/lib/python2.7/site-packages/pyglet/media/riff.py", line 155, in __init__     raise RIFFFormatException('Size of format chunk is incorrect.') pyglet.media.riff.RIFFFormatException: Size of format chunk is incorrect. AL lib: ReleaseALC: 1 device not closed 
like image 826
nim4n Avatar asked Jul 15 '13 14:07

nim4n


People also ask

What Python module allows you to read and write WAV files?

The wave module provides a convenient interface to the WAV sound format.


2 Answers

You can use PyAudio. An example here on my Linux it works:

#!usr/bin/env python   #coding=utf-8    import pyaudio   import wave    #define stream chunk    chunk = 1024    #open a wav format music   f = wave.open(r"/usr/share/sounds/alsa/Rear_Center.wav","rb")   #instantiate PyAudio   p = pyaudio.PyAudio()   #open stream   stream = p.open(format = p.get_format_from_width(f.getsampwidth()),                   channels = f.getnchannels(),                   rate = f.getframerate(),                   output = True)   #read data   data = f.readframes(chunk)    #play stream   while data:       stream.write(data)       data = f.readframes(chunk)    #stop stream   stream.stop_stream()   stream.close()    #close PyAudio   p.terminate()   
like image 148
zhangyangyu Avatar answered Oct 08 '22 03:10

zhangyangyu


The reason pygame changes your audio is mixer defaults to a 22k sample rate:

initialize the mixer module pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None 

Your wav is probably 8k. So when pygame plays it, it plays roughly twice as fast. So specify your wav frequency in the init.

Pyglet has some problems correctly reading RIFF headers. If you have a very basic wav file (with exactly a 16 byte fmt block) with no other information in the fmt chunk (like 'fact' data), it works. But it makes no provision for additional data in the chunks, so it's really not adhering to the RIFF interface specification.

like image 31
Gene Avatar answered Oct 08 '22 03:10

Gene