2017-08-09 9 views
2

J'écris un programme pour vérifier les pépins dans un signal audio enregistré par un ordinateur. Après avoir détecté l'audio, je voudrais vérifier les pépins dans les 5 premières secondes de données (correspondant à 220500 échantillons à un taux d'échantillonnage de 44,1 kHz), passer aux 5 secondes suivantes de données et vérifier les pépins dans cela, puis les 5 secondes suivantes etc. J'ai une boucle while qui commence après que l'audio a été détecté, il commence à lire des échantillons audio d'un flux dans un tableau jusqu'à ce qu'il ait 220500 échantillons dans le tableau, après quoi il entre dans une instruction if vérifier les défauts dans les 220500 échantillons (et supprimer tous les éléments dans le tableau par la suite). Mon problème est que pendant ce temps, l'audio est toujours enregistré par l'ordinateur mais il n'est pas lu depuis le flux dans la matrice et au moment où j'ai quitté l'instruction if et redémarré la boucle while j'ai manqué quelques secondes de données audio.Traitement audio en temps réel en Python

while 1: 
    # little endian, signed short 
    snd_data = array('h', stream.read(1500)) 
    if byteorder == 'big': 
     snd_data.byteswap() 
    r.extend(snd_data) 
    if len(r) == 220500 or silent: 
     r = trim(r) 
     data = pack('<' + ('h'*len(r)), *r) 
     data = np.fromstring(data,dtype=np.int16) 

     glitch detection carried out here... 

J'utilise PyAudio pour l'enregistrement audio

p=pyaudio.PyAudio() # start the PyAudio class 
stream=p.open(format=pyaudio.paInt16,channels=1,rate=RATE,input=True,input_device_index = 1, output_device_index = 6,frames_per_buffer=1500) 

Je voudrais savoir est-il un moyen pour moi de continuer la lecture du flux audio dans le tableau tout en effectuant la détection de pépin dans la si déclaration? Ou sinon, y a-t-il un autre moyen de m'y prendre?

+2

Avez-vous essayé d'utiliser plusieurs processus? Vous pouvez générer un processus pour lire votre flux audio et un autre pour le traiter pour "détection de pépin". Jetez un oeil à ceci: https://docs.python.org/2/library/multiprocessing.html – ma3oun

+0

Merci, je vais y jeter un coup d'oeil. – CJF

+0

"l'audio est toujours en cours d'enregistrement par l'ordinateur mais il n'est pas lu du flux dans la matrice" Pourquoi pas? Le tampon du flux est-il trop petit? – Trilarion

Répondre

0

Votre réponse est multi-threadingpas multitraitement, En utilisant python package de filetage et son merveilleux signal de fonction, vous pouvez obtenir ce que vous voulez.

+0

Des liens vers la documentation vous seraient utiles. Quelle est cette fonction "signal" merveilleuse mais mystérieuse? Avez-vous par hasard signifier [threading.Event] (https://docs.python.org/3/library/threading.html#threading.Event)? Une autre chose qui pourrait être utile est [queue.Queue] (https://docs.python.org/3/library/queue.html). – Matthias