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
The wave module provides a convenient interface to the WAV sound format.
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()
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With