{"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":"# 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))","metadata":{}},{"cell_type":"code","source":"!pip install noisereduce","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2021-06-28T10:31:21.462332Z","iopub.execute_input":"2021-06-28T10:31:21.462799Z","iopub.status.idle":"2021-06-28T10:31:30.871932Z","shell.execute_reply.started":"2021-06-28T10:31:21.462756Z","shell.execute_reply":"2021-06-28T10:31:30.871041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### import libraly","metadata":{}},{"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","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2021-06-28T10:31:30.873854Z","iopub.execute_input":"2021-06-28T10:31:30.874255Z","iopub.status.idle":"2021-06-28T10:31:32.709761Z","shell.execute_reply.started":"2021-06-28T10:31:30.874225Z","shell.execute_reply":"2021-06-28T10:31:32.707194Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Constants","metadata":{}},{"cell_type":"code","source":"INPUT = \"../input/birdsong-recognition/\"\nSEED = 20200807","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:32.715206Z","iopub.execute_input":"2021-06-28T10:31:32.715562Z","iopub.status.idle":"2021-06-28T10:31:32.720146Z","shell.execute_reply.started":"2021-06-28T10:31:32.715526Z","shell.execute_reply":"2021-06-28T10:31:32.719160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Utils","metadata":{}},{"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","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:32.723625Z","iopub.execute_input":"2021-06-28T10:31:32.724007Z","iopub.status.idle":"2021-06-28T10:31:32.734826Z","shell.execute_reply.started":"2021-06-28T10:31:32.723970Z","shell.execute_reply":"2021-06-28T10:31:32.733944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Denoise\n\nload path","metadata":{}},{"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)","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:32.736203Z","iopub.execute_input":"2021-06-28T10:31:32.736711Z","iopub.status.idle":"2021-06-28T10:31:40.382835Z","shell.execute_reply.started":"2021-06-28T10:31:32.736648Z","shell.execute_reply":"2021-06-28T10:31:40.381940Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"sampling and load audio data","metadata":{}},{"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)","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:40.384156Z","iopub.execute_input":"2021-06-28T10:31:40.384484Z","iopub.status.idle":"2021-06-28T10:31:42.446832Z","shell.execute_reply.started":"2021-06-28T10:31:40.384447Z","shell.execute_reply":"2021-06-28T10:31:42.445764Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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)!)","metadata":{}},{"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')","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:42.448162Z","iopub.execute_input":"2021-06-28T10:31:42.448492Z","iopub.status.idle":"2021-06-28T10:31:44.173380Z","shell.execute_reply.started":"2021-06-28T10:31:42.448457Z","shell.execute_reply":"2021-06-28T10:31:44.172492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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","metadata":{}},{"cell_type":"code","source":"x_denoise = nr.reduce_noise(audio_clip=x, noise_clip=x[np.logical_not(mask)], verbose=True)","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:44.174653Z","iopub.execute_input":"2021-06-28T10:31:44.175136Z","iopub.status.idle":"2021-06-28T10:31:46.764268Z","shell.execute_reply.started":"2021-06-28T10:31:44.175098Z","shell.execute_reply":"2021-06-28T10:31:46.763334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(x_denoise)","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:46.765996Z","iopub.execute_input":"2021-06-28T10:31:46.766382Z","iopub.status.idle":"2021-06-28T10:31:46.941383Z","shell.execute_reply.started":"2021-06-28T10:31:46.766342Z","shell.execute_reply":"2021-06-28T10:31:46.940424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"compare spectrogram","metadata":{}},{"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()","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:46.942663Z","iopub.execute_input":"2021-06-28T10:31:46.943034Z","iopub.status.idle":"2021-06-28T10:31:47.370789Z","shell.execute_reply.started":"2021-06-28T10:31:46.942996Z","shell.execute_reply":"2021-06-28T10:31:47.369721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"sompare audio","metadata":{}},{"cell_type":"code","source":"IPython.display.Audio(data=x, rate=sr)","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:47.372353Z","iopub.execute_input":"2021-06-28T10:31:47.372716Z","iopub.status.idle":"2021-06-28T10:31:47.414894Z","shell.execute_reply.started":"2021-06-28T10:31:47.372670Z","shell.execute_reply":"2021-06-28T10:31:47.409541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IPython.display.Audio(data=x_denoise, rate=sr)","metadata":{"execution":{"iopub.status.busy":"2021-06-28T10:31:47.416664Z","iopub.execute_input":"2021-06-28T10:31:47.417036Z","iopub.status.idle":"2021-06-28T10:31:47.466751Z","shell.execute_reply.started":"2021-06-28T10:31:47.416998Z","shell.execute_reply":"2021-06-28T10:31:47.465839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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.","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}