*** Wartungsfenster jeden ersten Mittwoch vormittag im Monat ***

Skip to content
Snippets Groups Projects
2_generate_features.ipynb 14.1 KiB
Newer Older
{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# Feature Extraction of Base audio files from Invenio"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from contextlib import contextmanager, redirect_stderr, redirect_stdout\n",
    "import pandas as pd\n",
    "import librosa\n",
    "import tarfile\n",
    "from pathlib import Path\n",
    "from concurrent.futures import ThreadPoolExecutor\n",
    "from definitions import BASE_PATH\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "# inputs\n",
    "\n",
    "DEFAULT_SAMPLING_RATE = 22050\n",
    "INPUT_PATH = BASE_PATH / \"tmp\" / \"2_generate_features\" / \"input\"\n",
    "assert INPUT_PATH.exists() and INPUT_PATH.is_dir()\n",
    "\n",
    "# files = load_input_audio_archive(gzip_audio_path := INPUT_PATH / \"audio_files.tar.gz\", gzip_audio_path.with_suffix(\"\"))\n",
    "with tarfile.open(audio_gz := INPUT_PATH / \"emotifymusic.tar.gz\", \"r:gz\") as archive:\n",
    "    archive.extractall(path=(path_out := audio_gz.with_suffix(\"\").with_suffix(\"\")))\n",
    "\n",
    "files = list(path_out.rglob(\"**/*.*\"))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "@contextmanager\n",
    "def suppress_stdout_stderr():\n",
    "    \"\"\"A context manager that redirects stdout and stderr to devnull\"\"\"\n",
    "    with open(os.devnull, 'w') as fnull:\n",
    "        with redirect_stderr(fnull) as err, redirect_stdout(fnull) as out:\n",
    "            yield err, out"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "def generate_mfcc_feature(filepath: Path, sr: int = DEFAULT_SAMPLING_RATE, number_mfccs: int = 40):\n",
    "    x, _ = load_mp3(filepath, sr=sr)\n",
    "    assert sr == _\n",
    "    mfcc = librosa.feature.mfcc(x, sr=sr, n_mfcc=number_mfccs)\n",
    "\n",
    "    # transpose to use mfcc bands as columns instead of rows\n",
    "    return pd.DataFrame(mfcc).transpose()\n",
    "\n",
    "def load_mp3(filepath: Path, sr: int = DEFAULT_SAMPLING_RATE):\n",
    "    x, sr = librosa.load(filepath, sr=sr)   # extract wave (x) with sample rate (sr)\n",
    "    return x, sr\n",
    "\n",
    "with suppress_stdout_stderr(), ThreadPoolExecutor(6) as executor:\n",
    "    dataframes = list(executor.map(\n",
    "        lambda args: generate_mfcc_feature(args), files)\n",
    "    )"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/plain": "      sample     filename label           0           1          2          3  \\\n0          0  rock_62.mp3  rock -571.813416   -0.045195  -0.776617   0.130642   \n1          1  rock_62.mp3  rock -283.595123  104.793701 -28.864902  35.690403   \n2          2  rock_62.mp3  rock  -84.322151  101.870377  -0.200612  48.966591   \n3          3  rock_62.mp3  rock  -19.622435   92.185410   8.945698  51.681049   \n4          4  rock_62.mp3  rock  -15.719015   84.805496   3.012265  46.291245   \n...      ...          ...   ...         ...         ...        ...        ...   \n2581    2581   pop_84.mp3   pop  -20.295166   76.309967  -0.537112  47.537018   \n2582    2582   pop_84.mp3   pop  -24.393179   76.078751  -0.217696  45.393887   \n2583    2583   pop_84.mp3   pop  -32.004326   73.496300   7.648635  48.266846   \n2584    2584   pop_84.mp3   pop  -24.098267   74.569794   1.918022  42.742210   \n2585    2585   pop_84.mp3   pop  -49.109211   77.647949  -3.673396  42.419292   \n\n              4          5          6  ...         30         31         32  \\\n0      0.740200  -0.202103  -0.685899  ...  -0.571889   0.460704   0.534769   \n1     -4.955809 -11.049730 -12.609512  ...  -8.575553   7.450663   3.012856   \n2      0.395384   7.875898  -8.082167  ...  -1.941671   3.003232  -9.348690   \n3      7.451919  13.238035   0.040309  ...   0.989069   3.732528 -10.594652   \n4     11.866993  14.065739   3.912442  ...   2.546893   4.681245 -10.060188   \n...         ...        ...        ...  ...        ...        ...        ...   \n2581  -2.753691  20.138699 -12.179976  ... -11.053669  13.894144   8.479092   \n2582  -3.839055  18.908188 -13.727843  ...  -4.695143  15.707985   8.134483   \n2583  -0.455808  17.435381 -14.363821  ...  -2.071352  17.130743   0.093085   \n2584  -2.470837  18.779152 -18.865677  ...  -8.722974  14.073466   0.714307   \n2585  -1.558257  18.824373 -23.748917  ... -10.903637  10.563424   3.245042   \n\n            33         34        35         36        37        38        39  \n0    -0.529890  -0.475038  0.583885   0.398325 -0.615929 -0.313063  0.622702  \n1    -0.510788  -4.468874 -4.104988  -0.391649  3.345398  2.204561 -7.161574  \n2     1.886054  -5.747732  1.687546   0.704384 -2.186291  1.340472 -1.882954  \n3     2.572243  -1.231659  3.904081  -0.745448  1.233542 -2.789202 -0.164483  \n4    -0.001825  -0.918342  1.720158  -1.147007  5.340800 -6.961733  1.635832  \n...        ...        ...       ...        ...       ...       ...       ...  \n2581  7.122847 -14.929329 -5.350380 -13.549859 -2.760207 -6.507334 -1.587169  \n2582 -4.642361 -16.337616  1.411419  -5.382087 -2.032343 -4.381462  6.644224  \n2583 -9.584680 -14.788561  3.801263  -4.997859 -0.796039 -4.585654  8.843502  \n2584 -3.764169 -16.944185 -0.806753  -6.225281  2.324071 -6.115126  1.064405  \n2585  3.819183 -15.246656 -0.539900  -7.361567  7.688834 -3.895716 -3.842279  \n\n[1029854 rows x 43 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>sample</th>\n      <th>filename</th>\n      <th>label</th>\n      <th>0</th>\n      <th>1</th>\n      <th>2</th>\n      <th>3</th>\n      <th>4</th>\n      <th>5</th>\n      <th>6</th>\n      <th>...</th>\n      <th>30</th>\n      <th>31</th>\n      <th>32</th>\n      <th>33</th>\n      <th>34</th>\n      <th>35</th>\n      <th>36</th>\n      <th>37</th>\n      <th>38</th>\n      <th>39</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0</td>\n      <td>rock_62.mp3</td>\n      <td>rock</td>\n      <td>-571.813416</td>\n      <td>-0.045195</td>\n      <td>-0.776617</td>\n      <td>0.130642</td>\n      <td>0.740200</td>\n      <td>-0.202103</td>\n      <td>-0.685899</td>\n      <td>...</td>\n      <td>-0.571889</td>\n      <td>0.460704</td>\n      <td>0.534769</td>\n      <td>-0.529890</td>\n      <td>-0.475038</td>\n      <td>0.583885</td>\n      <td>0.398325</td>\n      <td>-0.615929</td>\n      <td>-0.313063</td>\n      <td>0.622702</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>rock_62.mp3</td>\n      <td>rock</td>\n      <td>-283.595123</td>\n      <td>104.793701</td>\n      <td>-28.864902</td>\n      <td>35.690403</td>\n      <td>-4.955809</td>\n      <td>-11.049730</td>\n      <td>-12.609512</td>\n      <td>...</td>\n      <td>-8.575553</td>\n      <td>7.450663</td>\n      <td>3.012856</td>\n      <td>-0.510788</td>\n      <td>-4.468874</td>\n      <td>-4.104988</td>\n      <td>-0.391649</td>\n      <td>3.345398</td>\n      <td>2.204561</td>\n      <td>-7.161574</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>rock_62.mp3</td>\n      <td>rock</td>\n      <td>-84.322151</td>\n      <td>101.870377</td>\n      <td>-0.200612</td>\n      <td>48.966591</td>\n      <td>0.395384</td>\n      <td>7.875898</td>\n      <td>-8.082167</td>\n      <td>...</td>\n      <td>-1.941671</td>\n      <td>3.003232</td>\n      <td>-9.348690</td>\n      <td>1.886054</td>\n      <td>-5.747732</td>\n      <td>1.687546</td>\n      <td>0.704384</td>\n      <td>-2.186291</td>\n      <td>1.340472</td>\n      <td>-1.882954</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>3</td>\n      <td>rock_62.mp3</td>\n      <td>rock</td>\n      <td>-19.622435</td>\n      <td>92.185410</td>\n      <td>8.945698</td>\n      <td>51.681049</td>\n      <td>7.451919</td>\n      <td>13.238035</td>\n      <td>0.040309</td>\n      <td>...</td>\n      <td>0.989069</td>\n      <td>3.732528</td>\n      <td>-10.594652</td>\n      <td>2.572243</td>\n      <td>-1.231659</td>\n      <td>3.904081</td>\n      <td>-0.745448</td>\n      <td>1.233542</td>\n      <td>-2.789202</td>\n      <td>-0.164483</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4</td>\n      <td>rock_62.mp3</td>\n      <td>rock</td>\n      <td>-15.719015</td>\n      <td>84.805496</td>\n      <td>3.012265</td>\n      <td>46.291245</td>\n      <td>11.866993</td>\n      <td>14.065739</td>\n      <td>3.912442</td>\n      <td>...</td>\n      <td>2.546893</td>\n      <td>4.681245</td>\n      <td>-10.060188</td>\n      <td>-0.001825</td>\n      <td>-0.918342</td>\n      <td>1.720158</td>\n      <td>-1.147007</td>\n      <td>5.340800</td>\n      <td>-6.961733</td>\n      <td>1.635832</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>2581</th>\n      <td>2581</td>\n      <td>pop_84.mp3</td>\n      <td>pop</td>\n      <td>-20.295166</td>\n      <td>76.309967</td>\n      <td>-0.537112</td>\n      <td>47.537018</td>\n      <td>-2.753691</td>\n      <td>20.138699</td>\n      <td>-12.179976</td>\n      <td>...</td>\n      <td>-11.053669</td>\n      <td>13.894144</td>\n      <td>8.479092</td>\n      <td>7.122847</td>\n      <td>-14.929329</td>\n      <td>-5.350380</td>\n      <td>-13.549859</td>\n      <td>-2.760207</td>\n      <td>-6.507334</td>\n      <td>-1.587169</td>\n    </tr>\n    <tr>\n      <th>2582</th>\n      <td>2582</td>\n      <td>pop_84.mp3</td>\n      <td>pop</td>\n      <td>-24.393179</td>\n      <td>76.078751</td>\n      <td>-0.217696</td>\n      <td>45.393887</td>\n      <td>-3.839055</td>\n      <td>18.908188</td>\n      <td>-13.727843</td>\n      <td>...</td>\n      <td>-4.695143</td>\n      <td>15.707985</td>\n      <td>8.134483</td>\n      <td>-4.642361</td>\n      <td>-16.337616</td>\n      <td>1.411419</td>\n      <td>-5.382087</td>\n      <td>-2.032343</td>\n      <td>-4.381462</td>\n      <td>6.644224</td>\n    </tr>\n    <tr>\n      <th>2583</th>\n      <td>2583</td>\n      <td>pop_84.mp3</td>\n      <td>pop</td>\n      <td>-32.004326</td>\n      <td>73.496300</td>\n      <td>7.648635</td>\n      <td>48.266846</td>\n      <td>-0.455808</td>\n      <td>17.435381</td>\n      <td>-14.363821</td>\n      <td>...</td>\n      <td>-2.071352</td>\n      <td>17.130743</td>\n      <td>0.093085</td>\n      <td>-9.584680</td>\n      <td>-14.788561</td>\n      <td>3.801263</td>\n      <td>-4.997859</td>\n      <td>-0.796039</td>\n      <td>-4.585654</td>\n      <td>8.843502</td>\n    </tr>\n    <tr>\n      <th>2584</th>\n      <td>2584</td>\n      <td>pop_84.mp3</td>\n      <td>pop</td>\n      <td>-24.098267</td>\n      <td>74.569794</td>\n      <td>1.918022</td>\n      <td>42.742210</td>\n      <td>-2.470837</td>\n      <td>18.779152</td>\n      <td>-18.865677</td>\n      <td>...</td>\n      <td>-8.722974</td>\n      <td>14.073466</td>\n      <td>0.714307</td>\n      <td>-3.764169</td>\n      <td>-16.944185</td>\n      <td>-0.806753</td>\n      <td>-6.225281</td>\n      <td>2.324071</td>\n      <td>-6.115126</td>\n      <td>1.064405</td>\n    </tr>\n    <tr>\n      <th>2585</th>\n      <td>2585</td>\n      <td>pop_84.mp3</td>\n      <td>pop</td>\n      <td>-49.109211</td>\n      <td>77.647949</td>\n      <td>-3.673396</td>\n      <td>42.419292</td>\n      <td>-1.558257</td>\n      <td>18.824373</td>\n      <td>-23.748917</td>\n      <td>...</td>\n      <td>-10.903637</td>\n      <td>10.563424</td>\n      <td>3.245042</td>\n      <td>3.819183</td>\n      <td>-15.246656</td>\n      <td>-0.539900</td>\n      <td>-7.361567</td>\n      <td>7.688834</td>\n      <td>-3.895716</td>\n      <td>-3.842279</td>\n    </tr>\n  </tbody>\n</table>\n<p>1029854 rows × 43 columns</p>\n</div>"
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
    "for file, dataframe in zip(files, dataframes):\n",
    "    dataframe[\"sample\"] = dataframe.index.to_numpy(copy=True)\n",
    "    dataframe[\"filename\"] = file.name\n",
    "    dataframe[\"label\"] = file.name.split('_')[0]    # extract genre from file name\n",
    "dataframe_concat = pd.concat(dataframes)\n",
    "columns_old = list(dataframe_concat.columns)\n",
    "columns = columns_old[-3:] + columns_old[:-3]\n",
    "dataframe_concat = dataframe_concat[columns]\n",
    "output: pd.DataFrame = dataframe_concat\n",
    "output"
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [],
   "source": [
    "# outputs\n",
    "OUTPUT_PATH = BASE_PATH / \"tmp\" / \"2_generate_features\" / \"output\"\n",
    "\n",
    "output.to_csv(OUTPUT_PATH / \"output.csv\", index=False)\n",
    "output.to_pickle(OUTPUT_PATH / \"output.pickle\")"
   ],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}