2017-08-09 1 views
2

Ich schreibe ein Programm, um nach Störungen in einem Audiosignal zu suchen, das von einem Computer aufgezeichnet wurde. Nachdem Audio erkannt wurde, möchte ich in den ersten 5 Sekunden der Daten nach Fehlern suchen (entspricht 220500 Samples bei einer Sampling-Rate von 44,1 kHz), gehe zu den nächsten 5 Sekunden der Daten und suche nach Störungen in diesem, dann die nächsten 5 Sekunden usw. Ich habe eine While-Schleife, die beginnt, nachdem Audio erkannt wurde, beginnt es Audio-Samples aus einem Stream in ein Array zu lesen, bis es 220500 Samples im Array hat, nach denen es eine if-Anweisung eingibt, wo es beginnt Überprüfen auf Glitches in den 220500 Samples (und löscht anschließend alle Elemente im Array). Mein Problem ist, dass währenddessen Audio zwar vom Computer aufgezeichnet wird, aber nicht aus dem Stream in das Array gelesen wird, und bis ich die if-Anweisung beendet und die while-Schleife neu gestartet habe, habe ich ein paar Sekunden verpasst von Audiodaten.Echtzeit-Audio-Verarbeitung in 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... 

ich PyAudio bin mit für die Aufzeichnung von 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) 

Ich mag würde wissen, ist es eine Möglichkeit für mich aus dem Audiostrom in das Array weiter zu lesen, während die Glitch-Erkennung in der Durchführung wenn Aussage? Oder wenn nicht, könnte ich anders damit umgehen?

+2

Haben Sie versucht, mehrere Prozesse zu verwenden? Sie könnten einen Prozess erstellen, um Ihren Audiostream zu lesen, und einen anderen, um ihn für "Glitch Detection" zu verarbeiten. Sehen Sie sich dies an: https://docs.python.org/2/library/multiprocessing.html – ma3oun

+0

Danke, ich werde es mir ansehen. – CJF

+0

"Audio wird immer noch vom Computer aufgezeichnet, aber nicht aus dem Stream in das Array gelesen" Warum nicht? Ist der Stream-Puffer zu klein? – Trilarion

Antwort

0

Ihre Antwort ist Multi-Threadingnicht Multiprocessing, durch Verwendung Python Threading Paket und seine wunderbare Signal Funktion können Sie erreichen, was Sie wollen.

+0

Links zur Dokumentation wären hilfreich. Was ist dieses wundervolle, aber mysteriöse Signalmerkmal? Meinst du vielleicht [threading.Event] (https://docs.python.org/3/library/threading.html#threading.Event)? Eine andere Sache, die hilfreich sein könnte, ist [queue.Queue] (https://docs.python.org/3/library/queue.html). – Matthias