{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport librosa\nfrom IPython.display import Audio\nimport os\nimport tqdm\nfrom scipy.signal import spectrogram\nimport matplotlib.pyplot as plt\nimport soundfile as sf\nfrom scipy.signal import find_peaks\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-20T09:19:41.607084Z","iopub.execute_input":"2023-03-20T09:19:41.607674Z","iopub.status.idle":"2023-03-20T09:19:42.049411Z","shell.execute_reply.started":"2023-03-20T09:19:41.607629Z","shell.execute_reply":"2023-03-20T09:19:42.047295Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load a sample audio files from two different species\naudio_abe, sr_abe = librosa.load(\"/kaggle/input/birdclef-2023/train_audio/abethr1/XC128013.ogg\")\naudio_abh, sr_abh = librosa.load(\"/kaggle/input/birdclef-2023/train_audio/abhori1/XC127317.ogg\")","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:42.052878Z","iopub.execute_input":"2023-03-20T09:19:42.053306Z","iopub.status.idle":"2023-03-20T09:19:44.006450Z","shell.execute_reply.started":"2023-03-20T09:19:42.053264Z","shell.execute_reply":"2023-03-20T09:19:44.004832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play the audio\nAudio(data=audio_abe, rate=sr_abe)","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:44.008351Z","iopub.execute_input":"2023-03-20T09:19:44.009418Z","iopub.status.idle":"2023-03-20T09:19:44.079660Z","shell.execute_reply.started":"2023-03-20T09:19:44.009376Z","shell.execute_reply":"2023-03-20T09:19:44.078396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play the audio\nAudio(data=audio_abh, rate=sr_abh)","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:44.083086Z","iopub.execute_input":"2023-03-20T09:19:44.083773Z","iopub.status.idle":"2023-03-20T09:19:44.145057Z","shell.execute_reply.started":"2023-03-20T09:19:44.083729Z","shell.execute_reply":"2023-03-20T09:19:44.143630Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot audio file\ntime = np.arange(0,len(audio_abe))/sr_abe\nplt.plot(time,audio_abe)\nplt.title(\"audio_abe\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:44.146432Z","iopub.execute_input":"2023-03-20T09:19:44.146832Z","iopub.status.idle":"2023-03-20T09:19:44.540386Z","shell.execute_reply.started":"2023-03-20T09:19:44.146799Z","shell.execute_reply":"2023-03-20T09:19:44.539002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot audio file\ntime = np.arange(0,len(audio_abh))/sr_abh\nplt.plot(time,audio_abh)\nplt.title(\"audio_abh\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:44.541730Z","iopub.execute_input":"2023-03-20T09:19:44.542059Z","iopub.status.idle":"2023-03-20T09:19:44.890573Z","shell.execute_reply.started":"2023-03-20T09:19:44.542028Z","shell.execute_reply":"2023-03-20T09:19:44.889363Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"percentile_percentile_value_dict = {}\nfor i in range(0,102,2):\n    p = np.percentile(np.abs(audio_abe), i)\n    percentile_percentile_value_dict[i]=p\n\nlists = sorted(percentile_percentile_value_dict.items()) # sorted by key, return a list of tuples\n\nx, y = zip(*lists) # unpack a list of pairs into two tuples\n\nplt.plot(x, y)\nplt.xlabel('Percentile')\nplt.ylabel('Percentile value')\nplt.title('Percentile and percentile values for audio_abe')\nplt.show()\n\nprint(\" The elbow represents the percentile beyond which the signal increases beyond the noise floor.(Near about 95)\")","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:44.892123Z","iopub.execute_input":"2023-03-20T09:19:44.892475Z","iopub.status.idle":"2023-03-20T09:19:45.742065Z","shell.execute_reply.started":"2023-03-20T09:19:44.892443Z","shell.execute_reply":"2023-03-20T09:19:45.740488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualize noise floor\np = np.percentile(np.abs(audio_abe), 95)\ntime = np.arange(0,len(audio_abe))/sr_abe\nplt.plot(time,audio_abe)\nplt.axhline(y=p, color='r', linestyle='-')\nplt.axhline(y=-p, color='r', linestyle='-',label=\"Noise Floor\")\nplt.legend()\nplt.title(\"Noise Floor for audio_abe\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:45.743627Z","iopub.execute_input":"2023-03-20T09:19:45.743971Z","iopub.status.idle":"2023-03-20T09:19:49.939296Z","shell.execute_reply.started":"2023-03-20T09:19:45.743938Z","shell.execute_reply":"2023-03-20T09:19:49.937833Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualize noise floor\np = np.percentile(np.abs(audio_abh), 99)\ntime = np.arange(0,len(audio_abh))/sr_abe\nplt.plot(time,audio_abh)\nplt.axhline(y=p, color='r', linestyle='-')\nplt.axhline(y=-p, color='r', linestyle='-',label=\"Noise Floor\")\nplt.legend()\nplt.title(\"Noise Floor for audio_abh\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:49.940860Z","iopub.execute_input":"2023-03-20T09:19:49.941273Z","iopub.status.idle":"2023-03-20T09:19:50.862954Z","shell.execute_reply.started":"2023-03-20T09:19:49.941237Z","shell.execute_reply":"2023-03-20T09:19:50.861588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# The subsequent cells focus on extracting the call from the background noise.\n# Use the percentile cutoff as 99 as this eliminates bird calls in the background.\npercentile_of_values_at_which_noise_floor_ends = 99\nmin_distance_between_subsequent_peaks_in_seconds = 3\nwindow_in_seconds = 1","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:50.868841Z","iopub.execute_input":"2023-03-20T09:19:50.869332Z","iopub.status.idle":"2023-03-20T09:19:50.875428Z","shell.execute_reply.started":"2023-03-20T09:19:50.869288Z","shell.execute_reply":"2023-03-20T09:19:50.874056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\nTry this method. Get peak values above the percentile of values \nat which noise floor ends. Then grab a window of about t seconds about the \npeak for extracting the call signal.\"\"\" \n\np_abe = np.percentile(np.abs(audio_abe), percentile_of_values_at_which_noise_floor_ends)\n\npeaks, _ = find_peaks(audio_abe, height=p_abe,distance=min_distance_between_subsequent_peaks_in_seconds*sr_abe)\ntime = np.arange(0,len(audio_abe))/sr_abe\nplt.plot(time,audio_abe)\nplt.plot(peaks/sr_abe, audio_abe[peaks], \"x\")\n# plt.plot(np.zeros_like(audio_abe), \"--\", color=\"gray\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:50.877370Z","iopub.execute_input":"2023-03-20T09:19:50.879524Z","iopub.status.idle":"2023-03-20T09:19:51.275678Z","shell.execute_reply.started":"2023-03-20T09:19:50.879465Z","shell.execute_reply":"2023-03-20T09:19:51.274649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"peaks","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.277234Z","iopub.execute_input":"2023-03-20T09:19:51.279521Z","iopub.status.idle":"2023-03-20T09:19:51.288087Z","shell.execute_reply.started":"2023-03-20T09:19:51.279464Z","shell.execute_reply":"2023-03-20T09:19:51.286813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def extract_signals(peaks,window_in_seconds,sr,audio_arr):\n    # Gather indices about peaks which correspond to a window about the peaks\n\n    signal_indices = np.array([],dtype=int)\n    signals = []\n    for peak in peaks:\n        ll = peak - window_in_seconds*sr\n        ul = peak + window_in_seconds*sr\n        if ul >= len(audio_arr):\n            ul = len(audio_arr)\n        if ll < 0:\n            ll = 0\n        sample_indices = np.arange(ll,ul).astype(int)\n        signals.append(audio_arr[sample_indices])\n    return signals\n","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.289587Z","iopub.execute_input":"2023-03-20T09:19:51.290745Z","iopub.status.idle":"2023-03-20T09:19:51.299684Z","shell.execute_reply.started":"2023-03-20T09:19:51.290703Z","shell.execute_reply":"2023-03-20T09:19:51.298452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"signals_abe = extract_signals(peaks=peaks,\n                              window_in_seconds=window_in_seconds,\n                              sr=sr_abe,\n                              audio_arr=audio_abe)\n# Get the first signal sample\nsignal_abe = signals_abe[0]\n\n# Get second extracted signal sample\nsignal_abe_1 = signals_abe[1]","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.301221Z","iopub.execute_input":"2023-03-20T09:19:51.301664Z","iopub.status.idle":"2023-03-20T09:19:51.318929Z","shell.execute_reply.started":"2023-03-20T09:19:51.301625Z","shell.execute_reply":"2023-03-20T09:19:51.317698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sf.write('signal_abe_peak_extraction.ogg', signal_abe, sr_abe, format='ogg', subtype='vorbis')\nsignal_abe, sr_signal_abe = librosa.load(\"/kaggle/working/signal_abe_peak_extraction.ogg\")\n\n\nsf.write('signal_abe_1_peak_extraction.ogg', signal_abe_1, sr_abe, format='ogg', subtype='vorbis')\nsignal_abe_1, sr_signal_abe_1 = librosa.load(\"/kaggle/working/signal_abe_1_peak_extraction.ogg\")\n","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.322688Z","iopub.execute_input":"2023-03-20T09:19:51.323258Z","iopub.status.idle":"2023-03-20T09:19:51.387255Z","shell.execute_reply.started":"2023-03-20T09:19:51.323216Z","shell.execute_reply":"2023-03-20T09:19:51.385995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play first extracted signal\nAudio(data=signal_abe, rate=sr_abe)","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.388595Z","iopub.execute_input":"2023-03-20T09:19:51.392230Z","iopub.status.idle":"2023-03-20T09:19:51.403572Z","shell.execute_reply.started":"2023-03-20T09:19:51.392183Z","shell.execute_reply":"2023-03-20T09:19:51.402394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play second extracted signal\nAudio(data=signal_abe_1, rate=sr_abe)","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.405516Z","iopub.execute_input":"2023-03-20T09:19:51.406396Z","iopub.status.idle":"2023-03-20T09:19:51.418465Z","shell.execute_reply.started":"2023-03-20T09:19:51.406350Z","shell.execute_reply":"2023-03-20T09:19:51.417099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot first  extracted signal\ntime = np.arange(0,len(signal_abe))/sr_abe\nplt.plot(time,signal_abe)\nplt.title(\"signal_abe\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.420515Z","iopub.execute_input":"2023-03-20T09:19:51.421440Z","iopub.status.idle":"2023-03-20T09:19:51.707347Z","shell.execute_reply.started":"2023-03-20T09:19:51.421394Z","shell.execute_reply":"2023-03-20T09:19:51.706054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot second  extracted signal\ntime = np.arange(0,len(signal_abe_1))/sr_abe\nplt.plot(time,signal_abe_1)\nplt.title(\"signal_abe_1\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:51.708929Z","iopub.execute_input":"2023-03-20T09:19:51.709426Z","iopub.status.idle":"2023-03-20T09:19:52.021754Z","shell.execute_reply.started":"2023-03-20T09:19:51.709378Z","shell.execute_reply":"2023-03-20T09:19:52.020300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate Spectrogram for first extracted signal of audio_abe\nf, t, Sxx = spectrogram(signal_abe, fs=sr_abe,scaling = 'spectrum')\nplt.pcolormesh(t, f, Sxx, shading='gouraud')\nplt.ylabel('Frequency [Hz]')\nplt.xlabel('Time [sec]')\nplt.ylim(1000,3000)\nplt.title(\"Spectrogram of first extracted bird call signal for audio_abe\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:52.023352Z","iopub.execute_input":"2023-03-20T09:19:52.023694Z","iopub.status.idle":"2023-03-20T09:19:52.383614Z","shell.execute_reply.started":"2023-03-20T09:19:52.023661Z","shell.execute_reply":"2023-03-20T09:19:52.382275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate Spectrogram for second extracted signal of audio_abe\nf, t, Sxx = spectrogram(signal_abe_1, fs=sr_abe,scaling = 'spectrum')\nplt.pcolormesh(t, f, Sxx, shading='gouraud')\nplt.ylabel('Frequency [Hz]')\nplt.xlabel('Time [sec]')\nplt.ylim(1000,3000)\nplt.title(\"Spectrogram of second extracted bird call signal for audio_abe\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:52.384902Z","iopub.execute_input":"2023-03-20T09:19:52.385281Z","iopub.status.idle":"2023-03-20T09:19:52.737602Z","shell.execute_reply.started":"2023-03-20T09:19:52.385245Z","shell.execute_reply":"2023-03-20T09:19:52.736384Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Same processing for audio_abh\np_abh = np.percentile(np.abs(audio_abh), percentile_of_values_at_which_noise_floor_ends)\npeaks, _ = find_peaks(audio_abh, height=p_abh,distance=min_distance_between_subsequent_peaks_in_seconds*sr_abh)\ntime = np.arange(0,len(audio_abh))/sr_abh\nplt.plot(time,audio_abh)\nplt.plot(peaks/sr_abh, audio_abh[peaks], \"x\")\n# plt.plot(np.zeros_like(audio_abe), \"--\", color=\"gray\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:52.739234Z","iopub.execute_input":"2023-03-20T09:19:52.739719Z","iopub.status.idle":"2023-03-20T09:19:53.109941Z","shell.execute_reply.started":"2023-03-20T09:19:52.739670Z","shell.execute_reply":"2023-03-20T09:19:53.108570Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"signals_abh = extract_signals(peaks=peaks,\n                              window_in_seconds=window_in_seconds,\n                              sr=sr_abh,\n                              audio_arr=audio_abh)\n# Get the first signal sample\nsignal_abh = signals_abh[0]\n\n# Get second extracted signal sample\nsignal_abh_1 = signals_abh[1]","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:53.111932Z","iopub.execute_input":"2023-03-20T09:19:53.112446Z","iopub.status.idle":"2023-03-20T09:19:53.120834Z","shell.execute_reply.started":"2023-03-20T09:19:53.112396Z","shell.execute_reply":"2023-03-20T09:19:53.119238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sf.write('signal_abh_peak_extraction.ogg', signal_abh, sr_abh, format='ogg', subtype='vorbis')\nsignal_abh, sr_signal_abh = librosa.load(\"/kaggle/working/signal_abh_peak_extraction.ogg\")\n\n\nsf.write('signal_abh_1_peak_extraction.ogg', signal_abh_1, sr_abh, format='ogg', subtype='vorbis')\nsignal_abh_1, sr_signal_abh_1 = librosa.load(\"/kaggle/working/signal_abh_1_peak_extraction.ogg\")\n","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:53.123201Z","iopub.execute_input":"2023-03-20T09:19:53.123712Z","iopub.status.idle":"2023-03-20T09:19:53.182453Z","shell.execute_reply.started":"2023-03-20T09:19:53.123660Z","shell.execute_reply":"2023-03-20T09:19:53.180943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play first extracted signal\nAudio(data=signal_abh, rate=sr_abh)","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:53.184385Z","iopub.execute_input":"2023-03-20T09:19:53.184818Z","iopub.status.idle":"2023-03-20T09:19:53.198981Z","shell.execute_reply.started":"2023-03-20T09:19:53.184780Z","shell.execute_reply":"2023-03-20T09:19:53.198001Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play first extracted signal\nAudio(data=signal_abh_1, rate=sr_abh)","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:19:53.200801Z","iopub.execute_input":"2023-03-20T09:19:53.201974Z","iopub.status.idle":"2023-03-20T09:19:53.212870Z","shell.execute_reply.started":"2023-03-20T09:19:53.201919Z","shell.execute_reply":"2023-03-20T09:19:53.211447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot first  extracted signal for audio_abh\ntime = np.arange(0,len(signal_abh))/sr_abh\nplt.plot(time,signal_abh)\nplt.title(\"signal_abh\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:23:01.785494Z","iopub.execute_input":"2023-03-20T09:23:01.785936Z","iopub.status.idle":"2023-03-20T09:23:02.029539Z","shell.execute_reply.started":"2023-03-20T09:23:01.785902Z","shell.execute_reply":"2023-03-20T09:23:02.028292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot second  extracted signal for audio_abh\ntime = np.arange(0,len(signal_abh_1))/sr_abh\nplt.plot(time,signal_abh_1)\nplt.title(\"signal_abh_1\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:23:35.465048Z","iopub.execute_input":"2023-03-20T09:23:35.465520Z","iopub.status.idle":"2023-03-20T09:23:35.656335Z","shell.execute_reply.started":"2023-03-20T09:23:35.465482Z","shell.execute_reply":"2023-03-20T09:23:35.655314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate Spectrogram for first extracted signal of audio_abh\nf, t, Sxx = spectrogram(signal_abh, fs=sr_abh,scaling = 'spectrum')\nplt.pcolormesh(t, f, Sxx, shading='gouraud')\nplt.ylabel('Frequency [Hz]')\nplt.xlabel('Time [sec]')\nplt.ylim(1000,3000)\nplt.title(\"Spectrogram of second extracted bird call signal for audio_abh\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:24:45.775337Z","iopub.execute_input":"2023-03-20T09:24:45.775757Z","iopub.status.idle":"2023-03-20T09:24:46.055284Z","shell.execute_reply.started":"2023-03-20T09:24:45.775722Z","shell.execute_reply":"2023-03-20T09:24:46.054178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate Spectrogram for second extracted signal of audio_abh\nf, t, Sxx = spectrogram(signal_abh_1, fs=sr_abh,scaling = 'spectrum')\nplt.pcolormesh(t, f, Sxx, shading='gouraud')\nplt.ylabel('Frequency [Hz]')\nplt.xlabel('Time [sec]')\nplt.ylim(1000,3000)\nplt.title(\"Spectrogram of second extracted bird call signal for audio_abh_1\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-20T09:25:11.647588Z","iopub.execute_input":"2023-03-20T09:25:11.648024Z","iopub.status.idle":"2023-03-20T09:25:11.936571Z","shell.execute_reply.started":"2023-03-20T09:25:11.647989Z","shell.execute_reply":"2023-03-20T09:25:11.935568Z"},"trusted":true},"execution_count":null,"outputs":[]}]}