{"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":"markdown","source":"# Importing Libraries","metadata":{}},{"cell_type":"code","source":"import os\nimport math\nimport librosa\nimport statistics\nimport librosa.display\nimport pandas as pd\nimport numpy as np\nimport IPython.display as ipd\nimport matplotlib.pyplot as plt\nfrom IPython.display import Image\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.ensemble import RandomForestClassifier","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# initializing constants\nFRAME_SIZE=1024\nHOP_LENGTH=512\naudio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nipd.Audio(audio_path)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Extraction","metadata":{}},{"cell_type":"markdown","source":"# Time Domain Features","metadata":{}},{"cell_type":"markdown","source":"# Time Domain Feature Extraction Pipeline","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/time_domain_pipeline.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate AE for each frame\ndef amp_env(signal,frame_size,hop_length):\n    return np.array([max(signal[i:i+frame_size]) for i in range(0,len(signal),hop_length)])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Amplitude Envelope","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/amp_env.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate AE for each frame\ndef amp_env(signal,frame_size,hop_length):\n    return np.array([max(signal[i:i+frame_size]) for i in range(0,len(signal),hop_length)])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nsignal , sr = librosa.load(audio_path)\nae_signal=amp_env(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(ae_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,ae_signal,color=\"r\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Root Mean Square Energy","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/rmse.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate RMSE for each frame\ndef rmse(signal,frame_size,hop_length):\n    return np.array(librosa.feature.rms(signal,frame_length=frame_size,hop_length=hop_length)[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nsignal , sr = librosa.load(audio_path)\nrmse_signal=rmse(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(rmse_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,rmse_signal,color=\"g\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Zero Crossing Rate","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/zcr.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate ZCR for each frame\ndef zcr(signal,frame_size,hop_length):\n    return np.array(librosa.feature.zero_crossing_rate(signal,frame_length=frame_size,hop_length=hop_length)[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nsignal , sr = librosa.load(audio_path)\nzcr_signal=zcr(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(zcr_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,zcr_signal,color=\"b\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#  Visualization","metadata":{}},{"cell_type":"code","source":"audio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nsignal , sr = librosa.load(audio_path)\nplt.figure(figsize=(15,30))\n# original signal\nori_signal=signal\nframes=range(len(ori_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nplt.subplot(4,1,1)\nlibrosa.display.waveplot(signal)\nplt.plot(t,ori_signal,color=\"black\")\nplt.title(\"Original Audio Signal\")\n        \n# plot AE for the signal\nplt.subplot(4,1,2)\nae_signal=amp_env(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(ae_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,ae_signal,color=\"r\")\nplt.title(\"AE Audio Signal\")\n        \n# plot RMSE for the signal\nplt.subplot(4,1,3)\nrmse_signal=rmse(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(rmse_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,rmse_signal,color=\"g\")\nplt.title(\"RMSE Audio Signal\")\n        \n# plot ZCR for the signal\nplt.subplot(4,1,4)\nzcr_signal=zcr(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(zcr_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,zcr_signal,color=\"b\")\nplt.title(\"ZCR Audio Signal\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Frequency Domain Features","metadata":{}},{"cell_type":"markdown","source":"# Frequency Domain Feature Extraction Pipeline","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/frequency_domain_pipeline.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extract spectrograms","metadata":{}},{"cell_type":"code","source":"audio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nsignal , sr = librosa.load(audio_path)\n# Short Fourier Transform\nsignal_stft = librosa.stft(signal, n_fft=FRAME_SIZE, hop_length=HOP_LENGTH)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Band Energy Ratio","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/ber.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def calculate_split_frequency_bin(split_frequency, sample_rate, num_frequency_bins):\n    #Infer the frequency bin associated to a given split frequency\n    frequency_range = sample_rate / 2\n    frequency_delta_per_bin = frequency_range / num_frequency_bins\n    split_frequency_bin = math.floor(split_frequency / frequency_delta_per_bin)\n    return int(split_frequency_bin)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"split_frequency_bin = calculate_split_frequency_bin(2000, 22050, 1025)\nsplit_frequency_bin","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate BER for each frame\ndef ber(spectrogram, split_frequency, sample_rate):\n    #Calculate band energy ratio with a given split frequency\n    split_frequency_bin = calculate_split_frequency_bin(split_frequency, sample_rate, len(spectrogram[0]))\n    band_energy_ratio = []\n    # calculate power spectrogram\n    power_spectrogram = np.abs(spectrogram) ** 2\n    power_spectrogram = power_spectrogram.T\n    # calculate BER value for each frame\n    for frame in power_spectrogram:\n        sum_power_low_frequencies = frame[:split_frequency_bin].sum()\n        sum_power_high_frequencies = frame[split_frequency_bin:].sum()\n        band_energy_ratio_current_frame = sum_power_low_frequencies / sum_power_high_frequencies\n        band_energy_ratio.append(band_energy_ratio_current_frame)\n    return np.array(band_energy_ratio)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ber_signal= ber(signal_stft, 2000, sr)\nframes = range(len(ber_signal))\nt = librosa.frames_to_time(frames, hop_length=HOP_LENGTH)\nplt.plot(t, ber_signal, color=\"r\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Spectral Centroid","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/sc.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate SC for each frame\ndef sc(signal,framesize,hoplength):\n    return np.array(librosa.feature.spectral_centroid(y=signal, sr=sr, n_fft=framesize, hop_length=hoplength)[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sc_signal=sc(signal,FRAME_SIZE,HOP_LENGTH)\nframes = range(len(sc_signal))\nt = librosa.frames_to_time(frames, hop_length=HOP_LENGTH)\nplt.plot(t, sc_signal, color='g')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Spectral Bandwidth","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/sb.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate SB for each frame\ndef sb(signal,framesize,hoplength):\n    return np.array(librosa.feature.spectral_bandwidth(y=signal, sr=sr, n_fft=framesize, hop_length=hoplength)[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sb_signal=sb(signal,FRAME_SIZE,HOP_LENGTH)\nframes = range(len(sb_signal))\nt = librosa.frames_to_time(frames, hop_length=HOP_LENGTH)\nplt.plot(t, sb_signal, color='b')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mel Frequency Cepstral Coefficients","metadata":{}},{"cell_type":"code","source":"Image(\"../input/pictures/mfcc.PNG\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#function to calculate MFCC for each frame\ndef mfcc(signal,sample_rate,hoplength):\n    return np.array(librosa.feature.mfcc(y=signal, n_mfcc=hoplength, sr=sample_rate))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"librosa.display.specshow(mfcc(signal,sr,HOP_LENGTH), x_axis=\"time\", sr=sr)\nplt.colorbar(format=\"%+2.f\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualization","metadata":{}},{"cell_type":"code","source":"audio_path = '../input/birdclef-2021/train_short_audio/acafly/XC109605.ogg'\nsignal , sr = librosa.load(audio_path)\nplt.figure(figsize=(15,30))\n# original signal\nori_signal=signal\nframes=range(len(ori_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nplt.subplot(5,1,1)\nlibrosa.display.waveplot(signal)\nplt.plot(t,ori_signal,color=\"black\")\nplt.title(\"Original Audio Signal\")\n        \n# plot BER for the signal\nplt.subplot(5,1,2)\nber_signal= ber(signal_stft, 2000, sr)\nframes=range(len(ae_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,ber_signal,color=\"r\")\nplt.title(\"BER Audio Signal\")\n        \n# plot SC for the signal\nplt.subplot(5,1,3)\nsc_signal=sc(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(sc_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,sc_signal,color=\"g\")\nplt.title(\"SC Audio Signal\")\n        \n# plot SB for the signal\nplt.subplot(5,1,4)\nsb_signal=sb(signal,FRAME_SIZE,HOP_LENGTH)\nframes=range(len(zcr_signal))\nt=librosa.frames_to_time(frames,hop_length=HOP_LENGTH)\nlibrosa.display.waveplot(signal)\nplt.plot(t,sb_signal,color=\"b\")\nplt.title(\"SB Audio Signal\")\n\n# plot MFCC for the signal\nplt.subplot(5,1,5)\nlibrosa.display.specshow(mfcc(signal,sr,HOP_LENGTH), x_axis=\"time\", sr=sr)\nplt.colorbar(format=\"%+2.f\")\nplt.title(\"MFCC Audio Signal\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Final Feature Extraction from all Audio files","metadata":{}},{"cell_type":"code","source":"df=pd.DataFrame()\ndf['filename']=''\ndf['AE']=''\ndf['RMSE']=''\ndf['ZCR']=''\ndf['BER']=''\ndf['SC']=''\ndf['SB']=''\ndf['MFCC']=''","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''directory= r'../input/birdclef-2021/train_short_audio'\nfor root, subdirectories, files in os.walk(directory):\n    for subdirectory in subdirectories:\n        folder=os.path.join(root, subdirectory)\n        print(folder)\n        parent_list = os.listdir(folder)\n        count =0\n        for child in parent_list:\n            if count < 5:\n                print(child+\" \"+str(count))\n                audio_path=folder+\"/\"+child\n                signal , sr = librosa.load(audio_path)\n                signal_stft = librosa.stft(signal, n_fft=FRAME_SIZE, hop_length=HOP_LENGTH)\n                # AE for the signal\n                ae_signal=amp_env(signal,FRAME_SIZE,HOP_LENGTH)\n                # Feature Aggregation of AE\n                agg_ae=statistics.mean(ae_signal)\n                # RMSE for the signal\n                rmse_signal=rmse(signal,FRAME_SIZE,HOP_LENGTH)\n                # Feature Aggregation of RMSE\n                agg_rmse=statistics.mean(rmse_signal)\n                # ZCR for the signal\n                zcr_signal=zcr(signal,FRAME_SIZE,HOP_LENGTH)\n                # Feature Aggregation of ZCR\n                agg_zcr=statistics.mean(zcr_signal)\n                # BER for the signal\n                ber_signal=ber(signal_stft, 2000, sr)\n                # Feature Aggregation of BER\n                agg_ber=statistics.mean(ber_signal)\n                # SC for the signal\n                sc_signal=sc(signal,FRAME_SIZE,HOP_LENGTH)\n                # Feature Aggregation of SC\n                agg_sc=statistics.mean(sc_signal)\n                # SB for the signal\n                sb_signal=sb(signal,FRAME_SIZE,HOP_LENGTH)\n                # Feature Aggregation of SB\n                agg_sb=statistics.mean(sb_signal)\n                # MFCC for the signal\n                mfcc_signal=mfcc(signal,sr,HOP_LENGTH)[1]\n                # Feature Aggregation of MFCC\n                agg_mfcc=statistics.mean(mfcc_signal)\n                df2 = {'filename':filename, 'AE': agg_ae, 'RMSE': agg_rmse, 'ZCR': agg_zcr  , 'BER': agg_ber, 'SC': agg_sc, 'SB': agg_sb , 'MFCC': agg_mfcc}\n                df = df.append(df2, ignore_index = True)\n            else:\n                break\n            count = count+1'''","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata=pd.read_csv(\"../input/birdclef-2021/train_metadata.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}