{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Birdcall noise reduction\n\n\nI show [this discussion](https://www.kaggle.com/c/birdsong-recognition/discussion/169582#946072).  \nI try to remove noise by using Sound Envelope.\n\nversion 3:\n- I use scipy.ndimage.maximum_filter1d instead of pandas.rolling (ref. [this discussion](https://www.kaggle.com/c/birdsong-recognition/discussion/172921#962037))","execution_count":null},{"metadata":{"_kg_hide-output":true,"trusted":true},"cell_type":"code","source":"!pip install noisereduce","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### import libraly","execution_count":null},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import librosa\nimport random\nimport IPython\n\nimport numpy as np\nimport pandas as pd\nimport noisereduce as nr\n\nfrom pathlib import Path\nfrom matplotlib import pyplot as plt\nfrom scipy.ndimage import maximum_filter1d","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Constants","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"INPUT = \"../input/birdsong-recognition/\"\nSEED = 20200807","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Utils","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def audio_to_spec(audio, sr):\n    spec = librosa.power_to_db(\n        librosa.feature.melspectrogram(audio, sr=sr, fmin=20, fmax=16000, n_mels=128)\n    )\n    return spec.astype(np.float32)\n\ndef envelope(y, rate, threshold):\n    mask = []\n    y_mean = maximum_filter1d(np.abs(y), mode=\"constant\", size=rate//20)\n    for mean in y_mean:\n        if mean > threshold:\n            mask.append(True)\n        else:\n            mask.append(False)\n    return mask, y_mean","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Denoise\n\nload path","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"path_lst = []\nfor directory in Path(f\"{INPUT}/train_audio\").iterdir():\n    path_lst += [path for path in Path(directory).iterdir()]\n    \n\ntrain_df = pd.read_csv(f\"{INPUT}/train.csv\")\ntrain_df.head(1)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"sampling and load audio data","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"random.seed(SEED)\npath = random.sample(path_lst, 1)[0]\ndisplay(train_df.query(f\"filename=='{path.name}'\")[[\"rating\", \"ebird_code\"]])\n\nx, sr = librosa.load(path=path, mono=True)\nprint(\"sampling rate:\", sr)\nplt.plot(x)\nplt.show()\n\nIPython.display.Audio(data=x, rate=sr)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"I detect point no birdcall by using *Sound Envelope*.\n\n\nI reffered [this notebook](https://www.kaggle.com/jainarindam/imp-remove-background-dead-noise) and [this discussion](https://www.kaggle.com/c/birdsong-recognition/discussion/169582). (Thank you [Arindam](https://www.kaggle.com/jainarindam)!)","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"thr = 0.25\nmask, env = envelope(x, sr, thr)\n\nplt.plot(x[mask], label=\"birdcall\")\nplt.plot(x[np.logical_not(mask)], label=\"noise\")\nplt.legend(bbox_to_anchor=(1, 1), loc='upper right')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"noise reduction using spectral gating in python\n\nI show [this discussion](https://www.kaggle.com/c/birdsong-recognition/discussion/169582#946072), and I use [this library](https://pypi.org/project/noisereduce/).  \n*audio_clip* is pure audio data and *noise_clip* is low level of sound from Sound Envelope.\n\n","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"x_denoise = nr.reduce_noise(audio_clip=x, noise_clip=x[np.logical_not(mask)], verbose=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(x_denoise)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"compare spectrogram","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.figure(figsize=(16, 8))\nplt.imshow(audio_to_spec(x, sr))\nplt.show()\n\nplt.figure(figsize=(16, 8))\nplt.imshow(audio_to_spec(x_denoise, sr))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"sompare audio","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"IPython.display.Audio(data=x, rate=sr)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IPython.display.Audio(data=x_denoise, rate=sr)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"It seems that noise has been removed.\n\nI have made dataset of deonise audio spectrogram image. ([here](https://www.kaggle.com/takamichitoda/birdcall-spectrogram-images/activity))\n\nI train model by use this dataset, I got local fold-0 0.6319398546 and LB 0.543.","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}