{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":19596,"databundleVersionId":1292430,"sourceType":"competition"}],"dockerImageVersionId":30635,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import librosa # Librosa is a popular Python library specifically designed for analyzing and working with audio signals.It's used for FE.(Librosa specially resamples the data)\nimport librosa.display#Librosa also converts stereo to mono\nimport matplotlib.pyplot as plt\nimport IPython.display as ipd # to display interactive rich media like audios.\nimport numpy as np\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-01-12T18:52:19.804911Z","iopub.execute_input":"2024-01-12T18:52:19.805331Z","iopub.status.idle":"2024-01-12T18:52:19.810932Z","shell.execute_reply.started":"2024-01-12T18:52:19.805301Z","shell.execute_reply":"2024-01-12T18:52:19.809958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio_files={'aldfly':['/kaggle/input/birdsong-recognition/train_audio/aldfly/XC134874.mp3','/kaggle/input/birdsong-recognition/train_audio/aldfly/XC135454.mp3'],\n            'ameavo':['/kaggle/input/birdsong-recognition/train_audio/ameavo/XC133080.mp3','/kaggle/input/birdsong-recognition/train_audio/ameavo/XC139829.mp3'],\n            'amebit':['/kaggle/input/birdsong-recognition/train_audio/amebit/XC127371.mp3','/kaggle/input/birdsong-recognition/train_audio/amebit/XC130058.mp3'],\n            'amecro':['/kaggle/input/birdsong-recognition/train_audio/amecro/XC109768.mp3','/kaggle/input/birdsong-recognition/train_audio/amecro/XC112598.mp3'],\n            'amegfi':['/kaggle/input/birdsong-recognition/train_audio/amegfi/XC109299.mp3','/kaggle/input/birdsong-recognition/train_audio/amegfi/XC109300.mp3']}\naudio_signals={'aldfly':[],\n            'ameavo':[],\n            'amebit':[],\n            'amecro':[],\n            'amegfi':[]}\nsample_rates={'aldfly':[],\n            'ameavo':[],\n            'amebit':[],\n            'amecro':[],\n            'amegfi':[]}\nall_features_mfcc={\n    'aldfly':[],\n            'ameavo':[],\n            'amebit':[],\n            'amecro':[],\n            'amegfi':[]\n}\nfor key,value in audio_files.items():\n    print(f\"Audio {key}\")\n    y1, sr1 = librosa.load(value[0])\n    y2, sr2 = librosa.load(value[1])\n    display(ipd.Audio(y1, rate=sr1))\n    display(ipd.Audio(y2, rate=sr2))\n    audio_signals[key].append(y1)\n    audio_signals[key].append(y2)\n    sample_rates[key].append(sr1)\n    sample_rates[key].append(sr2)\nsample_rates","metadata":{"execution":{"iopub.status.busy":"2024-01-12T18:52:20.000053Z","iopub.execute_input":"2024-01-12T18:52:20.000984Z","iopub.status.idle":"2024-01-12T18:52:21.663215Z","shell.execute_reply.started":"2024-01-12T18:52:20.000947Z","shell.execute_reply":"2024-01-12T18:52:21.662321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"minn=444 #these are the minimum no. of frames(in which mfccs are calculated) among all audios.","metadata":{"execution":{"iopub.status.busy":"2024-01-12T18:52:21.664751Z","iopub.execute_input":"2024-01-12T18:52:21.665232Z","iopub.status.idle":"2024-01-12T18:52:21.671284Z","shell.execute_reply.started":"2024-01-12T18:52:21.665201Z","shell.execute_reply":"2024-01-12T18:52:21.670054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def extract_features_mfcc(audio_file):          # This variable is essentially a 2D array where each column represents the MFCCs of a specific frame in the audio, and each row represents a different MFCC feature. For example, row 0 might represent the first MFCC coefficient, row 1 the second coefficient, and so on.\n    y, sr = librosa.load(audio_file)\n    mfcc = librosa.feature.mfcc(y=y,n_mfcc=13, sr=sr)\n    return mfcc\n# Extract features for each audio file\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n    all_features_mfcc[key].append( np.array([extract_features_mfcc(file)[:,:minn] for file in audio_files[key]]))   #Keeping no. of frames same for all files\n    # Calculate statistics (mean, standard deviation, etc.) across the features for comparison\n    all_features_mfcc[key].append (np.mean(all_features_mfcc[key][0], axis=0))\n    all_features_mfcc[key].append (np.std(all_features_mfcc[key][0], axis=0))\n","metadata":{"execution":{"iopub.status.busy":"2024-01-12T18:52:21.672997Z","iopub.execute_input":"2024-01-12T18:52:21.673489Z","iopub.status.idle":"2024-01-12T18:52:24.249449Z","shell.execute_reply.started":"2024-01-12T18:52:21.673440Z","shell.execute_reply":"2024-01-12T18:52:24.247866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Visualising the MFCC coefficients \nplt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  plt.subplot(5, 2, i+1)\n  librosa.display.specshow(all_features_mfcc[key][0][0,:,:], sr=sample_rates[key][0], x_axis='time')\n  plt.colorbar(format='%+2.0f dB')\n  plt.title(f'MFCC-{key} - Audio 1')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n  librosa.display.specshow(all_features_mfcc[key][0][1,:,:], sr=sample_rates[key][1], x_axis='time')\n  plt.colorbar(format='%+2.0f dB')\n  plt.title(f'MFCC-{key} - Audio 2')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:05:44.955888Z","iopub.execute_input":"2024-01-12T19:05:44.956362Z","iopub.status.idle":"2024-01-12T19:05:47.523449Z","shell.execute_reply.started":"2024-01-12T19:05:44.956317Z","shell.execute_reply":"2024-01-12T19:05:47.522643Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Visualising the MFCC coefficients concatenated with their derivatives\nplt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  plt.subplot(5, 2, i+1)\n# Calculate delta and delta2 MFCCs\n  delta_mfcc=librosa.feature.delta(all_features_mfcc[key][0][0,:,:])\n  delta2_mfcc=librosa.feature.delta(all_features_mfcc[key][0][0,:,:],order=2)\n  mfcc_overall=np.concatenate((all_features_mfcc[key][0][0,:,:],delta_mfcc,delta2_mfcc))\n  librosa.display.specshow(mfcc_overall, sr=sample_rates[key][0], x_axis='time')\n  plt.colorbar(format='%+2.0f dB')\n  plt.title(f'MFCC-Overall-{key} - Audio 1')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n# Calculate delta and delta2 MFCCs\n  delta_mfcc=librosa.feature.delta(all_features_mfcc[key][0][1,:,:])\n  delta2_mfcc=librosa.feature.delta(all_features_mfcc[key][0][1,:,:],order=2)\n  mfcc_overall=np.concatenate((all_features_mfcc[key][0][1,:,:],delta_mfcc,delta2_mfcc))\n  librosa.display.specshow(mfcc_overall, sr=sample_rates[key][1], x_axis='time')\n  plt.colorbar(format='%+2.0f dB')\n  plt.title(f'MFCC-Overall-{key} - Audio 2')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:14:44.717245Z","iopub.execute_input":"2024-01-12T19:14:44.717764Z","iopub.status.idle":"2024-01-12T19:14:47.425576Z","shell.execute_reply.started":"2024-01-12T19:14:44.717728Z","shell.execute_reply":"2024-01-12T19:14:47.424377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  plt.subplot(5, 2, i+1)\n  zcr = np.array([librosa.feature.zero_crossing_rate(x)[:,:minn] for x in audio_signals[key]])\n  mean_zcr = np.mean(zcr, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],mean_zcr)\n  plt.title(f'Mean_zcr_{key}')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n  std_zcr = np.std(zcr, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],std_zcr)\n  plt.title(f'Std_zcr_{key}')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:33:46.347571Z","iopub.execute_input":"2024-01-12T19:33:46.348728Z","iopub.status.idle":"2024-01-12T19:33:49.093448Z","shell.execute_reply.started":"2024-01-12T19:33:46.348688Z","shell.execute_reply":"2024-01-12T19:33:49.092389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  plt.subplot(5, 2, i+1)\n  energy = np.array([librosa.feature.rms(y=x)[:,:minn] for x in audio_signals[key]])\n  mean_energy = np.mean(energy, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],mean_energy)\n  plt.title(f'Mean_energy_{key}')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n  std_energy = np.std(energy, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],std_energy)\n  plt.title(f'Std_energy_{key}')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:38:07.940858Z","iopub.execute_input":"2024-01-12T19:38:07.941874Z","iopub.status.idle":"2024-01-12T19:38:11.235915Z","shell.execute_reply.started":"2024-01-12T19:38:07.941828Z","shell.execute_reply":"2024-01-12T19:38:11.234725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  plt.subplot(5, 2, i+1)\n  onset_env = np.array([librosa.onset.onset_strength(y=x,sr=s)[:minn] for x,s in zip(audio_signals[key],sample_rates[key])])\n  mean_onset_env = np.mean(onset_env, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],mean_onset_env)\n  plt.title(f'Mean_onset_env_{key}')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n  std_onset_env = np.std(onset_env, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],std_onset_env)\n  plt.title(f'Std_onset_env_{key}')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:42:32.481693Z","iopub.execute_input":"2024-01-12T19:42:32.482407Z","iopub.status.idle":"2024-01-12T19:42:36.396868Z","shell.execute_reply.started":"2024-01-12T19:42:32.482371Z","shell.execute_reply":"2024-01-12T19:42:36.395827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nplt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  rolloff=[]\n  plt.subplot(5, 2, i+1)\n  S1, phase1 = librosa.magphase(librosa.stft(audio_signals[key][0]))\n  S2, phase2 = librosa.magphase(librosa.stft(audio_signals[key][1]))\n  rolloff.append(librosa.feature.spectral_rolloff(S=S1, sr=sample_rates[key][0], roll_percent=0.99)[:,:minn])\n  rolloff.append(librosa.feature.spectral_rolloff(S=S2, sr=sample_rates[key][1], roll_percent=0.99)[:,:minn])\n  rolloff = np.array(rolloff)\n  mean_rolloff = np.mean(rolloff, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],mean_rolloff)\n  plt.title(f'Mean_rolloff_{key}')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n  std_rolloff = np.std(rolloff, axis=0).flatten()\n  plt.plot([x+1 for x in range(minn)],std_rolloff)\n  plt.title(f'Std_rolloff_{key}')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:50:43.423782Z","iopub.execute_input":"2024-01-12T19:50:43.424223Z","iopub.status.idle":"2024-01-12T19:50:47.393749Z","shell.execute_reply.started":"2024-01-12T19:50:43.424192Z","shell.execute_reply":"2024-01-12T19:50:47.392913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 25))\ni=0\nfor key in ['aldfly','ameavo','amebit','amecro','amegfi']:\n  plt.subplot(5, 2, i+1)\n  D = librosa.amplitude_to_db(np.abs(librosa.stft(audio_signals[key][0])), ref=np.max)\n  librosa.display.specshow(D, sr=sample_rates[key][0], x_axis='time', y_axis='log')\n  plt.colorbar(format='%+2.0f dB')\n  plt.title(f'Spectrogram-{key} - Audio 1')\n  i=i+1\n  plt.subplot(5, 2, i+1)\n  D = librosa.amplitude_to_db(np.abs(librosa.stft(audio_signals[key][1])), ref=np.max)\n  librosa.display.specshow(D, sr=sample_rates[key][1], x_axis='time', y_axis='log')\n  plt.colorbar(format='%+2.0f dB')\n  plt.title(f'Spectrogram-{key} - Audio 2')\n  i=i+1\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-12T19:55:16.980241Z","iopub.execute_input":"2024-01-12T19:55:16.980707Z","iopub.status.idle":"2024-01-12T19:55:38.765192Z","shell.execute_reply.started":"2024-01-12T19:55:16.980675Z","shell.execute_reply":"2024-01-12T19:55:38.763929Z"},"trusted":true},"execution_count":null,"outputs":[]}]}