{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Super Resolution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This tutorial is available as an IPython notebook at [malaya-speech/example/super-resolution](https://github.com/huseinzol05/malaya-speech/tree/master/example/super-resolution).\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": "markdown", "metadata": {}, "source": [ "Purpose of this module to increase sample rate." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import malaya_speech\n", "import numpy as np\n", "from malaya_speech import Pipeline\n", "import IPython.display as ipd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### List available deep model" ] }, { "cell_type": "code", "execution_count": 2, "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", "
Size (MB)Quantized Size (MB)SDRISRSAR
srgan-1287.372.0417.0334522.33026017.454372
srgan-25629.507.5516.3455822.06749317.024390
\n", "
" ], "text/plain": [ " Size (MB) Quantized Size (MB) SDR ISR SAR\n", "srgan-128 7.37 2.04 17.03345 22.330260 17.454372\n", "srgan-256 29.50 7.55 16.34558 22.067493 17.024390" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "malaya_speech.super_resolution.available_model()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We modified SRGAN to do 1D Convolution and use output distance as generator loss, originally use content loss." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load deep model\n", "\n", "```python\n", "def deep_model(model: str = 'srgan-256', quantized: bool = False, **kwargs):\n", " \"\"\"\n", " Load Super Resolution 4x deep learning model.\n", "\n", " Parameters\n", " ----------\n", " model : str, optional (default='srgan-256')\n", " Model architecture supported. Allowed values:\n", "\n", " * ``'srgan-128'`` - srgan with 128 filter size and 16 residual blocks.\n", " * ``'srgan-256'`` - srgan with 256 filter size and 16 residual blocks.\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.UNET1D class\n", " \"\"\"\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /Users/huseinzolkepli/Documents/malaya-speech/malaya_speech/utils/__init__.py:66: The name tf.gfile.GFile is deprecated. Please use tf.io.gfile.GFile instead.\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:From /Users/huseinzolkepli/Documents/malaya-speech/malaya_speech/utils/__init__.py:66: The name tf.gfile.GFile is deprecated. Please use tf.io.gfile.GFile instead.\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /Users/huseinzolkepli/Documents/malaya-speech/malaya_speech/utils/__init__.py:68: The name tf.GraphDef is deprecated. Please use tf.compat.v1.GraphDef instead.\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:From /Users/huseinzolkepli/Documents/malaya-speech/malaya_speech/utils/__init__.py:68: The name tf.GraphDef is deprecated. Please use tf.compat.v1.GraphDef instead.\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /Users/huseinzolkepli/Documents/malaya-speech/malaya_speech/utils/__init__.py:61: The name tf.InteractiveSession is deprecated. Please use tf.compat.v1.InteractiveSession instead.\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:tensorflow:From /Users/huseinzolkepli/Documents/malaya-speech/malaya_speech/utils/__init__.py:61: The name tf.InteractiveSession is deprecated. Please use tf.compat.v1.InteractiveSession instead.\n", "\n", "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/client/session.py:1750: UserWarning: An interactive session is already active. This can cause out-of-memory errors in some cases. You must explicitly call `InteractiveSession.close()` to release resources held by the other session(s).\n", " warnings.warn('An interactive session is already active. This can '\n" ] } ], "source": [ "model = malaya_speech.super_resolution.deep_model(model = 'srgan-256')\n", "model_128 = malaya_speech.super_resolution.deep_model(model = 'srgan-128')" ] }, { "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": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:root:Load quantized model will cause accuracy drop.\n", "WARNING:root:Load quantized model will cause accuracy drop.\n" ] } ], "source": [ "quantized_model = malaya_speech.super_resolution.deep_model(model = 'srgan-256', quantized = True)\n", "quantized_model_128 = malaya_speech.super_resolution.deep_model(model = 'srgan-128', quantized = True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Important factor\n", "\n", "1. Currently we only supported 4x super resolution, if input sample rate is 16k, output will become 16k * 4.\n", "2. We trained on 11025 for input sample rate, 44100 for output sample rate." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Predict\n", "\n", "```python\n", "def predict(self, input):\n", " \"\"\"\n", " Enhance inputs, will return waveform.\n", "\n", " Parameters\n", " ----------\n", " input: np.array\n", " np.array or malaya_speech.model.frame.Frame.\n", "\n", " Returns\n", " -------\n", " result: np.array\n", " \"\"\"\n", "```\n", "\n", "Let say we have a low sample rate audio," ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "sr = 44100\n", "reduction_factor = 4" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y, sr_ = malaya_speech.load('speech/44k/test-0.wav', sr = sr // reduction_factor)\n", "ipd.Audio(y[:sr_ * 4], rate = sr_)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1min 2s, sys: 3.49 s, total: 1min 5s\n", "Wall time: 10.9 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = model(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 18.1 s, sys: 1.74 s, total: 19.8 s\n", "Wall time: 3.54 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = model_128(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 18.2 s, sys: 2.05 s, total: 20.2 s\n", "Wall time: 3.89 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = quantized_model_128(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below is common technique people do upsampling using interpolate," ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_ = malaya_speech.resample(y, sr // reduction_factor, sr)\n", "ipd.Audio(y_[:sr * 4], rate = sr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Try more examples" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "11025" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y, sr_ = malaya_speech.load('speech/example-speaker/husein-generated.wav', sr = sr // reduction_factor)\n", "sr_" ] }, { "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(y[:sr_ * 4], rate = sr_)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 58.1 s, sys: 3.38 s, total: 1min 1s\n", "Wall time: 10.5 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = model(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 17.2 s, sys: 1.6 s, total: 18.8 s\n", "Wall time: 3.14 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = model_128(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_ = malaya_speech.resample(y, sr_, sr)\n", "ipd.Audio(y_[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y, sr_ = malaya_speech.load('speech/44k/test-2.wav', sr = sr // reduction_factor)\n", "ipd.Audio(y[:sr_ * 4], rate = sr_)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1min 1s, sys: 3.64 s, total: 1min 4s\n", "Wall time: 11.5 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = model(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 18.5 s, sys: 1.83 s, total: 20.3 s\n", "Wall time: 3.72 s\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "output = model_128(y)\n", "ipd.Audio(output[:sr * 4], rate = sr)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_ = malaya_speech.resample(y, sr_, sr)\n", "ipd.Audio(y_[:sr * 4], 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 3 seconds, predict one-by-one and combine after that." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = Pipeline()\n", "pipeline = (\n", " p.map(malaya_speech.load, sr = sr // reduction_factor)\n", " .map(lambda x: x[0])\n", " .map(malaya_speech.generator.frames, frame_duration_ms = 3000, sample_rate = sr // reduction_factor)\n", " .foreach_map(model_128)\n", " .map(np.concatenate)\n", ")\n", "p.visualize()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 20.2 s, sys: 2.52 s, total: 22.7 s\n", "Wall time: 4.19 s\n" ] } ], "source": [ "%%time\n", "\n", "results = p('speech/podcast/nusantara.wav')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['load', '', 'frames', 'super-resolution', 'concatenate'])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results.keys()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(results['concatenate'], rate = sr)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(results[''], rate = sr // reduction_factor)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_ = malaya_speech.resample(results[''], sr // reduction_factor, sr)\n", "ipd.Audio(y_, rate = sr)" ] } ], "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 }