#!/usr/bin/python # coding=utf8 from __future__ import division import pyaudio import time ### Diese Klasse wird im Modul microlistener definiert. ### Sie kann in allen Projekten verwendet werden, die eine ### kontinuierliche Audio-Eingabe brauchen. class MicroListener(object): def __init__(self,rate,channels,chunk,callback,playback=False): '''kreiert einen Stream, der mit der Samplerate 'rate' und 'channels' Kanälen über das Microphon Audio aufnimmt. Nach jeweils 'chunk' Frames wird die callback-Funktion aufgerufen. Falls playback==True, werden die Daten an den Lautsprecher durchgereicht. Die Callback-Funktion nimmt als Argumente (in_data, frame_count, time_info, status) und gibt ein Tupel zurück, dessen erster Eintrag die Daten (für Playback), dessen zweiter Eintrag ein Signal ist, sollte pyaudio.paContinue sein. Also z. B. (mit einer globalen Variable CHANNELS) def micro_callback(in_data, frame_count, time_info) y=np.fromstring(in_data,dtype=np.short) if CHANNELS==2: y=y.reshape((y.shape[0]//2,2)) else: y=y.reshape((y.shape[0],1)) ## y enthält danach die Daten des letzten Abschnitts ## aus chunk samples. ## jetzt irgendwas mit den Daten machen ## return (in_data, pyaudio.paContinue) ''' self.p = pyaudio.PyAudio() self.stream = self.p.open(format=pyaudio.paInt16 , channels=channels, rate=rate, input=True, output=playback, stream_callback=callback, frames_per_buffer=chunk) self.stream.start_stream() time.sleep(0.5) def __del__(self): self.stream.stop_stream() self.stream.close() self.p.terminate() ######################################################################### ### Test-Sektion ####################################################### ######################################################################### if __name__=='__main__': import numpy as np ########################### ### GLOBALE VARIABLEN CHANNELS=2 RATE=44100 CHUNK=2**11 def micro_callback(in_data, frame_count, time_info,status): '''callback Funktion: wird vom PyAudio-Objekt aufgerufen, wenn CHUNK Frames von der Soundkarte (Mikrophon) gelesen wurden''' y=np.array(np.fromstring(in_data,dtype=np.short),dtype=np.float) if CHANNELS==2: y=y.reshape((y.shape[0]//2,2)) else: y=y.reshape((y.shape[0],1)) print int(np.linalg.norm(y[:,0])/2000.)*'*' return (in_data, status) listen=MicroListener(RATE,CHANNELS,CHUNK,micro_callback) while True: pass
#!/usr/bin/python # coding=utf8 from __future__ import division import pyaudio import time ### Diese Klasse wird im Modul microlistener definiert. ### Sie kann in allen Projekten verwendet werden, die eine ### kontinuierliche Audio-Eingabe brauchen. class MicroListener(object): def __init__(self,rate,channels,chunk,callback,playback=False): '''kreiert einen Stream, der mit der Samplerate 'rate' und 'channels' Kanälen über das Microphon Audio aufnimmt. Nach jeweils 'chunk' Frames wird die callback-Funktion aufgerufen. Falls playback==True, werden die Daten an den Lautsprecher durchgereicht. Die Callback-Funktion nimmt als Argumente (in_data, frame_count, time_info, status) und gibt ein Tupel zurück, dessen erster Eintrag die Daten (für Playback), dessen zweiter Eintrag ein Signal ist, sollte pyaudio.paContinue sein. Also z. B. (mit einer globalen Variable CHANNELS) def micro_callback(in_data, frame_count, time_info) y=np.fromstring(in_data,dtype=np.short) if CHANNELS==2: y=y.reshape((y.shape[0]//2,2)) else: y=y.reshape((y.shape[0],1)) ## y enthält danach die Daten des letzten Abschnitts ## aus chunk samples. ## jetzt irgendwas mit den Daten machen ## return (in_data, pyaudio.paContinue) ''' self.p = pyaudio.PyAudio() self.stream = self.p.open(format=pyaudio.paInt16 , channels=channels, rate=rate, input=True, output=playback, stream_callback=callback, frames_per_buffer=chunk) self.stream.start_stream() time.sleep(0.5) def __del__(self): self.stream.stop_stream() self.stream.close() self.p.terminate() ######################################################################### ### Test-Sektion ####################################################### ######################################################################### if __name__=='__main__': import numpy as np import matplotlib.pyplot as plt import scipy.fftpack ########################### ### GLOBALE VARIABLEN CHANNELS=2 RATE=44100 CHUNK=2**11 def micro_callback(in_data, frame_count, time_info,status): '''callback Funktion: wird vom PyAudio-Objekt aufgerufen, wenn CHUNK Frames von der Soundkarte (Mikrophon) gelesen wurden''' y=np.array(np.fromstring(in_data,dtype=np.short),dtype=np.float) yf = scipy.fftpack.fft(y) xf = np.linspace(0.0, (2.0*RATE), CHUNK/2) plt.plot(yf) plt.show() if CHANNELS==2: y=y.reshape((y.shape[0]//2,2)) else: y=y.reshape((y.shape[0],1)) print int(np.linalg.norm(y[:,0])/2000.)*'*' return (in_data, status) listen=MicroListener(RATE,CHANNELS,CHUNK,micro_callback) while True: pass