{"cells":[{"metadata":{},"cell_type":"markdown","source":"### Simple Spectogram ","execution_count":null},{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport os,glob,re,math\n#from pathlib import Path\n\n#from tqdm import tqdm_notebook as tqdm\nimport cv2\nimport librosa\n#from itertools import islice\nimport matplotlib.pyplot as plt\n#from multiprocessing.pool import Pool\n#from sklearn.model_selection import StratifiedKFold\nimport tensorflow as tf\nfrom scipy.signal import freqz\nimport warnings\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from librosa.display import waveplot","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from scipy.signal import butter, lfilter\nfrom skimage.restoration import denoise_wavelet \nfrom scipy import signal","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ROOT_DIR = '../input/birdsong-recognition/'\nTRAIN_AUDIO = f'{ROOT_DIR}/train_audio'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"CLASS = os.listdir('../input/birdsong-recognition/train_audio')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Extended data thanks to [Vopani](https://www.kaggle.com/rohanrao)","execution_count":null},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train_audio = glob.glob('../input/birdsong-recognition/train_audio/*/*.mp3')\ntrain_audio_1 =glob.glob('../input/xeno-canto-bird-recordings-extended-a-m/A-M/*/*.mp3')\ntrain_audio_2 = glob.glob('../input/xeno-canto-bird-recordings-extended-n-z/N-Z/*/*.mp3')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('../input/birdsong-recognition/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = df[['ebird_code', 'filename', 'duration','author','country','rating']]\ndf1 = pd.read_csv('../input/xeno-canto-bird-recordings-extended-a-m/train_extended.csv')[['ebird_code', 'filename', 'duration','author','country','rating']]\ndf2 = pd.read_csv('../input/xeno-canto-bird-recordings-extended-n-z/train_extended.csv')[['ebird_code', 'filename', 'duration','author','country','rating']]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"frames = pd.concat([df,df1,df2])\n#frames = frames.loc[frames.duration <= 30]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Below two audios causing error for some reasons ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"path = train_audio + train_audio_1 + train_audio_2\npath.remove('../input/birdsong-recognition/train_audio/lotduc/XC195038.mp3')\npath.remove('../input/xeno-canto-bird-recordings-extended-a-m/A-M/houspa/XC555482.mp3')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Butter worth Bandpass filter \n\n\n[Bird song and anthropogenic noise: vocalconstraints may explain why birds singhigher-frequency songs in cities](https://royalsocietypublishing.org/doi/10.1098/rspb.2012.2798#d3e769)\n\n* The forest birds used the frequency band from 1.8 to 1.9 kHz most often (16% of all motif elements), whereas the city birds sang the highest number of elements in the range between 2.2 and 2.3 kHz. Forest males used frequencies below 2 kHz significantly more often than city birds did.\n* Also, [Wavelet Denoising](https://in.mathworks.com/help/wavelet/ug/wavelet-denoising.html) for removing noise in signal basically reconstruct a signal from a noisy one.\n\nI am using wavelet desnoising after melspectogram bit it will be better to use after filtering the signal","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"from scipy.signal import butter, lfilter\n\n#https://scipy-cookbook.readthedocs.io/items/ButterworthBandpass.html\n\ndef butter_bandpass(lowcut, highcut, fs, order=5):\n    nyq =  fs//2 # Nyquist sampling rate\n    low = lowcut/ nyq\n    high = highcut / nyq\n    b, a = butter(order, [low, high], btype='band')\n    return b, a\n\n\ndef butter_bandpass_filter(data, lowcut, highcut, fs, order=5):\n    b, a = butter_bandpass(lowcut, highcut, fs, order=order)\n    y = lfilter(b, a, data)\n    return y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def waveletDenoising(data):\n        \n    #Wavelet Denosing using scikit-image\n    \n    im_bayes = denoise_wavelet(data,)\n    \n    return im_bayes\n\ndef audio_norm(data):\n    '''Normalization of audio'''\n    max_data = np.max(data)\n    min_data = np.min(data)\n    data = (data - min_data)/(max_data - min_data + 1e-6)\n    return data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class config:\n    shape = (128,256)\n    rate = 32000\n    low_cut = 500.0 #low pass filter\n    high_cut = 15000.0 #high pass filter\n    order = 5\n    duration = 30 #sec\n    nq_rate = 0.2 * rate\n    n_fft = 4096\n    hop_len = 1024\n    n_mels = 128\n    fmin = 100.0\n    fmax = 15000.0\n    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Read Audio ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def read_audio(audio):\n    sig, rt = librosa.load(audio, duration = config.duration, mono = True,sr = config.rate,res_type='kaiser_fast')\n    \n    return sig,rt","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Create Melspec","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def mel_spec(sig, preemphasis = True, normalize = True):\n    \n        #Split an audio signal into non-silent intervals,\n        #from discussion https://www.kaggle.com/c/birdsong-recognition/discussion/167264\n        sig = librosa.effects.trim(y = sig)\n        \n        if preemphasis:\n            sig = librosa.effects.preemphasis(y=sig[0],) #coef = 0.95\n        #Librosa mel-spectrum\n        \n        HOP_LEN = len(sig) // (config.shape[1] - 1)\n        \n        melspec = librosa.feature.melspectrogram(y=sig, sr=config.rate, \n                                       hop_length = HOP_LEN,\n                                      n_mels = config.n_mels,\n                                      fmax = config.fmax, \n                                      fmin = config.fmin,center = True,\n                                      window = 'hamming')\n        \n\n        \n        melspec = librosa.power_to_db(melspec,ref=np.max,) #using default top_db = 80 sometime works better\n        \n        #melspec = librosa.core.pcen(melspec,)\n        \n        #mfcc \n        #melspec = librosa.feature.mfcc(S=s,n_mfcc = config.n_mels)\n               \n        melspec =  melspec[::-1, ...] #flip lower frequency\n        \n        melspec = melspec[:config.shape[0], :config.shape[1]] #trim to desired shape\n     \n        # Normalize values between 0 and 1\n        if normalize:\n            melspec  = audio_norm(melspec)\n    \n        return melspec.astype('float32')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def filtered(audiof):\n    sig = read_audio(audiof)[0] #read audio\n    sig_fit = butter_bandpass_filter(sig,config.low_cut, config.high_cut, config.rate, config.order)\n    return waveletDenoising(mel_spec(sig_fit))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Wave plot \nButterworth Filter","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"sig,rt = read_audio('../input/birdsong-recognition/train_audio/bkbmag1/XC114081.mp3')\n\ny = butter_bandpass_filter(sig,config.low_cut, config.high_cut, config.rate, config.order)\n\nplt.figure()\nplt.subplot(3,1,1)\nwaveplot(y=sig, sr = rt)\nplt.title('original_signal')\nplt.subplot(3,1,2)\nwaveplot(y=y, sr = rt)\nplt.title('filtered_signal')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Lets Try wavelet Denoising","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"sig,rt = read_audio(path[6969])\n\ny = waveletDenoising(butter_bandpass_filter(sig,config.low_cut, config.high_cut, config.rate, config.order))\n\nplt.figure()\nplt.subplot(3,1,1)\nwaveplot(y=sig, sr = rt)\nplt.title('original_signal')\nplt.subplot(3,1,2)\nwaveplot(y=y, sr = rt)\nplt.title('filtered_signal')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Visualsing","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# settings\nh, w = 10, 10       \nnrows, ncols = 8, 4  \nfigsize = [12, 12]  \n\n\nxs = np.linspace(0, 2*np.pi, 60)  \nys = np.abs(np.sin(xs))           \n\n\nfig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)\n\n\nfor i, axi in enumerate(ax.flat):\n    \n    img = path[i]\n    axi.imshow(filtered(img))    \n    rowid = i // ncols\n    colid = i % ncols\n    \n    axi.set_title(\"Row:\"+str(rowid)+\", Col:\"+str(colid))\n\n\nax[0][2].plot(xs, 3*ys, color='red', linewidth=3)\nax[4][3].plot(ys**2, xs, color='green', linewidth=3)\n\nplt.tight_layout(True)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### For using saving spectogram ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"img = filtered(path[10])\n#img = mono_to_color(img)\ncv2.imwrite('melspec.png', img*255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(cv2.imread('./melspec.png'))","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}