Python Language
pyaudio
Recherche…
Introduction
PyAudio fournit des liaisons Python pour PortAudio, la bibliothèque d'E / S audio multi-plateformes. Avec PyAudio, vous pouvez facilement utiliser Python pour lire et enregistrer de l'audio sur diverses plates-formes. PyAudio est inspiré par:
1.pyPortAudio / fastaudio: liaisons Python pour l'API PortAudio v18.
2.tkSnack: toolkit audio multi-plateforme pour Tcl / Tk et Python.
Remarques
Remarque: stream_callback est appelé dans un thread séparé (à partir du thread principal). Les exceptions qui se produisent dans le stream_callback seront les suivantes:
1 .imprimez une traceback sur une erreur standard pour faciliter le débogage,
2 .queue l’exception à lancer (à un moment donné) dans le thread principal, et
3 .retendez paAbort à PortAudio pour arrêter le flux.
Remarque: N'appelez pas Stream.read () ou Stream.write () si vous utilisez une opération non bloquante.
Voir: Signature de rappel de PortAudio pour plus de détails:
http://portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a8a60fb2a5ec9cbade3f54a9c978e2710
Mode de rappel E / S audio
"""PyAudio Example: Play a wave file (callback version)."""
import pyaudio
import wave
import time
import sys
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')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# define callback (2)
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count)
return (data, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
stream_callback=callback)
# start the stream (4)
stream.start_stream()
# wait for stream to finish (5)
while stream.is_active():
time.sleep(0.1)
# stop stream (6)
stream.stop_stream()
stream.close()
wf.close()
# close PyAudio (7)
p.terminate()
En mode de rappel, PyAudio appelle une fonction de rappel spécifiée (2) chaque fois qu'il a besoin de nouvelles données audio (pour la lecture) et / ou lorsque de nouvelles données audio (enregistrées) sont disponibles. Notez que PyAudio appelle la fonction de rappel dans un thread séparé. La fonction a le callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
signature suivant callback(<input_data>, <frame_count>, <time_info>, <status_flag>)
et doit renvoyer un tuple contenant les trames de données audio frame_count
et un indicateur indiquant s'il y a plus d'images à lire / enregistrer.
Commencez à traiter le flux audio à l'aide de pyaudio.Stream.start_stream () (4), qui appellera la fonction de rappel à plusieurs reprises jusqu'à ce que cette fonction renvoie pyaudio.paComplete .
Pour que le flux reste actif, le thread principal ne doit pas se terminer, par exemple en dormant (5).
Mode de blocage Audio I / O
"" "PyAudio Exemple: Lire un fichier wave." ""
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')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
while len(data) > 0:
stream.write(data)
data = wf.readframes(CHUNK)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
Pour utiliser PyAudio, instanciez d'abord PyAudio en utilisant pyaudio.PyAudio () (1), qui configure le système portaudio.
Pour enregistrer ou lire de l'audio, ouvrez un flux sur le périphérique souhaité avec les paramètres audio souhaités à l'aide de pyaudio.PyAudio.open () (2). Cela configure un pyaudio.Stream pour lire ou enregistrer de l'audio.
Jouez l'audio en écrivant des données audio dans le flux à l'aide de pyaudio.Stream.write () ou lisez les données audio du flux à l'aide de pyaudio.Stream.read () . (3)
Notez qu'en mode " blocage ", chaque pyaudio.Stream.write () ou pyaudio.Stream.read () se bloque jusqu'à ce que toutes les images données / demandées aient été lues / enregistrées. Sinon, pour générer des données audio à la volée ou traiter immédiatement les données audio enregistrées, utilisez le «mode rappel» ( reportez-vous à l'exemple du mode rappel).
Utilisez pyaudio.Stream.stop_stream () pour suspendre la lecture / l'enregistrement et pyaudio.Stream.close () pour terminer le flux. (4)
Enfin, terminez la session portaudio en utilisant pyaudio.PyAudio.terminate () (5)