{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Take-aways\nIn this repository, I have primarily analized the frequency plots for 182 bird species\n","metadata":{}},{"cell_type":"markdown","source":"# Training dataset","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torchaudio\nimport plotly.express as px\nfrom IPython.display import Audio\nfrom matplotlib import pyplot as plt \nfrom scipy import signal\nimport math\nimport os\nfrom tqdm import tqdm\ndf = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\ndf.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T10:18:47.303181Z","iopub.execute_input":"2024-04-07T10:18:47.303448Z","iopub.status.idle":"2024-04-07T10:18:59.488104Z","shell.execute_reply.started":"2024-04-07T10:18:47.303423Z","shell.execute_reply":"2024-04-07T10:18:59.487162Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training audio\nThis part is for visualizing a audio signal","metadata":{}},{"cell_type":"code","source":"train_path = '/kaggle/input/birdclef-2024/train_audio/'\ndata, rate = torchaudio.load(train_path + df.filename[0])\ndisplay(Audio(data[0, :rate*5], rate=rate))\nfig = px.line(y=data[0, :rate*5], title=df.common_name[0])\nfig.show(renderer='iframe')","metadata":{"execution":{"iopub.status.busy":"2024-04-07T10:19:29.979754Z","iopub.execute_input":"2024-04-07T10:19:29.980665Z","iopub.status.idle":"2024-04-07T10:19:33.491859Z","shell.execute_reply.started":"2024-04-07T10:19:29.980630Z","shell.execute_reply":"2024-04-07T10:19:33.490850Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Frequency plot\nIn this part, I have showed the frequency plot for all the species. For computational efficiency, I have downsampled the audio signal again using.","metadata":{}},{"cell_type":"code","source":"train_path = '/kaggle/input/birdclef-2024/train_audio/'\nbirds_list = list(df['primary_label'].unique())\nFs = 32000 # Sampling frequency\nsecond_sampling = 200 # second step sampling for data visualization\n\ndef test_fun(bird='all', chirp_type='all'):\n    if (bird=='all'):\n        birds_name = birds_list\n    else:\n        birds_name = bird\n        \n    rows = math.ceil(len(birds_name)/4)\n    if (rows <= 1):\n        rows = 1\n    height = rows*5.5\n    fig, axs = plt.subplots(rows, 4, figsize=(20, height))\n    row, col = 0, 0\n    \n    for i in tqdm(range(len(birds_name))):\n        bird_audio = np.empty([1,1])\n        path = []\n        temp_df = df[df['primary_label'] == birds_name[i]]\n        if (chirp_type=='all'):\n            path = list(temp_df['filename'])\n        else:\n            path = list(temp_df[temp_df['type']==chirp_type]['filename'])\n\n        for audio in path:\n            data1, rate = torchaudio.load(os.path.join(train_path, audio))\n            signal1 = np.array(data1)\n            signal1 = signal.decimate(signal1, second_sampling)\n            bird_audio = np.concatenate((bird_audio, signal1), axis=1)\n        if(col!=0 and col%4 == 0): \n            row += 1\n            col = 0\n\n        if(rows == 1):\n            axis = axs[col]\n        else:\n            axis = axs[row, col]\n        axis.magnitude_spectrum(np.squeeze(bird_audio), Fs=Fs, color='b')\n        axis.magnitude_spectrum(np.squeeze(bird_audio), Fs=Fs) \n        axis.set_xlabel('Frequency (Hz)')\n        axis.set_ylabel('Magnitude')\n        axis.set_title(birds_name[i] + ' | Chirp_type: ' + chirp_type) \n        axis.ticklabel_format(axis='both', style='sci', scilimits=(0,0))\n        col += 1\n    fig.show()","metadata":{"execution":{"iopub.status.busy":"2024-04-07T11:00:52.979994Z","iopub.execute_input":"2024-04-07T11:00:52.980781Z","iopub.status.idle":"2024-04-07T11:00:52.995355Z","shell.execute_reply.started":"2024-04-07T11:00:52.980748Z","shell.execute_reply":"2024-04-07T11:00:52.994427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Frequency plot of first 20 birds\nbirds_list = list(df['primary_label'].unique())[0:20]\ntest_fun(bird=birds_list, chirp_type='all')","metadata":{"execution":{"iopub.status.busy":"2024-04-07T11:01:01.801571Z","iopub.execute_input":"2024-04-07T11:01:01.802185Z","iopub.status.idle":"2024-04-07T11:05:36.786748Z","shell.execute_reply.started":"2024-04-07T11:01:01.802154Z","shell.execute_reply":"2024-04-07T11:05:36.785826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Frequency plot of first 4 birds for chirping type 'call'\nbirds_list = list(df['primary_label'].unique())[0:4]\ntest_fun(bird=birds_list, chirp_type=\"['call']\")","metadata":{"execution":{"iopub.status.busy":"2024-04-07T11:37:38.893225Z","iopub.execute_input":"2024-04-07T11:37:38.893910Z","iopub.status.idle":"2024-04-07T11:37:46.168388Z","shell.execute_reply.started":"2024-04-07T11:37:38.893878Z","shell.execute_reply":"2024-04-07T11:37:46.167503Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Bird chirping analysis","metadata":{}},{"cell_type":"code","source":"def chirp_type(bird_num=1):\n    birds_name = list(df['primary_label'].unique())\n    type_name = list(df['type'].unique())\n    data = []\n    for bird in birds_name[0:bird_num]:\n        temp_df = df[df['primary_label'] == bird]\n        for type_ in type_name:\n            temp = []\n            temp.append(bird)\n            temp.append(type_)\n            temp.append(len(temp_df[temp_df['type'] == type_]))\n            data.append(temp)\n    type_df = pd.DataFrame(data, columns=['Bird', 'Type', 'Number of audios'])\n    fig = px.bar(type_df, x=\"Bird\", y=\"Number of audios\", color=\"Type\", title=\"Long-Form Input\")\n    fig.update_layout(xaxis=dict(rangeslider=dict(visible=True)))\n    fig.update_layout(width=1400,height=1000) \n    fig.show(renderer='iframe')  ","metadata":{"execution":{"iopub.status.busy":"2024-04-07T11:39:37.832252Z","iopub.execute_input":"2024-04-07T11:39:37.832942Z","iopub.status.idle":"2024-04-07T11:39:37.841166Z","shell.execute_reply.started":"2024-04-07T11:39:37.832905Z","shell.execute_reply":"2024-04-07T11:39:37.840242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Bird chirping of first 20 birds\nchirp_type(20)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T11:32:33.179996Z","iopub.execute_input":"2024-04-07T11:32:33.180440Z","iopub.status.idle":"2024-04-07T11:32:42.422397Z","shell.execute_reply.started":"2024-04-07T11:32:33.180400Z","shell.execute_reply":"2024-04-07T11:32:42.421447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# To-Do\n- Try [bird-vocalization-classifier](https://www.kaggle.com/models/google/bird-vocalization-classifier/frameworks/TensorFlow2/variations/bird-vocalization-classifier/versions/1), [BirdNET](https://github.com/kahst/BirdNET-Analyzer) model to create embeddings\n- Notebook: https://www.kaggle.com/code/philculliton/inferring-birds-with-kaggle-models","metadata":{}}]}