2014-07-26 4 views
10

Wie kann ich Echtzeit-Audio in ein numpliges Array einlesen und matplotlib zum Plotten verwenden?Lesen von Echtzeit-Audiodaten in ein numpliges Array

Im Augenblick nehme ich Audio auf einer wav Datei auf, die dann scikits.audiolab.wavread verwendet, um es in ein Array zu lesen. Kann ich das auch direkt in Echtzeit machen?

Antwort

13

Sie können PyAudio verwenden, um Audio aufzunehmen und np.fromstring zu verwenden, um es in ein numpy Array umzuwandeln.

import pyaudio 
import numpy as np 
from matplotlib import pyplot as plt 

CHUNKSIZE = 1024 # fixed chunk size 

# initialize portaudio 
p = pyaudio.PyAudio() 
stream = p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=CHUNKSIZE) 

# do this as long as you want fresh samples 
data = stream.read(CHUNKSIZE) 
numpydata = np.fromstring(data, dtype=np.int16) 

# plot data 
plt.plot(numpydata) 
plt.show() 

# close stream 
stream.stop_stream() 
stream.close() 
p.terminate() 
+0

Danke. Ich habe 'alsaaudio' anstelle von' pyaudio' in meiner Lösung verwendet. Gibt es einen Unterschied zwischen den beiden? –

+0

Ich denke 'alsaaudio' ist nur Linux, während' PyAudio' [PortAudio'] (http://www.portaudio.com/) -Bindungen bietet und auf mehreren Plattformen funktioniert. –

8

Es gibt eine Bibliothek PyAudio genannt. Sie können damit in Echtzeit aufnehmen. Mit Hilfe von numpy.fromstring() und können Sie die gewünschte Ausgabe erhalten. Bitte beachten Sie, dass das folgende Snippet für MONO-CHANNEL ist.

import pyaudio 
import numpy 

RATE=16000 
RECORD_SECONDS = 2.5 
CHUNKSIZE = 1024 

# initialize portaudio 
p = pyaudio.PyAudio() 
stream = p.open(format=pyaudio.paInt16, channels=1, rate=RATE, input=True, frames_per_buffer=CHUNKSIZE) 

frames = [] # A python-list of chunks(numpy.ndarray) 
for _ in range(0, int(RATE/CHUNKSIZE * RECORD_SECONDS)): 
    data = stream.read(CHUNKSIZE) 
    frames.append(numpy.fromstring(data, dtype=numpy.int16)) 

#Convert the list of numpy-arrays into a 1D array (column-wise) 
numpydata = numpy.hstack(frames) 

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

Dies ist ein getesteter Code. Es sollte als Charme funktionieren. Um zu überprüfen, ob Ihre aufgezeichneten Daten in numpydata korrekt verfügbar sind, können Sie dieses folgende Snippet nach dem vorherigen Code hinzufügen.

import scipy.io.wavefile as wav 
wav.write('out.wav',RATE,numpydata) 

Diese Linien werden Ihre numpydata in "out.wav" schreiben. Spielen Sie die Datei ab, um die Daten zu überprüfen.

PS: Dies ist meine erste Antwort in StackOverflow. Ich hoffe es hilft.

+4

Nicht schlecht für Ihren ersten Beitrag :) – deW1

+2

@ deW1 Danke für die Überarbeitung meiner Antwort und Hervorhebung der Begriffe. :) – StitchesGuy90

+0

@ StitchesGuy90 Ich möchte die eingehenden Audiodaten plotten, so dass ich eine Echtzeit-Grafik des Audios bekommen kann, ist es möglich. – Step

Verwandte Themen