2013-07-15 14 views
16

Ho provato Pygame per la riproduzione di file WAV in questo modo:come si gioca a un file wav in python?

import pygame 
pygame.init() 

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

ma cambiare la voce e non so perché! Ho letto le soluzioni this link e non riesco a risolvere il mio problema con la riproduzione del file wave!

per questa soluzione Non so cosa devo importare?

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

e per questa soluzione/dev/dsp dosen't esiste nella nuova versione di 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() 

e quando ho provato pyglet Mi dà questo errore:

import pyglet 

music = pyglet.resource.media('mysound.wav') 
music.play() 

pyglet.app.run() 
-------------------------- 

[email protected] 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 
+0

cosa intendi con "cambia la voce"? – astrognocci

+0

Cambia il suono di un uomo in un suono figlio (mi dispiace il mio inglese non è molto buono e non riesco a trovare la parola giusta per il mio problema) – nim4n

+0

Vuoi dire che suona più acuto di quanto dovrebbe? – astrognocci

risposta

24

È possibile utilizzare PyAudio. Un esempio qui sul mio Linux funziona:

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

Ho ricevuto errori ALSA http://stackoverflow.com/questions/17137701/pyaudio-alsa-error-messages –

+1

Solo un componente aggiuntivo: modifica di 'while data! = '':' A ' while len (data)> 0: 'risolto un problema in cui questo entra in un ciclo infinito. Questo problema si verifica solo dopo un aggiornamento da Python 3.4 a 3.5 con pyaudio 0.2.9 Fonte: [Documentazione PyAudio] (https://people.csail.mit.edu/hubert/pyaudio/docs/) –

6

La ragione Pygame cambia l'audio è di default del mixer a un tasso di campionamento 22k:

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

tuo WAV è probabilmente 8k. Quindi, quando Pygame lo suona, suona all'incirca il doppio della velocità. Quindi specifica la tua frequenza wav in init.

Pyglet ha alcuni problemi nel leggere correttamente le intestazioni RIFF. Se hai un file wav molto semplice (con esattamente un blocco Fmt da 16 byte) senza altre informazioni nel blocco fmt (come i dati "fact"), funziona. Ma non prevede alcun dato aggiuntivo nei blocchi, quindi non aderisce realmente alle specifiche dell'interfaccia RIFF.