From ecf31cac2fd34cedc89f9ec2cfa4263a81b8d4fe Mon Sep 17 00:00:00 2001 From: Steve Tjoa Date: Mon, 23 Jun 2014 01:30:13 -0700 Subject: [PATCH] added exercise: knn instrument classification; spectral features --- exercises/knn_instrument_classification.ipynb | 409 +++++++++++++++++- 1 file changed, 397 insertions(+), 12 deletions(-) diff --git a/exercises/knn_instrument_classification.ipynb b/exercises/knn_instrument_classification.ipynb index 8af6592..c7ac61b 100644 --- a/exercises/knn_instrument_classification.ipynb +++ b/exercises/knn_instrument_classification.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:bb2e49be0f0cc1f2f28b5e822902210b4d295112f04bd4c301dc435f7be7ebf4" + "signature": "sha256:acdbb21211e509f92197f1505242fdab716b14fe5434b6af6ac4f453c4e7606c" }, "nbformat": 3, "nbformat_minor": 0, @@ -20,30 +20,415 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Read a drum loop.\n", + "This is an *exercise* notebook. It's a playground for your Python code. Feel free to write and execute your code without fear.\n", "\n", - "Detect onsets. Save the onset times.\n", + "When you see a cell that looks like this:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "plot?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "that is a cue to use a particular command, in this case, `plot`. Run the cell to see documentation for that command. (To quickly close the Help window, press `q`.) \n", "\n", - "At each onset, extract one 100-ms segment from the audio signal.\n", + "For more documentation, visit the links in the Help menu above. Also see the other notebooks; all the exercises here are covered somewhere else in separate notebooks." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This exercise is loosely based upon \"Lab 1\" from previous MIR workshops ([2010](https://ccrma.stanford.edu/workshops/mir2010/Lab1_2010.pdf))." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Goals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1. Extract spectral features from an audio signal.\n", + "2. Train a K-Nearest Neighbor classifier.\n", + "3. Use the classifier to classify beats in a drum loop." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Step 1: Retrieve Audio, Detect Onsets, and Segment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Follow the same steps here.](feature_sonification.ipynb#Step-1:-Retrieve-Audio)\n", "\n", - "For each segment, compute the MFCCs.\n", + "1. Download the file `simpleLoop.wav` onto your local machine.\n", + "1. Save the audio signal into an array.\n", + "1. Find the times, in seconds, when onsets occur in the audio signal.\n", + "1. Save into an array, `segments`, 100-ms segments beginning at each onset." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import urllib\n", + "url = 'https://ccrma.stanford.edu/workshops/mir2014/audio/simpleLoop.wav'\n", + "urllib.urlretrieve?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from essentia.standard import MonoLoader\n", + "MonoLoader?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 17 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fs = 44100\n", + "frame_sz = int(0.1*fs)\n", + "import essentia\n", + "segments = essentia.array([rand(frame_sz), rand(frame_sz)]) # placeholder" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Step 2: Extract MFCCs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For each segment, compute the MFCCs." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from essentia.standard import MFCC, Spectrum, Windowing\n", + "hamming_window = Windowing(type='hamming')\n", + "spectrum = Spectrum() # we just want the magnitude spectrum\n", + "mfcc = MFCC()\n", "\n", - "Read a training set of drum samples. For each test signal, extract MFCCs, and use `mean` to obtain one MFCC vector per signal.\n", + "mfccs = array([mfcc(spectrum(hamming_window(frame)))[1]\n", + " for frame in segments])\n", "\n", - "Train a K-NN classifier using test signals. When training, discard the 0th MFCC coefficient, because it only represents the energy in the frame and does not add any discriminative power. \n", + "imshow(mfccs[:,1:].T, origin='lower', aspect='auto', interpolation='nearest') # Ignore the 0th MFCC\n", + "yticks(range(12), range(1,13)) # Ignore the 0th MFCC\n", + "ylabel('MFCC Coefficient Index')\n", + "xlabel('Segment Index')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Step 3: Train K-NN Classifier" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from urlparse import urljoin\n", + "\n", + "kick_files = ['Bass_Drum_%02d_V01.WAV' % n\n", + " for n in range(1,11)]\n", "\n", "\n", + "snare_files = ['Bass_Drum_%02d_V01.WAV' % n\n", + " for n in range(1,11)]\n", "\n", - "For each segment in the test audio signal, feed it into the trained K-NN classifier, and save the label.\n", "\n", - "Play a \"beep\" for each detected kick drum.\n", + "for kick_file in kick_files:\n", + " url = urljoin('https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/', kick_file)\n", + " urllib.urlretrieve(url, filename=kick_file)\n", + "#kicks = [MonoLoader(filename=filename) for filename in kick_files]\n", + "#snares = [MonoLoader(filename=filename) for filename in kick_files]\n", "\n", - "Play a \"beep\" for each detected snare drum.\n", + "%ls" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_01_V01.WAV\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_02_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_03_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_04_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_05_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_06_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_07_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_08_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_09_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "https://ccrma.stanford.edu/workshops/mir2014/audio/drum%%20samples/kicks/Bass_Drum_10_V01.WAV" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Bass_Drum_01_V01.WAV Bass_Drum_04_V01.WAV Bass_Drum_07_V01.WAV Bass_Drum_10_V01.WAV nmf_source_separation.ipynb\r\n", + "Bass_Drum_02_V01.WAV Bass_Drum_05_V01.WAV Bass_Drum_08_V01.WAV feature_sonification.ipynb\r\n", + "Bass_Drum_03_V01.WAV Bass_Drum_06_V01.WAV Bass_Drum_09_V01.WAV knn_instrument_classification.ipynb\r\n" + ] + } + ], + "prompt_number": 32 + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Step 4: Run the Classifier" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Step 5: Sonify the Classifier Output" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Play a \"beep\" for each detected kick drum." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from essentia.standard import AudioOnsetsMarker\n", + "AudioOnsetsMarker?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Play a \"beep\" for each detected snare drum." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from essentia.standard import AudioOnsetsMarker\n", + "AudioOnsetsMarker?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read a training set of drum samples. For each test signal, extract MFCCs, and use `mean` to obtain one MFCC vector per signal.\n", + "\n", + "Train a K-NN classifier using test signals. When training, discard the 0th MFCC coefficient, because it only represents the energy in the frame and does not add any discriminative power. \n", "\n", - "In addition to the MFCCs, extract the delta-MFCCs. Re-train the classifier, and re-run the classifier over the test audio signal. Do the results change?\n", "\n", - "Repeat for other audio files." + "\n", + "For each segment in the test audio signal, feed it into the trained K-NN classifier, and save the label." + ] + }, + { + "cell_type": "heading", + "level": 2, + "metadata": {}, + "source": [ + "Bonus" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the MFCCs, extract the following features:\n", + "\n", + "- spectral centroid\n", + "- spectral spread\n", + "- spectral skewness\n", + "- spectral kurtosis. " ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from essentia.standard import CentralMoments, DistributionShape\n", + "DistributionShape?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Re-train the classifier, and re-run the classifier over the test audio signal. Do the results change?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Repeat the steps above for the following audio files:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "url = 'https://ccrma.stanford.edu/workshops/mir2014/audio/CongaGroove-mono.wav'\n", + "url = 'https://ccrma.stanford.edu/workshops/mir2014/audio/125BOUNC-mono.WAV'" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 } ], "metadata": {}