{"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":"# About\n\n- Visualize some mel spectrograms\n- Try noise reduce and check sample audio and its mel spec","metadata":{}},{"cell_type":"markdown","source":"# Imports","metadata":{}},{"cell_type":"code","source":"! pip install noisereduce -qq","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-03-10T14:26:12.933096Z","iopub.execute_input":"2023-03-10T14:26:12.933457Z","iopub.status.idle":"2023-03-10T14:26:44.916792Z","shell.execute_reply.started":"2023-03-10T14:26:12.933427Z","shell.execute_reply":"2023-03-10T14:26:44.915640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# basics\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n# import math\nfrom tqdm import tqdm\nimport os\n\n# audio\nimport librosa\nimport IPython.display as ipd\nimport noisereduce as nr","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-10T14:26:44.918745Z","iopub.execute_input":"2023-03-10T14:26:44.920236Z","iopub.status.idle":"2023-03-10T14:26:45.481557Z","shell.execute_reply.started":"2023-03-10T14:26:44.920183Z","shell.execute_reply":"2023-03-10T14:26:45.480662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Read","metadata":{}},{"cell_type":"code","source":"train_audio = '/kaggle/input/birdclef-2023/train_audio/'","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.482635Z","iopub.execute_input":"2023-03-10T14:26:45.483298Z","iopub.status.idle":"2023-03-10T14:26:45.488241Z","shell.execute_reply.started":"2023-03-10T14:26:45.483264Z","shell.execute_reply":"2023-03-10T14:26:45.487487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_path = '/kaggle/input/birdclef-2023/train_metadata.csv'\n\ntrain = pd.read_csv(train_path)\ntrain","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.492444Z","iopub.execute_input":"2023-03-10T14:26:45.493675Z","iopub.status.idle":"2023-03-10T14:26:45.660192Z","shell.execute_reply.started":"2023-03-10T14:26:45.493580Z","shell.execute_reply":"2023-03-10T14:26:45.659184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CFG","metadata":{}},{"cell_type":"code","source":"class CFG:\n\n  period = 5\n  sample_rate = 32000\n  n_fft = 2048\n  hop_length = 512\n  fmin = 20\n  fmax = 16000\n\n  IMG_HEIGHT = 224\n  IMG_WIDTH = 313\n  IMG_CHANNELS = 3","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.661253Z","iopub.execute_input":"2023-03-10T14:26:45.662273Z","iopub.status.idle":"2023-03-10T14:26:45.668295Z","shell.execute_reply.started":"2023-03-10T14:26:45.662214Z","shell.execute_reply":"2023-03-10T14:26:45.666792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AudioParams:\n    \"\"\"\n    Parameters used for the audio data\n    \"\"\"\n    sr = CFG.sample_rate\n    duration = CFG.period\n\n    # Melspectrogram\n    n_mels = CFG.IMG_HEIGHT\n    fmin = CFG.fmin\n    fmax = CFG.fmax","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.669870Z","iopub.execute_input":"2023-03-10T14:26:45.670314Z","iopub.status.idle":"2023-03-10T14:26:45.680640Z","shell.execute_reply.started":"2023-03-10T14:26:45.670288Z","shell.execute_reply":"2023-03-10T14:26:45.679294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"scored_birds = [i.split('/')[-1] for i in os.listdir(train_audio)]\nn_classes = len(scored_birds)\nn_classes","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.682264Z","iopub.execute_input":"2023-03-10T14:26:45.682545Z","iopub.status.idle":"2023-03-10T14:26:45.730287Z","shell.execute_reply.started":"2023-03-10T14:26:45.682520Z","shell.execute_reply":"2023-03-10T14:26:45.728933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Mel spec","metadata":{}},{"cell_type":"code","source":"def compute_melspec(y, params):\n    \"\"\"\n    Computes a mel-spectrogram and puts it at decibel scale\n    Arguments:\n        y {np array} -- signal\n        params {AudioParams} -- Parameters to use for the spectrogram. Expected to have the attributes sr, n_mels, f_min, f_max\n    Returns:\n        np array -- Mel-spectrogram\n    \"\"\"\n    melspec = librosa.feature.melspectrogram(\n        y=y, sr=params.sr, n_mels=params.n_mels, fmin=params.fmin, fmax=params.fmax,\n    )\n\n    melspec = librosa.power_to_db(melspec).astype(np.float32)\n    return melspec\n\n\ndef crop_or_pad(y, length, sr, train=True, probs=None):\n    \"\"\"\n    Crops an array to a chosen length\n    Arguments:\n        y {1D np array} -- Array to crop\n        length {int} -- Length of the crop\n        sr {int} -- Sampling rate\n    Keyword Arguments:\n        train {bool} -- Whether we are at train time. If so, crop randomly, else return the beginning of y (default: {True})\n        probs {None or numpy array} -- Probabilities to use to chose where to crop (default: {None})\n    Returns:\n        1D np array -- Cropped array\n    \"\"\"\n    if len(y) <= length:\n        y = np.concatenate([y, np.zeros(length - len(y))])\n    else:\n        if not train:\n            start = 0\n        elif probs is None:\n            start = np.random.randint(len(y) - length)\n        else:\n            start = (\n                    np.random.choice(np.arange(len(probs)), p=probs) + np.random.random()\n            )\n            start = int(sr * (start))\n\n        y = y[start: start + length]\n\n    return y.astype(np.float32)","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.732174Z","iopub.execute_input":"2023-03-10T14:26:45.732505Z","iopub.status.idle":"2023-03-10T14:26:45.741984Z","shell.execute_reply.started":"2023-03-10T14:26:45.732479Z","shell.execute_reply":"2023-03-10T14:26:45.740134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize MelSpecs","metadata":{}},{"cell_type":"code","source":"list_birds_to_visualize = list(pd.Series(scored_birds).sample(10, random_state=8))\nlist_birds_to_visualize","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:26:45.743339Z","iopub.execute_input":"2023-03-10T14:26:45.743620Z","iopub.status.idle":"2023-03-10T14:26:45.769559Z","shell.execute_reply.started":"2023-03-10T14:26:45.743593Z","shell.execute_reply":"2023-03-10T14:26:45.768142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_slice = train.copy()\n\ntrain_slice = train_slice[train_slice['primary_label'].isin(list_birds_to_visualize)].reset_index()\n\nnrows = train_slice.primary_label.nunique()\nncols = 4 # 5\nfig, axs = plt.subplots(nrows, ncols, figsize=(30, 2*30))\n\nn = -1\n\nfor i in tqdm(train_slice.primary_label.unique()):\n\n  n = n + 1\n  df = train_slice.loc[train_slice['primary_label'] == i, :].reset_index()[0:ncols]\n\n  for j in range(0, len(df)):\n\n    path = train_audio + df.loc[j, 'filename']\n    plabel = str(df.loc[j, 'primary_label'])\n    label = str(df.loc[j, 'primary_label']) + ' ' + str(df.loc[j, 'secondary_labels'] + '\\n' + str(df.loc[j, 'filename']))\n\n    y, sample_rate = librosa.load(path)\n        \n    y = crop_or_pad(y, CFG.period * CFG.sample_rate, sr=CFG.sample_rate, train=True, probs=None)\n    image = compute_melspec(y, AudioParams)\n    image = image.astype(np.uint8)\n\n    axs[n, j].set_title(label, color='red', fontsize=18)\n    axs[n, j].imshow(np.squeeze(image), cmap='magma')","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:44:17.781405Z","iopub.execute_input":"2023-03-10T14:44:17.781887Z","iopub.status.idle":"2023-03-10T14:44:28.316352Z","shell.execute_reply.started":"2023-03-10T14:44:17.781854Z","shell.execute_reply":"2023-03-10T14:44:28.315564Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Noise reduction\n\n- Here we will visualize a species' spectrogram before and after noise reduce is applied\n- We can also listen to the audio before and after this transformation","metadata":{}},{"cell_type":"code","source":"def plot_mels(start = 6, end = 10, bird = 'hadibi1', noise_reduce = False):\n    \n    # choose bird to visualize\n    train_selection = train[train['primary_label'] == bird].reset_index()\n    print('N samples from this bird: ', len(train_selection), '\\n')\n\n    fig, axs = plt.subplots(1, end - start, figsize=(16, 5))\n    \n    for i in range(start, end):\n        n = int(i  - start)\n\n        path = train_audio + train_selection.loc[i, 'filename']\n        label = str(train_selection.loc[i, 'primary_label']) + ' ' + str(train_selection.loc[i, 'secondary_labels']) + '\\n' + train_selection.loc[i, 'filename']\n\n        y, sample_rate = librosa.load(path)\n        \n        if noise_reduce:\n            y = nr.reduce_noise(y=y, sr=sample_rate, use_tqdm=False) # noise reduction\n\n        y = crop_or_pad(y, CFG.period * CFG.sample_rate, sr=CFG.sample_rate, train=True, probs=None)\n        image = compute_melspec(y, AudioParams)\n        image = image.astype(np.uint8)\n\n        axs[n].set_title(label, color='red', fontsize=12)\n        axs[n].imshow(np.squeeze(image), cmap='magma');\n        # axs[n].axis('off')\n        \n    print(train_selection.loc[i, 'filename'])\n    display(ipd.Audio(y, rate=32000)) # listen to the last sample\n\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:45:14.763227Z","iopub.execute_input":"2023-03-10T14:45:14.763566Z","iopub.status.idle":"2023-03-10T14:45:14.777035Z","shell.execute_reply.started":"2023-03-10T14:45:14.763539Z","shell.execute_reply":"2023-03-10T14:45:14.775003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_mels(3, 8, 'yebapa1', False)\nplot_mels(3, 8, 'yebapa1', True)","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:45:16.863506Z","iopub.execute_input":"2023-03-10T14:45:16.863961Z","iopub.status.idle":"2023-03-10T14:45:19.790282Z","shell.execute_reply.started":"2023-03-10T14:45:16.863931Z","shell.execute_reply":"2023-03-10T14:45:19.788839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_mels(10, 14, 'whbwhe3', False)\nplot_mels(10, 14, 'whbwhe3', True)","metadata":{"execution":{"iopub.status.busy":"2023-03-10T14:27:11.915356Z","iopub.execute_input":"2023-03-10T14:27:11.915606Z","iopub.status.idle":"2023-03-10T14:27:16.751627Z","shell.execute_reply.started":"2023-03-10T14:27:11.915581Z","shell.execute_reply":"2023-03-10T14:27:16.749924Z"},"trusted":true},"execution_count":null,"outputs":[]}]}