|
| 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