{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Noise Reduction\n", "\n", "Reduce background musics, noises and etc while maintain voice activities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This tutorial is available as an IPython notebook at [malaya-speech/example/noise-reduction](https://github.com/huseinzol05/malaya-speech/tree/master/example/noise-reduction).\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This module is language independent, so it save to use on different languages. Pretrained models trained on multilanguages.\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This is an application of malaya-speech Pipeline, read more about malaya-speech Pipeline at [malaya-speech/example/pipeline](https://github.com/huseinzol05/malaya-speech/tree/master/example/pipeline).\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dataset\n", "\n", "Trained on English, Manglish and Bahasa podcasts with augmented noises, gathered at https://github.com/huseinzol05/malaya-speech/tree/master/data/podcast" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import malaya_speech\n", "import numpy as np\n", "from malaya_speech import Pipeline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2628043, 44100, 59.59281179138322)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y, sr = malaya_speech.load('speech/podcast/SKOLAR.wav', sr = 44100)\n", "len(y), sr, len(y) / sr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So total length is 60 seconds." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import IPython.display as ipd\n", "ipd.Audio(y[:10 * sr], rate = sr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This audio extracted from https://www.youtube.com/watch?v=blaIfSWf38Q&t=25s&ab_channel=SkolarMalaysia\n", "\n", "As you can hear, the audio got introduction music overlapped with speakers. So we want to reduce that introduction music and possibly split the audio into voice and background noise." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### List available deep model" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Only calculate SDR, ISR, SAR on voice sample. Higher is better.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Size (MB)Quantized Size (MB)SUM MAEMAE_SPEAKERMAE_NOISESDRISRSAR
unet78.920.00.8623160.4606760.401649.17312013.9243513.20592
resnet-unet96.424.60.8253500.4388500.386499.45413013.9639013.60276
resnext-unet75.419.00.8110200.4471900.363838.99283213.4919413.13210
\n", "
" ], "text/plain": [ " Size (MB) Quantized Size (MB) SUM MAE MAE_SPEAKER \\\n", "unet 78.9 20.0 0.862316 0.460676 \n", "resnet-unet 96.4 24.6 0.825350 0.438850 \n", "resnext-unet 75.4 19.0 0.811020 0.447190 \n", "\n", " MAE_NOISE SDR ISR SAR \n", "unet 0.40164 9.173120 13.92435 13.20592 \n", "resnet-unet 0.38649 9.454130 13.96390 13.60276 \n", "resnext-unet 0.36383 8.992832 13.49194 13.13210 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "malaya_speech.noise_reduction.available_model()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load deep model\n", "\n", "```python\n", "def deep_model(model: str = 'resnet-unet', quantized: bool = False, **kwargs):\n", " \"\"\"\n", " Load Noise Reduction deep learning model.\n", "\n", " Parameters\n", " ----------\n", " model : str, optional (default='wavenet')\n", " Model architecture supported. Allowed values:\n", "\n", " * ``'unet'`` - pretrained UNET.\n", " * ``'resnet-unet'`` - pretrained resnet-UNET.\n", " * ``'resnext'`` - pretrained resnext-UNET.\n", " quantized : bool, optional (default=False)\n", " if True, will load 8-bit quantized model. \n", " Quantized model not necessary faster, totally depends on the machine.\n", "\n", " Returns\n", " -------\n", " result : malaya_speech.model.tf.UNET_STFT class\n", " \"\"\"\n", "```" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "model = malaya_speech.noise_reduction.deep_model(model = 'resnet-unet')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load Quantized deep model\n", "\n", "To load 8-bit quantized model, simply pass `quantized = True`, default is `False`.\n", "\n", "We can expect slightly accuracy drop from quantized model, and not necessary faster than normal 32-bit float model, totally depends on machine." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:Load quantized model will cause accuracy drop.\n" ] } ], "source": [ "quantized_model = malaya_speech.noise_reduction.deep_model(model = 'resnet-unet', quantized = True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Important factor" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Noise Reduction model trained on 44k sample rate, so make sure load the audio with 44k sample rate.\n", "\n", "```python\n", "malaya_speech.load(audio_file, sr = 44100)\n", "librosa.load(audio_file, sr = 44100)\n", "```\n", "\n", "2. You can feed dynamic length of audio, no need to cap, the model do padding by itself. But again, the longer the audio, the longer time required to calculate, unless you have GPU to speed up.\n", "3. STFT and Inverse STFT can be done on GPU level, so the model is really fast on GPU." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 27.3 s, sys: 3.48 s, total: 30.8 s\n", "Wall time: 6.54 s\n" ] } ], "source": [ "%%time\n", "\n", "output = model(y)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'voice': array([ 7.4655384e-07, -5.3525662e-07, -3.8191757e-07, ...,\n", " -3.0058224e-02, -2.9105157e-02, -2.1171883e-02], dtype=float32),\n", " 'noise': array([-4.3224041e-08, -2.3430280e-06, -3.2800205e-07, ...,\n", " -1.3801644e-03, -3.3497461e-03, -1.9985531e-03], dtype=float32)}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(output['voice'][:10 * sr], rate = sr)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(output['noise'][:10 * sr], rate = sr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nicely done! How about our quantized model?" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 28.6 s, sys: 3.58 s, total: 32.2 s\n", "Wall time: 8.05 s\n" ] }, { "data": { "text/plain": [ "{'voice': array([ 6.0242473e-07, -6.7520131e-07, -4.9965337e-07, ...,\n", " -3.0453464e-02, -2.9502867e-02, -2.1368120e-02], dtype=float32),\n", " 'noise': array([ 1.01274054e-07, -2.20296351e-06, -2.10108894e-07, ...,\n", " -9.84926941e-04, -2.95203505e-03, -1.80230662e-03], dtype=float32)}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output_quantized = quantized_model(y)\n", "output_quantized" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(output_quantized['voice'][:10 * sr], rate = sr)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(output_quantized['noise'][:10 * sr], rate = sr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Use Pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Incase your audio is too long and you do not want to burden your machine. So, you can use malaya-speech Pipeline to split the audio splitted to 15 seconds, predict one-by-one and combine after that." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = Pipeline()\n", "pipeline = (\n", " p.map(malaya_speech.generator.frames, frame_duration_ms = 15000, sample_rate = sr)\n", " .foreach_map(model)\n", " .foreach_map(lambda x: x['voice'])\n", " .map(np.concatenate)\n", ")\n", "p.visualize()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 34.8 s, sys: 4.52 s, total: 39.3 s\n", "Wall time: 7.67 s\n" ] } ], "source": [ "%%time\n", "\n", "results = p.emit(y)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['frames', 'noise-reduction', '', 'concatenate'])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.keys()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(results['concatenate'][:10 * sr], rate = sr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Reference\n", "\n", "1. Wave-U-Net: A Multi-Scale Neural Network for End-to-End Audio Source Separation, Daniel Stoller, Sebastian Ewert, Simon Dixon, https://arxiv.org/abs/1806.03185\n", "2. SKOLAR MALAYSIA PODCAST, https://www.youtube.com/watch?v=blaIfSWf38Q&t=25s&ab_channel=SkolarMalaysia" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }