Newer
Older
{
"cell_type": "markdown",
"source": [
"# Feature Extraction of Base audio files from Invenio"
],
"metadata": {
"collapsed": false
}
},
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from contextlib import contextmanager, redirect_stderr, redirect_stdout\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"
"# 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",
"@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",
"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",
"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>"
"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",
"# outputs\n",
"OUTPUT_PATH = BASE_PATH / \"tmp\" / \"2_generate_features\" / \"output\"\n",
"OUTPUT_PATH.mkdir(parents=True, exist_ok=True)\n",
"output.to_csv(OUTPUT_PATH / \"raw_features.csv\", index=False)"
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
],
"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
}