Cela lit les fichiers mono aifc, mais pour tous les fichiers stéréo, j'obtiens une forte explosion de statique:

import pyaudio
import aifc

CHUNK = 1024

wf = aifc.open('C:\\path_to_file.aiff', 'rb')

p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)

data = wf.readframes(CHUNK)

while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)

stream.stop_stream()
stream.close()

p.terminate()

Le fichier stéréo que je teste avec: https://archive.org/details/TestAifAiffFile

Je suis sur Windows 7, si c'est important.

1
sportsracer48 15 juil. 2015 à 04:03

3 réponses

Meilleure réponse

Échanger tous les autres échantillons fait l'affaire. Chargez le fichier entier dans data, puis faites

a = numpy.fromstring(data, dtype = '<i2')
temp = a[1::2]
a[1::2] = a[::2]
a[::2] = temp

Jouez ensuite a comme s'il s'agissait d'une chaîne d'échantillons audio plutôt que d'un tableau numpy. Je l'ai testé sur deux fichiers aiff différents, et dans les deux cas, il conserve les deux canaux et joue correctement.

Cela fonctionne probablement parce que le fichier a un ordre d'octets opposé à ce que pyaudio attend.

0
sportsracer48 8 août 2015 à 02:04

Au lieu de faire des trucs difficiles avec la chaîne d'octets, vous pouvez également envisager le package audioread. au lieu de aifc / wave / ... Il décode votre fichier audio en utilisant le backend disponible et quel que soit le format de fichier, il renvoie toujours des tampons de données PCM entières signées en petit-bout 16 bits avec lesquelles vous pouvez alimenter pyaudio.

0
nomis nanoc 11 avril 2016 à 23:23

J'ai essayé votre code sous Linux, et j'ai aussi un bruit horrible.

Le module aifc semble lire le fichier correctement, je l'ai converti en un tableau NumPy et cela semble très bien:

import numpy as np

data = wf.readframes(wf.getnframes())
sig = np.frombuffer(data, dtype='<i2').reshape(-1, wf.getnchannels())

Donc je suppose que le problème est dans PyAudio ou dans votre utilisation.

Je ne connais pas de solution mais je peux vous proposer une alternative: utilisez soundfile et sounddevice.

import soundfile as sf
import sounddevice as sd

data, fs = sf.read('02DayIsDone.aif')
sd.play(data, fs, blocking=True)
0
Matthias 29 juil. 2015 à 13:44