sound reproduce playsound play python audio pygame pyglet

reproduce - ¿Cómo reproducir un archivo wav en python?



python play wav (2)

Probé pygame para reproducir un archivo wav como este:

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

Pero cambia la voz y no sé por qué! ¡Leí las soluciones de este enlace y no puedo resolver mi problema con la reproducción del archivo wave!

¿Para esta solución no sé qué debo importar?

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

y para esta solución / dev / dsp no existen en la nueva versión de 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()

y cuando probé pyglet me dio este 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


La razón por la que pygame cambia su audio es la configuración predeterminada del mezclador a una frecuencia de muestreo de 22k:

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

Tu wav es probablemente 8k. Así que cuando Pygame lo juega, juega aproximadamente el doble de rápido. Así que especifique su frecuencia wav en el init.

Pyglet tiene algunos problemas para leer correctamente los encabezados RIFF. Si tiene un archivo wav muy básico (con exactamente un bloque fmt de 16 bytes) sin ninguna otra información en el fragmento fmt (como datos de ''datos''), funciona. Pero no proporciona provisión de datos adicionales en los fragmentos, por lo que realmente no se adhiere a la especificación de la interfaz RIFF.


Puedes usar PyAudio . Un ejemplo aquí en mi Linux funciona:

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