pruth23 kurianbenoy commited on
Commit
64df49c
0 Parent(s):

Duplicate from kurianbenoy/audioclassification

Browse files

Co-authored-by: Kurian Benoy <kurianbenoy@users.noreply.huggingface.co>

.gitattributes ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ftz filter=lfs diff=lfs merge=lfs -text
6
+ *.gz filter=lfs diff=lfs merge=lfs -text
7
+ *.h5 filter=lfs diff=lfs merge=lfs -text
8
+ *.joblib filter=lfs diff=lfs merge=lfs -text
9
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
10
+ *.model filter=lfs diff=lfs merge=lfs -text
11
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
12
+ *.onnx filter=lfs diff=lfs merge=lfs -text
13
+ *.ot filter=lfs diff=lfs merge=lfs -text
14
+ *.parquet filter=lfs diff=lfs merge=lfs -text
15
+ *.pb filter=lfs diff=lfs merge=lfs -text
16
+ *.pt filter=lfs diff=lfs merge=lfs -text
17
+ *.pth filter=lfs diff=lfs merge=lfs -text
18
+ *.rar filter=lfs diff=lfs merge=lfs -text
19
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
20
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
21
+ *.tflite filter=lfs diff=lfs merge=lfs -text
22
+ *.tgz filter=lfs diff=lfs merge=lfs -text
23
+ *.wasm filter=lfs diff=lfs merge=lfs -text
24
+ *.xz filter=lfs diff=lfs merge=lfs -text
25
+ *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
000003.ogg ADDED
Binary file (394 kB). View file
 
000032.ogg ADDED
Binary file (380 kB). View file
 
000038.ogg ADDED
Binary file (416 kB). View file
 
000050.ogg ADDED
Binary file (368 kB). View file
 
000103.ogg ADDED
Binary file (435 kB). View file
 
README.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Audioclassification
3
+ emoji: 💻
4
+ colorFrom: gray
5
+ colorTo: indigo
6
+ sdk: gradio
7
+ sdk_version: 2.9.4
8
+ app_file: app.py
9
+ pinned: false
10
+ license: mit
11
+ duplicated_from: kurianbenoy/audioclassification
12
+ ---
13
+
14
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces#reference
app.py ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio
2
+ import torchaudio
3
+ from fastai.vision.all import *
4
+ from fastai.learner import load_learner
5
+ from torchvision.utils import save_image
6
+ from huggingface_hub import hf_hub_download
7
+
8
+
9
+ model = load_learner(
10
+ hf_hub_download("kurianbenoy/music_genre_classification_baseline", "model.pkl")
11
+ )
12
+
13
+ EXAMPLES_PATH = Path("./examples")
14
+ labels = model.dls.vocab
15
+
16
+ with open("article.md") as f:
17
+ article = f.read()
18
+
19
+ interface_options = {
20
+ "title": "Music Genre Classification",
21
+ "description": "A simple baseline model for classifying music genres with fast.ai on [Kaggle competition data](https://www.kaggle.com/competitions/kaggle-pog-series-s01e02/data)",
22
+ "article": article,
23
+ "interpretation": "default",
24
+ "layout": "horizontal",
25
+ # Audio from validation file
26
+ "examples": ["000003.ogg", "000032.ogg", "000038.ogg", "000050.ogg", "000103.ogg"],
27
+ "allow_flagging": "never"
28
+ }
29
+
30
+ ## Code from Dien Hoa Truong inference notebook: https://www.kaggle.com/code/dienhoa/inference-submission-music-genre
31
+ N_FFT = 2048
32
+ HOP_LEN = 1024
33
+
34
+
35
+ def create_spectrogram(filename):
36
+ audio, sr = torchaudio.load(filename)
37
+ specgram = torchaudio.transforms.MelSpectrogram(
38
+ sample_rate=sr,
39
+ n_fft=N_FFT,
40
+ win_length=N_FFT,
41
+ hop_length=HOP_LEN,
42
+ center=True,
43
+ pad_mode="reflect",
44
+ power=2.0,
45
+ norm="slaney",
46
+ onesided=True,
47
+ n_mels=224,
48
+ mel_scale="htk",
49
+ )(audio).mean(axis=0)
50
+ specgram = torchaudio.transforms.AmplitudeToDB()(specgram)
51
+ specgram = specgram - specgram.min()
52
+ specgram = specgram / specgram.max()
53
+
54
+ return specgram
55
+
56
+
57
+ def create_image(filename):
58
+ specgram = create_spectrogram(filename)
59
+ dest = Path("temp.png")
60
+ save_image(specgram, "temp.png")
61
+
62
+
63
+ # Code from: https://huggingface.co/spaces/suvash/food-101-resnet50
64
+ def predict(img):
65
+ img = PILImage.create(img)
66
+ _pred, _pred_w_idx, probs = model.predict(img)
67
+ # gradio doesn't support tensors, so converting to float
68
+ labels_probs = {labels[i]: float(probs[i]) for i, _ in enumerate(labels)}
69
+ return labels_probs
70
+
71
+
72
+ def end2endpipeline(filename):
73
+ create_image(filename)
74
+ return predict("temp.png")
75
+
76
+
77
+ demo = gradio.Interface(
78
+ fn=end2endpipeline,
79
+ inputs=gradio.inputs.Audio(source="upload", type="filepath"),
80
+ outputs=gradio.outputs.Label(num_top_classes=5),
81
+ **interface_options,
82
+ )
83
+
84
+ launch_options = {
85
+ "enable_queue": True,
86
+ "share": False,
87
+ # thanks Alex for pointing this option to cache examples
88
+ "cache_examples": True,
89
+ }
90
+
91
+ demo.launch(**launch_options)
article.md ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ > Note: The examples provides doesn't work on Safari, in case people are trying to access on a Mac. Please try it in a different browser.
2
+
3
+ During first lesson of Practical Deep Learning for Coders course, Jeremy had mentioned how using simple computer vision model by being a bit creative we can build a state of the art model to classify audio with same image classification model. I was curious on how I can train an music classifier, as I have never worked on audio data problems before.
4
+
5
+
6
+ [You can find how I trained this music genre classification using fast.ai in this blogpost.](https://kurianbenoy.com/posts/2022/2022-05-01-audiocnndemo.html).
7
+
8
+ ## Dataset
9
+
10
+ 1. [The competition data](https://www.kaggle.com/competitions/kaggle-pog-series-s01e02/data)
11
+ 2. [Image data generated from converting audio to melspectograms in form of images](https://www.kaggle.com/datasets/dienhoa/music-genre-spectrogram-pogchamps)
12
+
13
+
14
+ ## Training
15
+
16
+ Fast.ai was used to train this classifier with a ResNet50 vision learner for 10 epochs.
17
+
18
+ | epoch | train_loss | valid_loss | error_rate | time |
19
+ |-------|---------------|---------------|---------------|-------|
20
+ |0 | 2.312176 | 1.843815 | 0.558654 | 02:07 |
21
+ |1 | 2.102361 | 1.719162 | 0.539061 | 02:08 |
22
+ |2 | 1.867139 | 1.623988 | 0.527003 | 02:08 |
23
+ |3 | 1.710557 | 1.527913 | 0.507661 | 02:07 |
24
+ |4 | 1.629478 | 1.456836 | 0.479779 | 02:05 |
25
+ |5 | 1.519305 | 1.433036 | 0.474253 | 02:05 |
26
+ |6 | 1.457465 | 1.379757 | 0.464456 | 02:05 |
27
+ |7 | 1.396283 | 1.369344 | 0.457925 | 02:05 |
28
+ |8 | 1.359388 | 1.367973 | 0.453655 | 02:05 |
29
+ |9 | 1.364363 | 1.368887 | 0.456167 | 02:04 |
30
+
31
+
32
+ ## Examples
33
+
34
+ The example images provided in the demo are from the validation data from Kaggle competition data, which was not used during training.
35
+
36
+ ## Credits
37
+
38
+ Thanks [Dien Hoa Truong](https://twitter.com/DienhoaT) for providing [inference code](https://www.kaggle.com/code/dienhoa/inference-submission-music-genre) for creating end to end pipeline from creating audio to converting to melspectograms, and then doing prediction.
39
+
40
+ Thanks [@suvash](https://twitter.com/suvash) for helping me get started with huggingface
41
+ spaces and for his [excellent space](https://huggingface.co/spaces/suvash/food-101-resnet50) which was a reference for this work.
42
+
43
+ Thanks [@strickvl](https://twitter.com/strickvl) for reporting issue in safari browser
44
+ and trying this space out.
nbs/AudioCNNDemo.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
nbs/AudioClassificationgradio.ipynb ADDED
@@ -0,0 +1,682 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nbformat": 4,
3
+ "nbformat_minor": 0,
4
+ "metadata": {
5
+ "colab": {
6
+ "name": "AudioClassificationgradio.ipynb",
7
+ "provenance": [],
8
+ "collapsed_sections": []
9
+ },
10
+ "kernelspec": {
11
+ "name": "python3",
12
+ "display_name": "Python 3"
13
+ },
14
+ "language_info": {
15
+ "name": "python"
16
+ },
17
+ "widgets": {
18
+ "application/vnd.jupyter.widget-state+json": {
19
+ "8e25e79ba0c34ac2a39504d2bdb23a44": {
20
+ "model_module": "@jupyter-widgets/controls",
21
+ "model_name": "HBoxModel",
22
+ "model_module_version": "1.5.0",
23
+ "state": {
24
+ "_dom_classes": [],
25
+ "_model_module": "@jupyter-widgets/controls",
26
+ "_model_module_version": "1.5.0",
27
+ "_model_name": "HBoxModel",
28
+ "_view_count": null,
29
+ "_view_module": "@jupyter-widgets/controls",
30
+ "_view_module_version": "1.5.0",
31
+ "_view_name": "HBoxView",
32
+ "box_style": "",
33
+ "children": [
34
+ "IPY_MODEL_c326c94972544c0cafd0aec1424d3d66",
35
+ "IPY_MODEL_a5ded79eb6274a2693d4f6f46dbdaae6",
36
+ "IPY_MODEL_9165407f88a44866a6372082c5a1bdd1"
37
+ ],
38
+ "layout": "IPY_MODEL_cd13120cc6f345ff958b3438a51d9caf"
39
+ }
40
+ },
41
+ "c326c94972544c0cafd0aec1424d3d66": {
42
+ "model_module": "@jupyter-widgets/controls",
43
+ "model_name": "HTMLModel",
44
+ "model_module_version": "1.5.0",
45
+ "state": {
46
+ "_dom_classes": [],
47
+ "_model_module": "@jupyter-widgets/controls",
48
+ "_model_module_version": "1.5.0",
49
+ "_model_name": "HTMLModel",
50
+ "_view_count": null,
51
+ "_view_module": "@jupyter-widgets/controls",
52
+ "_view_module_version": "1.5.0",
53
+ "_view_name": "HTMLView",
54
+ "description": "",
55
+ "description_tooltip": null,
56
+ "layout": "IPY_MODEL_358da8bada514630b9078cd49fb2b2dc",
57
+ "placeholder": "​",
58
+ "style": "IPY_MODEL_53a416f6a7e9499ea6a88e44f2087c0d",
59
+ "value": "Downloading: 100%"
60
+ }
61
+ },
62
+ "a5ded79eb6274a2693d4f6f46dbdaae6": {
63
+ "model_module": "@jupyter-widgets/controls",
64
+ "model_name": "FloatProgressModel",
65
+ "model_module_version": "1.5.0",
66
+ "state": {
67
+ "_dom_classes": [],
68
+ "_model_module": "@jupyter-widgets/controls",
69
+ "_model_module_version": "1.5.0",
70
+ "_model_name": "FloatProgressModel",
71
+ "_view_count": null,
72
+ "_view_module": "@jupyter-widgets/controls",
73
+ "_view_module_version": "1.5.0",
74
+ "_view_name": "ProgressView",
75
+ "bar_style": "success",
76
+ "description": "",
77
+ "description_tooltip": null,
78
+ "layout": "IPY_MODEL_74ce31440c4c497cb1ff10748a39c9e0",
79
+ "max": 103192469,
80
+ "min": 0,
81
+ "orientation": "horizontal",
82
+ "style": "IPY_MODEL_908199f1d2244909bd58c3bc46e6a47f",
83
+ "value": 103192469
84
+ }
85
+ },
86
+ "9165407f88a44866a6372082c5a1bdd1": {
87
+ "model_module": "@jupyter-widgets/controls",
88
+ "model_name": "HTMLModel",
89
+ "model_module_version": "1.5.0",
90
+ "state": {
91
+ "_dom_classes": [],
92
+ "_model_module": "@jupyter-widgets/controls",
93
+ "_model_module_version": "1.5.0",
94
+ "_model_name": "HTMLModel",
95
+ "_view_count": null,
96
+ "_view_module": "@jupyter-widgets/controls",
97
+ "_view_module_version": "1.5.0",
98
+ "_view_name": "HTMLView",
99
+ "description": "",
100
+ "description_tooltip": null,
101
+ "layout": "IPY_MODEL_3efa06b0aafd4f2ea01ebfc0a7d6abe6",
102
+ "placeholder": "​",
103
+ "style": "IPY_MODEL_10ed9d0b19814111b80a281ea80f60d9",
104
+ "value": " 103M/103M [00:02&lt;00:00, 51.8MB/s]"
105
+ }
106
+ },
107
+ "cd13120cc6f345ff958b3438a51d9caf": {
108
+ "model_module": "@jupyter-widgets/base",
109
+ "model_name": "LayoutModel",
110
+ "model_module_version": "1.2.0",
111
+ "state": {
112
+ "_model_module": "@jupyter-widgets/base",
113
+ "_model_module_version": "1.2.0",
114
+ "_model_name": "LayoutModel",
115
+ "_view_count": null,
116
+ "_view_module": "@jupyter-widgets/base",
117
+ "_view_module_version": "1.2.0",
118
+ "_view_name": "LayoutView",
119
+ "align_content": null,
120
+ "align_items": null,
121
+ "align_self": null,
122
+ "border": null,
123
+ "bottom": null,
124
+ "display": null,
125
+ "flex": null,
126
+ "flex_flow": null,
127
+ "grid_area": null,
128
+ "grid_auto_columns": null,
129
+ "grid_auto_flow": null,
130
+ "grid_auto_rows": null,
131
+ "grid_column": null,
132
+ "grid_gap": null,
133
+ "grid_row": null,
134
+ "grid_template_areas": null,
135
+ "grid_template_columns": null,
136
+ "grid_template_rows": null,
137
+ "height": null,
138
+ "justify_content": null,
139
+ "justify_items": null,
140
+ "left": null,
141
+ "margin": null,
142
+ "max_height": null,
143
+ "max_width": null,
144
+ "min_height": null,
145
+ "min_width": null,
146
+ "object_fit": null,
147
+ "object_position": null,
148
+ "order": null,
149
+ "overflow": null,
150
+ "overflow_x": null,
151
+ "overflow_y": null,
152
+ "padding": null,
153
+ "right": null,
154
+ "top": null,
155
+ "visibility": null,
156
+ "width": null
157
+ }
158
+ },
159
+ "358da8bada514630b9078cd49fb2b2dc": {
160
+ "model_module": "@jupyter-widgets/base",
161
+ "model_name": "LayoutModel",
162
+ "model_module_version": "1.2.0",
163
+ "state": {
164
+ "_model_module": "@jupyter-widgets/base",
165
+ "_model_module_version": "1.2.0",
166
+ "_model_name": "LayoutModel",
167
+ "_view_count": null,
168
+ "_view_module": "@jupyter-widgets/base",
169
+ "_view_module_version": "1.2.0",
170
+ "_view_name": "LayoutView",
171
+ "align_content": null,
172
+ "align_items": null,
173
+ "align_self": null,
174
+ "border": null,
175
+ "bottom": null,
176
+ "display": null,
177
+ "flex": null,
178
+ "flex_flow": null,
179
+ "grid_area": null,
180
+ "grid_auto_columns": null,
181
+ "grid_auto_flow": null,
182
+ "grid_auto_rows": null,
183
+ "grid_column": null,
184
+ "grid_gap": null,
185
+ "grid_row": null,
186
+ "grid_template_areas": null,
187
+ "grid_template_columns": null,
188
+ "grid_template_rows": null,
189
+ "height": null,
190
+ "justify_content": null,
191
+ "justify_items": null,
192
+ "left": null,
193
+ "margin": null,
194
+ "max_height": null,
195
+ "max_width": null,
196
+ "min_height": null,
197
+ "min_width": null,
198
+ "object_fit": null,
199
+ "object_position": null,
200
+ "order": null,
201
+ "overflow": null,
202
+ "overflow_x": null,
203
+ "overflow_y": null,
204
+ "padding": null,
205
+ "right": null,
206
+ "top": null,
207
+ "visibility": null,
208
+ "width": null
209
+ }
210
+ },
211
+ "53a416f6a7e9499ea6a88e44f2087c0d": {
212
+ "model_module": "@jupyter-widgets/controls",
213
+ "model_name": "DescriptionStyleModel",
214
+ "model_module_version": "1.5.0",
215
+ "state": {
216
+ "_model_module": "@jupyter-widgets/controls",
217
+ "_model_module_version": "1.5.0",
218
+ "_model_name": "DescriptionStyleModel",
219
+ "_view_count": null,
220
+ "_view_module": "@jupyter-widgets/base",
221
+ "_view_module_version": "1.2.0",
222
+ "_view_name": "StyleView",
223
+ "description_width": ""
224
+ }
225
+ },
226
+ "74ce31440c4c497cb1ff10748a39c9e0": {
227
+ "model_module": "@jupyter-widgets/base",
228
+ "model_name": "LayoutModel",
229
+ "model_module_version": "1.2.0",
230
+ "state": {
231
+ "_model_module": "@jupyter-widgets/base",
232
+ "_model_module_version": "1.2.0",
233
+ "_model_name": "LayoutModel",
234
+ "_view_count": null,
235
+ "_view_module": "@jupyter-widgets/base",
236
+ "_view_module_version": "1.2.0",
237
+ "_view_name": "LayoutView",
238
+ "align_content": null,
239
+ "align_items": null,
240
+ "align_self": null,
241
+ "border": null,
242
+ "bottom": null,
243
+ "display": null,
244
+ "flex": null,
245
+ "flex_flow": null,
246
+ "grid_area": null,
247
+ "grid_auto_columns": null,
248
+ "grid_auto_flow": null,
249
+ "grid_auto_rows": null,
250
+ "grid_column": null,
251
+ "grid_gap": null,
252
+ "grid_row": null,
253
+ "grid_template_areas": null,
254
+ "grid_template_columns": null,
255
+ "grid_template_rows": null,
256
+ "height": null,
257
+ "justify_content": null,
258
+ "justify_items": null,
259
+ "left": null,
260
+ "margin": null,
261
+ "max_height": null,
262
+ "max_width": null,
263
+ "min_height": null,
264
+ "min_width": null,
265
+ "object_fit": null,
266
+ "object_position": null,
267
+ "order": null,
268
+ "overflow": null,
269
+ "overflow_x": null,
270
+ "overflow_y": null,
271
+ "padding": null,
272
+ "right": null,
273
+ "top": null,
274
+ "visibility": null,
275
+ "width": null
276
+ }
277
+ },
278
+ "908199f1d2244909bd58c3bc46e6a47f": {
279
+ "model_module": "@jupyter-widgets/controls",
280
+ "model_name": "ProgressStyleModel",
281
+ "model_module_version": "1.5.0",
282
+ "state": {
283
+ "_model_module": "@jupyter-widgets/controls",
284
+ "_model_module_version": "1.5.0",
285
+ "_model_name": "ProgressStyleModel",
286
+ "_view_count": null,
287
+ "_view_module": "@jupyter-widgets/base",
288
+ "_view_module_version": "1.2.0",
289
+ "_view_name": "StyleView",
290
+ "bar_color": null,
291
+ "description_width": ""
292
+ }
293
+ },
294
+ "3efa06b0aafd4f2ea01ebfc0a7d6abe6": {
295
+ "model_module": "@jupyter-widgets/base",
296
+ "model_name": "LayoutModel",
297
+ "model_module_version": "1.2.0",
298
+ "state": {
299
+ "_model_module": "@jupyter-widgets/base",
300
+ "_model_module_version": "1.2.0",
301
+ "_model_name": "LayoutModel",
302
+ "_view_count": null,
303
+ "_view_module": "@jupyter-widgets/base",
304
+ "_view_module_version": "1.2.0",
305
+ "_view_name": "LayoutView",
306
+ "align_content": null,
307
+ "align_items": null,
308
+ "align_self": null,
309
+ "border": null,
310
+ "bottom": null,
311
+ "display": null,
312
+ "flex": null,
313
+ "flex_flow": null,
314
+ "grid_area": null,
315
+ "grid_auto_columns": null,
316
+ "grid_auto_flow": null,
317
+ "grid_auto_rows": null,
318
+ "grid_column": null,
319
+ "grid_gap": null,
320
+ "grid_row": null,
321
+ "grid_template_areas": null,
322
+ "grid_template_columns": null,
323
+ "grid_template_rows": null,
324
+ "height": null,
325
+ "justify_content": null,
326
+ "justify_items": null,
327
+ "left": null,
328
+ "margin": null,
329
+ "max_height": null,
330
+ "max_width": null,
331
+ "min_height": null,
332
+ "min_width": null,
333
+ "object_fit": null,
334
+ "object_position": null,
335
+ "order": null,
336
+ "overflow": null,
337
+ "overflow_x": null,
338
+ "overflow_y": null,
339
+ "padding": null,
340
+ "right": null,
341
+ "top": null,
342
+ "visibility": null,
343
+ "width": null
344
+ }
345
+ },
346
+ "10ed9d0b19814111b80a281ea80f60d9": {
347
+ "model_module": "@jupyter-widgets/controls",
348
+ "model_name": "DescriptionStyleModel",
349
+ "model_module_version": "1.5.0",
350
+ "state": {
351
+ "_model_module": "@jupyter-widgets/controls",
352
+ "_model_module_version": "1.5.0",
353
+ "_model_name": "DescriptionStyleModel",
354
+ "_view_count": null,
355
+ "_view_module": "@jupyter-widgets/base",
356
+ "_view_module_version": "1.2.0",
357
+ "_view_name": "StyleView",
358
+ "description_width": ""
359
+ }
360
+ }
361
+ }
362
+ }
363
+ },
364
+ "cells": [
365
+ {
366
+ "cell_type": "code",
367
+ "execution_count": 1,
368
+ "metadata": {
369
+ "colab": {
370
+ "base_uri": "https://localhost:8080/"
371
+ },
372
+ "id": "tj_BVh5omaoQ",
373
+ "outputId": "413b2cf4-f8da-4bb3-a0a3-1c58cd89cfa0"
374
+ },
375
+ "outputs": [
376
+ {
377
+ "output_type": "stream",
378
+ "name": "stdout",
379
+ "text": [
380
+ "\u001b[K |████████████████████████████████| 197 kB 24.3 MB/s \n",
381
+ "\u001b[K |████████████████████████████████| 2.9 MB 52.4 MB/s \n",
382
+ "\u001b[K |████████████████████████████████| 77 kB 5.4 MB/s \n",
383
+ "\u001b[K |████████████████████████████████| 60 kB 6.1 MB/s \n",
384
+ "\u001b[K |████████████████████████████████| 84 kB 3.1 MB/s \n",
385
+ "\u001b[K |████████████████████████████████| 54 kB 2.7 MB/s \n",
386
+ "\u001b[K |████████████████████████████████| 1.1 MB 40.9 MB/s \n",
387
+ "\u001b[K |████████████████████████████████| 2.0 MB 42.1 MB/s \n",
388
+ "\u001b[K |████████████████████████████████| 253 kB 54.9 MB/s \n",
389
+ "\u001b[K |████████████████████████████████| 53 kB 2.1 MB/s \n",
390
+ "\u001b[K |████████████████████████████████| 212 kB 44.2 MB/s \n",
391
+ "\u001b[K |████████████████████████████████| 271 kB 64.4 MB/s \n",
392
+ "\u001b[K |████████████████████████████████| 144 kB 45.5 MB/s \n",
393
+ "\u001b[K |████████████████████████████████| 94 kB 3.1 MB/s \n",
394
+ "\u001b[K |████████████████████████████████| 58 kB 6.2 MB/s \n",
395
+ "\u001b[K |████████████████████████████████| 10.9 MB 53.7 MB/s \n",
396
+ "\u001b[K |████████████████████████████████| 79 kB 7.1 MB/s \n",
397
+ "\u001b[K |████████████████████████████████| 43 kB 1.8 MB/s \n",
398
+ "\u001b[K |████████████████████████████████| 62 kB 953 kB/s \n",
399
+ "\u001b[K |████████████████████████████████| 856 kB 47.5 MB/s \n",
400
+ "\u001b[K |████████████████████████████████| 4.0 MB 58.7 MB/s \n",
401
+ "\u001b[K |████████████████████████████████| 58 kB 6.0 MB/s \n",
402
+ "\u001b[?25h Building wheel for ffmpy (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
403
+ " Building wheel for python-multipart (setup.py) ... \u001b[?25l\u001b[?25hdone\n"
404
+ ]
405
+ }
406
+ ],
407
+ "source": [
408
+ "! pip install -Uqq fastai gradio torchaudio torchvision huggingface_hub"
409
+ ]
410
+ },
411
+ {
412
+ "cell_type": "code",
413
+ "source": [
414
+ "import gradio\n",
415
+ "import torchaudio\n",
416
+ "from fastai.vision.all import *\n",
417
+ "from fastai.learner import load_learner\n",
418
+ "from torchvision.utils import save_image\n",
419
+ "from huggingface_hub import hf_hub_download"
420
+ ],
421
+ "metadata": {
422
+ "colab": {
423
+ "base_uri": "https://localhost:8080/"
424
+ },
425
+ "id": "xIM_o4w-ms2J",
426
+ "outputId": "936b730f-2d52-4cc2-fd7a-afbf86d05687"
427
+ },
428
+ "execution_count": 2,
429
+ "outputs": [
430
+ {
431
+ "output_type": "stream",
432
+ "name": "stderr",
433
+ "text": [
434
+ "/usr/local/lib/python3.7/dist-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated\n",
435
+ " \"class\": algorithms.Blowfish,\n"
436
+ ]
437
+ }
438
+ ]
439
+ },
440
+ {
441
+ "cell_type": "code",
442
+ "source": [
443
+ "model = load_learner(\n",
444
+ " hf_hub_download(\"kurianbenoy/music_genre_classification_baseline\", \"model.pkl\")\n",
445
+ ")\n",
446
+ "\n",
447
+ "labels = model.dls.vocab"
448
+ ],
449
+ "metadata": {
450
+ "colab": {
451
+ "base_uri": "https://localhost:8080/",
452
+ "height": 49,
453
+ "referenced_widgets": [
454
+ "8e25e79ba0c34ac2a39504d2bdb23a44",
455
+ "c326c94972544c0cafd0aec1424d3d66",
456
+ "a5ded79eb6274a2693d4f6f46dbdaae6",
457
+ "9165407f88a44866a6372082c5a1bdd1",
458
+ "cd13120cc6f345ff958b3438a51d9caf",
459
+ "358da8bada514630b9078cd49fb2b2dc",
460
+ "53a416f6a7e9499ea6a88e44f2087c0d",
461
+ "74ce31440c4c497cb1ff10748a39c9e0",
462
+ "908199f1d2244909bd58c3bc46e6a47f",
463
+ "3efa06b0aafd4f2ea01ebfc0a7d6abe6",
464
+ "10ed9d0b19814111b80a281ea80f60d9"
465
+ ]
466
+ },
467
+ "id": "MJxNnlsYmwsJ",
468
+ "outputId": "3ba1eca7-1986-4f29-a549-b51bb79a4c88"
469
+ },
470
+ "execution_count": 3,
471
+ "outputs": [
472
+ {
473
+ "output_type": "display_data",
474
+ "data": {
475
+ "text/plain": [
476
+ "Downloading: 0%| | 0.00/103M [00:00<?, ?B/s]"
477
+ ],
478
+ "application/vnd.jupyter.widget-view+json": {
479
+ "version_major": 2,
480
+ "version_minor": 0,
481
+ "model_id": "8e25e79ba0c34ac2a39504d2bdb23a44"
482
+ }
483
+ },
484
+ "metadata": {}
485
+ }
486
+ ]
487
+ },
488
+ {
489
+ "cell_type": "code",
490
+ "source": [
491
+ "N_FFT = 2048\n",
492
+ "HOP_LEN = 1024\n",
493
+ "\n",
494
+ "\n",
495
+ "def create_spectrogram(filename):\n",
496
+ " audio, sr = torchaudio.load(filename)\n",
497
+ " specgram = torchaudio.transforms.MelSpectrogram(\n",
498
+ " sample_rate=sr,\n",
499
+ " n_fft=N_FFT,\n",
500
+ " win_length=N_FFT,\n",
501
+ " hop_length=HOP_LEN,\n",
502
+ " center=True,\n",
503
+ " pad_mode=\"reflect\",\n",
504
+ " power=2.0,\n",
505
+ " norm=\"slaney\",\n",
506
+ " onesided=True,\n",
507
+ " n_mels=224,\n",
508
+ " mel_scale=\"htk\",\n",
509
+ " )(audio).mean(axis=0)\n",
510
+ " specgram = torchaudio.transforms.AmplitudeToDB()(specgram)\n",
511
+ " specgram = specgram - specgram.min()\n",
512
+ " specgram = specgram / specgram.max()\n",
513
+ "\n",
514
+ " return specgram"
515
+ ],
516
+ "metadata": {
517
+ "id": "J1Goh5DHnm59"
518
+ },
519
+ "execution_count": 8,
520
+ "outputs": []
521
+ },
522
+ {
523
+ "cell_type": "code",
524
+ "source": [
525
+ "def create_image(filename):\n",
526
+ " specgram = create_spectrogram(filename)\n",
527
+ " dest = Path(\"temp.png\")\n",
528
+ " save_image(specgram, \"temp.png\")"
529
+ ],
530
+ "metadata": {
531
+ "id": "-J15K2MmqADm"
532
+ },
533
+ "execution_count": 11,
534
+ "outputs": []
535
+ },
536
+ {
537
+ "cell_type": "code",
538
+ "source": [
539
+ "def predict(img):\n",
540
+ " img = PILImage.create(img)\n",
541
+ " _pred, _pred_w_idx, probs = model.predict(img)\n",
542
+ " labels_probs = {labels[i]: float(probs[i]) for i, _ in enumerate(labels)}\n",
543
+ " return labels_probs"
544
+ ],
545
+ "metadata": {
546
+ "id": "1cOhBdp0m2Q5"
547
+ },
548
+ "execution_count": 4,
549
+ "outputs": []
550
+ },
551
+ {
552
+ "cell_type": "code",
553
+ "source": [
554
+ "def end2endpipeline(filename):\n",
555
+ " create_image(filename)\n",
556
+ " return predict(\"temp.png\")"
557
+ ],
558
+ "metadata": {
559
+ "id": "eXIEc4blqOWQ"
560
+ },
561
+ "execution_count": 12,
562
+ "outputs": []
563
+ },
564
+ {
565
+ "cell_type": "code",
566
+ "source": [
567
+ "interface_options = {\n",
568
+ " \"title\": \"Music Genre Classification\",\n",
569
+ " \"description\": \"A simple baseline model for classifying music genres with fast.ai on [Kaggle competition data](https://www.kaggle.com/competitions/kaggle-pog-series-s01e02/data)\",\n",
570
+ " \"interpretation\": \"default\",\n",
571
+ " \"layout\": \"horizontal\",\n",
572
+ " \"theme\": \"default\",\n",
573
+ "}\n",
574
+ "\n",
575
+ "demo = gradio.Interface(\n",
576
+ " fn=end2endpipeline,\n",
577
+ " inputs=gradio.inputs.Audio(source=\"microphone\", type=\"filepath\", label=\"Record/ Drop audio\"),\n",
578
+ " outputs=gradio.outputs.Label(num_top_classes=5),\n",
579
+ " **interface_options,\n",
580
+ ")\n",
581
+ "\n",
582
+ "launch_options = {\n",
583
+ " \"enable_queue\": True,\n",
584
+ " \"share\": False,\n",
585
+ "}\n",
586
+ "demo.launch(**launch_options)"
587
+ ],
588
+ "metadata": {
589
+ "colab": {
590
+ "base_uri": "https://localhost:8080/",
591
+ "height": 662
592
+ },
593
+ "id": "uMO5CynZm_pL",
594
+ "outputId": "0cff073a-293d-4c3d-d3bf-a924d63cdfec"
595
+ },
596
+ "execution_count": 13,
597
+ "outputs": [
598
+ {
599
+ "output_type": "stream",
600
+ "name": "stdout",
601
+ "text": [
602
+ "Colab notebook detected. To show errors in colab notebook, set `debug=True` in `launch()`\n",
603
+ "Your interface requires microphone or webcam permissions - this may cause issues in Colab. Use the External URL in case of issues.\n",
604
+ "Running on public URL: https://55955.gradio.app\n",
605
+ "\n",
606
+ "This share link expires in 72 hours. For free permanent hosting, check out Spaces (https://huggingface.co/spaces)\n"
607
+ ]
608
+ },
609
+ {
610
+ "output_type": "display_data",
611
+ "data": {
612
+ "text/plain": [
613
+ "<IPython.lib.display.IFrame at 0x7f647af3b450>"
614
+ ],
615
+ "text/html": [
616
+ "\n",
617
+ " <iframe\n",
618
+ " width=\"900\"\n",
619
+ " height=\"500\"\n",
620
+ " src=\"https://55955.gradio.app\"\n",
621
+ " frameborder=\"0\"\n",
622
+ " allowfullscreen\n",
623
+ " ></iframe>\n",
624
+ " "
625
+ ]
626
+ },
627
+ "metadata": {}
628
+ },
629
+ {
630
+ "output_type": "execute_result",
631
+ "data": {
632
+ "text/plain": [
633
+ "(<fastapi.applications.FastAPI at 0x7f65bf011ed0>,\n",
634
+ " 'http://127.0.0.1:7862/',\n",
635
+ " 'https://55955.gradio.app')"
636
+ ]
637
+ },
638
+ "metadata": {},
639
+ "execution_count": 13
640
+ }
641
+ ]
642
+ },
643
+ {
644
+ "cell_type": "code",
645
+ "source": [
646
+ "input_audio = [gradio.inputs.Audio(source=\"microphone\", type=\"filepath\", label=\"Record/ Drop audio\")]\n",
647
+ "input_audio"
648
+ ],
649
+ "metadata": {
650
+ "colab": {
651
+ "base_uri": "https://localhost:8080/"
652
+ },
653
+ "id": "8Ptz2HMdnAE7",
654
+ "outputId": "2cac3314-07eb-4c91-d5ed-770e2ed6ae0d"
655
+ },
656
+ "execution_count": 9,
657
+ "outputs": [
658
+ {
659
+ "output_type": "execute_result",
660
+ "data": {
661
+ "text/plain": [
662
+ "[Audio(label=\"Record/ Drop audio\")]"
663
+ ]
664
+ },
665
+ "metadata": {},
666
+ "execution_count": 9
667
+ }
668
+ ]
669
+ },
670
+ {
671
+ "cell_type": "code",
672
+ "source": [
673
+ ""
674
+ ],
675
+ "metadata": {
676
+ "id": "_wHGGfNfnufy"
677
+ },
678
+ "execution_count": null,
679
+ "outputs": []
680
+ }
681
+ ]
682
+ }
nbs/PytorchAudioInference.ipynb ADDED
@@ -0,0 +1,396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 4,
6
+ "id": "8973fb4b",
7
+ "metadata": {},
8
+ "outputs": [
9
+ {
10
+ "name": "stdout",
11
+ "output_type": "stream",
12
+ "text": [
13
+ "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com, https://download.pytorch.org/whl/cu113\n",
14
+ "Requirement already satisfied: torch in /opt/conda/lib/python3.8/site-packages (1.11.0)\n",
15
+ "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (0.12.0a0)\n",
16
+ "Requirement already satisfied: torchaudio in /opt/conda/lib/python3.8/site-packages (0.11.0)\n",
17
+ "Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.8/site-packages (from torch) (4.0.1)\n",
18
+ "Collecting torchvision\n",
19
+ " Downloading https://download.pytorch.org/whl/cu113/torchvision-0.12.0%2Bcu113-cp38-cp38-linux_x86_64.whl (22.3 MB)\n",
20
+ "\u001b[K |████████████████████████████████| 22.3 MB 1.3 MB/s eta 0:00:01\n",
21
+ "\u001b[?25hRequirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision) (9.0.0)\n",
22
+ "Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision) (1.22.2)\n",
23
+ "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from torchvision) (2.26.0)\n",
24
+ "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (3.1)\n",
25
+ "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (1.26.7)\n",
26
+ "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (2021.10.8)\n",
27
+ "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (2.0.9)\n",
28
+ "Installing collected packages: torchvision\n",
29
+ " Attempting uninstall: torchvision\n",
30
+ " Found existing installation: torchvision 0.12.0a0\n",
31
+ " Uninstalling torchvision-0.12.0a0:\n",
32
+ " Successfully uninstalled torchvision-0.12.0a0\n",
33
+ "Successfully installed torchvision-0.12.0+cu113\n",
34
+ "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n"
35
+ ]
36
+ }
37
+ ],
38
+ "source": [
39
+ "! pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "execution_count": 12,
45
+ "id": "bf7451ce",
46
+ "metadata": {},
47
+ "outputs": [
48
+ {
49
+ "name": "stdout",
50
+ "output_type": "stream",
51
+ "text": [
52
+ "Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\n",
53
+ "Requirement already satisfied: torchvision in /opt/conda/lib/python3.8/site-packages (0.12.0+cu113)\n",
54
+ "Requirement already satisfied: torch==1.11.0 in /opt/conda/lib/python3.8/site-packages (from torchvision) (1.11.0)\n",
55
+ "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/conda/lib/python3.8/site-packages (from torchvision) (9.0.0)\n",
56
+ "Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.8/site-packages (from torchvision) (4.0.1)\n",
57
+ "Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from torchvision) (1.22.2)\n",
58
+ "Requirement already satisfied: requests in /opt/conda/lib/python3.8/site-packages (from torchvision) (2.26.0)\n",
59
+ "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (1.26.7)\n",
60
+ "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (2.0.9)\n",
61
+ "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (2021.10.8)\n",
62
+ "Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.8/site-packages (from requests->torchvision) (3.1)\n",
63
+ "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\n"
64
+ ]
65
+ }
66
+ ],
67
+ "source": [
68
+ "! pip install torchvision"
69
+ ]
70
+ },
71
+ {
72
+ "cell_type": "code",
73
+ "execution_count": 13,
74
+ "id": "90037405",
75
+ "metadata": {},
76
+ "outputs": [],
77
+ "source": [
78
+ "import gradio\n",
79
+ "import torchaudio\n",
80
+ "from fastai.vision.all import *\n",
81
+ "from fastai.learner import load_learner\n",
82
+ "from torchvision.utils import save_image\n",
83
+ "from huggingface_hub import hf_hub_download"
84
+ ]
85
+ },
86
+ {
87
+ "cell_type": "code",
88
+ "execution_count": 4,
89
+ "id": "cf93c763",
90
+ "metadata": {},
91
+ "outputs": [],
92
+ "source": [
93
+ "base_folder = Path(\"../input/kaggle-pog-series-s01e02\")\n",
94
+ "\n",
95
+ "items = get_files(base_folder, extensions=\".ogg\")"
96
+ ]
97
+ },
98
+ {
99
+ "cell_type": "code",
100
+ "execution_count": 6,
101
+ "id": "93f3e24d",
102
+ "metadata": {},
103
+ "outputs": [
104
+ {
105
+ "data": {
106
+ "text/plain": [
107
+ "(#24985) [Path('../input/kaggle-pog-series-s01e02/test/000003.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000006.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000008.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000011.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000017.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000023.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000024.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000031.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000032.ogg'),Path('../input/kaggle-pog-series-s01e02/test/000036.ogg')...]"
108
+ ]
109
+ },
110
+ "execution_count": 6,
111
+ "metadata": {},
112
+ "output_type": "execute_result"
113
+ }
114
+ ],
115
+ "source": [
116
+ "items"
117
+ ]
118
+ },
119
+ {
120
+ "cell_type": "code",
121
+ "execution_count": 7,
122
+ "id": "13c68e01",
123
+ "metadata": {},
124
+ "outputs": [],
125
+ "source": [
126
+ "N_FFT = 2048\n",
127
+ "HOP_LEN = 1024\n",
128
+ "\n",
129
+ "\n",
130
+ "def create_spectrogram(filename):\n",
131
+ " audio, sr = torchaudio.load(filename)\n",
132
+ " specgram = torchaudio.transforms.MelSpectrogram(\n",
133
+ " sample_rate=sr,\n",
134
+ " n_fft=N_FFT,\n",
135
+ " win_length=N_FFT,\n",
136
+ " hop_length=HOP_LEN,\n",
137
+ " center=True,\n",
138
+ " pad_mode=\"reflect\",\n",
139
+ " power=2.0,\n",
140
+ " norm=\"slaney\",\n",
141
+ " onesided=True,\n",
142
+ " n_mels=224,\n",
143
+ " mel_scale=\"htk\",\n",
144
+ " )(audio).mean(axis=0)\n",
145
+ " specgram = torchaudio.transforms.AmplitudeToDB()(specgram)\n",
146
+ " specgram = specgram - specgram.min()\n",
147
+ " specgram = specgram / specgram.max()\n",
148
+ "\n",
149
+ " return specgram"
150
+ ]
151
+ },
152
+ {
153
+ "cell_type": "code",
154
+ "execution_count": 8,
155
+ "id": "630a2a63",
156
+ "metadata": {},
157
+ "outputs": [],
158
+ "source": [
159
+ "filename = items[2]\n",
160
+ "spec_default = create_spectrogram(filename)"
161
+ ]
162
+ },
163
+ {
164
+ "cell_type": "code",
165
+ "execution_count": 9,
166
+ "id": "bd857529",
167
+ "metadata": {},
168
+ "outputs": [
169
+ {
170
+ "data": {
171
+ "text/plain": [
172
+ "Path('../input/kaggle-pog-series-s01e02/test/000008.ogg')"
173
+ ]
174
+ },
175
+ "execution_count": 9,
176
+ "metadata": {},
177
+ "output_type": "execute_result"
178
+ }
179
+ ],
180
+ "source": [
181
+ "filename"
182
+ ]
183
+ },
184
+ {
185
+ "cell_type": "code",
186
+ "execution_count": 11,
187
+ "id": "1eae215f",
188
+ "metadata": {},
189
+ "outputs": [
190
+ {
191
+ "data": {
192
+ "text/plain": [
193
+ "<matplotlib.image.AxesImage at 0x7fc61efe0550>"
194
+ ]
195
+ },
196
+ "execution_count": 11,
197
+ "metadata": {},
198
+ "output_type": "execute_result"
199
+ },
200
+ {
201
+ "data": {
202
+ "image/png": "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",
203
+ "text/plain": [
204
+ "<Figure size 432x288 with 1 Axes>"
205
+ ]
206
+ },
207
+ "metadata": {
208
+ "needs_background": "light"
209
+ },
210
+ "output_type": "display_data"
211
+ }
212
+ ],
213
+ "source": [
214
+ "plt.imshow(spec_default)"
215
+ ]
216
+ },
217
+ {
218
+ "cell_type": "code",
219
+ "execution_count": 22,
220
+ "id": "5a0afd6f",
221
+ "metadata": {},
222
+ "outputs": [],
223
+ "source": [
224
+ "def create_image(filename):\n",
225
+ " specgram = create_spectrogram(filename)\n",
226
+ " dest = Path(\"input/temp.png\")\n",
227
+ " save_image(specgram, \"temp.png\")"
228
+ ]
229
+ },
230
+ {
231
+ "cell_type": "code",
232
+ "execution_count": 23,
233
+ "id": "c52d69d2",
234
+ "metadata": {},
235
+ "outputs": [],
236
+ "source": [
237
+ "create_image(filename)"
238
+ ]
239
+ },
240
+ {
241
+ "cell_type": "code",
242
+ "execution_count": 24,
243
+ "id": "ad35918d",
244
+ "metadata": {},
245
+ "outputs": [
246
+ {
247
+ "name": "stdout",
248
+ "output_type": "stream",
249
+ "text": [
250
+ "PytorchAudioInference.ipynb music-genre-spectrogram-pogchamps\t temp.png\n",
251
+ "kaggle-pog-series-s01e02 music-genre-torch-melspec-generator.log\n"
252
+ ]
253
+ }
254
+ ],
255
+ "source": [
256
+ "! ls"
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "code",
261
+ "execution_count": 26,
262
+ "id": "daf3215e",
263
+ "metadata": {},
264
+ "outputs": [],
265
+ "source": [
266
+ "learn = load_learner(\"music-genre-spectrogram-pogchamps/spectograms/model.pkl\")"
267
+ ]
268
+ },
269
+ {
270
+ "cell_type": "code",
271
+ "execution_count": 31,
272
+ "id": "c990969f",
273
+ "metadata": {},
274
+ "outputs": [],
275
+ "source": [
276
+ "labels = learn.dls.vocab"
277
+ ]
278
+ },
279
+ {
280
+ "cell_type": "code",
281
+ "execution_count": 32,
282
+ "id": "ebfefcd3",
283
+ "metadata": {},
284
+ "outputs": [],
285
+ "source": [
286
+ "def predict(img):\n",
287
+ " img = PILImage.create(img)\n",
288
+ " _pred, _pred_w_idx, probs = learn.predict(img)\n",
289
+ " labels_probs = {labels[i]: float(probs[i]) for i, _ in enumerate(labels)}\n",
290
+ " return labels_probs"
291
+ ]
292
+ },
293
+ {
294
+ "cell_type": "code",
295
+ "execution_count": 33,
296
+ "id": "11b17142",
297
+ "metadata": {},
298
+ "outputs": [
299
+ {
300
+ "data": {
301
+ "text/html": [
302
+ "\n",
303
+ "<style>\n",
304
+ " /* Turns off some styling */\n",
305
+ " progress {\n",
306
+ " /* gets rid of default border in Firefox and Opera. */\n",
307
+ " border: none;\n",
308
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
309
+ " background-size: auto;\n",
310
+ " }\n",
311
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
312
+ " background: #F44336;\n",
313
+ " }\n",
314
+ "</style>\n"
315
+ ],
316
+ "text/plain": [
317
+ "<IPython.core.display.HTML object>"
318
+ ]
319
+ },
320
+ "metadata": {},
321
+ "output_type": "display_data"
322
+ },
323
+ {
324
+ "data": {
325
+ "text/html": [],
326
+ "text/plain": [
327
+ "<IPython.core.display.HTML object>"
328
+ ]
329
+ },
330
+ "metadata": {},
331
+ "output_type": "display_data"
332
+ },
333
+ {
334
+ "data": {
335
+ "text/plain": [
336
+ "{'Ambient Electronic': 0.018784182146191597,\n",
337
+ " 'Blues': 0.001689370721578598,\n",
338
+ " 'Chiptune / Glitch': 0.009157774038612843,\n",
339
+ " 'Classical': 0.0018330742605030537,\n",
340
+ " 'Country': 0.015161271207034588,\n",
341
+ " 'Easy Listening': 0.000761857838369906,\n",
342
+ " 'Electronic': 0.043093256652355194,\n",
343
+ " 'Experimental': 0.01893473044037819,\n",
344
+ " 'Folk': 0.03622647374868393,\n",
345
+ " 'Hip-Hop': 0.012909098528325558,\n",
346
+ " 'Instrumental': 0.03738876059651375,\n",
347
+ " 'International': 0.007503754459321499,\n",
348
+ " 'Jazz': 0.002992472844198346,\n",
349
+ " 'Old-Time / Historic': 0.0014046949800103903,\n",
350
+ " 'Pop': 0.14049866795539856,\n",
351
+ " 'Punk': 0.1848350614309311,\n",
352
+ " 'Rock': 0.4632216989994049,\n",
353
+ " 'Soul-RnB': 0.002242171438410878,\n",
354
+ " 'Spoken': 0.0013616250362247229}"
355
+ ]
356
+ },
357
+ "execution_count": 33,
358
+ "metadata": {},
359
+ "output_type": "execute_result"
360
+ }
361
+ ],
362
+ "source": [
363
+ "predict(\"temp.png\")"
364
+ ]
365
+ },
366
+ {
367
+ "cell_type": "code",
368
+ "execution_count": null,
369
+ "id": "63aa6dd6",
370
+ "metadata": {},
371
+ "outputs": [],
372
+ "source": []
373
+ }
374
+ ],
375
+ "metadata": {
376
+ "kernelspec": {
377
+ "display_name": "Python 3 (ipykernel)",
378
+ "language": "python",
379
+ "name": "python3"
380
+ },
381
+ "language_info": {
382
+ "codemirror_mode": {
383
+ "name": "ipython",
384
+ "version": 3
385
+ },
386
+ "file_extension": ".py",
387
+ "mimetype": "text/x-python",
388
+ "name": "python",
389
+ "nbconvert_exporter": "python",
390
+ "pygments_lexer": "ipython3",
391
+ "version": "3.8.12"
392
+ }
393
+ },
394
+ "nbformat": 4,
395
+ "nbformat_minor": 5
396
+ }
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ fastai==2.6.0
2
+ gradio==2.9.4
3
+ torchaudio
4
+ torchvision
5
+ huggingface_hub