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