web-dev-qa-db-fra.com

Python: streaming audio en temps réel avec PyAudio (ou autre chose)?

Actuellement, j'utilise NumPy pour générer le fichier WAV à partir d'un tableau NumPy. Je me demande s'il est possible de jouer le tableau NumPy en temps réel avant qu'il ne soit réellement écrit sur le disque dur. Tous les exemples que j'ai trouvés en utilisant PyAudio reposent d'abord sur l'écriture du tableau NumPy dans un fichier WAV, mais j'aimerais avoir une fonction de prévisualisation qui crache simplement le tableau NumPy sur la sortie audio.

Devrait également être multiplateforme. J'utilise Python 3 (distribution Anaconda).

13
Mario Krušelj

Cela a fonctionné! Merci pour l'aide!

def generate_sample(self, ob, preview):
    print("* Generating sample...")
    tone_out = array(ob, dtype=int16)

    if preview:
        print("* Previewing audio file...")

        bytestream = tone_out.tobytes()
        pya = pyaudio.PyAudio()
        stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True)
        stream.write(bytestream)
        stream.stop_stream()
        stream.close()

        pya.terminate()
        print("* Preview completed!")
    else:
        write('sound.wav', SAMPLE_RATE, tone_out)
        print("* Wrote audio file!")

Cela semble si simple maintenant, mais quand vous ne connaissez pas très bien Python, cela semble être un enfer.

13
Mario Krušelj

C'est vraiment simple avec python-sounddevice :

import sounddevice as sd
sd.play(myarray, 44100)
8
Matthias

Comme vous pouvez le voir dans les exemples , pyaudio lit simplement les données du fichier WAV et les écrit dans le flux.

Il n'est pas nécessaire d'écrire d'abord un fichier WAV, vous avez juste besoin d'un flux de données au bon format .

J'ajoute l'exemple ci-dessous au cas où le lien deviendrait mort (notez que je n'ai pas écrit ce code):

"""PyAudio Example: Play a WAVE file."""

import pyaudio
import wave
import sys

CHUNK = 1024

if len(sys.argv) < 2:
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
    sys.exit(-1)

wf = wave.open(sys.argv[1], '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()
3
Roland Smith