This repository has been archived by the owner on Jul 17, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
introduction.ipynb.backup
1478 lines (1478 loc) · 149 KB
/
introduction.ipynb.backup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "view-in-github"
},
"source": [
"<a href=\"https://colab.research.google.com/github/earthspecies/open_collaboration_on_audio_classification/blob/master/introduction.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "z4Xmcn0EIAA4"
},
"outputs": [],
"source": [
"%%capture\n",
"import sys\n",
"if 'google.colab' in sys.modules:\n",
" !pip install git+git://github.com/fastai/fastai2.git\n",
" !pip install torchaudio\n",
"\n",
"from fastai2.vision.all import *\n",
"import torchaudio"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "UzCr_fjga0hX"
},
"source": [
"Being able to identify the speaker is believed to be a necessary component of a language.\n",
"\n",
"Can you share a way of working with the audio data? This could be very helpful to researchers who might be very familiar with digital signal processing techniques, but who maybe haven't had such a broad exposure to deep learning. Also, there are probably quite a lot of people across the world (students, hobbyists) who could benefit greatly from your work!\n",
"\n",
"Below I include some starter code to get you going. Would be great if this could turn into a collaborative effort where we could collect in this repository notebooks from contributors showing various ways of working with the data 🙂\n",
"\n",
"To make it even more interesting, I am proposing a particular way of splitting the data into train and validation sets. If you follow this way of splitting in your notebooks, we will be able to compare the results!\n",
"\n",
"The dataset we will use is a collection of macaque coo call recordings collected for the [Distributed acoustic cues for caller identity in macaque vocalization](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4806230/).\n",
"\n",
"You can access the URL of the dataset in `fastai` as follows: `URLs.MACAQUES`. The problem is though that some of the samples were recorded using higher sampling rate. The resampling operation is relatively compute intensive and it is prohibitively costly to be run on colab (though I feel this tells more about the throttling colab does to the vCpus than how expensive the oepration is - locally for me it takes 18 seconds, on colab 20 minutes!). Either way, to accomodate people runnig this code on colab, instead of doing:\n",
"\n",
"```path = untar_data(URLs.MACAQUES)```\n",
"\n",
"We will do"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"colab_type": "code",
"id": "jlBLj423a0hY",
"outputId": "fbc5d104-6bf2-4df3-822f-f56855c34f62"
},
"outputs": [],
"source": [
"path = untar_data('https://storage.googleapis.com/ml-animal-sounds-datasets/macaques_24414Hz.zip')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "YaNhJPmua0ha"
},
"source": [
"There are 7285 coo calls recorded (stored in wav files) from 8 individuals. They are organized in directories, where a directory groups calls from a single macaque."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"colab_type": "code",
"id": "slOwEPnCa0hb",
"outputId": "d52e838e-edd2-4e53-82f2-f3c4d42477e9"
},
"outputs": [
{
"data": {
"text/plain": [
"(#8) [Path('/home/radek/.fastai/data/macaques_24414Hz/MU'),Path('/home/radek/.fastai/data/macaques_24414Hz/BE'),Path('/home/radek/.fastai/data/macaques_24414Hz/IO'),Path('/home/radek/.fastai/data/macaques_24414Hz/TH'),Path('/home/radek/.fastai/data/macaques_24414Hz/TW'),Path('/home/radek/.fastai/data/macaques_24414Hz/SN'),Path('/home/radek/.fastai/data/macaques_24414Hz/AL'),Path('/home/radek/.fastai/data/macaques_24414Hz/QU')]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path.ls()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "NYqiGbQva0he"
},
"source": [
"Let's listen to one of the calls in our browser!"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "4Tlah7cba0he"
},
"outputs": [],
"source": [
"import pathlib\n",
"from IPython.display import Audio"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"colab_type": "code",
"id": "6sUk1UZBa0hh",
"outputId": "642d8aa5-6112-48f4-bcbc-7a9040e4f595"
},
"outputs": [
{
"data": {
"text/plain": [
"(#7285) [Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU804.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU130.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU272.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU38.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU58.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU2.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU632.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU732.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU503.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU455.wav')...]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wav_files = get_files(path); wav_files"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 75
},
"colab_type": "code",
"id": "upKxG0Sra0hj",
"outputId": "69108133-ecc7-4453-9722-1fa2a4708a01"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <audio controls=\"controls\" >\n",
" <source src=\"data:audio/x-wav;base64,UklGRmI6AABXQVZFZm10IBIAAAADAAEAXl8AAHh9AQAEACAAAABmYWN0BAAAAIwOAABkYXRhMDoAAAAAqzsAALM7AAC1OwAAsTsAAKw7AAClOwAAmTsAAIo7AABuOwAAQDsAAAw7AAC0OgAACDoAAPC5AADAugAAILsAAGC7AACPuwAArLsAAMe7AADkuwAA+7sAAAW8AAAMvAAAFLwAABm8AAAYvACAFbwAABS8AAAPvAAABrwAAPi7AADjuwAAxbsAAKK7AACCuwAAQLsAANy6AACguQAAeDoAAAg7AABaOwAAlTsAALs7AADeOwAA+zsAgAk8AIAVPACAHzwAACU8AAAnPACAJzwAgCQ8AIAePACAFjwAgA08AAABPAAA4jsAAL47AACaOwAAZjsAAAw7AAA4OgAAKLoAAAS7AABkuwAAnbsAAMa7AADtuwCACLwAgBa8AAAjvAAALrwAADW8AIA5vACAPLwAADy8AAA4vAAAMrwAACu8AIAfvACAELwAAAK8AADluwAAubsAAIa7AAAuuwAAoLoAAPA5AAAUOwAAfjsAALE7AADpOwCADjwAACM8AIA2PACASjwAAFk8AIBiPACAaTwAgG08AIBtPACAZzwAgFs8AIBNPACAPTwAACc8AAANPAAA5jsAAKg7AABEOwAAiDoAAHi6AABMuwAAqbsAAOm7AIATvAAAL7wAgEa8AIBdvACAcLwAgHy8AMCCvABAhbwAQIS8AACBvAAAebwAAGq8AABUvAAAO7wAgB+8AAAAvAAAu7sAAF67AACIugAAuDoAAIM7AADYOwCAEjwAgDg8AIBfPACAgDwAQI48AMCbPAAApzwAAK48AMCyPAAAtjwAwLQ8AMCvPACAqTwAAKA8AACSPABAgjwAgGE8AAA3PAAACDwAAK87AAASOwAAhLoAAI+7AAD9uwCAMbwAAGG8AACIvADAnbwAALC8AAC/vACAy7wAQNW8AEDbvADA3LwAQNq8AMDUvACAy7wAgL28AMCrvADAl7wAgIG8AABOvACAFLwAALa7AAD0ugAAAjsAAMA7AIAdPACAWTwAAIo8AAClPAAAvTwAwNE8AEDkPADA8zwAwP48AGACPQCAAz0AgAI9AMD9PABA8jwAgOI8AMDNPABAtDwAgJg8AABzPAAALTwAAMI7AACQOgAAdrsAABC8AABkvACA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zj0AoLI9AFCTPQDgYj0AABs9AAChPAAAqDoAQIu8AKAOvQCgVL0AIIu9ABCpvQBww70AoNm9ADDrvQCg970AwP69AEgAvgAA/b0AMPS9AGDmvQAw1L0AQL69ABClvQAQib0AAFa9AMAWvQAAqrwAAI67AABIPABA6zwAoDc9AOB2PQDwmD0A4LM9AIDLPQBg3z0A8O49AGD5PQBg/j0A4P09AOD3PQCA7D0AINw9ADDHPQBArj0AEJI9AIBmPQDgJD0AgME8AADaOwAAKbwAQN28AGAwvQBgbr0A0JO9AECtvQAQw70AwNS9AODhvQBQ6r0A8O29ALDsvQDA5r0AINy9AFDNvQCwur0A0KS9ABCMvQAgYr0AYCi9AIDYvACAObwAAII7AMCdPAAgDD0A4EY9AAB+PQBQmD0AwK49ANDBPQAQ0T0AMNw9ALDiPQBg5D0AUOE9AGDZPQDgzD0AILw9AICnPQCAjz0AoGk9ACAwPQDA5jwAgFM8AAAiuwBAkbwAIAW9AMA+vQBAdL0AYJK9AICnvQAQub0A0Ma9AHDQvQDg1b0AINe9ACDUvQDwzL0A0MG9ACCzvQAwob0AcIy9AGBqvQAgOL0A4AK9AICWvAAAlbsAgBc8AIC7PADgEz0AIEc9AGB2PQCAkD0A8KI9ACCyPQCgvT0AQMU9ANDIPQAwyD0AYMM9AJC6PQDgrT0AwJ09AJCKPQBgaT0AYDk9ACAGPQBAoTwAAM87AADnuwCApbwAwAa9AMA3vQDgZL0AgIa9ANCXvQDwpb0AoLC9AKC3vQDQur0AYLq9AEC2vQCgrr0AoKO9AKCVvQAAhb0AAGS9AAA6vQAgDb0AALy8AAA0vAAAjDoAgFU8AMDKPABgEz0AoD49ACBmPQDAhD0A4JM9ABCgPQAgqT0A4K49AFCxPQAwsD0AkKs9AKCjPQCAmD0AYIo9AGBzPQBgTT0AgCM9AEDtPACAjzwAAMA7AADAuwBAjrwAQOm8AGAfvQDgRr0AIGq9ADCEvQCQkL0A8Jm9ABCgvQAAo70AoKK9ABCfvQBwmL0A0I69AICCvQCAZ70AwEW9AGAgvQCA8LwAAJy8AIAKvAAAFDsAAFI8AEC9PACgBj0AwCs9AEBNPQDgaj0A4IE9ALCLPQDAkj0A8JY9ACCYPQBglj0AsJE9ADCKPQAAgD0AoGY9AMBIPQAgJz0AoAI9AEC3PACASzwAABo7AAD7uwAAj7wAANy8AOARvQDAMr0A4E+9AKBovQBgfL0AgIW9ABCKvQDgi70A8Iq9AECHvQDwgL0AYHC9ACBavQDgP70AQCK9AKABvQCAvbwAAGq8AACtuwAAeDsAAFA8AECuPABA8DwAwBY9AEAyPQAgSj0AAF49AKBtPQCgeD0AwH49AOB/PQBAfD0AwHM9AKBmPQAAVT0AgD89AGAmPQAACj0AgNY8AACVPACAITwAALg6AADmuwCAerwAQL68AID7vADAGb0AwDK9AEBIvQAAWr0AYGe9AEBwvQBgdL0AoHO9AGBuvQCAZL0AQFa9AABEvQAALr0A4BS9AADyvADAtrwAgHC8AADhuwAAhDoAgA88AMCEPADAvjwAQPQ8AEASPQDgJj0AIDg9AIBFPQDATj0AwFM9AIBUPQAAUT0AYEk9AOA9PQDgLj0AgBw9AGAHPQCA3zwAgKw8AABtPAAA+zsAADg6AADLuwCAVLwAQJ+8AMDQvABA/rwAQBO9AEAkvQDgMb0A4Du9AABCvQBARL0AwEK9AMA9vQAgNb0AICm9ACAavQCgCL0AgOm8AIC9vABAjrwAgDq8AACruwAAgDoAAOg7AABVPADAmDwAQMM8AMDpPADABT0AwBM9AOAePQDgJj0AgCs9AOAsPQAAKz0A4CU9AMAdPQDgEj0AYAU9AMDqPADAxjwAQJ88AABqPACAETwAAFw7AAAOuwAA+bsAgFK8AICRvACAtrwAQNe8AEDzvAAABb0AYA29AMASvQAAFb0AQBS9AIAQvQAACr0A4AC9AIDqvADAzrwAAK+8AECMvAAATrwAAAC8AAA+uwAABDsAAOA7AAA8PACAgTwAQKI8AIC/PACA2DwAQO08AMD8PACgAz0AYAY9AKAGPQBABD0AAP88AADxPADA3jwAwMg8AECvPAAAkzwAgGg8AIAmPAAAxTsAAPA6AAAauwAA1LsAgCq8AIBnvADAj7wAgKi8AIC9vACAzrwAQNu8AIDjvABA57wAAOa8AIDgvAAA17wAQMm8AAC4vACAo7wAAIy8AABkvACALLwAAOW7AABauwAAsDkAAIE7AAD0OwAAMDwAAGI8AECHPACAmjwAQKo8AIC2PAAAvzwAgMM8AADEPAAAwTwAQLo8AECwPAAAozwAQJM8AMCAPACAWDwAgCs8AAD4OwAAljsAAMg6AADMugAAlbsAAPK7AIAkvACATLwAgG+8AICGvABAkrwAgJq8AICfvABAobwAwJ+8AACbvABAk7wAgIi8AAB3vACAWLwAgDa8AAASvAAA1rsAAIW7AADMugAAgDoAAGA7AAC9OwAAAjwAACI8AAA+PACAVTwAgGg8AIB2PAAAfzwAAIE8AECAPACAeTwAAG48AIBdPAAASTwAADE8AAAWPAAA8DsAALA7AABaOwAApDoAAGC6AABCuwAApLsAAOO7AAAPvAAAKbwAgD+8AIBSvACAYLwAAGu8AABxvACAcrwAgG+8AABovAAAXLwAAE28AIA5vAAAI7wAAAq8AADduwAAo7sAAFC7AACwugAAADoAABY7AACCOwAAtTsAAOE7AAAEPAAAFDwAgCA8AIApPAAALjwAAC88AAAsPAAAJTwAABs8AAAOPAAA/DsAANg7AACvOwAAhDsAACw7AACcOgAAgLkAANi6AABEuwAAjLsAALK7AADUuwAA8bsAAAW8AAAOvACAFLwAABi8AIAYvACAFrwAABG8AIAIvAAA/LsAAOG7AADDuwAAorsAAH67AAA0uwAA0LoAANC5AABYOgAABDsAAE47AACKOwAAqTsAAMY7AADeOwAA8zsAgAE8AAAHPACACjwAgAs8AIAJPAAABjwAAAA8AADwOwAA3DsAAMU7AACsOwAAkTsAAGg7AAAsOwAA4Do=\" type=\"audio/x-wav\" />\n",
" Your browser does not support the audio element.\n",
" </audio>\n",
" "
],
"text/plain": [
"<IPython.lib.display.Audio object>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Audio(filename=wav_files[0])"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "4DJJOP7ya0hn"
},
"source": [
"Did you here the 'coo'? 🙂 Great!\n",
"\n",
"This is what the path to a single recording looks like"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "xL-YdleRa0hn",
"outputId": "f14bcc4a-c6d8-416a-fc45-3b5e2a279a99"
},
"outputs": [
{
"data": {
"text/plain": [
"Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU804.wav')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wav_files[0]"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "SD92l5Kta0hp"
},
"source": [
"This recording comes from an individual codenamed 'MU'. We can grab that information from the path as follows:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "glevR97Ba0hq",
"outputId": "49ad6fc1-ce88-4beb-9471-bdf333b6414c"
},
"outputs": [
{
"data": {
"text/plain": [
"'MU'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wav_files[0].parent.stem"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "xjNe5gv_a0hs"
},
"source": [
"Let's read all of the data and see what else we can learn."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "PD7g9A_ja0ht"
},
"outputs": [],
"source": [
"import librosa # the librosa library makes it very convenient to work with audio files in Python"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
},
"colab_type": "code",
"id": "RnFH4NeOc5W-",
"outputId": "53c26e02-ca20-46fe-8b24-8d026f01a520"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.82 s, sys: 513 ms, total: 2.33 s\n",
"Wall time: 4.87 s\n"
]
}
],
"source": [
"%%time\n",
"target_rate=24414\n",
"audio, names = L(), L()\n",
"\n",
"for fp in wav_files:\n",
" x, rate = torchaudio.load_wav(fp)\n",
" if rate != target_rate: \n",
" x = torchaudio.transforms.Resample(orig_freq=rate, new_freq=24414, resampling_method='sinc_interpolation')(x)\n",
" names.append(fp.parent.stem)\n",
" audio.append(x[0] / 32767) # dividing by the max value of a 16bit signed int (this is how the data is stored in a\n",
" # wav file, this normalizes our input to [-1,1])"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "OPftLZ5Xa0hx"
},
"source": [
"The recording of a sound is nothing more than samples of the air pressure taken by the microphone some number of times (sampling rate) per second. All this gets stored in an array. I've created a bit of a primer on this [here](https://github.com/earthspecies/from_zero_to_DSP), if you would like to learn more."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "ruFCdvFka0hy",
"outputId": "ea9cfba6-9caa-4c65-b447-38419b2c7752"
},
"outputs": [
{
"data": {
"text/plain": [
"tensor([-0.0038, -0.0043, -0.0049, ..., 0.0283, 0.0311, 0.0332])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"audio[100]"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "iUHEioiRa0h1"
},
"source": [
"We can listen to the values in the array!"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 75
},
"colab_type": "code",
"id": "1YO_Tkhna0h2",
"outputId": "f8ffc48f-a50f-4ea9-d6fa-f04af8ece1a5"
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <audio controls=\"controls\" >\n",
" <source src=\"data:audio/wav;base64,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\" type=\"audio/wav\" />\n",
" Your browser does not support the audio element.\n",
" </audio>\n",
" "
],
"text/plain": [
"<IPython.lib.display.Audio object>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Audio(audio[100], rate=rate)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "4dryk8Dma0h4"
},
"source": [
"Let's look at the duration of calls by indiviual."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"colab_type": "code",
"id": "VZp8yPDSa0h5",
"outputId": "fb6334ba-2632-43fc-e4f5-6e838d0f7bfd"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import seaborn as sns\n",
"\n",
"durations = audio.map(len).map(lambda x: x / rate)\n",
"\n",
"for name in names.unique():\n",
" mask = names.map(lambda x: x == name)\n",
" sns.distplot(durations[mask], label=name)\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "A0h-FQQla0h8"
},
"source": [
"We see that the calls are of varying length (additionaly, some macaques have a preference for longer calls and other for shorter ones!). This is something we will have to address as we prepare the data for our deep learning model.\n",
"\n",
"Let us build our dataloaders using the `DataBlock` api! There are several pieces we will have to tell the `DataBlock` api how to do.\n",
"\n",
"* how to get all the items from the dataset\n",
"* how to label the items\n",
"* how to read in the items before passing them to the model"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "0PaYKKRua0h8"
},
"source": [
"Getting all the items is going to be easy - the starting point for our items will be the paths pointing to our files. We already know how obtan this using the `get_files` function provided by fastai."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"colab_type": "code",
"id": "GTEeic5Ea0h9",
"outputId": "ae160d65-a30b-4fd1-fa22-1fe73b5047d2"
},
"outputs": [
{
"data": {
"text/plain": [
"(#7285) [Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU804.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU130.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU272.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU38.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU58.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU2.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU632.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU732.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU503.wav'),Path('/home/radek/.fastai/data/macaques_24414Hz/MU/MU455.wav')...]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_files(path)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "9jve61FCa0h_"
},
"source": [
"Going from an `item` (a path in our case) to a label is going to be straightforward as well. We already saw how can go about this above"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "5sHNbxvYa0iA",
"outputId": "13d81c52-4e19-469f-9835-f9732afc07f3"
},
"outputs": [
{
"data": {
"text/plain": [
"'MU'"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wav_files[0].parent.stem"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "jGizH9Hfa0iB"
},
"source": [
"We also already know how to read in an audio file as a numpy array. But how do we go from this representation to something that we could train our model on?\n",
"\n",
"We could build a model straight on the array, it would be very interesting to see how a model like that could perform.\n",
"\n",
"There is also another alternative. We could represent our audio as an image and train a regular CNN classifier on it! For many problems presenting your data as an image before feeding it to a model is a state of the art approach.\n",
"\n",
"In the case of audio, it seems this approach can work very well for [some problems](https://ai.googleblog.com/2018/10/acoustic-detection-of-humpback-whales.html), though it also has [some limitations](https://towardsdatascience.com/whats-wrong-with-spectrograms-and-cnns-for-audio-processing-311377d7ccd).\n",
"\n",
"Devil is in the details - how we train our model, how we prepare the datasets, how we go from audio to an image, all will play a role in the results we get. This is by no means a solved problem - any results you could show through your work could potentially be very useful.\n",
"\n",
"Here is one way we could go about preparing our data.\n",
"\n",
"We can use torchaudio as before to read it in."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "t3DRKZtidRib"
},
"outputs": [],
"source": [
"x, rate = torchaudio.load_wav(fp)\n",
"if rate != target_rate: \n",
" x = torchaudio.transforms.Resample(orig_freq=rate, new_freq=24414, resampling_method='sinc_interpolation')(x)\n",
"x = x[0] / 32767\n",
"x = x.numpy()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "XdPOPMmWa0iE"
},
"source": [
"And then we can represent the audio as a spectrogram."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 238
},
"colab_type": "code",
"id": "a4P65rhra0iF",
"outputId": "6f9cfc09-d1bf-462c-951e-b69cf73ae0c2"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[7.3116412e-04, 4.9158192e-04, 1.3197887e-04, ..., 5.7667471e-06,\n",
" 1.2439990e-05, 1.8913877e-05],\n",
" [7.9804100e-04, 5.4877880e-04, 1.6154349e-04, ..., 7.6912775e-06,\n",
" 6.1083174e-06, 2.3264793e-06],\n",
" [1.0894043e-03, 7.3144934e-04, 1.8364275e-04, ..., 1.8570670e-05,\n",
" 2.6837508e-05, 2.7642736e-05],\n",
" ...,\n",
" [4.9136544e-09, 3.7312078e-09, 1.8682698e-09, ..., 1.8022925e-09,\n",
" 1.6617596e-09, 1.2948131e-09],\n",
" [3.6397183e-09, 2.7284268e-09, 1.3661221e-09, ..., 5.5160060e-10,\n",
" 7.6559781e-10, 1.0791807e-09],\n",
" [6.4152177e-09, 4.9053623e-09, 2.4040865e-09, ..., 6.8702066e-10,\n",
" 6.9230088e-10, 8.9603996e-10]], dtype=float32)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"spec = librosa.feature.melspectrogram(x, sr=rate, n_fft=1024, hop_length=140); spec"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "zu6kLBR1a0iI"
},
"source": [
"A spectrogram is a visualization of sound where the y axis corresponds to frequencies and the x axis to samples. The resultant image is a decomposition of audio into frequencies that the signal consists of at any given point in time.\n",
"\n",
"This is what our spectrogram would look like."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 285
},
"colab_type": "code",
"id": "PDXHds3ia0iI",
"outputId": "996397b1-a9fc-4d6d-c1e1-36b22e012794"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f167418e490>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(spec)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "IUZ998Fla0iL"
},
"source": [
"We still have a problem though. We know how to go from audio to an image, but our input arrays are of various length! To make it a little bit easier for our model, let's bring them all to the same size, say one corresponding to the first 0.75 seconds."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "AwZq_g7oa0iL"
},
"outputs": [],
"source": [
"num_samples = int(0.75 * rate)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "cQEmm_iNa0iN"
},
"source": [
"Librosa to the rescue as it provides a very handy utility!"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "k2mF9XS2a0iN"
},
"outputs": [],
"source": [
"x = librosa.util.fix_length(x, num_samples)\n",
"spec = librosa.feature.melspectrogram(x, sr=rate, n_fft=1024, hop_length=140)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 285
},
"colab_type": "code",
"id": "Y1AH7oFja0iQ",
"outputId": "5b3d83e1-8a27-4fab-9146-99f08aab286d"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f1674103c10>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(spec)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "2HTvnBcLa0iS"
},
"source": [
"Let's pull all of this together. We get our items like this"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "k-Tih0qRa0iS"
},
"outputs": [],
"source": [
"def get_items(path): return get_files(path)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Yl4SqYmWa0iU"
},
"source": [
"To get our labels from the path we do this"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "NFJ4xxeEa0iV"
},
"outputs": [],
"source": [
"def get_y(path): return path.parent.stem"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "McDEn_sea0iX"
},
"source": [
"And to get our image (in the form of a numpy array) from a path we do this"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "IETf_DWIa0ib"
},
"outputs": [],
"source": [
"def get_x(path, target_rate=24414, num_samples=18310):\n",
" x, rate = torchaudio.load_wav(path)\n",
" if rate != target_rate: \n",
" x = torchaudio.transforms.Resample(orig_freq=rate, new_freq=24414, resampling_method='sinc_interpolation')(x)\n",
" x = x[0] / 32767\n",
" x = x.numpy()\n",
" x = librosa.util.fix_length(x, num_samples)\n",
" spec = librosa.feature.melspectrogram(x, sr=rate, n_fft=1024, hop_length=140)\n",
" spec = spec / spec.max() * 255 # we want the range of values for our data to be [0, 255]\n",
" # this way fastai internally will be able to represent it as an image using PIL\n",
" return spec.astype(np.uint8)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "-AIKMHUja0id"
},
"source": [
"Internally, `ImageBlock` will be use `Image.fromarray` to create our image. Let us see if this will work with the data our get_x returns"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 145
},
"colab_type": "code",
"id": "gwPNarVca0ie",
"outputId": "1602d6ee-dd6e-4ca0-9836-bf09085f89d9"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIMAAACACAAAAAANYoUUAAAArklEQVR4nO3SLQ7CQBRF4TfDlAQIFQ0bYAk4EhQGz8JJ8JCAQBCC4Kfp0DJvBosE05rzueuOuCIAAAD/MSJWkqRuG3p50dek3r9CTJ20OOuK5XpelLvNdn+5V3WjGmO7KUZ6k9lqMc0zfz4eTpfr7fEsfR1UY2yvwbhBlqIbjvORs5L0Xb98VfkmtNjwPYyx1hprUgja6U0BAAAAAAAAAAAAAAAAAAAAAAAAAPjZB1IRP/838f7ZAAAAAElFTkSuQmCC\n",
"text/plain": [
"<PIL.Image.Image image mode=L size=131x128 at 0x7F16740BCE90>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Image.fromarray(get_x(wav_files[0]).astype(np.uint8))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ipW2s_xEa0ig"
},
"source": [
"voila! Now let's group all of this using the DataBlock API."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "t_c6FN8Ea0ig"
},
"outputs": [],
"source": [
"db = DataBlock(\n",
" blocks=(ImageBlock, CategoryBlock),\n",
" get_items=get_items,\n",
" get_x=get_x,\n",
" get_y=get_y,\n",
" splitter=RandomSplitter(seed=42))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tiufvyb1a0ii"
},
"source": [
"The only thing that we added here is the splitter. It will split our data reserving 20% for validation.\n",
"\n",
"Please remember to pass in the seed! This way we can keep the split consistent between experiments and will be able to compare various approaches.\n",
"\n",
"We can now create dataloaders based on the `DataBlock` we created above."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "XdFEqcaxa0ii"
},
"outputs": [],
"source": [
"dls = db.dataloaders(path, num_workers=2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Vr1NYYrta0im"
},
"source": [
"To make sure everything worked, let's take a look at a batch of data."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 536
},
"colab_type": "code",
"id": "Kw-nlCVia0in",
"outputId": "02063470-2209-4b6a-fffe-bb4dc13e0bd4"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 648x648 with 9 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"dls.show_batch()"
]
},