comment jouer le fichier wav en python?
j'ai essayé pygame pour jouer le fichier wav comme ceci:
import pygame
pygame.init()
pygame.mixer.music.load("mysound.wav")
pygame.mixer.music.play()
pygame.event.wait()
mais ça change la voix et je ne sais pas pourquoi! J'ai lu ce lien solutions et ne peut pas résoudre mon problème avec la lecture de fichier wave!
pour cette solution je ne sais pas ce que je dois importer?
s = Sound()
s.read('sound.wav')
s.play()
et pour cette solution, / dev/dsp n'existe pas dans la nouvelle version 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()
et quand j'ai essayé pyglet me donne cette erreur:
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
2 réponses
Vous pouvez utiliser PyAudio. Un exemple ici sur mon Linux ça marche:
#!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()
la raison pour laquelle pygame change votre audio est mixer par défaut à un taux d'échantillon de 22k:
initialize the mixer module
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096): return None
votre wav est probablement 8k. Donc quand pygame le joue, il joue à peu près deux fois plus vite. Alors spécifiez votre fréquence wav dans l'init.
Pyglet a quelques problèmes pour lire correctement les en-têtes RIFF. Si vous avez un fichier wav très basique (avec exactement un bloc de 16 octets fmt) sans aucune autre information dans le chunk fmt (comme les données "fact"), cela fonctionne. Mais il ne prévoit pas de dispositions supplémentaires. données dans les morceaux, donc il est vraiment pas adhérer à la spécification de L'interface RIFF.