{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Exploratory Data Analysis (EDA)","metadata":{}},{"cell_type":"markdown","source":"## EDA is a crucial step in understanding and preparing your data for any data analysis or machine learning project. Here's a step-by-step guide on how to perform an EDA for this dataset:","metadata":{}},{"cell_type":"markdown","source":"Check the first few rows using df.head().\n\nCheck the data types and missing values using df.info().\n\nCalculate basic statistics using df.describe().\n\nData Cleaning:","metadata":{}},{"cell_type":"markdown","source":"Use techniques like imputation for missing values.\n\nIdentify and deal with outliers appropriately.\n\nRemove duplicate rows if necessary.\n","metadata":{}},{"cell_type":"markdown","source":"Explore relationships between features and the target variable(s) for classification and outlier detection.\n\nVisualize how different features vary across different subtypes or classes.\n\nUse box plots, violin plots, or swarm plots to compare feature distributions.","metadata":{}},{"cell_type":"markdown","source":"If your dataset contains information related to outlier detection, perform a dedicated EDA for this aspect:\n\nVisualize outliers using scatter plots or box plots.\n\nApply statistical methods or machine learning techniques to identify outliers.","metadata":{}},{"cell_type":"markdown","source":"If the dataset has many features, consider dimensionality reduction techniques like Principal Component Analysis (PCA) to reduce the number of \n\nvariables while preserving important information.\n","metadata":{}},{"cell_type":"markdown","source":"If the dataset has many features, consider dimensionality reduction techniques like Principal Component Analysis (PCA) to reduce the number of\n\nvariables while preserving important information.","metadata":{}},{"cell_type":"markdown","source":"Summarize your findings from the EDA, including any patterns, trends, or anomalies observed.\n\nDocument any data preprocessing steps applied","metadata":{}},{"cell_type":"markdown","source":"Based on your EDA findings, \n\nplan your next steps, which may include feature engineering, \n\nmodel selection, and further data preprocessing.","metadata":{}},{"cell_type":"markdown","source":"## Dataset Description¶\n","metadata":{}},{"cell_type":"markdown","source":"Your challenge in this competition is to identify which birds are calling in recordings made in a Global Biodiversity Hotspot in the Western Ghats.\n\nThis is an important task for scientists who monitor bird populations for conservation purposes. More accurate solutions could enable more comprehensive monitoring.\n\nThis competition uses a hidden test set. When your submitted notebook is scored, the actual test data will be made available to your notebook.","metadata":{}},{"cell_type":"markdown","source":"## Files","metadata":{}},{"cell_type":"markdown","source":"train_audio/ The training data consists of short recordings of individual bird calls generously uploaded by users of xenocanto.org. These files have been downsampled to 32 kHz where applicable to match the test set audio and converted to the ogg format. The training data should have nearly all relevant files; we expect there is no benefit to looking for more on xenocanto.org and appreciate your cooperation in limiting the burden on their servers.\n\ntest_soundscapes/ When you submit a notebook, the test_soundscapes directory will be populated with approximately 1,100 recordings to be used for scoring. They are 4 minutes long and in ogg audio format. The file names are randomized. It should take your submission notebook approximately five minutes to load all of the test soundscapes.\n\nunlabeled_soundscapes/ Unlabeled audio data from the same recording locations as the test soundscapes.\n\ntrain_metadata.csv A wide range of metadata is provided for the training data. The most directly relevant fields are:\n\nprimary_label - a code for the bird species. You can review detailed information about the bird codes by appending the code to https://ebird.org/species/, such as https://ebird.org/species/amecro for the American Crow.\n\nlatitude & longitude: coordinates for where the recording was taken. Some bird species may have local call 'dialects,' so you may want to seek geographic diversity in your training data.\n\nauthor - The user who provided the recording.\n\nfilename: the name of the associated audio file.\n\nsample_submission.csv A valid sample submission.","metadata":{}},{"cell_type":"code","source":"#Importing the Libraries\nimport os\nimport pandas as pd\nimport numpy as np\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\nimport matplotlib.pyplot as plt\nimport librosa\nimport seaborn as sns\nplt.style.use('ggplot')\n\nimport librosa\nimport librosa.display\nimport matplotlib.pyplot as plt\nfrom matplotlib.colorbar import Colorbar\nimport IPython.display as ipd\n\nfrom keras.models import Sequential\nfrom keras import layers, optimizers, callbacks\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.utils import to_categorical\nfrom sklearn.metrics import confusion_matrix\n\nfrom IPython.display import Audio\nfrom pydub import AudioSegment, effects\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:13.362393Z","iopub.execute_input":"2024-05-02T07:14:13.362856Z","iopub.status.idle":"2024-05-02T07:14:13.375307Z","shell.execute_reply.started":"2024-05-02T07:14:13.362809Z","shell.execute_reply":"2024-05-02T07:14:13.373548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_meta = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\neBird_Taxonomy = pd.read_csv('/kaggle/input/birdclef-2024/eBird_Taxonomy_v2021.csv')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:13.378265Z","iopub.execute_input":"2024-05-02T07:14:13.379380Z","iopub.status.idle":"2024-05-02T07:14:13.591804Z","shell.execute_reply.started":"2024-05-02T07:14:13.379321Z","shell.execute_reply":"2024-05-02T07:14:13.590777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def summary(df):\n    summry = pd.DataFrame(df.dtypes, columns=['data type'])\n    summry['#missing'] = df.isnull().sum().values\n    summry['Duplicate'] = df.duplicated().sum()\n    summry['#unique'] = df.nunique().values\n    desc = pd.DataFrame(df.describe(include='all').transpose())\n    summry['min'] = desc['min'].values\n    summry['max'] = desc['max'].values\n    summry['avg'] = desc['mean'].values\n    summry['std dev'] = desc['std'].values\n    summry['top value'] = desc['top'].values\n    summry['Freq'] = desc['freq'].values\n\n    return summry","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:13.594140Z","iopub.execute_input":"2024-05-02T07:14:13.594575Z","iopub.status.idle":"2024-05-02T07:14:13.603772Z","shell.execute_reply.started":"2024-05-02T07:14:13.594541Z","shell.execute_reply":"2024-05-02T07:14:13.602041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"summary(train_meta).style.set_caption(\"**Summary of the Train Data**\").\\\nbackground_gradient(cmap='Pastel2_r', axis=0). \\\nset_properties(**{'border': '1.3px dotted', 'color': '', 'caption-side': 'left'})","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:13.607665Z","iopub.execute_input":"2024-05-02T07:14:13.608685Z","iopub.status.idle":"2024-05-02T07:14:13.876568Z","shell.execute_reply.started":"2024-05-02T07:14:13.608645Z","shell.execute_reply":"2024-05-02T07:14:13.875355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_meta.head().style.set_caption(\"\").set_properties(**{'border': '1.3px dotted', 'color': ''})","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:13.877783Z","iopub.execute_input":"2024-05-02T07:14:13.878738Z","iopub.status.idle":"2024-05-02T07:14:13.895986Z","shell.execute_reply.started":"2024-05-02T07:14:13.878706Z","shell.execute_reply":"2024-05-02T07:14:13.894835Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def feature_dist(data, feature):\n    # Count unique values\n    value_counts = data[feature].value_counts().sort_values(ascending=False)\n    \n    # Plot\n    fig = px.bar(y=value_counts.index[::-1], x=value_counts[::-1], orientation='h')\n    fig.update_yaxes(title='')\n    fig.update_xaxes(title_text='Count')\n    fig.update_layout(\n        showlegend=False, \n        plot_bgcolor='#1C1D20', \n        paper_bgcolor='#1C1D20',\n        font=dict(size=16, color='#E1B12D'),\n        title_font=dict(size=20, color='#222'),\n        barmode='group',  \n        title=f\"Distribution of '{feature}'\"\n    )\n    fig.show()\n    print(f\"\\nTotal unique values in '{feature}'are:\",data[feature].nunique())\n    print(\"\\nTop 5 values:\", value_counts.head())\n    print(\"\\nBottom 5 values:\", value_counts.tail())\nfeature_dist(train_meta,'primary_label')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:13.897649Z","iopub.execute_input":"2024-05-02T07:14:13.898495Z","iopub.status.idle":"2024-05-02T07:14:13.999749Z","shell.execute_reply.started":"2024-05-02T07:14:13.898463Z","shell.execute_reply":"2024-05-02T07:14:13.998610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(train_meta,'secondary_labels')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:14.001229Z","iopub.execute_input":"2024-05-02T07:14:14.002233Z","iopub.status.idle":"2024-05-02T07:14:14.102348Z","shell.execute_reply.started":"2024-05-02T07:14:14.002191Z","shell.execute_reply":"2024-05-02T07:14:14.101205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(train_meta,'scientific_name')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:14.103659Z","iopub.execute_input":"2024-05-02T07:14:14.104857Z","iopub.status.idle":"2024-05-02T07:14:14.203493Z","shell.execute_reply.started":"2024-05-02T07:14:14.104775Z","shell.execute_reply":"2024-05-02T07:14:14.202324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(train_meta,'common_name')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:14.204711Z","iopub.execute_input":"2024-05-02T07:14:14.205103Z","iopub.status.idle":"2024-05-02T07:14:14.304713Z","shell.execute_reply.started":"2024-05-02T07:14:14.205070Z","shell.execute_reply":"2024-05-02T07:14:14.303343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(train_meta,'common_name')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:14:14.307785Z","iopub.execute_input":"2024-05-02T07:14:14.308245Z","iopub.status.idle":"2024-05-02T07:14:14.408201Z","shell.execute_reply.started":"2024-05-02T07:14:14.308211Z","shell.execute_reply":"2024-05-02T07:14:14.406322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_dist(feature):\n    feature_distribution = train_meta[feature].value_counts().sort_index(ascending=False)\n    colors = ['#2E8B57', '#3CB371', '#58D68D', '#74F9A4', '#9EF8C0',\n              '#C7F8DB', '#E6F5D0', '#F9E79F', '#F7C677', '#F7A54A', '#F58231']\n    rating_colors = {rating: color for rating, color in zip(feature_distribution.index, colors)}\n    # Bar plot\n    bar_data = go.Bar(x=feature_distribution.values, y=feature_distribution.index,\n                      orientation='h', marker=dict(color=[rating_colors[rating] for rating in feature_distribution.index]), showlegend=False, name='')\n    # Donut chart\n    labels = feature_distribution.index.tolist()\n    values = feature_distribution.values.tolist()\n    total_count = sum(values)\n    percentages = [(value / total_count) * 100 for value in values]\n    donut_data = go.Pie(labels=labels, values=values, marker=dict(colors=[rating_colors[rating] for rating in feature_distribution.index], line=dict(color='#ffffff', width=0.5)), hole=0.55,\n                        showlegend=False, name='', textinfo='label+percent', hoverinfo='label+percent', textposition='inside')\n    fig = make_subplots(rows=1, cols=2, specs=[[{\"type\": \"bar\"}, {\"type\": \"pie\"}]])\n    fig.add_trace(bar_data, row=1, col=1)\n    fig.add_trace(donut_data, row=1, col=2)\n    fig.update_layout(title=f'{feature} Distribution', plot_bgcolor='#1C1D20', paper_bgcolor='#1C1D20',\n                      title_font=dict(size=20, family=\"Lato, sans-serif\"), font=dict(color='#E1B12D'))\n    fig.show()\nplot_dist(\"rating\")\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:15:26.900277Z","iopub.execute_input":"2024-05-02T07:15:26.900744Z","iopub.status.idle":"2024-05-02T07:15:27.015307Z","shell.execute_reply.started":"2024-05-02T07:15:26.900710Z","shell.execute_reply":"2024-05-02T07:15:27.014022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Lets plot for western ghat\n# boundaries for the Western Ghats - as per Google search\nlower_latitude = 8\nupper_latitude = 22\nlower_longitude = 73\nupper_longitude = 79\nfiltered_data = train_meta[(train_meta['latitude'] >= lower_latitude) & \n                           (train_meta['latitude'] <= upper_latitude) &\n                           (train_meta['longitude'] >= lower_longitude) &\n                           (train_meta['longitude'] <= upper_longitude)]\n\nfig = px.scatter_mapbox(filtered_data, lat=\"latitude\", lon=\"longitude\", color=\"common_name\",\n                        zoom=5, center={\"lat\": (lower_latitude + upper_latitude) / 2, \"lon\": (lower_longitude + upper_longitude) / 2})\nfig.update_layout( title=\"Distribution of Bird Species in the Western Ghats\", plot_bgcolor=None, paper_bgcolor=None,\n    title_font=dict(size=20, family=\"Lato, sans-serif\", color='#E1B12D'),  font=dict(color='#E1B12D'),\n    mapbox_style=\"carto-positron\", margin=dict(t=50, r=50, b=50, l=50), hovermode='closest',\n    showlegend=True, legend=dict(title='Bird Species'), legend_title_font=dict(color='#E1B12D'))\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:17:23.236931Z","iopub.execute_input":"2024-05-02T07:17:23.237371Z","iopub.status.idle":"2024-05-02T07:17:23.852009Z","shell.execute_reply.started":"2024-05-02T07:17:23.237339Z","shell.execute_reply":"2024-05-02T07:17:23.850799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Let's Explore the Data ","metadata":{}},{"cell_type":"code","source":"eBird_Taxonomy.head().style.set_caption(\"\").set_properties(**{'border': '1.3px dotted', 'color': ''})\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:19:04.564036Z","iopub.execute_input":"2024-05-02T07:19:04.564485Z","iopub.status.idle":"2024-05-02T07:19:04.581873Z","shell.execute_reply.started":"2024-05-02T07:19:04.564455Z","shell.execute_reply":"2024-05-02T07:19:04.580615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"summary(eBird_Taxonomy).style.set_caption(\"**Summary of the Train Data**\").\\\nbackground_gradient(cmap='Pastel2_r', axis=0). \\\nset_properties(**{'border': '1.3px dotted', 'color': '', 'caption-side': 'left'})","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:19:38.658201Z","iopub.execute_input":"2024-05-02T07:19:38.658619Z","iopub.status.idle":"2024-05-02T07:19:38.822140Z","shell.execute_reply.started":"2024-05-02T07:19:38.658590Z","shell.execute_reply":"2024-05-02T07:19:38.820834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(eBird_Taxonomy,'CATEGORY')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:20:07.925359Z","iopub.execute_input":"2024-05-02T07:20:07.925790Z","iopub.status.idle":"2024-05-02T07:20:08.025957Z","shell.execute_reply.started":"2024-05-02T07:20:07.925760Z","shell.execute_reply":"2024-05-02T07:20:08.024576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(eBird_Taxonomy,'ORDER1')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:21:51.675122Z","iopub.execute_input":"2024-05-02T07:21:51.675541Z","iopub.status.idle":"2024-05-02T07:21:51.767486Z","shell.execute_reply.started":"2024-05-02T07:21:51.675511Z","shell.execute_reply":"2024-05-02T07:21:51.766017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(eBird_Taxonomy,'FAMILY')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:22:23.492806Z","iopub.execute_input":"2024-05-02T07:22:23.493290Z","iopub.status.idle":"2024-05-02T07:22:23.591639Z","shell.execute_reply.started":"2024-05-02T07:22:23.493257Z","shell.execute_reply":"2024-05-02T07:22:23.590414Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_dist(eBird_Taxonomy,'REPORT_AS')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:22:59.437218Z","iopub.execute_input":"2024-05-02T07:22:59.437638Z","iopub.status.idle":"2024-05-02T07:22:59.535972Z","shell.execute_reply.started":"2024-05-02T07:22:59.437608Z","shell.execute_reply":"2024-05-02T07:22:59.534768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Lets Explore some Audio Files as well","metadata":{}},{"cell_type":"code","source":"# Check if the coordinates are within Western Ghats\ndef is_within_western_ghats(latitude, longitude):\n    lower_latitude = 8.0\n    upper_latitude = 21.5\n    lower_longitude = 73.0\n    upper_longitude = 77.5\n    return lower_latitude <= latitude <= upper_latitude and lower_longitude <= longitude <= upper_longitude\n\n#Function to plot graphs & print audio file\ndef visualize_audio_by_bird(common_name, train_meta, audio_path):\n    metadata = train_meta[train_meta['common_name'] == common_name]\n    if metadata.empty:\n        print(f\"No data found for the bird species '{common_name}'.\")\n        return\n    \n    audio_file = metadata['filename'].iloc[0]\n    audio_file_path = f\"{audio_path}/{audio_file}\"\n    latitude = metadata['latitude'].iloc[0]\n    \n    longitude = metadata['longitude'].iloc[0]\n    rating = metadata['rating'].iloc[0]\n    author = metadata['author'].iloc[0]\n    primary_label = metadata['primary_label'].iloc[0]\n    type = metadata['type'].iloc[0]\n\n    # Check if the coordinates are within the Western Ghats\n    if not is_within_western_ghats(latitude, longitude):\n        print(f\"The bird species '{common_name}' does not have recordings in the Western Ghats.\")\n        return\n\n    try:\n        audio_data, sample_rate = librosa.load(audio_file_path)\n    except FileNotFoundError:\n        print(f\"Audio file not found for the bird species '{common_name}'.\")\n        return\n\n    # Play the audio\n    print(f\"Playing audio: {common_name}\")\n    ipd.display(ipd.Audio(audio_data, rate=sample_rate))\n\n    # Create subplots for audio visualizations\n    fig, axs = plt.subplots(nrows=3, ncols=2, figsize=(16, 12))\n\n    # Waveform\n    axs[0, 0].plot(audio_data)\n    axs[0, 0].set_title('Waveform')\n\n    # Spectrogram\n    spectrogram = librosa.amplitude_to_db(librosa.stft(audio_data), ref=np.max)\n    librosa.display.specshow(spectrogram, sr=sample_rate, x_axis='time', y_axis='hz', ax=axs[0, 1])\n    axs[0, 1].set_title('Spectrogram')\n\n    # Mel Spectrogram\n    mel_spectrogram = librosa.feature.melspectrogram(y=audio_data, sr=sample_rate)\n    librosa.display.specshow(mel_spectrogram, x_axis='time', y_axis='mel', sr=sample_rate, ax=axs[1, 0])\n    axs[1, 0].set_title('Mel Spectrogram')\n\n    # Chromagram\n    chromagram = librosa.feature.chroma_stft(y=audio_data, sr=sample_rate)\n    librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', sr=sample_rate, ax=axs[1, 1])\n    axs[1, 1].set_title('Chromagram')\n\n    # MFCCs\n    mfccs = librosa.feature.mfcc(y=audio_data, sr=sample_rate)\n    librosa.display.specshow(mfccs, x_axis='time', sr=sample_rate, ax=axs[2, 0])\n    axs[2, 0].set_title('MFCCs')\n    \n    # Spectral Contrast\n    spectral_contrast = librosa.feature.spectral_contrast(y=audio_data, sr=sample_rate)\n    librosa.display.specshow(spectral_contrast, x_axis='time', sr=sample_rate, ax=axs[2, 1])\n    axs[2, 1].set_title('Spectral Contrast')\n\n    # Add color bar to the spectrogram plot\n    cbar = fig.colorbar(axs[0, 1].collections[0], ax=axs[0, 1], format='%+2.0f dB')\n\n    # Print metadata\n    print(f\"Common Name: {common_name}\")\n    print(f\"Rating: {rating}\")\n    print(f\"Primary Label: {primary_label}\")\n    print(f\"Type: {type}\")\n    print(f\"Author: {author}\")\n    print(f\"Latitude: {latitude}\")\n    print(f\"Longitude: {longitude}\")\n\n    # Plot recordings on map\n    fig_map = px.scatter_mapbox(metadata, lat=\"latitude\", lon=\"longitude\", zoom=5, title=\"Recordings Map\",\n                                hover_name=\"filename\")\n    fig_map.update_layout(mapbox_style=\"open-street-map\")\n    fig_map.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:32:31.257930Z","iopub.execute_input":"2024-05-02T07:32:31.258364Z","iopub.status.idle":"2024-05-02T07:32:31.284432Z","shell.execute_reply.started":"2024-05-02T07:32:31.258334Z","shell.execute_reply":"2024-05-02T07:32:31.283155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Check if any specified does not have recording at lat & long of Western Ghat\nvisualize_audio_by_bird('Nilgiri Wood-Pigeon', train_meta, '/kaggle/input/birdclef-2024/train_audio')\n","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:35:47.422249Z","iopub.execute_input":"2024-05-02T07:35:47.422958Z","iopub.status.idle":"2024-05-02T07:36:07.321430Z","shell.execute_reply.started":"2024-05-02T07:35:47.422915Z","shell.execute_reply":"2024-05-02T07:36:07.319989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"visualize_audio_by_bird('Malabar Gray Hornbill', train_meta, '/kaggle/input/birdclef-2024/train_audio')","metadata":{"execution":{"iopub.status.busy":"2024-05-02T07:37:19.973331Z","iopub.execute_input":"2024-05-02T07:37:19.974159Z","iopub.status.idle":"2024-05-02T07:37:32.129178Z","shell.execute_reply.started":"2024-05-02T07:37:19.974122Z","shell.execute_reply":"2024-05-02T07:37:32.127710Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}}]}