Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d394e83

Browse files
first notebook to stream audio
this notebook streams audio and displays using matplotlib
1 parent b38818b commit d394e83

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

‎audio spectrum.ipynb‎

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 9,
6+
"metadata": {
7+
"collapsed": true
8+
},
9+
"outputs": [],
10+
"source": [
11+
"\"\"\"\n",
12+
"Notebook for streaming data from a microphone in realtime\n",
13+
"\n",
14+
"audio is captured using pyaudio\n",
15+
"then converted from binary data to ints using struct\n",
16+
"then displayed using matplotlib\n",
17+
"\n",
18+
"pip install pyaudio \n",
19+
"\n",
20+
"if you don't have pyaudio\n",
21+
"\"\"\"\n",
22+
"\n",
23+
"import pyaudio\n",
24+
"import os\n",
25+
"import struct\n",
26+
"import numpy as np\n",
27+
"import matplotlib.pyplot as plt\n",
28+
"import time\n",
29+
"\n",
30+
"# use this backend to display in separate window\n",
31+
"%matplotlib tk\n",
32+
"\n",
33+
"CHUNK = 1024 * 4\n",
34+
"FORMAT = pyaudio.paInt16\n",
35+
"CHANNELS = 1\n",
36+
"RATE = 44100"
37+
]
38+
},
39+
{
40+
"cell_type": "code",
41+
"execution_count": 10,
42+
"metadata": {
43+
"scrolled": false
44+
},
45+
"outputs": [
46+
{
47+
"ename": "TclError",
48+
"evalue": "this isn't a Tk application",
49+
"output_type": "error",
50+
"traceback": [
51+
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
52+
"\u001b[1;31mTclError\u001b[0m Traceback (most recent call last)",
53+
"\u001b[1;32mC:\\Users\\mark\\Anaconda3\\lib\\site-packages\\matplotlib\\backends\\tkagg.py\u001b[0m in \u001b[0;36mblit\u001b[1;34m(photoimage, aggimage, bbox, colormode)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[1;34m\"PyAggImagePhoto\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mphotoimage\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 22\u001b[1;33m id(data), colormode, id(bbox_array))\n\u001b[0m\u001b[0;32m 23\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mTk\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTclError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
54+
"\u001b[1;31mTclError\u001b[0m: this isn't a Tk application",
55+
"\nDuring handling of the above exception, another exception occurred:\n",
56+
"\u001b[1;31mTclError\u001b[0m Traceback (most recent call last)",
57+
"\u001b[1;32m<ipython-input-10-99f79adc46a1>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[0mdata_int\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstruct\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munpack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mCHUNK\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'B'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'b'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m127\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_ydata\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata_int\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;36m255\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 27\u001b[1;33m \u001b[0mfig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcanvas\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdraw\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 28\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcanvas\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflush_events\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
58+
"\u001b[1;32mC:\\Users\\mark\\Anaconda3\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\u001b[0m in \u001b[0;36mdraw\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 350\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdraw\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[0mFigureCanvasAgg\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdraw\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 352\u001b[1;33m \u001b[0mtkagg\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mblit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_tkphoto\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrenderer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_renderer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolormode\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 353\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_master\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate_idletasks\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 354\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
59+
"\u001b[1;32mC:\\Users\\mark\\Anaconda3\\lib\\site-packages\\matplotlib\\backends\\tkagg.py\u001b[0m in \u001b[0;36mblit\u001b[1;34m(photoimage, aggimage, bbox, colormode)\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0m_tkagg\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtkinit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m tk.call(\"PyAggImagePhoto\", photoimage,\n\u001b[1;32m---> 30\u001b[1;33m id(data), colormode, id(bbox_array))\n\u001b[0m\u001b[0;32m 31\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mImportError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mTk\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTclError\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[1;32mraise\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
60+
"\u001b[1;31mTclError\u001b[0m: this isn't a Tk application"
61+
]
62+
}
63+
],
64+
"source": [
65+
"fig, ax = plt.subplots(1, figsize=(15, 7))\n",
66+
"\n",
67+
"p = pyaudio.PyAudio()\n",
68+
"\n",
69+
"stream = p.open(format=FORMAT,\n",
70+
" channels=CHANNELS,\n",
71+
" rate=RATE,\n",
72+
" input=True,\n",
73+
" output=True,\n",
74+
" frames_per_buffer=CHUNK)\n",
75+
"\n",
76+
"\n",
77+
"x = np.arange(0, 2 * CHUNK, 2)\n",
78+
"line, = ax.plot(x, np.random.rand(CHUNK), '-', lw=2)\n",
79+
"ax.set_title('AUDIO WAVEFORM')\n",
80+
"ax.set_xlabel('samples')\n",
81+
"ax.set_ylabel('volume')\n",
82+
"ax.set_ylim(0, 255)\n",
83+
"ax.set_xlim(0, 2 * CHUNK)\n",
84+
"plt.setp(ax, xticks=[0, 1024, 2048], yticks=[0, 128, 255])\n",
85+
"plt.show(block=False)\n",
86+
"\n",
87+
"while True:\n",
88+
" data = stream.read(CHUNK) # binary data\n",
89+
" \n",
90+
" # convert to int, make np array, then offset it by 127\n",
91+
" data_int = np.array(struct.unpack(str(2 * CHUNK) + 'B', data), dtype='b')[::2] + 127\n",
92+
" \n",
93+
" # unpdate matplotlib\n",
94+
" fig.canvas.draw()\n",
95+
" fig.canvas.flush_events()"
96+
]
97+
},
98+
{
99+
"cell_type": "code",
100+
"execution_count": null,
101+
"metadata": {
102+
"collapsed": true
103+
},
104+
"outputs": [],
105+
"source": []
106+
},
107+
{
108+
"cell_type": "code",
109+
"execution_count": null,
110+
"metadata": {
111+
"collapsed": true
112+
},
113+
"outputs": [],
114+
"source": []
115+
}
116+
],
117+
"metadata": {
118+
"anaconda-cloud": {},
119+
"kernelspec": {
120+
"display_name": "Python [conda root]",
121+
"language": "python",
122+
"name": "conda-root-py"
123+
},
124+
"language_info": {
125+
"codemirror_mode": {
126+
"name": "ipython",
127+
"version": 3
128+
},
129+
"file_extension": ".py",
130+
"mimetype": "text/x-python",
131+
"name": "python",
132+
"nbconvert_exporter": "python",
133+
"pygments_lexer": "ipython3",
134+
"version": "3.5.3"
135+
}
136+
},
137+
"nbformat": 4,
138+
"nbformat_minor": 1
139+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /