web-dev-qa-db-fra.com

Lecture du signal sonore entrant avec Python

Je dois obtenir un signal sonore d'un microphone branché et utiliser les données pour un traitement immédiat en Python.

Le traitement et les étapes suivantes sont clairs. Je suis seulement perdu à recevoir le signal du programme. Le nombre de canaux est sans importance, un suffit. Je ne vais pas reproduire le son, il ne devrait donc pas être nécessaire d'utiliser ASIO sur la carte son.

Ma question est la suivante: comment puis-je capturer l'audio Jack à partir de Python? (Ce serait bien s'il y avait un paquet, bien documenté et des exemples de niches :-).

26
Victor Pira

Avez-vous essayé pyaudio ?
Pour installer: python -m pip install pyaudio
Exemple d’enregistrement sur le site officiel:

    """PyAudio example: Record a few seconds of audio and save to a WAVE file."""

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.Paint16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

Cet exemple fonctionne sur mon ordinateur portable avec Python 2.7.11 (et 3.5.1) dans Windows 8.1, pyaudio 0.2.9.

32
alr

Envisagez-vous d’obtenir l’audio du microphone en morceaux ou en streaming? Dans les deux cas, sounddevice peut être utilisé.

Vous pouvez installer le module python en utilisant
pip install sounddevice --user

Veuillez vous référer au site officiel pour plus de détails sur l'API.

sounddevice enregistrera le son du microphone de votre ordinateur portable (entrée audio standard) et sera lu sur un haut-parleur ou un casque (sortie audio standard). Vous pouvez utiliser l'objet son pour un traitement ultérieur.

import sounddevice as sd
import numpy as np
import scipy.io.wavfile as wav

fs=44100
duration = 5  # seconds
myrecording = sd.rec(duration * fs, samplerate=fs, channels=2,dtype='float64')
print "Recording Audio"
sd.wait()
print "Audio recording complete , Play Audio"
sd.play(myrecording, fs)
sd.wait()
print "Play Audio Complete"

Voici la sortie: Python 2.7.9 (valeur par défaut, 10 déc 2014, 12:24:55) [MSC v.1500 32 bits (Intel)] sur le type win32 "copyright", " crédits "ou" licence () "pour plus d'informations. =============================== RESTART ===== ==============

Enregistrement audio
Enregistrement audio terminé, Lecture audio
Lecture audio complète

15
Anil_M

Je envisagerais d'utiliser pysox , les liaisons python pour libsox.

Vous pouvez obtenir paquet pysox auprès de PyPI.

3
wrkyle

Si l'exigence est Jack , vous pouvez utiliser PyJack , qui est la liaison Python pour Jack.

De plus, le code source contient un exemple de ce que vous voulez faire, c'est-à-dire capturer de l'audio. Voir le fichier capture.py

Vous devez considérer que pour éviter de rater un bloc, vous devez appeler jack.process Toutes les 500 *(buffer_size/sample_rate) millisecondes. jack.process Lève des exceptions lorsque vous manquez des blocs audio (jack.InputSyncError Et jack.OutputSyncError).

2
gpoo