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
17
demandé sur Community 2013-07-15 18:47:08

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()  
26
répondu zhangyangyu 2016-12-28 17:02:06

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.

7
répondu Gene 2013-11-07 22:05:31