diff --git a/claude-design/Dolphin Beats Music Player.zip b/claude-design/Dolphin Beats Music Player.zip deleted file mode 100644 index 4278071..0000000 Binary files a/claude-design/Dolphin Beats Music Player.zip and /dev/null differ diff --git a/claude-design/pasted-1787085770763-0.png b/claude-design/pasted-1787085770763-0.png deleted file mode 100644 index bf3fb0c..0000000 Binary files a/claude-design/pasted-1787085770763-0.png and /dev/null differ diff --git a/claude-design/pasted-1787122665953-0.png b/claude-design/pasted-1787122665953-0.png deleted file mode 100644 index a843225..0000000 Binary files a/claude-design/pasted-1787122665953-0.png and /dev/null differ diff --git a/claude-design/pasted-1787124615900-0.png b/claude-design/pasted-1787124615900-0.png deleted file mode 100644 index a843225..0000000 Binary files a/claude-design/pasted-1787124615900-0.png and /dev/null differ diff --git a/docs/REPO_OVERVIEW.md b/docs/REPO_OVERVIEW.md index 9ccf893..d6ebfaf 100644 --- a/docs/REPO_OVERVIEW.md +++ b/docs/REPO_OVERVIEW.md @@ -116,8 +116,7 @@ reported at once. on numpy's stubs for two weeks without anyone noticing) is a failure, not a skip. - Prefer adding a scenario in `python-backend/scenarios/` over a hand-rolled test when the behaviour is end-to-end — those files are executed by the test suite. -- `python-backend/notebooks/` is university course material on chord recognition, not - part of the app. +- `python-backend/notebooks/` is LED-effect scratch work, not part of the app. - The firmware has no automated tests beyond a PlatformIO `native` env for LED effects. - The front-end has `vitest` over the pure modules (`web/src/lib/`) and `tsc --noEmit`; there is no component-level test harness. `npm run test` and `npx tsc --noEmit` are diff --git a/python-backend/notebooks/C5S2_ChordRec_Templates.ipynb b/python-backend/notebooks/C5S2_ChordRec_Templates.ipynb deleted file mode 100644 index 8cda312..0000000 --- a/python-backend/notebooks/C5S2_ChordRec_Templates.ipynb +++ /dev/null @@ -1,674 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "\"FMP\"\n", - "\"AudioLabs\"\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "\"C5\"\n", - "

Template-Based Chord Recognition

\n", - "
\n", - "\n", - "
\n", - "\n", - "

\n", - "Following Section 5.2 of [Müller, FMP, Springer 2015], we introduce in this notebook a basic approach for chord recognition using chord templates. For a discussion of the importance of various algorithmic components of such a system, we refer to the following two studies:\n", - "\n", - "

\n", - "

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "In music, **harmony** refers to the simultaneous sound of different notes that form a cohesive entity in the mind of the listener. The main constituent components of harmony, at least in the Western music tradition, are [**chords**](../C5/C5S1_Chords.html), which are musical constructs\n", - "that typically consist of three or more notes. Harmony analysis may be thought of as the study of the construction, interaction, and progression of chords. In this notebook, we discuss a subproblem of harmonic analysis referred to as **chord recognition**, where we consider only a small number of the most important chords as occurring in Western music. Furthermore, we assume that the piece of music is given in the form of an **audio recording**. The resulting chord recognition task consists in splitting up the recording into **segments** and assigning a **chord label** to each segment. The segmentation specifies the start and end time of a chord, and the chord label specifies which chord is played during this time period. A typical chord recognition system consists of **two main steps**. \n", - "\n", - "* In the first step, the given audio recording is cut into frames, and each frame is transformed into an appropriate **feature vector**. Most recognition systems rely on [**chroma-based audio features**](../C3/C3S1_SpecLogFreq-Chromagram.html), which correlate to the underlying tonal information contained in the audio signal. \n", - "* In the second step, **pattern matching** techniques are used to map each feature vector to a set of predefined **chord models**. The best fit determines the chord label assigned to the given frame. \n", - "\n", - "To improve the chord recognition results, additional enhancement techniques are applied either before the pattern matching step (referred to as [**prefiltering**](../C5/C5S3_ChordRec_HMM.html)) or after/within the pattern matching step \n", - "(referred to as [**postfiltering**](../C5/C5S3_ChordRec_HMM.html)). In this notebook, we introduce a first chord recognition procedure that employs a simple template-based matching strategy.\n", - "\n", - "\"FMP_C5_F13\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Beatles Example\n", - "\n", - "In the following example, the chord recognition task is illustrated by the first measures of the Beatles song \"Let It Be.\" The figure shows a score representation, the recording's waveform, a [chromagram](../C3/C3S1_SpecLogFreq-Chromagram.html), as well as chord annotations generated in a manual process. \n", - "\n", - "\"FMP_C5_F01\"\n", - "\n", - "
\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Chroma-Based Feature Representation\n", - "\n", - "Given an audio recording of a piece of music, the first step is to transform the recording into a sequence $X=(x_1,x_2,\\ldots,x_N)$ of feature vectors $x_n\\in\\mathcal{F}$, $n\\in[1:N]$, where $\\mathcal{F}$ denotes a suitable feature space. As mentioned above, nearly all traditional chord recognition procedures rely on some type of [**chroma-based feature representation**](../C3/C3S1_SpecLogFreq-Chromagram.html). This is because chroma-based features capture a signal's short-time tonal content, which is closely correlated to the harmonic progression of the underlying piece. Assuming the [equal-tempered scale](../C1/C1S1_MusicalNotesPitches.html), the chroma values correspond to the set $\\{\\mathrm{C},\\mathrm{C}^\\sharp,\\mathrm{D},\\ldots,\\mathrm{B}\\}$, which we identify with the set $[0:11]$. A chroma feature can then be expressed as a $12$-dimensional vector \n", - "\n", - "$$\n", - "x=(x(0),x(1),\\ldots,x(11))^\\top\\in\\mathcal{F}=\\mathbb{R}^{12}\n", - "$$ \n", - "\n", - "As we also discuss in other FMP notebooks (e.g., in the context of [music synchronization](../C3/C3S1_SpecLogFreq-Chromagram.html) or [content-based music retrieval](../C7/C7S2_CENS.html)), there are many different ways of computing chroma features. Furthermore, their properties can be adjusted by applying suitable postprocessing steps such as [logarithmic compression](../C3/C3S1_LogCompression.html), [normalization](../C3/C3S1_FeatureNormalization.html), or [smoothing](../C3/C3S1_FeatureSmoothing.html). To give some example, we compute in the following code cell three different chroma variants: \n", - "\n", - "* STFT-based chroma features (`librosa.feature.chroma_stft`). \n", - "* Filter-bank decomposition using IIR elliptic filters (`librosa.iirt`), logarithmic compression, and chroma binning.\n", - "* CQT-based chroma features (`librosa.feature.chroma_cqt`)\n", - "\n", - "For each variant, we use the same window length (`N=4096`) and hop size (`H=2048`). Furthermore, in each variant, we normalize the chroma vectors with respect to the [Euclidean norm](../C3/C3S1_FeatureNormalization.html) ($\\ell^2$-norm). In the following figure, the resulting chromagrams are visually superimposed with the manually generated chord annotations (in color). " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n", - " warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n", - "/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n", - " warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n", - "/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n", - " warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n" - ] - }, - { - "data": { - "image/png": "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736XPn36NBrKtX7oV7O8KvWuaD1NZxyBN9yNTFIfkruRNe0ZNRU4LX1+PPBga+e/7SO1ta03RnzrW98quuwrX/lKm6+/0UYbMX78+IbHj370o0bLx40bx9Zbb90wXX+P6I997GNtvnZ30atXr2b3xq60pp0M+/Xr12wcdh+BW9511v0guqty3Y3sJmALSfOBbwHNLjVrauONN253mUaOHNnubcvtvPPOa3X5jjvuyDHHHNPisr322qvVeqo/QuuIbbbZhrPOOosf/ehHHHnkkYwaNarDr5k3W221FWPGjKl0MUrWk3ru7rPPPpUugnWBDTfcsNJFqGqdcg48Iu6NiB0j4hMRcXE670cRMTV9/mFEnBARO0TEPhGxoM2CFRxNfPWrXy2pPMcccwxHHHFEaR+iiu29994MGzas2fwsR1hnn312p5RBEvvuu2+PPKrLeuevYrK0hFjH1NbWsu2221a6GNbJdtppp0oXoapVVSe2QoU/mgMHDsy8XW1tLb169crNdcqS+Jd/+Zc21zvyyCMBGnUsy9KRbMstt2x/4dpw6KGHdtlrdyed0RJSyEclzW266absvffelS5G2ey5556VLkJZ9KRWpPao2gDfYIMNGDRoEKeffjoA//zP/1x03X322YfTTjuN/fffn6OOOqphfuFR/KGHHspJJ1Xf2DGS2Gqrrdpcb+utt2b8+PGNLu0aMGBAo3UOO+ywhuejR4+mLWeccUYJJW1u8OCmVwv2TD/84Q8bTRf2S/jCF74AtL2z9f/+3//L/H7f+MY3Sihdz9CnTx8233zzShejbNy5y6CKAxySW2LWd2LYfvvtG+ZvscUWjZqUjzrqKIYNG8bhhx/eKLQvvPBCxowZwwknnMBnPvMZdt55Z0466SQ23XTTsn2GrDbYYIPM6x599NGcdNJJDR3Jzj33XAYNGsRee+3VsE6WfgAdbXIcMmRIh7bPm8985jPN5p111ln06tWrIYA32WQTNt5444YWpPrgbusc+u677565HKU06Xd0Jy1Pit0xrjsq/D20nqtqbyfakpNOOolly5ax//77A8k9snv37l10/Zqamma9h3feeWdmz57d6Faam266KWeccQY//elPu6LYraoP7s0337zZuL9f+tKXWtym6f3Ot9hiC8455xwg6RRXU1Oe/9ZSdjq6g/32269hyNKNNtqI9957r6GH/m677cby5csbOlOde+65jf4/i/2fbLbZZg3f567Qv3//LnvtarPZZptVughmZdWhI3BJm0uaJumF9N8BRdZbJ+nJ9NF88O2Mdt5550Y/dn369Gk1wIupP1IdMmQI559/Pt/85jfZdNNNm12aU3iusauai+s7hR100EFAcs66/pKuoUOHtrZpizbZZJNm50jrm3GtYwrr9Zvf/CY/+MEPGqYlceCBB9KvXz8guYpihx12aPM1v/GNbzTbISu06667dqDEPfcc4re//e3M6w4fPpzzzjuPE044odH81u4HkMVnP/vZRtObbLJJh16v3vHHH98pr9OaU045pcvfwzquo03oFwAPRMQI4AGKXx72QUR8Kn20fXK2i9Vfgr7RRhs1C7vCIfvOPPPMhudbbrklxx57bMP00KFDueCCNq+GK2qXXXbh8MMPbzR91llnZerQVqrC86/1R4iVHmf+85//fKPppucvjzvuuJKb6I899tiil9w11bT/QDHFfsR79+7drp3HUnW0NaW1z3nccce1um3TUyxN/8+qWdPm9KadWgs7dw4dOpRNNtmk1Z2lQw45pNF0bW1tm6cn+vfv3yhszzvvvGbjLLRHOYYVLaXjsFVORwN8DHBL+vwW4LgOvl5ZjBgxgtra2hZ/kArPoRc2P+6yyy4NR+69e/fmS1/6UrsvqTrzzDM58cQTmzWdbr311l12xFRTU8MWW2zBUUcdxfjx4xsNztIZmjZfNu102HSHoekANV/4whc47bTTuPDCCxk/fjx77rlnps59hWpqahr1A9hxxx35+te/3uK65557bkmv3RmGDx8OJGFywQUX8L3vfa/NbTr6fWht+6aB1XRn4Ytf/GLD8x/96EfU1tYyfvx4/vmf/5ljjjmGH/3oRyVf5nPcccc16mBZbICcESNGZO7Y1/RIt6mvf/3rjS4r/dznPteoF3eWMaWGDh3a8P8Hyc7Mtttu2+olrptsskmzgUhK+f/cc889W+zL0vR3p7WWuqz9XL7zne80mi61n9A555zTaBt3cC2Pjgb4VhHxWvr8daDYL26/9CYlMyQdV+zFCm9msnTp0g4WrbjevXvz+c9/vs1OL4V/KPXNoaecckqHewFXovPX9773vZKvpy/FV7/6VS644AL69evH8ccfz/bbb9+oGbO1Pfrvfe97fPzjH2fYsGGNOmg1raexY8c2O1I/8MADG57X1NQgibFjxzbMa+kIdMMNN6RXr14NOwqQHGkXC/vOssUWyf17tt56a/r27ZupD0HTH/zCqyw64qSTTmr2/ieffHKj6cLvf2E5tt9+e/bee28kNft/bWncgcJWjK233pqRI0c2dMIaOXJkiztT//iP/8juu+/O1772NTbffHOOPfbYhn4eTX3uc58r9jGBj74D559/Pqeddhqf/exnG4Vxa78DP/zhDznllFMYPnx4w6mOwlMjAwcObGga33LLLTnhhBM444wz2GqrrRgxYkSrrTSttWicfPLJDTs7hxxyCIMGDeKHP/wh3/jGN5r1a9hrr70a/taajsZ3zDHHMH78+Davgih8zfYMojVo0CC+8Y1vMHLkSMaNG9dwStC6Vpvtc5LuB1o6XPt+4UREhKRiu7LbRcRiSdsDD0p6KiJebLpSREwCJgHU1tZWZKjVAw88kNtvv71hura2lr/97W8NP2Cf+MQnGq3/ne98h4hoNJ74hRdeyD333MOcOXOQRERw+OGHM23atJJ6G3emrj4XWlNTQ01NTaMbaxT+MLbWFJwlyHbddVd22mkndtppJyZMmNAw/5BDDmH69OlAtiMpaHwu+7jjjmtoSs7arN5ehx12GB/72MeK/pgeeuihPPDAAw3TZ511Fn/9618bpk8//fQOXTlQf8RfWN+FY+G3p9l0t91249FHHwWSv50tt9ySr3zlK9xwww2tbnfyySfz6quvFv089VdYbL755nzta19rmL/HHnswZ86coq87bNgwFi9ObsVw0EEHNRqvf8MNN2y4eqWwGbq1u+716tWr4W++PhybhuRhhx3G//zP/7Dnnns2tGrUnwqrqanhmGOOaRT6G2ywATvuuCN77703Tz75JIsXL+awww7jgAMOaPhuF7aQHXjggQ07qi111Nt0000bhkQupnC773znO/zkJz8p+vlb2kns1asX69evb/G163dgJDVqXTnzzDO56aabGqbPOecclixZwpIlSxr+Zq1j2gzwiDis2DJJb0jaJiJek7QNsKTIayxO/10g6WFgJNAswKvBjjvuyLHHHsuIESOAZC+5tT3llnr59unTh6OPPpptt92W/v37c8cdd7Dnnnt2aW/janXCCSfwzjvvAEmT4MKFCzn11FMzbVt4qWDhOczPf/7z3HPPPUW322677dhiiy2anbes19qYAoX+8R//sdm8Y489ljVr1mTavqm+ffu2erS4//77s/HGG7PHHns07HDtsccezJ49G+j4uNAt7SgV7mRtsskmnHjiidx5552ZTzHUH1HPnj27YSettYFr6j9XTU1N0fBuadTBeocddlijAG96Tvm0005reH7wwQdz8MEHF32tH/zgB6xYsaLREeduu+3G008/3eqOdtMdxd12260hlFvSdICZwlMnX/7ylxstu+CCC3jzzTczdXjr27cvq1atarW+6u2///4NV1DU/2bV1NTw/e9/v9m69YH+D//wD8ycORNI/ubuvvvuFl+72HDQhS1oH//4xxk0aBCDBg1ik002aRbgZ511Ftdff32jeR4et20dvd6o/iYll6T//l/TFdKe6SsjYpWkgcABwGUdfN8uVXgeNavDDjuM+++/v2G6b9++DX+4He3NmmeF51nb6jTV1GabbdZi3Q0aNAj46Nzf1ltvzeuvv95wBN2vX7+iATR8+PBWfxwPPvhgHn74YaDlwTLa893IqlevXs1G2Cr3zRx22WWXkr+vRx11FP3792ffffdtmLfJJpvwzjvvNHQWGzt2LE899VTD/10x559/fknXuXekZal3797NTskccsghPP300y2O6rbDDjswcuTIZjsFkth5553bXY5Cffv2zXz+uJROtB/72Mc4/vjjG66SyPJ/XNhKMWDAAE499VT69+/PLbfcwhFHHFHSYDKF9Vm/0zhs2DCGDh3KZz/7WTbYYAMGDx7c0HoC2VvUerKOBvglwJ2SzgReAU4EkFQL/EtEfBnYBbhe0nqSc+6XRMS8Dr5v1TnggAMaBbh1nfojiPofunHjxrF8+fKiI3H9y7/8C2+//XamDlcHHXRQQ4BXA0l897vfLdp8mcUOO+zQ6o/hOeecU/T1999//zZ7wm+wwQbNhtX9zGc+w7333ttwFFZ/+qOYwYMHs2zZsjaHie3qu+BtvvnmrV55kGWEw2r1yU9+stXlZ5xxBh988EHD9J577snUqR9d9Vvfb+D888/P/J5Dhw5l4cKFzUaQHDduHFtuuWWjPgJf/vKXG50eK+zfYi1Tte7l1NbWRl1dXaWLUZL6L19POuJet24dEdGuy53efvtt1qxZ0+ZRWUtef/11Bg0a1CWXcvXE/8fO9v7773PjjTfyT//0T11ySZL/j8pj6dKlTJs2jRNPPLFdf+Nr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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import os\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "import librosa\n", - "\n", - "import sys\n", - "import libfmp.b\n", - "import libfmp.c3\n", - "import libfmp.c4\n", - "%matplotlib inline\n", - "\n", - "test_file = \"/home/martin/Music/deemix Music/Simone Sommerland - Ki-Ka-Kinderturnen.mp3\"\n", - "\n", - "def compute_chromagram_from_filename(fn_wav, Fs=22050, N=4096, H=2048, gamma=None, version='STFT', norm='2'):\n", - " \"\"\"Compute chromagram for WAV file specified by filename\n", - "\n", - " Notebook: C5/C5S2_ChordRec_Templates.ipynb\n", - "\n", - " Args:\n", - " fn_wav (str): Filenname of WAV\n", - " Fs (scalar): Sampling rate (Default value = 22050)\n", - " N (int): Window size (Default value = 4096)\n", - " H (int): Hop size (Default value = 2048)\n", - " gamma (float): Constant for logarithmic compression (Default value = None)\n", - " version (str): Technique used for front-end decomposition ('STFT', 'IIS', 'CQT') (Default value = 'STFT')\n", - " norm (str): If not 'None', chroma vectors are normalized by norm as specified ('1', '2', 'max')\n", - " (Default value = '2')\n", - "\n", - " Returns:\n", - " X (np.ndarray): Chromagram\n", - " Fs_X (scalar): Feature reate of chromagram\n", - " x (np.ndarray): Audio signal\n", - " Fs (scalar): Sampling rate of audio signal\n", - " x_dur (float): Duration (seconds) of audio signal\n", - " \"\"\"\n", - " x, Fs = librosa.load(fn_wav, sr=Fs)\n", - " x_harmonic, y_percussive = librosa.effects.hpss(x) \n", - " x = x_harmonic\n", - " x_dur = x.shape[0] / Fs\n", - " if version == 'STFT':\n", - " # Compute chroma features with STFT\n", - " X = librosa.stft(x, n_fft=N, hop_length=H, pad_mode='constant', center=True)\n", - " if gamma is not None:\n", - " X = np.log(1 + gamma * np.abs(X) ** 2)\n", - " else:\n", - " X = np.abs(X) ** 2\n", - " X = librosa.feature.chroma_stft(S=X, sr=Fs, tuning=0, norm=None, hop_length=H, n_fft=N)\n", - " if version == 'CQT':\n", - " # Compute chroma features with CQT decomposition\n", - " X = librosa.feature.chroma_cqt(y=x, sr=Fs, hop_length=H, norm=None)\n", - " if version == 'IIR':\n", - " # Compute chroma features with filter bank (using IIR elliptic filter)\n", - " X = librosa.iirt(y=x, sr=Fs, win_length=N, hop_length=H, center=True, tuning=0.0)\n", - " if gamma is not None:\n", - " X = np.log(1.0 + gamma * X)\n", - " X = librosa.feature.chroma_cqt(C=X, bins_per_octave=12, n_octaves=7,\n", - " fmin=librosa.midi_to_hz(24), norm=None)\n", - " if norm is not None:\n", - " X = libfmp.c3.normalize_feature_sequence(X, norm='2')\n", - " Fs_X = Fs / H\n", - " return X, Fs_X, x, Fs, x_dur\n", - "\n", - "def plot_chromagram_annotation(ax, X, Fs_X, ann, color_ann, x_dur, cmap='gray_r', title=''):\n", - " \"\"\"Plot chromagram and annotation\n", - "\n", - " Notebook: C5/C5S2_ChordRec_Templates.ipynb\n", - "\n", - " Args:\n", - " ax: Axes handle\n", - " X: Feature representation\n", - " Fs_X: Feature rate\n", - " ann: Annotations\n", - " color_ann: Color for annotations\n", - " x_dur: Duration of feature representation\n", - " cmap: Color map for imshow (Default value = 'gray_r')\n", - " title: Title for figure (Default value = '')\n", - " \"\"\"\n", - " libfmp.b.plot_chromagram(X, Fs=Fs_X, ax=ax,\n", - " chroma_yticks=[0, 4, 7, 11], clim=[0, 1], cmap=cmap,\n", - " title=title, ylabel='Chroma', colorbar=True)\n", - " libfmp.b.plot_segments_overlay(ann, ax=ax[0], time_max=x_dur,\n", - " print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "# Compute chroma features\n", - "fn_wav = test_file # os.path.join('..', 'data', 'C5', 'FMP_C5_F01_Beatles_LetItBe-mm1-4_Original.wav')\n", - "N = 4096 * 32\n", - "H = 2048 * 32\n", - "X_STFT, Fs_X, x, Fs, x_dur = compute_chromagram_from_filename(fn_wav, N=N, H=H, gamma=0.1, version='STFT')\n", - "X_IIR, Fs_X, x, Fs, x_dur = compute_chromagram_from_filename(fn_wav, N=N, H=H, gamma=100, version='IIR')\n", - "X_CQT, Fs_X, x, Fs, x_dur = compute_chromagram_from_filename(fn_wav, N=N, H=H, version='CQT')\n", - "\n", - "# Annotations\n", - "fn_ann = test_file #os.path.join('..', 'data', 'C5', 'FMP_C5_F01_Beatles_LetItBe-mm1-4_Original_Chords_simplified.csv')\n", - "#ann, _ = libfmp.c4.read_structure_annotation(fn_ann)\n", - "color_ann = {'N': [1, 1, 1, 1], 'C': [1, 0.5, 0, 1], 'G': [0, 1, 0, 1], \n", - " 'Am': [1, 0, 0, 1], 'F': [0, 0, 1, 1]}\n", - "\n", - "# Plot\n", - "cmap = libfmp.b.compressed_gray_cmap(alpha=1, reverse=False)\n", - "fig, ax = plt.subplots(5, 2, gridspec_kw={'width_ratios': [1, 0.03], \n", - " 'height_ratios': [1, 2, 2, 2, 0.5]}, figsize=(7, 8))\n", - "libfmp.b.plot_signal(x, Fs, ax=ax[0,0], title='Waveform of audio signal')\n", - "#libfmp.b.plot_segments_overlay(ann, ax=ax[0,0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "ax[0,1].axis('off')\n", - "\n", - "#title = 'STFT-based chromagram (feature rate = %0.1f Hz, N = %d)'%(Fs_X, X_STFT.shape[1])\n", - "#plot_chromagram_annotation([ax[1, 0], ax[1, 1]], X_STFT, Fs_X, ann, color_ann, x_dur, title=title)\n", - "\n", - "#title = 'IIR-based chromagram (feature rate = %0.1f Hz, N = %d)'%(Fs_X, X_IIR.shape[1])\n", - "#plot_chromagram_annotation([ax[2, 0], ax[2, 1]], X_IIR, Fs_X, ann, color_ann, x_dur, title=title)\n", - "\n", - "#title = 'CQT-based chromagram (feature rate = %0.1f Hz, N = %d)'%(Fs_X, X_CQT.shape[1])\n", - "#plot_chromagram_annotation([ax[3, 0], ax[3, 1]], X_CQT, Fs_X, ann, color_ann, x_dur, title=title)\n", - "\n", - "#libfmp.b.plot_segments(ann, ax=ax[4, 0], time_max=x_dur, time_label='Time (seconds)',\n", - "# colors=color_ann, alpha=0.3)\n", - "ax[4,1].axis('off')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Template-Based Pattern Matching\n", - "\n", - "Given the chroma sequence $X=(x_1,x_2,\\ldots,x_N)$ and a set $\\Lambda$ of possible chord labels, the objective of the next step is to map each chroma vector $x_n\\in\\mathbb{R}^{12}$ to a chord label $\\lambda_{n} \\in \\Lambda$, $n\\in[1:N]$. For example, one may consider the set\n", - "\n", - "\\begin{equation}\n", - " \\Lambda = \\{\\mathbf{C},\\mathbf{C}^\\sharp,\\ldots,\\mathbf{B},\\mathbf{Cm},\\mathbf{C^\\sharp m},\\ldots,\\mathbf{Bm}\\}\n", - "\\end{equation}\n", - "\n", - "consisting of the [twelve major and twelve minor triads](../C5/C5S1_Chords.html). In this case, each frame $n\\in[1:N]$ is assigned to a [major chord](../C5/C5S1_Chords.html) or a [minor chord](../C5/C5S1_Chords.html) specified by $\\lambda_{n}$. For the pattern matching step, we now introduce a simple template-based approach. The idea is to precompute a set \n", - "\n", - "$$\n", - "\\mathcal{T}\\subset\\mathcal{F}=\\mathbb{R}^{12}\n", - "$$ \n", - "\n", - "of templates denoted by $\\mathbf{t}_\\lambda\\in\\mathcal{T}$, $\\lambda\\in\\Lambda$. Intuitively, each template can be thought of as a prototypical chroma vector that represents a specific musical chord. Furthermore, we fix a similarity measure \n", - "\n", - "\\begin{equation}\n", - "s:\\mathcal{F}\\times\\mathcal{F}\\to \\mathbb{R}\n", - "\\end{equation}\n", - "\n", - "that allows for comparing different chroma vectors. Then, the template-based procedure consists in assigning the chord label that maximizes the similarity between the corresponding template and the given feature vector $x_n$:\n", - "\n", - "\\begin{equation}\n", - " \\lambda_{n} := \\underset{\\lambda \\in \\Lambda}{\\mathrm{argmax}}\n", - " \\,\\, s( \\mathbf{t}_\\lambda , x_n ).\n", - "\\end{equation}\n", - "\n", - "In this procedure, there are many design choices that crucially influence the performance of a chord recognizer. \n", - "\n", - "* Which chords should be considered in $\\mathcal{T}$? \n", - "* How are the chord templates defined? \n", - "* What is a suitable similarity measure to compare the feature vectors with the chord templates? \n", - "\n", - "To obtain a first simple chord recognition system, we make the following design choices. For the chord label set $\\Lambda$, we choose the twelve major and twelve minor triads. This choice, even though problematic from a musical point of view, is convenient and instructive. Considering chords up to enharmonic equivalence and up to octave shifts, each triad can be encoded by a three-element subset of $[0:11]$. For example, the $\\mathrm{C}$ major chord $\\mathbf{C}$ corresponds to the subset $\\{0,4,7\\}$. Each subset, in turn, can be identified with a binary twelve-dimensional chroma vector $x=(x(0),x(1),\\ldots,x(11))^\\top$, where $x(i)=1$ if and only if the chroma value $i\\in[0:11]$ is contained in the chord. For example, in the case of the $\\mathrm{C}$-major chord $\\mathbf{C}$, the resulting chroma vector is\n", - "\n", - "\\begin{equation}\n", - "\\label{eq:ChordReco:Template:Basic:ChromaVectC}\n", - " \\mathbf{t}_{\\mathbf{C}}{} := x =(1,0,0,0,1,0,0,1,0,0,0,0)^\\top.\n", - "\\end{equation}\n", - "\n", - "Using a chroma-based encoding, the twelve major chords and twelve minor chords can be obtained by [cyclically shifting](../C3/C3S1_TranspositionTuning.html) the binary vectors for the $\\mathrm{C}$-major and the $\\mathrm{C}$-minor triads, respectively. The result is illustrated by the following figure.\n", - "\n", - "\"FMP_C5_F06\"\n", - "\n", - "For comparing chroma features and chord templates, we use in the following a simple similarity measure using the inner product of normalized vectors:\n", - "\n", - "\\begin{equation}\n", - " s(x,y)= \\frac{\\langle x,y\\rangle}{\\|x\\|\\cdot\\|y\\|}\n", - "\\end{equation}\n", - "\n", - "for $x,y\\in\\mathcal{F}$ with $\\|x\\|\\not= 0$ and $\\|y\\|\\not= 0$. In the case $\\|x\\|=0$ or $\\|y\\|=0$, we set $s(x,y)=0$. Note that this measure always yields a value $s(x,y)\\in[-1,1]$. In the case that the vectors $x$ and $y$ only have positive entries, one has $s(x,y)\\in[0,1]$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "In the following code cell, we provide an implementation for the template-based chord recognition procedure described before. To obtain a better understanding of this procedure, we continue our Beatles example from above. The following steps are performed and visualized:\n", - "\n", - "* First, the audio recording is converted into a chroma representation. As an example, we use the STFT-variant as computed before. \n", - "\n", - "* Second, each chroma vector is compared with each of the $24$ binary chord templates, which yields $24$ similarity values per frame. These similarity values are visualized in the form of a **time–chord representation**.\n", - "\n", - "* Third, we select for each frame the chord label $\\lambda_{n}$ of the template that maximizes the similarity value over all $24$ chord templates. This yields our final chord recognition result, which is shown in the form of a **binary time–chord representation**.\n", - "\n", - "* Fourth, the manually generated chord annotations are visualized.\n", - "\n", - "In the following figure, all visualizations are superimposed with the manually generated chord annotations. \n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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tcsQjVb2bBwB3ClpNPBUo1e+++678+1vfztXTJFEXnfffXfumJNOKjZWefHixbljiiSqe9e73pU75tprr80dUyTh3Pr163PHPPTQQ7ljoFhyqaOPPjp3zLx583LHTJ48OXfMPffckzumSMK5N7yhWBaFww47LHfMww8/nDtmw4YNuWPe8pa35I557LHHcsccemj+/+eKJKmDYsngxo0blzumyH/1a9eurb1QiSIJ/gYNKpZMvsh72m233XLH7LvvvrmWL5IwtBr3yKQiYkiF6a/eFErSOzIDggFOycZFxIX1rNPMzMy2nsfI5FdtQLCZmZl1MjdktpKkDwCnkFyGvRdwCdAPeC/JwN8TImJpq8pnZmbWnbXLGJmuUsqBmVsYZO+oOBF4B3AIcBGwOiIOAu4C3teCcpqZmfUIvkVBPpVOLU2LiBXACkkvA79Kp88Gthgpmk2It9NOOzWpqGZmZt1bqxsneXSVHplKskPXN2Veb6JMIywiroyIyRExedttt+2M8pmZmXVL7pExMzOzttUuY2S6bUNm/fr1PP/887liHnzwwdzbeemll3LHvPjii7ljAO67777cMQceeGDumO222y53TJEDvkiOmyI5QIrkpIBi+6l///65Y4rkailyrD799NO5Y15++eXcMWvWrMkdA/COd7wjd8ymTZtyx+T9XoBi+UaKHAtFclkVre8ix/fAgQNzxxT5juzXr1/umCL7qEhuFyhW50uX5r825dFHH821fNHvukra5dRSl2jIlMsLExFXA1dnXo+tNM/MzMwap9Wni/JoeUNG0kaSwbsdpkTExa0qj5mZmblHJg8nwzMzM+ti2mWMTJctpaT5kr6e5paZIelgSbdKekLSR1tdPjMzs+7MVy3Vb2DJfZa+HhHXp8+fjogDJV1KMibmcGAA8CBwRemKsnlkdthhh2aW2czMrNtqdeMkj67QkKl2amlq+nc2MCSTHG+tpGERsSy7cERcCVwJMG7cuGhSec3MzLq9dmnIdNlTS6lsArzS5HhdoRFmZmbWLfXq1SvXox6SjpP0iKTHJX2hzPzdJE2TdJ+kBySdULOcBd6bmZmZdWN5x8fU03sjqTdwOXA8MAE4Q9KEksX+Gbghva/i6cD3aq23K/RqlI6RuSUitmil5dW3b1922WWXXDFvfvObc2/n17/+de6YJUuW5I6BYsmbiiSQ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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def get_chord_labels(ext_minor='m', nonchord=False):\n", - " \"\"\"Generate chord labels for major and minor triads (and possibly nonchord label)\n", - "\n", - " Notebook: C5/C5S2_ChordRec_Templates.ipynb\n", - "\n", - " Args:\n", - " ext_minor (str): Extension for minor chords (Default value = 'm')\n", - " nonchord (bool): If \"True\" then add nonchord label (Default value = False)\n", - "\n", - " Returns:\n", - " chord_labels (list): List of chord labels\n", - " \"\"\"\n", - " chroma_labels = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']\n", - " chord_labels_maj = chroma_labels\n", - " chord_labels_min = [s + ext_minor for s in chroma_labels]\n", - " chord_labels = chord_labels_maj + chord_labels_min\n", - " if nonchord is True:\n", - " chord_labels = chord_labels + ['N']\n", - " return chord_labels\n", - "\n", - "def generate_chord_templates(nonchord=False):\n", - " \"\"\"Generate chord templates of major and minor triads (and possibly nonchord)\n", - "\n", - " Notebook: C5/C5S2_ChordRec_Templates.ipynb\n", - "\n", - " Args:\n", - " nonchord (bool): If \"True\" then add nonchord template (Default value = False)\n", - "\n", - " Returns:\n", - " chord_templates (np.ndarray): Matrix containing chord_templates as columns\n", - " \"\"\"\n", - " template_cmaj = np.array([1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]).T\n", - " template_cmin = np.array([1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]).T\n", - " \n", - " num_chord = 24\n", - " if nonchord:\n", - " num_chord = 25\n", - " chord_templates = np.ones((12, num_chord))\n", - " for shift in range(12):\n", - " chord_templates[:, shift] = np.roll(template_cmaj, shift)\n", - " chord_templates[:, shift+12] = np.roll(template_cmin, shift)\n", - " return chord_templates\n", - "\n", - "def chord_recognition_template(X, norm_sim='1', nonchord=False):\n", - " \"\"\"Conducts template-based chord recognition\n", - " with major and minor triads (and possibly nonchord)\n", - "\n", - " Notebook: C5/C5S2_ChordRec_Templates.ipynb\n", - "\n", - " Args:\n", - " X (np.ndarray): Chromagram\n", - " norm_sim (str): Specifies norm used for normalizing chord similarity matrix (Default value = '1')\n", - " nonchord (bool): If \"True\" then add nonchord template (Default value = False)\n", - "\n", - " Returns:\n", - " chord_sim (np.ndarray): Chord similarity matrix\n", - " chord_max (np.ndarray): Binarized chord similarity matrix only containing maximizing chord\n", - " \"\"\"\n", - " chord_templates = generate_chord_templates(nonchord=nonchord)\n", - " X_norm = libfmp.c3.normalize_feature_sequence(X, norm='2')\n", - " chord_templates_norm = libfmp.c3.normalize_feature_sequence(chord_templates, norm='2')\n", - " chord_sim = np.matmul(chord_templates_norm.T, X_norm)\n", - " if norm_sim is not None:\n", - " chord_sim = libfmp.c3.normalize_feature_sequence(chord_sim, norm=norm_sim)\n", - " # chord_max = (chord_sim == chord_sim.max(axis=0)).astype(int)\n", - " chord_max_index = np.argmax(chord_sim, axis=0)\n", - " chord_max = np.zeros(chord_sim.shape).astype(np.int32)\n", - " for n in range(chord_sim.shape[1]):\n", - " chord_max[chord_max_index[n], n] = 1\n", - "\n", - " return chord_sim, chord_max\n", - "\n", - "# Chord recognition\n", - "X = X_STFT\n", - "chord_sim, chord_max = chord_recognition_template(X, norm_sim='max')\n", - "chord_labels = get_chord_labels(nonchord=False)\n", - "\n", - "# Plot\n", - "cmap = libfmp.b.compressed_gray_cmap(alpha=1, reverse=False)\n", - "fig, ax = plt.subplots(4, 2, gridspec_kw={'width_ratios': [1, 0.03], \n", - " 'height_ratios': [1.5, 3, 3, 0.3]}, figsize=(8, 10))\n", - "libfmp.b.plot_chromagram(X, ax=[ax[0,0], ax[0,1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n", - " title='STFT-based chromagram (feature rate = %0.1f Hz)' % (Fs_X))\n", - "#libfmp.b.plot_segments_overlay(ann, ax=ax[0,0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "libfmp.b.plot_matrix(chord_sim, ax=[ax[1, 0], ax[1, 1]], Fs=Fs_X, \n", - " title='Time–chord representation of chord similarity matrix',\n", - " ylabel='Chord', xlabel='')\n", - "ax[1, 0].set_yticks(np.arange( len(chord_labels) ))\n", - "ax[1, 0].set_yticklabels(chord_labels)\n", - "#libfmp.b.plot_segments_overlay(ann, ax=ax[1, 0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "libfmp.b.plot_matrix(chord_max, ax=[ax[2, 0], ax[2, 1]], Fs=Fs_X, \n", - " title='Time–chord representation of chord recognition result',\n", - " ylabel='Chord', xlabel='')\n", - "ax[2, 0].set_yticks(np.arange( len(chord_labels) ))\n", - "ax[2, 0].set_yticklabels(chord_labels)\n", - "ax[2, 0].grid()\n", - "#libfmp.b.plot_segments_overlay(ann, ax=ax[2, 0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "#libfmp.b.plot_segments(ann, ax=ax[3, 0], time_max=x_dur, time_label='Time (seconds)',\n", - "# colors=color_ann, alpha=0.3)\n", - "ax[3, 1].axis('off')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "total = np.sum(chord_max, axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(24, 34)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "chord_max.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.1414141414141414" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "14 / (60+39)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0, 'A#'),\n", - " (0, 'A#m'),\n", - " (0, 'Am'),\n", - " (0, 'Bm'),\n", - " (0, 'C'),\n", - " (0, 'C#'),\n", - " (0, 'Cm'),\n", - " (0, 'D#'),\n", - " (0, 'D#m'),\n", - " (0, 'Dm'),\n", - " (0, 'Em'),\n", - " (0, 'F'),\n", - " (0, 'Fm'),\n", - " (0, 'G#'),\n", - " (1, 'F#'),\n", - " (1, 'G'),\n", - " (1, 'Gm'),\n", - " (3, 'B'),\n", - " (3, 'D'),\n", - " (3, 'E'),\n", - " (4, 'C#m'),\n", - " (4, 'G#m'),\n", - " (5, 'F#m'),\n", - " (9, 'A')]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sorted([(e2, e1) for e1, e2 in zip(chord_labels, total)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The chord similarity values shown in the form of a time–chord representation indicate for each chroma vector a kind of likelihood for the $24$ possible chords. For example, this visualization shows that the chroma vectors at the beginning of the Beatles song are most similar to the template for the $\\mathrm{C}$ major chord $\\mathbf{C}$. Furthermore, there is also a higher degree of similarity to the templates for $\\mathbf{C}$, $\\mathbf{Em}$, and $\\mathbf{Am}$. Comparing the final chord recognition results with the reference annotation, one can observe that the results obtained from the automated procedure agree with the reference labels for most of the frames. We continue with our discussion of the results in the [FMP notebook on chord recognition evaluation](../C5/C5S2_ChordRec_Eval.html), where we also consider further examples.\n", - "\n", - "We close our Beatles example by looking at the similarity-maximizing chord templates for each frame. This yields a time‐chroma representation, which can be compared with the original input chromagram. In a way, the sequence of chord templates may be thought of as a musically informed quantization of the input chroma representation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "chord_templates = generate_chord_templates() \n", - "X_chord = np.matmul(chord_templates, chord_max)\n", - "\n", - "# Plot\n", - "fig, ax = plt.subplots(3, 2, gridspec_kw={'width_ratios': [1, 0.03], \n", - " 'height_ratios': [1, 1, 0.2]}, figsize=(8, 5))\n", - "\n", - "libfmp.b.plot_chromagram(X, ax=[ax[0, 0], ax[0, 1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n", - " title='STFT-based chromagram (feature rate = %0.1f Hz)' % (Fs_X))\n", - "#libfmp.b.plot_segments_overlay(ann, ax=ax[0, 0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "libfmp.b.plot_chromagram(X_chord, ax=[ax[1, 0], ax[1, 1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n", - " title='Binary templates of the chord recognition result')\n", - "#libfmp.b.plot_segments_overlay(ann, ax=ax[1, 0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "#libfmp.b.plot_segments(ann, ax=ax[2, 0], time_max=x_dur, time_label='Time (seconds)',\n", - "# colors=color_ann, alpha=0.3)\n", - "ax[2,1].axis('off')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Further Notes\n", - "\n", - "In this notebook, we have studied the problem of chord recognition with the objective of automatically extracting chord labels from a given music recording. Only considering the $24$ major and minor triads in a simplistic scenario, we introduced a first template-based matching procedure that compares chroma features of the music recording with prototypical chroma templates of the triads. Already with this simple baseline approach, there are many design choices that have a substantial influence on the final chord recognition results. \n", - "\n", - "* In this notebook, we have used **idealized binary chord templates** that indicate the presence or absence of notes in the given chord. For real music recordings, however, the presence of [harmonics](../C1/C1S3_HarmonicSeries.html) and other sound components leads to chroma features where the energy is spread over the chroma bands in a more unstructured, non-binary fashion. This motivates the usage of **chord templates with harmonics**, where the chroma patterns also account for the harmonics of the chord notes.\n", - "\n", - "* Instead of explicitly modeling the harmonics, a conceptually different approach is to **learn** chroma patterns from labeled training data. The input of such a **supervised learning** procedure consists of pairs of a chroma vector and a corresponding chord label. A simple way is then to derive chord templates by suitably averaging chroma vectors that are labeled with the same chord. \n", - "\n", - "* Taking the average templates is a simple way to adapt a template-based chord recognizer to given training data. More involved approaches are often based on statistical models that capture not only the **averages** but also the **variances** in the training data. In such approaches, the templates are replaced by chord models that are specified by, e.g., **Gaussian distributions** given in terms of a mean vector and a covariance matrix. The similarity of a given chroma vector to a chord model is then expressed by a Gaussian probability value and the assigned label is determined by the probability-maximizing chord model. The discussion of such statistical approaches is beyond the scope of these notebooks, and we refer the reader to the overview article by Cho and Bello.\n", - "\n", - "* Besides refining and adapting the chord templates, another general strategy is to modify and enhance the chroma features extracted from the audio recordings to be analyzed. We have already seen at the beginning of this notebook that there are many **chroma variants** with quite different properties. The chroma type used has a strong influence on the chord recognition results, as has been demonstrated by Jiang et al. in their article on **Analyzing Chroma Feature Types for Automated Chord Recognition**.\n", - "\n", - "Some of these components and more elaborate procedures for automated chord recognition are discussed in the subsequent notebooks.\n", - "\n", - "* In the [FMP notebook on chord recognition evaluation](../C5/C5S2_ChordRec_Eval.html), we introduce some evaluation measures and discuss further phenomena and examples.\n", - "* In the [FMP notebook on HMM-based chord recognition](../C5/C5S3_ChordRec_HMM.html), we discuss a chord recognition procedure that applies a context-aware postfiltering technique.\n", - "* In the [FMP notebook on the Beatles collection](../C5/C5S3_ChordRec_Beatles.html), we present a case study that indicates the relevance of various chord recognition components. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Acknowledgment: This notebook was created by Meinard Müller and Christof Weiß.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "
\"C0\"\"C1\"\"C2\"\"C3\"\"C4\"\"C5\"\"C6\"\"C7\"\"C8\"
" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/python-backend/notebooks/C5S3_ChordRec_HMM.ipynb b/python-backend/notebooks/C5S3_ChordRec_HMM.ipynb deleted file mode 100644 index 83f94df..0000000 --- a/python-backend/notebooks/C5S3_ChordRec_HMM.ipynb +++ /dev/null @@ -1,662 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "\"FMP\"\n", - "\"AudioLabs\"\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "\"C5\"\n", - "

HMM-Based Chord Recognition

\n", - "
\n", - "\n", - "
\n", - "\n", - "

\n", - "Following Section 5.3.4 of [Müller, FMP, Springer 2015], we discuss in this notebook an HMM-based approach for chord recognition. The idea of using HMMs for chord recognition was originally introduced by Sheh and Ellis. \n", - "

    \n", - "\n", - "
  • \n", - "Alexander Sheh, Daniel P. W. Ellis: Chord segmentation and recognition using EM-trained hidden Markov models. Proceedings of the International Conference on Music Information Retrieval (ISMIR), Baltimore, 2003. \n", - "
    \n", - " Bibtex \n", - "
  • \n", - " \n", - "
  • \n", - "Taemin Cho, Juan Pablo Bello: On the Relative Importance of Individual Components of Chord Recognition Systems. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 22 (2014), pp. 466–492. \n", - "
    \n", - " Bibtex \n", - "
  • \n", - " \n", - "
  • \n", - "Nanzhu Jiang, Peter Grosche, Verena Konz, Meinard Müller: Analyzing Chroma Feature Types for Automated Chord Recognition. Proceedings of the AES Conference on Semantic Audio, Ilmenau, Germany, 2011. \n", - "
    \n", - " Bibtex \n", - "
  • \n", - "\n", - "\n", - " \n", - "
\n", - " \n", - " \n", - "

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "We now show how the concept of [HMMs](../C5/C5S3_HiddenMarkovModel.html) can be applied to improve [automated chord recognition](../C5/C5S2_ChordRec_Templates.html). First of all, we need to create an HMM that suitably models our chord recognition problem. Generally, as introduced in the [FMP noteboook on HMMs](../C5/C5S3_HiddenMarkovModel.html), an HMM is specified by the parameters $\\Theta:=(\\mathcal{A},A,C,\\mathcal{B},B)$. In the chord recognition context, the set \n", - "\n", - "$$\n", - "\\mathcal{A}:=\\{\\alpha_{1},\\alpha_{2},\\ldots,\\alpha_{I}\\}.\n", - "$$\n", - "\n", - "of states is used to model the various chord types that are allowed in the recognition problem. As in the [FMP notebook on template-based chord recognition](../C5/C5S2_ChordRec_Templates.html), we consider in this notebook only the twelve major and twelve minor triads, thus setting\n", - "\n", - "\\begin{equation}\n", - "\\label{eq:ChordReco:HMM:App:Spec:SetStates}\n", - " \\mathcal{A} = \\{\\mathbf{C},\\mathbf{C}^\\sharp,\\ldots,\\mathbf{B},\\mathbf{Cm},\\mathbf{Cm^\\sharp},\\ldots,\\mathbf{Bm}\\} \n", - "\\end{equation}\n", - "\n", - "In this case, the HMM consists of $I=24$ states, which we enumerate as indicated above. For example, $\\alpha_{1}$ corresponds to $\\mathbf{C}$ and $\\alpha_{13}$ to $\\mathbf{Cm}$. In the remainder of this notebook, we do the following: \n", - "\n", - "* First, we explain how to explicitly create an HMM by specifying the other HMM parameters in a musically informed fashion. Even though these parameters may be learned automatically from training data using the [Baum–Welch Algorithm](../C5/C5S3_HiddenMarkovModel.html), the manual specification of HMM parameters is instructive and leads to an HMM with an explicit musical meaning. \n", - "\n", - "* Second, we apply this HMM for chord recognition. The input (i.e., observation sequence) of the HMM is a [**chromagram representation**](../C3/C3S1_SpecLogFreq-Chromagram.html) of the music recording. Applying the [**Viterbi Algorithm**](../C5/C5S3_Viterbi.html), we then derive an optimal state sequence (consisting of chord labels) that best explains the chroma sequence. The sequence of chord labels yields our frame-wise chord recognition result.\n", - "\n", - "We will compare the HMM-based chord recognition results with the results obtained from the [template-based approach](../C5/C5S2_ChordRec_Templates.html). In particular we will see that the HMM transition model introduces a kind of **context-aware postfiltering**. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Specification of Emission Likelihoods\n", - "\n", - "In our chord recognition scenario, the observations are chroma vectors that have previously been extracted from the given audio recording. In other words, the observations are $12$-dimensional real-valued vectors which are elements of the continuous feature space $\\mathcal{F}=\\mathbb{R}^{12}$. So far, we have only considered the case of **discrete HMMs**, where the observations are discrete symbols coming from a finite output space $\\mathcal{B}$. To make discrete HMMs applicable to our scenario, one possible procedure is to introduce a finite set of prototype vectors, a so-called **codebook**. Such a codebook can be regarded as a discretization of the continuous feature space $\\mathcal{F}=\\mathbb{R}^{12}$, where each codebook vector represents an entire range of feature vectors. Emission probabilities can then be determined on the basis of this finite set of codebook vectors.\n", - "\n", - "As an alternative, we use in the following an HMM variant, where we replace the discrete output space $\\mathcal{B}$ by the continuous feature space $\\mathcal{F}=\\mathbb{R}^{12}$ and the emission probability matrix $B$ by **likelihood functions**. In particular, the emission probability of a given state is replaced by a normalized similarity value defined as inner product of a state-dependent normalized template and a normalized observation (chroma) vector. To compute the state-dependent likelihood functions, we proceed as described in the [FMP notebook on template-based chord recognition](../C5/C5S2_ChordRec_Templates.html). Let $s:\\mathcal{F} \\times \\mathcal{F} \\to [0,1]$ be the **similarity measure** defined by the [inner product of normalized chroma vectors](../C5/C5S2_ChordRec_Templates.html) (where one should use a [thresholded normalization](../C3/C3S1_FeatureNormalization.html) to avoid division by zero):\n", - "\n", - "$$\n", - "s(x, y) = \\frac{\\langle x,y\\rangle}{\\|x\\|_2\\cdot\\|y\\|_2}\n", - "$$ \n", - "\n", - "for $x,y\\in\\mathcal{F}$. Based on $I=24$ major and minor triads (encoded by the states $\\mathcal{A}$ and indexed by the set $[1:I]$), we consider the [**binary chord templates**](../C5/C5S2_ChordRec_Templates.html) $\\mathbf{t}_i\\in \\mathcal{F}$ for $i\\in [1:I]$. Then, we define the state-dependent likelihood function $b_i:\\mathcal{F}\\to [0,1]$ by\n", - "\n", - "$$\n", - "b_i(x) := \\frac{s(x, \\mathbf{t}_i)}{\\sum_{j\\in[1:I]}s(x, \\mathbf{t}_j)}\n", - "$$\n", - "\n", - "for $x\\in\\mathcal{F}$ and $i\\in [1:I]$. In our scenario, the [observation sequence](../C5/C5S3_HiddenMarkovModel.html) $O=(o_{1},o_{2},\\ldots,o_{N})$ is a sequence of chroma vectors $o_n\\in\\mathcal{F}$. We define the observation-dependent $(I\\times N)$-matrix $B[O]$ by \n", - "\n", - "$$\n", - "B[O](i,n) = b_i(o_n)\n", - "$$\n", - "\n", - "for $i\\in[1:I]$ and $n\\in[1:N]$. Note that his matrix is exactly the [**chord similarity matrix**](../C5/C5S2_ChordRec_Templates.html) with a column-wise [$\\ell^1$-normalization](../C3/C3S1_FeatureNormalization.html), as introduced in the [FMP notebook on template-based chord recognition](../C5/C5S2_ChordRec_Templates.html) and visualized in form of a **time–chord representation**. In context of the the [Viterbi algorithm](../C5/C5S3_Viterbi.html), the likelihood $B[O](i,n)$ is used to replace the probability value $b_{ik_n}$. \n", - "\n", - "As our running example throughout the remainder of this notebook, we continue our Bach example introduced in the [FMP notebook on chord recognition evaluation](../C5/C5S2_ChordRec_Eval.html). In this example, we consider a piano recording of the first four measures of Johann Sebastian Bach's $\\mathrm{C}$-major prelude. Furthermore, in the next code cell, we show the observation sequence $O$ (chromagram representation) as well as the likelihood matrix $B[O]$ (time–chord representation).\n", - "\n", - "\"FMP_C5_20a\"\n", - "\n", - "
\n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n", - " warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import os\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "import pandas as pd\n", - "from scipy.linalg import circulant\n", - "from numba import jit\n", - "\n", - "import sys\n", - "sys.path.append('..')\n", - "import libfmp.b\n", - "from libfmp.c5 import get_chord_labels\n", - "%matplotlib inline\n", - "\n", - "test_file = \"/home/martin/Music/deemix Music/Simone Sommerland - Ki-Ka-Kinderturnen.mp3\"\n", - "\n", - "\n", - "# Specify \n", - "fn_wav = test_file #os.path.join('..', 'data', 'C5', 'FMP_C5_F20_Bach_BWV846-mm1-4_Fischer.wav')\n", - "#fn_ann = os.path.join('..', 'data', 'C5', 'FMP_C5_F20_Bach_BWV846-mm1-4_Fischer_ChordAnnotations.csv')\n", - "color_ann = {'C': [1, 0.5, 0, 1], 'G': [0, 1, 0, 1], 'Dm': [1, 0, 0, 1], 'N': [1, 1, 1, 1]}\n", - "\n", - "N = 4096\n", - "H = 1024\n", - "X, Fs_X, x, Fs, x_dur = \\\n", - " libfmp.c5.compute_chromagram_from_filename(fn_wav, N=N, H=H, gamma=0.1, version='STFT')\n", - "N_X = X.shape[1]\n", - "\n", - "# Chord recogntion\n", - "chord_sim, chord_max = libfmp.c5.chord_recognition_template(X, norm_sim='1')\n", - "chord_labels = libfmp.c5.get_chord_labels(nonchord=False)\n", - "\n", - "# Annotations\n", - "chord_labels = libfmp.c5.get_chord_labels(ext_minor='m', nonchord=False)\n", - "#ann_matrix, ann_frame, ann_seg_frame, ann_seg_ind, ann_seg_sec = \\\n", - "# libfmp.c5.convert_chord_ann_matrix(fn_ann, chord_labels, Fs=Fs_X, N=N_X, last=True)\n", - "#P, R, F, TP, FP, FN = libfmp.c5.compute_eval_measures(ann_matrix, chord_max)\n", - "\n", - "# Plot\n", - "cmap = libfmp.b.compressed_gray_cmap(alpha=1, reverse=False)\n", - "fig, ax = plt.subplots(3, 2, gridspec_kw={'width_ratios': [1, 0.03], \n", - " 'height_ratios': [1.5, 3, 0.2]}, figsize=(9, 7))\n", - "\n", - "libfmp.b.plot_chromagram(X, ax=[ax[0, 0], ax[0, 1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n", - " title='Observation sequence (chromagram with feature rate = %0.1f Hz)' % (Fs_X))\n", - "#libfmp.b.plot_segments_overlay(ann_seg_sec, ax=ax[0, 0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "libfmp.b.plot_matrix(chord_sim, ax=[ax[1, 0], ax[1, 1]], Fs=Fs_X, clim=[0, np.max(chord_sim)],\n", - " title='Likelihood matrix (time–chord representation)',\n", - " ylabel='Chord', xlabel='')\n", - "ax[1, 0].set_yticks(np.arange(len(chord_labels)))\n", - "ax[1, 0].set_yticklabels(chord_labels)\n", - "#libfmp.b.plot_segments_overlay(ann_seg_sec, ax=ax[1, 0], time_max=x_dur,\n", - "# print_labels=False, colors=color_ann, alpha=0.1)\n", - "\n", - "#libfmp.b.plot_segments(ann_seg_sec, ax=ax[2, 0], time_max=x_dur, time_label='Time (seconds)',\n", - "# colors=color_ann, alpha=0.3)\n", - "ax[2,1].axis('off')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Specification of Transition Probabilities\n", - "\n", - "In music, certain chord transitions are more likely than others. This observation is our main motivation to employ [HMMs](../C5/C5S3_HiddenMarkovModel.html), where the first-order temporal relationships between the various chords can be captured by the **transition probability matrix** $A$. In the following, we use the notation $\\alpha_{i}\\rightarrow\\alpha_{j}$ to refer to the transition from state $\\alpha_{i}$ to state $\\alpha_{j}$ for $i,j\\in[1:I]$. For example, the coefficient $a_{1,2}$ expresses the probability for the transition $\\alpha_{1}\\rightarrow\\alpha_{2}$ (corresponding to $\\mathbf{C}\\rightarrow\\mathbf{C}^\\sharp$), whereas $a_{1,8}$ expresses the probability for $\\alpha_{1}\\rightarrow\\alpha_{8}$ (corresponding to $\\mathbf{C}\\rightarrow\\mathbf{G}$). In real music, the change from a tonic to the dominant is much more likely than changing by one semitone, so that the probability $a_{1,8}$ should be much larger than $a_{1,2}$. The coefficients $a_{i,i}$ express the probability of staying in state $\\alpha_{i}$ (i.e., $\\alpha_{i}\\rightarrow\\alpha_{i}$) for $i\\in[1:I]$. These coefficients are also referred to as **self-transition** probabilities.\n", - "\n", - "A transition probability matrix can be specified in many ways. For example, the matrix may be defined manually by a music expert based on rules from harmony theory. The most common approach is to generate such a matrix automatically \n", - "by estimating the transition probabilities from labeled data. In the following figure, we show three different transition matrices (using a log probability scale for visualization purposes). \n", - "\n", - "* The first one was learned from labeled training data based on the [Beatles collection](../C5/C5S3_ChordRec_Beatles.html) using bigrams (pairs of adjacent elements) in the labeled frame sequences. As an example, the coefficient $a_{1,8}$ (corresponding to the transition $\\mathbf{C}\\rightarrow\\mathbf{G}$) has been highlighted. \n", - "* The second matrix is a **transposition-invariant** transition probability matrix obtained from the previous matrix. To achieve transposition invariance, the labeled training dataset is augmented by considering all twelve possible [cyclic chroma shifts](../C3/C3S1_TranspositionTuning.html) to the considered bigrams. \n", - "* The third matrix is a **uniform** transition probability matrix with a large value on the main diagonal (self-transitions) and a much smaller value at all remaining positions. \n", - "\n", - "\"FMP_C5_F29-30-32\"\n", - "\n", - "
\n", - "\n", - "For more details on the construction of these transition matrices, we refer to Section 5.3.4.2 of [Müller, FMP, Springer 2015]. In the following code cell, we read a `CSV`-file that contains the precomputed transition matrix estimated on the basis of the [Beatles collection](../C5/C5S3_ChordRec_Beatles.html). In the visualization, we show both the probability values as well as the log-probability values. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'fn_csv' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_23374/3864277426.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;31m# Load transition matrix estimated on the basis of the Beatles collection\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0;31m#fn_csv = os.path.join('..', 'data', 'C5', 'FMP_C5_transitionMatrix_Beatles.csv')\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 64\u001b[0;31m \u001b[0mA_est_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn_csv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m';'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 65\u001b[0m \u001b[0mA_est\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mA_est_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_numpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'float64'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'fn_csv' is not defined" - ] - } - ], - "source": [ - "def plot_transition_matrix(A, log=True, ax=None, figsize=(6, 5), title='',\n", - " xlabel='State (chord label)', ylabel='State (chord label)',\n", - " cmap='gray_r', quadrant=False):\n", - " \"\"\"Plot a transition matrix for 24 chord models (12 major and 12 minor triads)\n", - "\n", - " Notebook: C5/C5S3_ChordRec_HMM.ipynb\n", - "\n", - " Args:\n", - " A: Transition matrix\n", - " log: Show log probabilities (Default value = True)\n", - " ax: Axis (Default value = None)\n", - " figsize: Width, height in inches (only used when ax=None) (Default value = (6, 5))\n", - " title: Title for plot (Default value = '')\n", - " xlabel: Label for x-axis (Default value = 'State (chord label)')\n", - " ylabel: Label for y-axis (Default value = 'State (chord label)')\n", - " cmap: Color map (Default value = 'gray_r')\n", - " quadrant: Plots additional lines for C-major and C-minor quadrants (Default value = False)\n", - "\n", - " Returns:\n", - " fig: The created matplotlib figure or None if ax was given.\n", - " ax: The used axes.\n", - " im: The image plot\n", - " \"\"\"\n", - " fig = None\n", - " if ax is None:\n", - " fig, ax = plt.subplots(1, 1, figsize=figsize)\n", - " ax = [ax]\n", - "\n", - " if log is True:\n", - " A_plot = np.log(A)\n", - " cbar_label = 'Log probability'\n", - " clim = [-6, 0]\n", - " else:\n", - " A_plot = A\n", - " cbar_label = 'Probability'\n", - " clim = [0, 1]\n", - " im = ax[0].imshow(A_plot, origin='lower', aspect='equal', cmap=cmap, interpolation='nearest')\n", - " im.set_clim(clim)\n", - " plt.sca(ax[0])\n", - " cbar = plt.colorbar(im)\n", - " ax[0].set_xlabel(xlabel)\n", - " ax[0].set_ylabel(ylabel)\n", - " ax[0].set_title(title)\n", - " cbar.ax.set_ylabel(cbar_label)\n", - "\n", - " chord_labels = get_chord_labels()\n", - " chord_labels_squeezed = chord_labels.copy()\n", - " for k in [1, 3, 6, 8, 10, 11, 13, 15, 17, 18, 20, 22]:\n", - " chord_labels_squeezed[k] = ''\n", - "\n", - " ax[0].set_xticks(np.arange(24))\n", - " ax[0].set_yticks(np.arange(24))\n", - " ax[0].set_xticklabels(chord_labels_squeezed)\n", - " ax[0].set_yticklabels(chord_labels)\n", - "\n", - " if quadrant is True:\n", - " ax[0].axvline(x=11.5, ymin=0, ymax=24, linewidth=2, color='r')\n", - " ax[0].axhline(y=11.5, xmin=0, xmax=24, linewidth=2, color='r')\n", - "\n", - " return fig, ax, im\n", - "\n", - "# Load transition matrix estimated on the basis of the Beatles collection\n", - "#fn_csv = os.path.join('..', 'data', 'C5', 'FMP_C5_transitionMatrix_Beatles.csv')\n", - "A_est_df = pd.read_csv(fn_csv, delimiter=';')\n", - "A_est = A_est_df.to_numpy('float64')\n", - "\n", - "fig, ax = plt.subplots(1, 2, gridspec_kw={'width_ratios': [1, 1], \n", - " 'height_ratios': [1]}, \n", - " figsize=(10, 3.8))\n", - "\n", - "plot_transition_matrix(A_est, log=False, ax=[ax[0]], title='Transition matrix')\n", - "plot_transition_matrix(A_est, ax=[ax[1]], title='Transition matrix with log probabilities')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To obtain the **transposition-invariant transition matrix**, we simulate the [cyclic chroma shifts](../C3/C3S1_TranspositionTuning.html) on the matrix-level by cyclically shifting and averaging the four quadrants (defined by the major-chord and minor-chord regions) of the original matrix. In the visualization, we show the original transition matrix as well as the resulting transposition-invariant transition matrix. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def matrix_circular_mean(A):\n", - " \"\"\"Computes circulant matrix with mean diagonal sums\n", - "\n", - " Notebook: C5/C5S3_ChordRec_HMM.ipynb\n", - "\n", - " Args:\n", - " A (np.ndarray): Square matrix\n", - "\n", - " Returns:\n", - " A_mean (np.ndarray): Circulant output matrix\n", - " \"\"\"\n", - " N = A.shape[0]\n", - " A_shear = np.zeros((N, N))\n", - " for n in range(N):\n", - " A_shear[:, n] = np.roll(A[:, n], -n)\n", - " circ_sum = np.sum(A_shear, axis=1)\n", - " A_mean = circulant(circ_sum) / N\n", - " return A_mean\n", - " \n", - "def matrix_chord24_trans_inv(A):\n", - " \"\"\"Computes transposition-invariant matrix for transition matrix\n", - " based 12 major chords and 12 minor chords\n", - "\n", - " Notebook: C5/C5S3_ChordRec_HMM.ipynb\n", - "\n", - " Args:\n", - " A (np.ndarray): Input transition matrix\n", - "\n", - " Returns:\n", - " A_ti (np.ndarray): Output transition matrix\n", - " \"\"\"\n", - " A_ti = np.zeros(A.shape)\n", - " A_ti[0:12, 0:12] = matrix_circular_mean(A[0:12, 0:12])\n", - " A_ti[0:12, 12:24] = matrix_circular_mean(A[0:12, 12:24])\n", - " A_ti[12:24, 0:12] = matrix_circular_mean(A[12:24, 0:12])\n", - " A_ti[12:24, 12:24] = matrix_circular_mean(A[12:24, 12:24])\n", - " return A_ti\n", - "\n", - "\n", - "A_ti = matrix_chord24_trans_inv(A_est)\n", - "\n", - "fig, ax = plt.subplots(1, 2, gridspec_kw={'width_ratios': [1, 1], \n", - " 'height_ratios': [1]}, \n", - " figsize=(10, 3.8))\n", - "\n", - "plot_transition_matrix(A_est, ax=[ax[0]], quadrant=True, \n", - " title='Transition matrix')\n", - "plot_transition_matrix(A_ti, ax=[ax[1]], quadrant=True, \n", - " title='Transposition-invariant transition matrix')\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we provide a function for generating a uniform transition probability matrix. This function has a parameter $p\\in[0,1]$ that determines the probability for self transitions (the value on the main diagonal). The probabilities on the remaining positions are set such that the resulting matrix is a probability matrix (i.e., all rows and columns sum to one)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def uniform_transition_matrix(p=0.01, N=24):\n", - " \"\"\"Computes uniform transition matrix\n", - "\n", - " Notebook: C5/C5S3_ChordRec_HMM.ipynb\n", - "\n", - " Args:\n", - " p (float): Self transition probability (Default value = 0.01)\n", - " N (int): Column and row dimension (Default value = 24)\n", - "\n", - " Returns:\n", - " A (np.ndarray): Output transition matrix\n", - " \"\"\"\n", - " off_diag_entries = (1-p) / (N-1) # rows should sum up to 1\n", - " A = off_diag_entries * np.ones([N, N])\n", - " np.fill_diagonal(A, p)\n", - " return A\n", - "\n", - "fig, ax = plt.subplots(1, 2, gridspec_kw={'width_ratios': [1, 1], \n", - " 'height_ratios': [1]}, \n", - " figsize=(10, 3.8))\n", - "\n", - "p = 0.5\n", - "A_uni = uniform_transition_matrix(p)\n", - "plot_transition_matrix(A_uni, ax=[ax[0]], title='Uniform transition matrix (p=%0.2f)' % p)\n", - "p = 0.9\n", - "A_uni = uniform_transition_matrix(p)\n", - "plot_transition_matrix(A_uni, ax=[ax[1]], title='Uniform transition matrix (p=%0.2f)' % p)\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## HMM-Based Chord Recognition\n", - "\n", - "As discussed before, the free parameters of the HMM-based model can either be learned automatically from the training set or set manually using musical knowledge. Continuing with our Bach example, we now present an experiment that demonstrates the effect of applying HMMs to our chord recognition scenario. We use the following setting:\n", - "\n", - "* As observation sequence $O$, we use a sequence of chroma vectors.\n", - "* As for the transition probability matrix $A$, we simply use a uniform transition matrix. \n", - "* As for the initial state probability vector $C$, we use a uniform distribution.\n", - "* As for the emission probability matrix $B$, we replace them by the likelihood matrix $B[O]$, which is a normalized version of the chord similarity matrix also used for the [template-based chord recognition](../C5/C5S2_ChordRec_Templates.html).\n", - "* The frame-wise chord recognition results is given by the state sequence computed by the [Viterbi algorithm](../C5/C5S3_Viterbi.html). \n", - "\n", - "Using the likelihood matrix $B[O]$ instead of emission probabilities requires a small modification of the original algorithm. In the following code cell, we provide the implementation of this modification using a numerically stable log version. We then compare the HMM-based results with the [template-based approach](../C5/C5S2_ChordRec_Templates.html) showing the [evaluation results in the form of time–chord visualizations](../C5/C5S2_ChordRec_Eval.html), respectively." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "@jit(nopython=True)\n", - "def viterbi_log_likelihood(A, C, B_O):\n", - " \"\"\"Viterbi algorithm (log variant) for solving the uncovering problem\n", - "\n", - " Notebook: C5/C5S3_Viterbi.ipynb\n", - "\n", - " Args:\n", - " A (np.ndarray): State transition probability matrix of dimension I x I\n", - " C (np.ndarray): Initial state distribution of dimension I\n", - " B_O (np.ndarray): Likelihood matrix of dimension I x N\n", - "\n", - " Returns:\n", - " S_opt (np.ndarray): Optimal state sequence of length N\n", - " S_mat (np.ndarray): Binary matrix representation of optimal state sequence\n", - " D_log (np.ndarray): Accumulated log probability matrix\n", - " E (np.ndarray): Backtracking matrix\n", - " \"\"\"\n", - " I = A.shape[0] # Number of states\n", - " N = B_O.shape[1] # Length of observation sequence\n", - " tiny = np.finfo(0.).tiny\n", - " A_log = np.log(A + tiny)\n", - " C_log = np.log(C + tiny)\n", - " B_O_log = np.log(B_O + tiny)\n", - "\n", - " # Initialize D and E matrices\n", - " D_log = np.zeros((I, N))\n", - " E = np.zeros((I, N-1)).astype(np.int32)\n", - " D_log[:, 0] = C_log + B_O_log[:, 0]\n", - "\n", - " # Compute D and E in a nested loop\n", - " for n in range(1, N):\n", - " for i in range(I):\n", - " temp_sum = A_log[:, i] + D_log[:, n-1]\n", - " D_log[i, n] = np.max(temp_sum) + B_O_log[i, n]\n", - " E[i, n-1] = np.argmax(temp_sum)\n", - "\n", - " # Backtracking\n", - " S_opt = np.zeros(N).astype(np.int32)\n", - " S_opt[-1] = np.argmax(D_log[:, -1])\n", - " for n in range(N-2, -1, -1):\n", - " S_opt[n] = E[int(S_opt[n+1]), n]\n", - "\n", - " # Matrix representation of result\n", - " S_mat = np.zeros((I, N)).astype(np.int32)\n", - " for n in range(N):\n", - " S_mat[S_opt[n], n] = 1\n", - "\n", - " return S_mat, S_opt, D_log, E\n", - "\n", - "A = uniform_transition_matrix(p=0.5)\n", - "C = 1 / 24 * np.ones((1, 24))\n", - "B_O = chord_sim\n", - "chord_HMM, _, _, _ = viterbi_log_likelihood(A, C, B_O)\n", - "\n", - "P, R, F, TP, FP, FN = libfmp.c5.compute_eval_measures(ann_matrix, chord_HMM)\n", - "title = 'HMM-Based approach (N=%d, TP=%d, FP=%d, FN=%d, P=%.2f, R=%.2f, F=%.2f)' % (N_X, TP, FP, FN, P, R, F)\n", - "fig, ax, im = libfmp.c5.plot_matrix_chord_eval(ann_matrix, chord_HMM, Fs=1, \n", - " title=title, ylabel='Chord', xlabel='Time (frames)', chord_labels=chord_labels)\n", - "plt.tight_layout()\n", - "plt.show()\n", - "\n", - "P, R, F, TP, FP, FN = libfmp.c5.compute_eval_measures(ann_matrix, chord_max)\n", - "title = 'Template-based approach (N=%d, TP=%d, FP=%d, FN=%d, P=%.2f, R=%.2f, F=%.2f)' %\\\n", - " (N_X, TP, FP, FN, P, R, F)\n", - "fig, ax, im = libfmp.c5.plot_matrix_chord_eval(ann_matrix, chord_max, Fs=1, \n", - " title=title, ylabel='Chord', xlabel='Time (frames)', chord_labels=chord_labels)\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, the HMM-based chord recognizer clearly outperforms the template-based approach. The improvements in HMM-based approach come specifically from the **transition model** that introduces context-sensitive smoothing. In the case of **high self-transition probabilities**, a chord recognizer tends to stay in the current chord rather than change to another one, which can be regarded as a kind of smoothing. This effect is also demonstrated in our Bach example, where the broken chords cause many [chord ambiguities](../C5/C5S2_ChordRec_Eval.html) of short duration. This leads to many random-like chord changes when using a simple template-based chord recognizer. Using an HMM-based approach, chord changes are only performed when the relatively low transition probabilities are compensated by a substantial increase of emission probabilities. Consequently, only the dominant chord changes remain." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prefiltering vs. Postfiltering\n", - "\n", - "In the [FMP notebook on chord recognition evaluation](../C5/C5S2_ChordRec_Eval.html), we showed for the Bach example that one may achieve similar improvements by applying a longer window size when computing the input chromagram. Applying longer window sizes more or less amounts to temporal smoothing of the observation sequence. Since this smoothing is performed **prior** to the pattern matching step, we also call this strategy **prefiltering**. Note that such a prefiltering step not only smoothes out noise-like frames, but also washes out characteristic chroma information and blurs transitions. As opposed to prefiltering, the HMM-based approach leaves the feature representation untouched. Furthermore, the smoothing is performed in combination with the pattern matching step. For this reason, we also call this approach **postfiltering**. As a result, the original chroma information is preserved and transitions in the feature representation are kept sharp. \n", - "\n", - "\"FMP_C5_F13\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Further Notes\n", - "\n", - "In this notebook, we introduced a basic HMM-based approach for chord recognition. In our simplistic model, we used $24$ states that correspond to the $12$ major and $12$ minor triads and fixed the HMM parameters explicitly using musical knowledge. \n", - "\n", - "* In the application to chord labeling, the HMM was then used to uncover the most likely chord labeling sequence that generates a given sequence of chroma features—an idea originally introduced by [Sheh and Ellis](https://www.ee.columbia.edu/~dpwe/pubs/ismir03-chords.pdf). \n", - "\n", - "* In general, there is a delicate interplay of the various feature extraction, filtering, and pattern matching components composing a chord recognition system. In this context, we refer to the excellent overview paper [On the Relative Importance of Individual Components of Chord Recognition Systems](https://ieeexplore.ieee.org/document/6691936) by Cho and Bello. \n", - "\n", - "* In the article [Analyzing Chroma Feature Types for Automated Chord Recognition](https://secure.aes.org/forum/pubs/conferences/?elib=15943) by Jiang et al., the importance of the input representation is investigated.\n", - "\n", - "In this book, we have only considered a basic HMM variant. There are many more variants and extensions of HMMs including continuous HMMs and HMMs with specific state transition topologies. Rather than fixing the model parameters manually, the power of general HMMs is to automatically learn the free parameters based on training examples (e.g., using the [Baum-Welch Algorithm](../C5/C5S3_HiddenMarkovModel.html)). The estimation of the model parameters can become very intricate, leading to challenging and deep mathematical problems. For an excellent textbook on the classical theory of HMMs, including the discrete as well as the continuous case, we refer to the excellent book on [Hidden Markov Models for Speech Recognition](https://dl.acm.org/doi/book/10.5555/575447) by Huang et al. (1990). We close this notebook with an overview of a typical HMM-based chord recognition approach consisting of a training and an evaluation stage.\n", - "\n", - "\"FMP_C5_F33.png\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Acknowledgment: This notebook was created by Meinard Müller and Christof Weiß.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "
\"C0\"\"C1\"\"C2\"\"C3\"\"C4\"\"C5\"\"C6\"\"C7\"\"C8\"
" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/python-backend/notebooks/C5S3_HiddenMarkovModel.ipynb b/python-backend/notebooks/C5S3_HiddenMarkovModel.ipynb deleted file mode 100644 index b9fcc91..0000000 --- a/python-backend/notebooks/C5S3_HiddenMarkovModel.ipynb +++ /dev/null @@ -1,434 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "\"FMP\"\n", - "\"AudioLabs\"\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "\"C5\"\n", - "

Hidden Markov Model (HMM)

\n", - "
\n", - "\n", - "
\n", - "\n", - "

\n", - "Motivated by the chord recognition problem, we give in this notebook an overview of hidden Markov models (HMMs) and introduce three famous algorithmic problems related with HMMs following Section 5.3 of [Müller, FMP, Springer 2015]. For a detailed introduction of HMMs, we refer to the famous tutorial paper by Rabiner.\n", - "\n", - "

    \n", - "
  • \n", - "Lawrence R. Rabiner: A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, 77 (1989), pp. 257–286. \n", - "
    \n", - " Bibtex \n", - "
  • \n", - "
\n", - "

" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Markov Chains\n", - "\n", - "Certain transitions from one chord to another are more likely than others. To capture such likelihoods, one can employ a concept called **Markov chains**. Abstracting from our chord recognition scenario, we assume that the chord types to be considered are represented by a set \n", - "\n", - "\\begin{equation}\n", - " \\mathcal{A}:=\\{\\alpha_{1},\\alpha_{2},\\ldots,\\alpha_{I}\\}\n", - "\\end{equation}\n", - "\n", - "of size $I\\in\\mathbb{N}$. The elements $\\alpha_{i}$ for $i\\in[1:I]$ are referred to as **states**. A progression of chords is realized by a system that can be described at any time instance $n=1,2,3,\\ldots$ as being in some state $s_{n}\\in\\mathcal{A}$. The change from one state to another is specified according to a set of probabilities associated with each state. In general, a probabilistic description of such a system can be quite complex. To simplify the model, one often makes the assumption that the probability of a change from the current state $s_{n}$ to the next state $s_{n+1}$ only depends on the current state, and not on the events that preceded it. In terms of conditional probabilities, this property is expressed by\n", - "\n", - "\\begin{equation}\n", - " P[s_{n+1}=\\alpha_{j}|s_{n}=\\alpha_{i},s_{n-1}=\\alpha_{k},\\ldots]\n", - " = P[s_{n+1}=\\alpha_{j}|s_{n}=\\alpha_{i}].\n", - "\\end{equation}\n", - "\n", - "The specific kind of \"amnesia\" is called the **Markov property**. Besides this property, one also often assumes that the system is **invariant under time shifts**, which means by definition that the following coefficients become independent of the index $n$:\n", - "\n", - "\\begin{equation}\n", - " a_{ij} := P[s_{n+1}=\\alpha_{j} | s_{n}=\\alpha_{i}] \\in [0,1]\n", - "\\end{equation}\n", - "\n", - "for $i,j\\in[1:I]$. These coefficients are also called **state transition probabilities**. They obey the standard stochastic constraint $\\sum_{j=1}^{I} a_{ij} = 1$ and can be expressed by an $(I\\times I)$ matrix, which we denote by $A$. A system that satisfies these properties is also called a (discrete-time) **Markov chain**. The following figure illustrates these definitions. It defines a Markov chain that consists of $I=3$ states $\\alpha_{1}$, $\\alpha_{2}$, and $\\alpha_{3}$, which correspond to the major chords $\\mathbf{C}$, $\\mathbf{G}$, and $\\mathbf{F}$, respectively. In the graph representation, the states correspond to the nodes, the transitions to the edges, and the transition probabilities to the labels attached to the edges. For example, the transition probability to remain in the state $\\alpha_{1}=\\mathbf{C}$ is $a_{11}=0.8$, whereas the transition probability of changing from $\\alpha_{1}=\\mathbf{C}$ to $\\alpha_{2}=\\mathbf{G}$ is $a_{12}=0.1$.\n", - "\n", - "\"FMP_C5_F24\"\n", - "\n", - "The model expresses the probability of all possible chord changes. To compute the probability of a given chord progression, one also needs the information on how the model gets started. This information is specified\n", - "by additional model parameters referred to as **initial state probabilities**. For a general Markov chain, these probabilities are specified by the numbers\n", - "\n", - "\\begin{equation}\n", - " c_{i} := P[s_{1}=\\alpha_{i}] \\in [0,1]\n", - "\\end{equation}\n", - "\n", - "for $i\\in[1:I]$. These coefficients, which sum up to one, can be expressed by a vector of length $I$ denoted by $C$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Hidden Markov Models\n", - "\n", - "Based on a Markov chain, one can compute a probability for a given observation consisting of a sequence of states or chord types. In our [chord recognition scenario](../C5/C5S2_ChordRec_Templates.html), however, this is not what we need. Rather than observing a sequence of chord types, we observe a **sequence of chroma vectors** that are somehow related to the chord types. In other words, the state sequence is not directly visible, but only a fuzzier observation sequence that is generated based on the state sequence. This leads to an extension of Markov chains to a statistical model referred to as a **hidden Markov model** (HMM). The idea is to represent the relation between the observed feature vectors and the chord types (the states) using a probabilistic framework. Each state is equipped with a probability function that expresses the likelihood for a given chord type to output or emit a certain feature vector. As a result, we obtain a two-layered process consisting of a **hidden layer** and an **observable layer**. The hidden layer produces a state sequence that is not observable (\"hidden\"), but generates the observation sequence on the basis of the state-dependent probability functions.\n", - "\n", - "The **first layer** of an HMM is a **Markov chain** as introduced above. To define the second layer of an HMM, we need to specify a space of possible output values and a probability function for each state. In general, the output space can be any set including the real numbers, a vector space, or any kind of feature space. For example, in the case of chord recognition, this space may be modeled as the feature space $\\mathcal{F}=\\mathbb{R}^{12}$ consisting of all possible $12$-dimensional chroma vectors. For the sake of simplicity, we only consider the case of a **discrete HMM**, where the output space is assumed to be discrete and even finite. In this case, the space can be modeled as a finite set \n", - "\n", - "\\begin{equation}\n", - " \\mathcal{B} = \\{\\beta_{1},\\beta_{2},\\ldots,\\beta_{K}\\} \n", - "\\end{equation}\n", - "\n", - "of size $K\\in\\mathbb{N}$ consisting of distinct output elements $\\beta_{k}$, $k\\in[1:K]$, which are also referred to as **observation symbols**. An HMM associates with each state a probability function, which is also referred to as the **emission probability** or **output probability**. In the discrete case, the emission probabilities are specified by coefficients\n", - "\n", - "\\begin{equation}\n", - " b_{ik}\\in[0,1]\n", - "\\end{equation}\n", - "\n", - "for $i\\in[1:I]$ and $k\\in[1:K]$. Each coefficient $b_{ik}$ expresses the probability of the system to output the observation symbol $\\beta_{k}$ when in state $\\alpha_{i}$. Similarly to the state transition probabilities, the emission probabilities are required to satisfy the stochastic constraint $\\sum_{k=1}^{K} \\beta_{ik} = 1$ for $i\\in[1:I]$ (thus forming a probability distribution for each state). The coefficients can be expressed by an $(I\\times K)$ matrix, which we denote by $B$. In summary, an HMM is specified by a tuple\n", - "\n", - "\\begin{equation}\n", - " \\Theta:=(\\mathcal{A},A,C,\\mathcal{B},B).\n", - "\\end{equation}\n", - "\n", - "The sets $\\mathcal{A}$ and $\\mathcal{B}$ are usually considered to be fixed components of the model, while the probability values specified by $A$, $B$, and $C$ are the free parameters to be determined. This can be done explicitly by an expert based on his or her musical knowledge or by employing a learning procedure based on suitably labeled training data. Continuing the above example, the following figure illustrates a hidden Markov model, where the state-dependent emission probabilities are indicated by the labels of the dashed arrows.\n", - "\n", - "\"FMP_C5_F25\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following code cell, we define the state transition probability matrix $A$ and the output probability $B$ as specified by the figure. \n", - "\n", - "* Here, we assume that $\\alpha_{1}=\\mathbf{C}$, $\\alpha_{2}=\\mathbf{G}$, and $\\alpha_{3}=\\mathbf{F}$. \n", - "* Furthermore, the elements of the output space $\\mathcal{B} = \\{\\beta_{1},\\beta_{2},\\beta_{3}\\}$ represent the three chroma vectors ordered from left to right. \n", - "* Finally, we assume that the initial state probability vector $C$ is given by the values $c_{1}=0.6$, $c_{2}=0.2$, $c_{3}=0.2$." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from sklearn.preprocessing import normalize \n", - "\n", - "A = np.array([[0.8, 0.1, 0.1], \n", - " [0.2, 0.7, 0.1], \n", - " [0.1, 0.3, 0.6]])\n", - "\n", - "C = np.array([0.6, 0.2, 0.2])\n", - "\n", - "B = np.array([[0.7, 0.0, 0.3], \n", - " [0.1, 0.9, 0.0], \n", - " [0.0, 0.2, 0.8]])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## HMM-Based Sequence Generation \n", - "\n", - "Once an HMM is specified by $\\Theta:=(\\mathcal{A},A,C,\\mathcal{B},B)$, it can be used for various analysis and synthesis applications. Since it is very instructive, we now discuss how to (artificially) generate, on the basis of a given HMM, an observation sequence $O=(o_{1},o_{2},\\ldots,o_{N})$ of length $N\\in\\mathbb{N}$ with $o_n\\in \\mathcal{B}$, $n\\in[1:N]$. The generation procedure is as follows:\n", - "\n", - "1. Set $n=1$ and choose an initial state $s_n=\\alpha_i$ for some $i\\in[1:I]$ according to the initial state distribution $C$.\n", - "2. Generate an observation $o_n=\\beta_k$ for some $k\\in[1:K]$ according to the emission probability in state $s_n=\\alpha_i$ (specified by the $i^{\\mathrm{th}}$ row of $B$).\n", - "3. If $n=N$ then terminate the process. Otherwise, if $n 0, \"N should be at least one\"\n", - " I = A.shape[1]\n", - " K = B.shape[1]\n", - " assert I == A.shape[0], \"A should be an I-square matrix\"\n", - " assert I == C.shape[0], \"Dimension of C should be I\"\n", - " assert I == B.shape[0], \"Column-dimension of B should be I\"\n", - "\n", - " O = np.zeros(N, int)\n", - " S = np.zeros(N, int)\n", - " for n in range(N):\n", - " if n == 0:\n", - " i = np.random.choice(np.arange(I), p=C)\n", - " else:\n", - " i = np.random.choice(np.arange(I), p=A[i, :])\n", - " k = np.random.choice(np.arange(K), p=B[i, :])\n", - " S[n] = i\n", - " O[n] = k\n", - " if details:\n", - " print('n = %d, S[%d] = %d, O[%d] = %d' % (n, n, S[n], n, O[n]))\n", - " return O, S\n", - "\n", - "N = 10\n", - "O, S = generate_sequence_hmm(N, A, C, B, details=True)\n", - "print('State sequence S: ', S)\n", - "print('Observation sequence O:', O)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a sanity check for the plausibility of our sequence generation approach, we now check if the generated sequences reflect well the probabilities of our HMM. To this end, we estimate the original transition probability matrix $A$ and the output probability matrix $B$ from a generated observation sequence $O$ and state sequence $S$.\n", - "\n", - "* To obtain an estimate of the entry $a_{ij}$ of $A$, we count all transitions from $n$ to $n+1$ with $S(n)=\\alpha_i$ and $S(n+1)=\\alpha_j$ and then divide this number by the total number of transitions starting with $\\alpha_i$.\n", - "\n", - "* Similarly, to obtain an estimate of the entry $b_{ik}$ of $B$, we count the number of occurrences $n$ with $S(n)=\\alpha_i$ and $O(n)=\\beta_k$ and divide this number by the total number of occurrences of $\\alpha_i$ in $S$.\n", - "\n", - "When generating longer sequences by increasing the number $N$, the resulting estimates should approach the original values in $A$ and $B$. This is demonstrated by the subsequent experiment. \n", - "\n", - "
\n", - "Note: In practice, when estimating HMM model parameters from training data, only observation sequences are typically available, and the state sequences (that reflect the hidden generation process) are generally not known. Learning parameters only from observation sequences leads to much harder estimation problems as discussed below. \n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "======== Estimation results when using N = 100 ========\n", - "A =\n", - "[[ 0.800 0.100 0.100]\n", - " [ 0.200 0.700 0.100]\n", - " [ 0.100 0.300 0.600]]\n", - "A_est =\n", - "[[ 0.795 0.091 0.114]\n", - " [ 0.172 0.655 0.172]\n", - " [ 0.154 0.269 0.577]]\n", - "B =\n", - "[[ 0.700 0.000 0.300]\n", - " [ 0.100 0.900 0.000]\n", - " [ 0.000 0.200 0.800]]\n", - "B_est =\n", - "[[ 0.705 0.000 0.295]\n", - " [ 0.167 0.833 0.000]\n", - " [ 0.000 0.423 0.577]]\n", - "======== Estimation results when using N = 10000 ========\n", - "A =\n", - "[[ 0.800 0.100 0.100]\n", - " [ 0.200 0.700 0.100]\n", - " [ 0.100 0.300 0.600]]\n", - "A_est =\n", - "[[ 0.799 0.097 0.104]\n", - " [ 0.198 0.696 0.106]\n", - " [ 0.097 0.306 0.597]]\n", - "B =\n", - "[[ 0.700 0.000 0.300]\n", - " [ 0.100 0.900 0.000]\n", - " [ 0.000 0.200 0.800]]\n", - "B_est =\n", - "[[ 0.708 0.000 0.292]\n", - " [ 0.103 0.897 0.000]\n", - " [ 0.000 0.205 0.795]]\n" - ] - } - ], - "source": [ - "def estimate_hmm_from_o_s(O, S, I, K):\n", - " \"\"\"Estimate the state transition and output probability matrices from\n", - " a given observation and state sequence\n", - "\n", - " Notebook: C5/C5S3_HiddenMarkovModel.ipynb\n", - "\n", - " Args:\n", - " O (np.ndarray): Observation sequence of length N\n", - " S (np.ndarray): State sequence of length N\n", - " I (int): Number of states\n", - " K (int): Number of observation symbols\n", - "\n", - " Returns:\n", - " A_est (np.ndarray): State transition probability matrix of dimension I x I\n", - " B_est (np.ndarray): Output probability matrix of dimension I x K\n", - " \"\"\"\n", - " # Estimate A\n", - " A_est = np.zeros([I, I])\n", - " N = len(S)\n", - " for n in range(N-1):\n", - " i = S[n]\n", - " j = S[n+1]\n", - " A_est[i, j] += 1\n", - " A_est = normalize(A_est, axis=1, norm='l1')\n", - "\n", - " # Estimate B\n", - " B_est = np.zeros([I, K])\n", - " for i in range(I):\n", - " for k in range(K):\n", - " B_est[i, k] = np.sum(np.logical_and(S == i, O == k))\n", - " B_est = normalize(B_est, axis=1, norm='l1')\n", - " return A_est, B_est\n", - "\n", - "N = 100\n", - "print('======== Estimation results when using N = %d ========' % N)\n", - "O, S = generate_sequence_hmm(N, A, C, B, details=False)\n", - "A_est, B_est = estimate_hmm_from_o_s(O, S, A.shape[1], B.shape[1])\n", - "np.set_printoptions(formatter={'float': \"{: 7.3f}\".format})\n", - "print('A =', A, sep='\\n')\n", - "print('A_est =', A_est, sep='\\n')\n", - "print('B =', B, sep='\\n')\n", - "print('B_est =', B_est, sep='\\n')\n", - "\n", - "N = 10000\n", - "print('======== Estimation results when using N = %d ========' % N)\n", - "O, S = generate_sequence_hmm(N, A, C, B, details=False)\n", - "A_est, B_est = estimate_hmm_from_o_s(O, S, A.shape[1], B.shape[1])\n", - "np.set_printoptions(formatter={'float': \"{: 7.3f}\".format})\n", - "print('A =', A, sep='\\n')\n", - "print('A_est =', A_est, sep='\\n')\n", - "print('B =', B, sep='\\n')\n", - "print('B_est =', B_est, sep='\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Three Problems for HMMs\n", - "\n", - "We have seen how a given HMM can be used to generate an observation sequence. We will now look at three famous algorithmic problems for HMMs that concern the specification of the free model parameters and the evaluation of observation sequences. \n", - "\n", - "### 1. Evaluation Problem\n", - "\n", - "The first problem is known as **evaluation problem**. Given an HMM specified by $\\Theta=(\\mathcal{A},A,C,\\mathcal{B},B)$ and an observation sequence $O=(o_{1},o_{2},\\ldots,o_{N})$, the task is to compute the probability \n", - "\n", - "\\begin{equation}\n", - " P[O|\\Theta]\n", - "\\end{equation}\n", - "\n", - "of the observation sequence given the model. From a slightly different viewpoint, this probability can be regarded as a score value that expresses how well a given model matches a given observation sequence. This interpretation becomes useful in the case where one is trying to choose among several competing models. The solution would then be to choose the model which best matches the observation sequence. To compute $P[O|\\Theta]$, we first consider a fixed state sequence $S=(s_1,s_2,\\ldots,s_N)$ of length $N$ with $s_n=\\alpha_{i_n}\\in\\mathcal{A}$ for some suitable $i_n\\in[1:I]$, $n\\in[1:N]$. The probability $P[O,S|\\Theta]$ for generating the state sequence $S$ as well as the observation sequence $O$ is given by \n", - "\n", - "$$\n", - "P[O,S|\\Theta] = c_{i_1}\\cdot b_{i_1k_1} \\cdot a_{i_1i_2}\\cdot b_{i_2k_2} \\cdot ...\\cdot a_{i_{N-1}i_N}\\cdot b_{i_Nk_N}\n", - "$$\n", - "\n", - "Next, to obtain the overall probability $P[O|\\Theta]$, one needs to sum up all these probabilities considering all possible state sequences $S$ of length $|S|=N$:\n", - "\n", - "$$\n", - "P[O|\\Theta] = \\sum_{S: |S|=N}P[O,S|\\Theta]\n", - "= \\sum_{i_1=1}^I \\sum_{i_2=1}^I \\ldots \\sum_{i_N=1}^I\n", - "c_{i_1}\\cdot b_{i_1k_1} \\cdot a_{i_1i_2}\\cdot b_{i_2k_2} \\cdot ...\\cdot a_{i_{N-1}i_N}\\cdot b_{i_Nk_N}\n", - "$$\n", - "\n", - "This leads to $I^N$ summands, a number that is exponential in the length $N$ of the observation sequence. Therefore, in practice, this brute-force calculation is computationally infeasible even for a small $N$. The good news is that there is a more efficient way to compute $P[O|\\Theta]$ using an algorithm that is based on the dynamic programming paradigm. This procedure, which is known as [**Forward–Backward Algorithm**](https://en.wikipedia.org/wiki/Forward%E2%80%93backward_algorithm), requires a number of operations on the order of $I^2N$ (instead of $I^N$). For a detailed description of this algorithm, we refer to the article by [Rabiner](https://ieeexplore.ieee.org/document/18626).\n", - "\n", - "\n", - "### 2. Uncovering Problem\n", - "\n", - "The second problem is the so-called **uncovering problem**. Again, we are given an HMM specified by $\\Theta=(\\mathcal{A},A,C,\\mathcal{B},B)$ and an observation sequence $O=(o_{1},o_{2},\\ldots,o_{N})$. Instead of finding the overall probability $P[O|\\Theta]$ for $O$, where one needs to consider **all** possible state sequences, the goal of the uncovering problem is to find the **single** state sequence $S=(s_{1},s_{2},\\ldots,s_{N})$ that \"best explains\" the observation sequence. The uncovering problem stated so far is not well defined since, in general, there is not a single \"correct\" state sequence generating the observation sequence. Indeed, one needs a kind of optimization criterion that specifies what is meant when talking about a best possible explanation. There are several reasonable choices for such a criterion, and the actual choice will depend on the intended application. In the [FMP notebook on the Viterbi algorithm](../C5/C5S3_Viterbi.html), we will discuss one possible choice as well as an efficient algorithm (called **Viterbi algorithm**). This algorithm, which can be thought of as a kind of context-sensitive smoothing procedure, will apply in the [FMP notebook on HMM-based chord recognition](../C5/C5S3_ChordRec_HMM.html). \n", - "\n", - "\n", - "### 3. Estimation Problem\n", - "\n", - "Besides the evaluation and uncovering problems, the third basic problem for HMMs is referred to as the **estimation problem**. Given an observation sequence $O$, the objective is to determine the free model parameters of $\\Theta$ (specified by by $A$, $C$, and $B$) that maximize the probability $P[O|\\Theta]$. In other words, the free model parameters are to be estimated so as to best describe the observation sequence. This is a typical instance of an **optimization problem** where a set of observation sequences serves as **training material** for adjusting or learning the HMM parameters. The estimation problem is by far the most difficult problem of HMMs. In fact, there is no known way to explicitly solve the given optimization problem. However, iterative procedures that find locally optimal solutions have been suggested. One of these procedures is known as the [**Baum–Welch Algorithm**](https://en.wikipedia.org/wiki/Baum%E2%80%93Welch_algorithm). Again, we refer to the article by [Rabiner](https://ieeexplore.ieee.org/document/18626) for more details. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Acknowledgment: This notebook was created by Meinard Müller.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "
\"C0\"\"C1\"\"C2\"\"C3\"\"C4\"\"C5\"\"C6\"\"C7\"\"C8\"
" - ] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/python-backend/notebooks/README.md b/python-backend/notebooks/README.md index 8cd66f3..3885e21 100644 --- a/python-backend/notebooks/README.md +++ b/python-backend/notebooks/README.md @@ -1,14 +1,10 @@ # Notebooks -Exploratory material, **not part of the running backend** and not imported by it. +Scratch work, **not part of the running backend** and not imported by it. -`audio_analysis.py` and the three `C5S*` notebooks are chroma/chord-recognition course -work (they still reference stale absolute paths). `effect_debug.ipynb` is scratch work -for tinkering with LED effects. - -They need `librosa`, `numba` and `numpy`, which are deliberately not in the backend's -dependencies: +`effect_debug.ipynb` is for tinkering with LED effects. It needs `numpy` and `jupyter`, +which are deliberately not in the backend's dependencies: ```sh -pip install librosa numba numpy jupyter +pip install numpy jupyter ``` diff --git a/python-backend/notebooks/audio_analysis.py b/python-backend/notebooks/audio_analysis.py deleted file mode 100644 index 8d90d55..0000000 --- a/python-backend/notebooks/audio_analysis.py +++ /dev/null @@ -1,128 +0,0 @@ -import librosa -from numba import jit -import numpy as np - - -@jit(nopython=True) -def normalize_feature_sequence(X, norm='2', threshold=0.0001, v=None): - """Normalizes the columns of a feature sequence - Notebook: C3/C3S1_FeatureNormalization.ipynb - Args: - X (np.ndarray): Feature sequence - norm (str): The norm to be applied. '1', '2', 'max' or 'z' (Default value = '2') - threshold (float): An threshold below which the vector ``v`` used instead of normalization - (Default value = 0.0001) - v (float): Used instead of normalization below ``threshold``. If None, uses unit vector for given norm - (Default value = None) - Returns: - X_norm (np.ndarray): Normalized feature sequence - """ - assert norm in ['1', '2', 'max', 'z'] - - K, N = X.shape - X_norm = np.zeros((K, N)) - - if norm == '1': - if v is None: - v = np.ones(K, dtype=np.float64) / K - for n in range(N): - s = np.sum(np.abs(X[:, n])) - if s > threshold: - X_norm[:, n] = X[:, n] / s - else: - X_norm[:, n] = v - - if norm == '2': - if v is None: - v = np.ones(K, dtype=np.float64) / np.sqrt(K) - for n in range(N): - s = np.sqrt(np.sum(X[:, n]**2)) - if s > threshold: - X_norm[:, n] = X[:, n] / s - else: - X_norm[:, n] = v - - if norm == 'max': - if v is None: - v = np.ones(K, dtype=np.float64) - for n in range(N): - s = np.max(np.abs(X[:, n])) - if s > threshold: - X_norm[:, n] = X[:, n] / s - else: - X_norm[:, n] = v - - if norm == 'z': - if v is None: - v = np.zeros(K, dtype=np.float64) - for n in range(N): - mu = np.sum(X[:, n]) / K - sigma = np.sqrt(np.sum((X[:, n] - mu)**2) / (K - 1)) - if sigma > threshold: - X_norm[:, n] = (X[:, n] - mu) / sigma - else: - X_norm[:, n] = v - - return X_norm - - -def compute_chromagram_from_filename(fn_wav, - Fs=22050, - N=4096, - H=2048, - gamma=None, - version='STFT', - norm='2'): - """Compute chromagram for WAV file specified by filename - - Notebook: C5/C5S2_ChordRec_Templates.ipynb - - Args: - fn_wav (str): Filenname of WAV - Fs (scalar): Sampling rate (Default value = 22050) - N (int): Window size (Default value = 4096) - H (int): Hop size (Default value = 2048) - gamma (float): Constant for logarithmic compression (Default value = None) - version (str): Technique used for front-end decomposition ('STFT', 'IIS', 'CQT') (Default value = 'STFT') - norm (str): If not 'None', chroma vectors are normalized by norm as specified ('1', '2', 'max') - (Default value = '2') - - Returns: - X (np.ndarray): Chromagram - Fs_X (scalar): Feature reate of chromagram - x (np.ndarray): Audio signal - Fs (scalar): Sampling rate of audio signal - x_dur (float): Duration (seconds) of audio signal - """ - x, Fs = librosa.load(fn_wav, sr=Fs) - x_dur = x.shape[0] / Fs - if version == 'STFT': - # Compute chroma features with STFT - X = librosa.stft(x, n_fft=N, hop_length=H, pad_mode='constant', center=True) - if gamma is not None: - X = np.log(1 + gamma * np.abs(X)**2) - else: - X = np.abs(X)**2 - X = librosa.feature.chroma_stft(S=X, sr=Fs, tuning=0, norm=None, hop_length=H, n_fft=N) - if version == 'CQT': - # Compute chroma features with CQT decomposition - X = librosa.feature.chroma_cqt(y=x, sr=Fs, hop_length=H, norm=None) - if version == 'IIR': - # Compute chroma features with filter bank (using IIR elliptic filter) - X = librosa.iirt(y=x, sr=Fs, win_length=N, hop_length=H, center=True, tuning=0.0) - if gamma is not None: - X = np.log(1.0 + gamma * X) - X = librosa.feature.chroma_cqt(C=X, - bins_per_octave=12, - n_octaves=7, - fmin=librosa.midi_to_hz(24), - norm=None) - if norm is not None: - X = normalize_feature_sequence(X, norm='2') - Fs_X = Fs / H - return X, Fs_X, x, Fs, x_dur - - -if __name__ == "__main__": - test_file = "/home/martin/Music/deemix Music/Simone Sommerland - Ki-Ka-Kinderturnen.mp3" - chroma = compute_chromagram_from_filename(test_file) diff --git a/python-backend/pyproject.toml b/python-backend/pyproject.toml index 49f284b..d4d374b 100644 --- a/python-backend/pyproject.toml +++ b/python-backend/pyproject.toml @@ -55,7 +55,7 @@ filterwarnings = ["error"] [tool.ruff] line-length = 100 target-version = "py311" -# Course material and scratch work, not part of the backend. See notebooks/README.md. +# Scratch work, not part of the backend. See notebooks/README.md. extend-exclude = ["notebooks"] [tool.ruff.lint]