-
-
Save ZWMiller/53232427efc5088007cab6feee7c6e4c to your computer and use it in GitHub Desktop.
| try: | |
| import pyaudio | |
| import numpy as np | |
| import pylab | |
| import matplotlib.pyplot as plt | |
| from scipy.io import wavfile | |
| import time | |
| import sys | |
| import seaborn as sns | |
| except: | |
| print "Something didn't import" | |
| i=0 | |
| f,ax = plt.subplots(2) | |
| # Prepare the Plotting Environment with random starting values | |
| x = np.arange(10000) | |
| y = np.random.randn(10000) | |
| # Plot 0 is for raw audio data | |
| li, = ax[0].plot(x, y) | |
| ax[0].set_xlim(0,1000) | |
| ax[0].set_ylim(-5000,5000) | |
| ax[0].set_title("Raw Audio Signal") | |
| # Plot 1 is for the FFT of the audio | |
| li2, = ax[1].plot(x, y) | |
| ax[1].set_xlim(0,5000) | |
| ax[1].set_ylim(-100,100) | |
| ax[1].set_title("Fast Fourier Transform") | |
| # Show the plot, but without blocking updates | |
| plt.pause(0.01) | |
| plt.tight_layout() | |
| FORMAT = pyaudio.paInt16 # We use 16bit format per sample | |
| CHANNELS = 1 | |
| RATE = 44100 | |
| CHUNK = 1024 # 1024bytes of data red from a buffer | |
| RECORD_SECONDS = 0.1 | |
| WAVE_OUTPUT_FILENAME = "file.wav" | |
| audio = pyaudio.PyAudio() | |
| # start Recording | |
| stream = audio.open(format=FORMAT, | |
| channels=CHANNELS, | |
| rate=RATE, | |
| input=True)#, | |
| #frames_per_buffer=CHUNK) | |
| global keep_going | |
| keep_going = True | |
| def plot_data(in_data): | |
| # get and convert the data to float | |
| audio_data = np.fromstring(in_data, np.int16) | |
| # Fast Fourier Transform, 10*log10(abs) is to scale it to dB | |
| # and make sure it's not imaginary | |
| dfft = 10.*np.log10(abs(np.fft.rfft(audio_data))) | |
| # Force the new data into the plot, but without redrawing axes. | |
| # If uses plt.draw(), axes are re-drawn every time | |
| #print audio_data[0:10] | |
| #print dfft[0:10] | |
| li.set_xdata(np.arange(len(audio_data))) | |
| li.set_ydata(audio_data) | |
| li2.set_xdata(np.arange(len(dfft))*10.) | |
| li2.set_ydata(dfft) | |
| # Show the updated plot, but without blocking | |
| plt.pause(0.01) | |
| if keep_going: | |
| return True | |
| else: | |
| return False | |
| # Open the connection and start streaming the data | |
| stream.start_stream() | |
| print "\n+---------------------------------+" | |
| print "| Press Ctrl+C to Break Recording |" | |
| print "+---------------------------------+\n" | |
| # Loop so program doesn't end while the stream callback's | |
| # itself for new data | |
| while keep_going: | |
| try: | |
| plot_data(stream.read(CHUNK)) | |
| except KeyboardInterrupt: | |
| keep_going=False | |
| except: | |
| pass | |
| # Close up shop (currently not used because KeyboardInterrupt | |
| # is the only way to close) | |
| stream.stop_stream() | |
| stream.close() | |
| audio.terminate() |
Line 87 plot_data(stream.read(CHUNK)) -->plot_data(stream.read(CHUNK, exception_on_overflow = False))
Hey, this code is very useful except for when each time I try to run it, first at all, it did show the figure, but later my computer juste shut down the figure, I tried to change de Record sounds but it doesn't change anything. Did anyone have de same problem as I ?
Maybe try running the code without the "try:" block. As that block is used to check for errors in code, maybe not having any errors in the first place is causing the code to end.
line67 li2.set_xdata(np.arange(len(dfft))*10.)
li2.set_xdata(np.arange(len(dfft))*RATE/CHUNK)
frequency should be scaled by a factor dependent on the sampling rate and chunk
right now its reporting a 440hz signal as ~110hz
Yes, I just found it, thanks!