{"cells":[{"metadata":{},"cell_type":"markdown","source":"<h1><center>Explore the Rainforest Soundscape</center></h1> \n\n\n<center><img src=\"https://upload.wikimedia.org/wikipedia/commons/a/a8/CRTO_Matthew-Gable.JPG\" width=\"400\"></img></center>"},{"metadata":{},"cell_type":"markdown","source":"<h1 style='background:#E3C6AD; border:0; color:black'><center>Introduction</center></h1> \n"},{"metadata":{},"cell_type":"markdown","source":"In this Notebook, I will:\n* Explore the **RFCX Species Audio Detection** dataset;\n* Review various techniques for signal augmentation in parallel with exploring the sounds of the rainforest.  \n\n<a id=\"0\"></a>\n### Content\n* <a href='#1'>Analysis preparation</a>  \n* <a href='#2'>Data ingestion</a>    \n* <a href='#3'>Data exploration</a>    \n* <a href='#4'>Sounds of the rainforest</a>    \n* <a href='#5'>References</a>    \n\nIn the final section of the Notebook, you can find additional resources for data exploration, signal data augmentation as well as few baseline models. "},{"metadata":{},"cell_type":"markdown","source":"<a id=\"1\"></a><h1 style='background:#135E46; border:0; color:black'><center>Analysis preparation</center></h1>"},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport librosa\nimport librosa.display\nimport soundfile as sf\nimport scipy.signal as signal\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport IPython.display as ipd\nfrom IPython.display import YouTubeVideo","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"2\"></a><h1 style='background:#478966; border:0; color:black'><center>Data ingestion</center></h1> "},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"data_tp_df=pd.read_csv('/kaggle/input/rfcx-species-audio-detection/train_tp.csv')\ndata_fp_df=pd.read_csv('/kaggle/input/rfcx-species-audio-detection/train_fp.csv')","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"data_tp_df.head()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"data_fp_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"3\"></a><h1 style='background:#73A788; border:0; color:black'><center>Data exploration</center></h1> "},{"metadata":{},"cell_type":"markdown","source":"We start by glimpsing the data (press `Output` buton to review the TP and FP train sets)."},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"cell_type":"code","source":"data_tp_df.info()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"trusted":true},"cell_type":"code","source":"data_fp_df.info()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_count(feature, title, df, size=1):\n    '''\n    Plot count of classes / feature\n    param: feature - the feature to analyze\n    param: title - title to add to the graph\n    param: df - dataframe from which we plot feature's classes distribution \n    param: size - default 1.\n    '''\n    f, ax = plt.subplots(1,1, figsize=(4*size,4))\n    total = float(len(df))\n    g = sns.countplot(df[feature], order = df[feature].value_counts().index[:30], palette='Set1')\n    g.set_title(\"Number and percentage of {}\".format(title))\n    if(size > 2):\n        plt.xticks(rotation=90, size=8)\n    for p in ax.patches:\n        height = p.get_height()\n        ax.text(p.get_x()+p.get_width()/2.,\n                height + 3,\n                '{:1.2f}%'.format(100*height/total),\n                ha=\"center\") \n    plt.show()  ","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_count('species_id', 'TP: Species ID', data_tp_df, size=4)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_count('songtype_id', 'TP: Songtype ID', data_tp_df, size=2)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_count('species_id', 'FP: Species ID', data_fp_df, size=4)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_count('songtype_id', 'FP: Songtype ID', data_fp_df, size=2)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_feature_distribution(data_df, feature, feature2, title, kde_mode=False, hist_mode=True):\n    f, ax = plt.subplots(1,1, figsize=(12,6))\n    for item in list(data_df[feature2].unique()):\n        d_df = data_df.loc[data_df[feature2]==item]\n        try:\n            sns.distplot(d_df[feature], kde=kde_mode, hist=hist_mode, label=item)\n        except:\n            pass\n    plt.legend(labels=list(data_df[feature2].unique()), bbox_to_anchor=(1, 1), loc='upper right', ncol=2)\n    plt.title(title)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 'f_min', 'species_id', \"Minimum frequency distribution, TP data, grouped by species id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 'f_max', 'species_id', \"Maximum frequency distribution, TP data, grouped by species id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 'f_min', 'species_id', \"Minimum frequency distribution, FP data, grouped by species id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 'f_max', 'species_id', \"Maximum frequency distribution, FP data, grouped by species id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 'f_min', 'songtype_id', \"Minimum frequency distribution, TP data, grouped by songtype id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 'f_max', 'songtype_id', \"Maximum frequency distribution, TP data, grouped by songtype id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 'f_min', 'songtype_id', \"Minimum frequency distribution, FP data, grouped by songtype id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 'f_max', 'songtype_id', \"Maximum frequency distribution, FP data, grouped by songtype id\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 't_min', 'species_id', \n                          \"Minimum time distribution, TP data, grouped by species id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 't_max', 'species_id', \n                          \"Max time distribution, TP data, grouped by species id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 't_min', 'songtype_id', \n                          \"Minimum time distribution, TP data, grouped by songtype id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_tp_df, 't_max', 'songtype_id', \n                          \"Max time distribution, TP data, grouped by songtype id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 't_min', 'species_id', \n                          \"Minimum time distribution, FP data, grouped by species id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 't_max', 'species_id', \n                          \"Max time distribution, FP data, grouped by species id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 't_min', 'songtype_id', \n                          \"Minimum time distribution, FP data, grouped by songtype id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_feature_distribution(data_fp_df, 't_max', 'songtype_id', \n                          \"Max time distribution, FP data, grouped by songtype id\", kde_mode=True, hist_mode=False)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"4\"></a><h1 style='background:#E3C6AD; border:0; color:black'><center>Sounds of the rainforest</center></h1> "},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"YouTubeVideo(\"7iUrEOy3coA\", width=800, height=450)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"We define functions for display of:\n- Waveplots\n- Spectrograms  \n- Mel spectrograms  \n- Chroma feature\n- Harmonics and Perceptual sound wave components\n\n<div class=\"alert alert-block alert-info\">\n<b>Note:</b> We can build features for our model using the functions defined here.\n</div>\n<br>\nWe also define a function for playing the sound.\n\nWe then show Waveplots, Spectrograms, Mel Spectrograms, Chroma feature and combined Harmonics and Perceptual graphs for few of the recordings, from both the TP and FP train sets."},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_audio_file(data_df, idx):\n    audio_file_path = '/kaggle/input/rfcx-species-audio-detection/train/'+data_df.recording_id[idx]+'.flac'\n    plt.figure(figsize=(12,6))\n    x , sr = librosa.load(audio_file_path)\n    librosa.display.waveplot(x, sr=sr)\n    plt.gca().set_title(f\"Waveplot - file: {data_df.recording_id[idx]}\")\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_spectrogram(data_df, idx):\n    audio_file_path = '/kaggle/input/rfcx-species-audio-detection/train/'+data_df.recording_id[idx]+'.flac'\n    plt.figure(figsize=(12,6))\n    x , sr = librosa.load(audio_file_path)\n    xs = librosa.stft(x)\n    xdb = librosa.amplitude_to_db(abs(xs))\n    librosa.display.specshow(xdb, sr=sr, x_axis='time', y_axis='hz')\n    plt.gca().set_title(f\"Spectrogram - file: {data_df.recording_id[idx]}\")\n    plt.colorbar()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_mel_spectrogram(data_df, idx):\n    audio_file_path = '/kaggle/input/rfcx-species-audio-detection/train/'+data_df.recording_id[idx]+'.flac'\n    plt.figure(figsize=(12,6))\n    x , sr = librosa.load(audio_file_path)\n    xs = librosa.feature.melspectrogram(x)\n    xdb = librosa.amplitude_to_db(abs(xs))\n    librosa.display.specshow(xdb, sr=sr, x_axis='time', y_axis='hz')\n    plt.gca().set_title(f\"Mel spectrogram - file: {data_df.recording_id[idx]}\")\n    plt.colorbar()","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_harmonics_and_perceptual(data_df, idx):\n    audio_file_path = '/kaggle/input/rfcx-species-audio-detection/train/'+data_df.recording_id[idx]+'.flac'\n    plt.figure(figsize=(12,6))\n    x , sr = librosa.load(audio_file_path)\n    y_harmonics, y_perceptual = librosa.effects.hpss(x)\n    plt.plot(y_perceptual, color = '#BBAA12')\n    plt.plot(y_harmonics, color = '#12AABB')\n    plt.legend((\"Perceptual\", \"Harmonics\"))\n    plt.title(f\"Harmonics and Perceptual - file: {data_df.recording_id[idx]}\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def plot_chroma_feature(data_df, idx):\n    hop_length=12\n    audio_file_path = '/kaggle/input/rfcx-species-audio-detection/train/'+data_df.recording_id[idx]+'.flac'\n    plt.figure(figsize=(12,6))\n    x , sr = librosa.load(audio_file_path)\n    chromagram = librosa.feature.chroma_stft(x)\n    librosa.display.specshow(chromagram, sr=sr, x_axis='time', y_axis='chroma',hop_length=hop_length, cmap='coolwarm')\n    plt.title(f\"Chroma feature - file: {data_df.recording_id[idx]}\")","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"def play_sound(data_df, idx):\n    audio_file_path = '/kaggle/input/rfcx-species-audio-detection/train/'+data_df.recording_id[idx]+'.flac'\n    return ipd.Audio(audio_file_path)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"},{"metadata":{},"cell_type":"markdown","source":"<h2 style='background:#D09D7B; border:0; color:black'><center>Sound samples from TP set</center></h2> "},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_audio_file(data_tp_df, 20)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_spectrogram(data_tp_df, 20)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_mel_spectrogram(data_tp_df, 20)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_chroma_feature(data_tp_df, 20)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_harmonics_and_perceptual(data_tp_df, 20)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"play_sound(data_tp_df, 20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_audio_file(data_tp_df, 50)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_spectrogram(data_tp_df, 50)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_mel_spectrogram(data_tp_df, 50)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_chroma_feature(data_tp_df, 50)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_harmonics_and_perceptual(data_tp_df, 50)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"play_sound(data_tp_df, 50)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_audio_file(data_tp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_spectrogram(data_tp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_mel_spectrogram(data_tp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_chroma_feature(data_tp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_harmonics_and_perceptual(data_tp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"play_sound(data_tp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"},{"metadata":{},"cell_type":"markdown","source":"<h2 style='background:#B67B65; border:0; color:black'><center>Sound samples from FP set</center></h2> "},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_audio_file(data_fp_df, 10)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_spectrogram(data_fp_df, 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_mel_spectrogram(data_fp_df, 10)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_chroma_feature(data_fp_df, 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_harmonics_and_perceptual(data_fp_df, 10)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"play_sound(data_fp_df, 10)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_audio_file(data_fp_df, 70)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_spectrogram(data_fp_df, 70)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_mel_spectrogram(data_fp_df, 70)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_chroma_feature(data_fp_df, 70)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_harmonics_and_perceptual(data_fp_df, 70)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"play_sound(data_fp_df, 70)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_audio_file(data_fp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_spectrogram(data_fp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_mel_spectrogram(data_fp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_chroma_feature(data_fp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"plot_harmonics_and_perceptual(data_fp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true},"cell_type":"code","source":"play_sound(data_fp_df, 100)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<img src=\"https://upload.wikimedia.org/wikipedia/commons/4/48/Hyperolius_tuberculatus.jpg\" width=\"400\"></img>"},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"},{"metadata":{},"cell_type":"markdown","source":"<a id=\"5\"></a><h1 style='background:#135E46; border:0; color:black'><center>References</center></h1>   \n\nI include here various useful resources: papers, reviews, projects, trivia, notebooks.\n\n<h2 style='background:#478966; border:0; color:black'><center>Papers, reviews and projects</center></h2>   \n\n* [A pipeline for identification of bird and frog species in tropical soundscape recordings using a convolutional neural network](https://www.sciencedirect.com/science/article/pii/S1574954120300637)\n\n* [Frog Sound Identification System for Frog Species Recognition](https://link.springer.com/chapter/10.1007/978-3-642-36642-0_5)  \n\n* [Bird recognition - review of useful resources](https://github.com/AgaMiko/bird-recognition-review)   \n\n* [Detecting Frog Calling Activity Based on Acoustic Event Detection and Multi-label Learning](https://www.sciencedirect.com/science/article/pii/S1877050916307700)\n\n* [Acoustic classification of Australian frogs for ecosystem\nsurveys](https://eprints.qut.edu.au/103530/1/Jie_Xie_Thesis.pdf)  \n\n* [Data Augmentation Review](https://github.com/AgaMiko/data-augmentation-review)    \n\n* [Automatic recognition of frog calls using a multi-stage average spectrum](https://www.sciencedirect.com/science/article/pii/S0898122112002763)  \n\n* [A Baseline for Large-Scale Bird Species Identification in Field Recordings](http://ceur-ws.org/Vol-2125/paper_85.pdf).  \n\n* [Identifying Birds by Sound: Large-scale Acoustic Event Recognition for Avian Activity Monitoring](https://monarch.qucosa.de/api/qucosa%3A36986/attachment/ATT-0/)   \n\n* [LifeCLEF 2019: Biodiversity Identification and Prediction Challenges](https://www.researchgate.net/profile/Henning_Mueller2/publication/331733244_LifeCLEF_2019_Biodiversity_Identification_and_Prediction_Challenges/links/5c8a35e592851c1df9407d46/LifeCLEF-2019-Biodiversity-Identification-and-Prediction-Challenges.pdf)  \n\n<h2 style='background:#478966; border:0; color:black'><center>More resources</center></h2>   \n\n* [Calls of Frogs and Toads of the Northeast](https://musicofnature.com/calls-of-frogs-and-toads-of-the-northeast/)  \n\n* [Sounds of Frogs](https://www.fws.gov/refuge/clarks_river/sounds_of_frogs.html)   \n\n* [Singing in the Rain Forest: How a Tropical Bird Song Transfers Information](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0001580)\n\n<h2 style='background:#478966; border:0; color:black'><center>Trivia</center></h2>   \n\n\n* [Shazam for Birds: Three Apps That Recognize Bird Calls](https://lifehacker.com/shazam-for-birds-three-apps-that-recognize-bird-calls-1797955537)  \n\n* [The Shazam App For Frogs!](https://www.iheartradio.ca/virginradio/calgary/trending/the-shazam-app-for-frogs-1.3430016)   \n\n* [Song Sleuth -  Helping you become a better birder](https://www.songsleuth.com/#/)  \n\n* [BirdNET - Bird sound identification](https://play.google.com/store/apps/details?id=de.tu_chemnitz.mi.kahst.birdnet)\n\n\n<h2 style='background:#478966; border:0; color:black'><center>Notebooks</center></h2>   \n\n\n* [Audio Data Analysis Using librosa](https://www.kaggle.com/hamditarek/audio-data-analysis-using-librosa)  \n\n* [Birdcall Recognition: EDA and Audio FE](https://www.kaggle.com/andradaolteanu/birdcall-recognition-eda-and-audio-fe)    \n\n* [EDA and Audio Processing with Python](https://www.kaggle.com/parulpandey/eda-and-audio-processing-with-python)  \n\n* [Rainforest Connection Analysis Using librosa](https://www.kaggle.com/hamditarek/rainforest-connection-analysis-using-librosa)   \n\n* [RFCX: Audio Data Augmentation(Japanese+English)](https://www.kaggle.com/hidehisaarai1213/rfcx-audio-data-augmentation-japanese-english)  \n\n* [Tabular XGboost GPU + FFT GPU + Cuml = FAST](https://www.kaggle.com/titericz/0-525-tabular-xgboost-gpu-fft-gpu-cuml-fast)   "},{"metadata":{},"cell_type":"markdown","source":"<a href=\"#0\"><small>Go to top</small></a>"}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}