2013-07-15 13 views
16

Próbowałem Pygame do odtwarzania wav tak:jak odtwarzać plik wav w python?

import pygame 
pygame.init() 

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

ale to zmienić głos, a ja nie wiem dlaczego! Czytam rozwiązania this link i nie mogę rozwiązać mojego problemu z odtwarzaniem pliku wave!

za to rozwiązanie Nie wiem, co mam zaimportować?

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

i do tego roztworu/dev/dsp nie robi istnieć w nowej wersji systemu 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() 

i kiedy próbowałem pyglet to daje mi ten błąd:

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

co masz na myśli przez "to zmienić głos"? – astrognocci

+0

To zmienia dźwięk człowieka na dźwięk dziecka (przepraszam, mój angielski nie jest zbyt dobry i nie mogę znaleźć odpowiedniego słowa na mój problem) – nim4n

+0

Masz na myśli, że brzmi on wyżej niż powinien? – astrognocci

Odpowiedz

24

Możesz użyć PyAudio. Przykładem tutaj na moim Linuksie to działa:

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

Otrzymuję błędy ALSA http://stackoverflow.com/questions/17137701/pyaudio-alsa-error-messages –

+1

Tylko jeden dodatek: zmiana 'podczas danych! = '':' To ' while len (data)> 0: 'rozwiązało problem, w którym to znajduje się w nieskończonej pętli. Ten problem występuje tylko po aktualizacji z Pythona 3.4 na 3.5 z pyaudio 0.2.9 Źródło: [PyAudio Documentation] (https://people.csail.mit.edu/hubert/pyaudio/docs/) –

6

Powodem pygame zmienia dźwięk jest domyślnie mikser do szybkości 22k próbek:

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

Twój WAV to prawdopodobnie 8k. Kiedy pygame to odtwarza, gra z grubsza dwa razy szybciej. Określ częstotliwość WAV w init.

Pyglet ma pewne problemy z poprawnym odczytaniem nagłówków RIFF. Jeśli masz bardzo prosty plik wav (z dokładnie 16-bajtowym blokiem fmt) bez żadnych innych informacji w porcji fmt (jak dane "fakt"), to działa. Nie uwzględnia jednak dodatkowych danych w porcjach, więc naprawdę nie jest zgodny ze specyfikacją interfejsu RIFF.

Powiązane problemy