{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "source": [ "# New Section" ], "metadata": { "id": "jbe_aWYkjWRH" }, "id": "jbe_aWYkjWRH" }, { "cell_type": "code", "execution_count": 1, "id": "dd70762d", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dd70762d", "outputId": "24457550-e127-4d73-db47-297147b68f09" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Cloning into 'denoising-historical-recordings'...\n", "remote: Enumerating objects: 181, done.\u001b[K\n", "remote: Counting objects: 100% (181/181), done.\u001b[K\n", "remote: Compressing objects: 100% (157/157), done.\u001b[K\n", "remote: Total 181 (delta 64), reused 98 (delta 16), pack-reused 0\u001b[K\n", "Receiving objects: 100% (181/181), 104.80 KiB | 17.47 MiB/s, done.\n", "Resolving deltas: 100% (64/64), done.\n", "--2022-01-20 14:40:36-- https://github.com/eloimoliner/denoising-historical-recordings/releases/download/v0.0/checkpoint.zip\n", "Resolving github.com (github.com)... 140.82.112.3\n", "Connecting to github.com (github.com)|140.82.112.3|:443... connected.\n", "HTTP request sent, awaiting response... 302 Found\n", "Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/401385223/354cec4e-d8be-4126-8b32-9e6509bca537?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220120%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220120T144036Z&X-Amz-Expires=300&X-Amz-Signature=1cf02e4ae397a518db9da71aad3dfc7dcb844c520bbfc49398ca6a54171ad637&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=401385223&response-content-disposition=attachment%3B%20filename%3Dcheckpoint.zip&response-content-type=application%2Foctet-stream [following]\n", "--2022-01-20 14:40:36-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/401385223/354cec4e-d8be-4126-8b32-9e6509bca537?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220120%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220120T144036Z&X-Amz-Expires=300&X-Amz-Signature=1cf02e4ae397a518db9da71aad3dfc7dcb844c520bbfc49398ca6a54171ad637&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=401385223&response-content-disposition=attachment%3B%20filename%3Dcheckpoint.zip&response-content-type=application%2Foctet-stream\n", "Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.108.133, 185.199.111.133, ...\n", "Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 264031940 (252M) [application/octet-stream]\n", "Saving to: ‘checkpoint.zip’\n", "\n", "checkpoint.zip 100%[===================>] 251.80M 215MB/s in 1.2s \n", "\n", "2022-01-20 14:40:38 (215 MB/s) - ‘checkpoint.zip’ saved [264031940/264031940]\n", "\n", "Archive: checkpoint.zip\n", " inflating: denoising-historical-recordings/experiments/trained_model/checkpoint \n", " inflating: denoising-historical-recordings/experiments/trained_model/checkpoint.data-00000-of-00001 \n", " inflating: denoising-historical-recordings/experiments/trained_model/checkpoint.index \n" ] } ], "source": [ "#download the files\n", "! git clone https://github.com/eloimoliner/denoising-historical-recordings.git\n", "! wget https://github.com/eloimoliner/denoising-historical-recordings/releases/download/v0.0/checkpoint.zip\n", "! unzip checkpoint.zip -d denoising-historical-recordings/experiments/trained_model/" ] }, { "cell_type": "code", "source": [ "\n", "%cd denoising-historical-recordings" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "HmHRpa5eloy2", "outputId": "8666da99-94e0-4ed2-afca-f9e31b37c84c" }, "id": "HmHRpa5eloy2", "execution_count": 2, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "/content/denoising-historical-recordings\n" ] } ] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "gvd6KZkTlyhR" }, "id": "gvd6KZkTlyhR", "execution_count": 12, "outputs": [] }, { "cell_type": "code", "source": [ "" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "nmic9hVzmSj6", "outputId": "4d1a91d8-e994-48d3-d27b-f3c0b933b60e" }, "id": "nmic9hVzmSj6", "execution_count": 3, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting hydra-core==0.11.3\n", " Downloading hydra_core-0.11.3-py3-none-any.whl (72 kB)\n", "\u001b[?25l\r\u001b[K |████▌ | 10 kB 34.0 MB/s eta 0:00:01\r\u001b[K |█████████ | 20 kB 38.2 MB/s eta 0:00:01\r\u001b[K |█████████████▋ | 30 kB 43.5 MB/s eta 0:00:01\r\u001b[K |██████████████████▏ | 40 kB 47.4 MB/s eta 0:00:01\r\u001b[K |██████████████████████▊ | 51 kB 33.6 MB/s eta 0:00:01\r\u001b[K |███████████████████████████▎ | 61 kB 36.8 MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▉| 71 kB 27.7 MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 72 kB 649 kB/s \n", "\u001b[?25hCollecting omegaconf<1.5,>=1.4\n", " Downloading omegaconf-1.4.1-py3-none-any.whl (14 kB)\n", "Requirement already satisfied: PyYAML in /usr/local/lib/python3.7/dist-packages (from omegaconf<1.5,>=1.4->hydra-core==0.11.3) (3.13)\n", "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from omegaconf<1.5,>=1.4->hydra-core==0.11.3) (1.15.0)\n", "Installing collected packages: omegaconf, hydra-core\n", "Successfully installed hydra-core-0.11.3 omegaconf-1.4.1\n" ] } ] }, { "cell_type": "code", "source": [ "#install dependencies\n", "! pip install hydra-core==0.11.3\n", "\n", "#All the code goes here\n", "import unet\n", "import tensorflow as tf\n", "import soundfile as sf\n", "import numpy as np\n", "from tqdm import tqdm\n", "import scipy.signal\n", "import hydra\n", "import os\n", "#workaround to load hydra conf file\n", "import yaml\n", "from pathlib import Path\n", "args = yaml.safe_load(Path('conf/conf.yaml').read_text())\n", "class dotdict(dict):\n", " \"\"\"dot.notation access to dictionary attributes\"\"\"\n", " __getattr__ = dict.get\n", " __setattr__ = dict.__setitem__\n", " __delattr__ = dict.__delitem__\n", "args=dotdict(args)\n", "unet_args=dotdict(args.unet)\n", "\n", "path_experiment=str(args.path_experiment)\n", "\n", "unet_model = unet.build_model_denoise(unet_args=unet_args)\n", "\n", "ckpt=os.path.join(\"/content/denoising-historical-recordings\",path_experiment, 'checkpoint')\n", "unet_model.load_weights(ckpt)\n", "\n", "def do_stft(noisy):\n", " \n", " window_fn = tf.signal.hamming_window\n", "\n", " win_size=args.stft[\"win_size\"]\n", " hop_size=args.stft[\"hop_size\"]\n", "\n", " \n", " stft_signal_noisy=tf.signal.stft(noisy,frame_length=win_size, window_fn=window_fn, frame_step=hop_size, pad_end=True)\n", " stft_noisy_stacked=tf.stack( values=[tf.math.real(stft_signal_noisy), tf.math.imag(stft_signal_noisy)], axis=-1)\n", "\n", " return stft_noisy_stacked\n", "\n", "def do_istft(data):\n", " \n", " window_fn = tf.signal.hamming_window\n", "\n", " win_size=args.stft[\"win_size\"]\n", " hop_size=args.stft[\"hop_size\"]\n", "\n", " inv_window_fn=tf.signal.inverse_stft_window_fn(hop_size, forward_window_fn=window_fn)\n", "\n", " pred_cpx=data[...,0] + 1j * data[...,1]\n", " pred_time=tf.signal.inverse_stft(pred_cpx, win_size, hop_size, window_fn=inv_window_fn)\n", " return pred_time\n", "\n", "def denoise_audio(audio):\n", "\n", " data, samplerate = sf.read(audio)\n", " print(data.dtype)\n", " #Stereo to mono\n", " if len(data.shape)>1:\n", " data=np.mean(data,axis=1)\n", " \n", " if samplerate!=44100: \n", " print(\"Resampling\")\n", " \n", " data=scipy.signal.resample(data, int((44100 / samplerate )*len(data))+1) \n", " \n", " \n", " \n", " segment_size=44100*5 #20s segments\n", "\n", " length_data=len(data)\n", " overlapsize=2048 #samples (46 ms)\n", " window=np.hanning(2*overlapsize)\n", " window_right=window[overlapsize::]\n", " window_left=window[0:overlapsize]\n", " audio_finished=False\n", " pointer=0\n", " denoised_data=np.zeros(shape=(len(data),))\n", " residual_noise=np.zeros(shape=(len(data),))\n", " numchunks=int(np.ceil(length_data/segment_size))\n", " \n", " for i in tqdm(range(numchunks)):\n", " if pointer+segment_size\n", " \n", " Upload widget is only available when the cell has been executed in the\n", " current browser session. Please rerun this cell to enable.\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Saving Carmen-Habanera_(Love_is_Like_a_Woo_-_Marguerite_D'Alvarez_noisy_input.wav to Carmen-Habanera_(Love_is_Like_a_Woo_-_Marguerite_D'Alvarez_noisy_input.wav\n" ] } ] }, { "cell_type": "code", "source": [ "for fn in uploaded.keys():\n", " print('Denoising uploaded file \"{name}\"'.format(\n", " name=fn))\n", " denoise_data=denoise_audio(fn)\n", " basename=os.path.splitext(fn)[0]\n", " wav_output_name=basename+\"_denoised\"+\".wav\"\n", " sf.write(wav_output_name, denoise_data, 44100)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0po6zpvrylc2", "outputId": "173f5355-2939-41fe-c702-591aa752fc7e" }, "id": "0po6zpvrylc2", "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Denoising uploaded file \"Carmen-Habanera_(Love_is_Like_a_Woo_-_Marguerite_D'Alvarez_noisy_input.wav\"\n", "float64\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "100%|██████████| 41/41 [00:30<00:00, 1.34it/s]\n" ] } ] }, { "cell_type": "code", "source": [ "\n", "files.download(wav_output_name)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 17 }, "id": "3tEshWBezYvf", "outputId": "54588c26-0b3c-42bf-aca2-8316ab54603f" }, "id": "3tEshWBezYvf", "execution_count": 7, "outputs": [ { "output_type": "display_data", "data": { "application/javascript": [ "\n", " async function download(id, filename, size) {\n", " if (!google.colab.kernel.accessAllowed) {\n", " return;\n", " }\n", " const div = document.createElement('div');\n", " const label = document.createElement('label');\n", " label.textContent = `Downloading \"${filename}\": `;\n", " div.appendChild(label);\n", " const progress = document.createElement('progress');\n", " progress.max = size;\n", " div.appendChild(progress);\n", " document.body.appendChild(div);\n", "\n", " const buffers = [];\n", " let downloaded = 0;\n", "\n", " const channel = await google.colab.kernel.comms.open(id);\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", "\n", " for await (const message of channel.messages) {\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", " if (message.buffers) {\n", " for (const buffer of message.buffers) {\n", " buffers.push(buffer);\n", " downloaded += buffer.byteLength;\n", " progress.value = downloaded;\n", " }\n", " }\n", " }\n", " const blob = new Blob(buffers, {type: 'application/binary'});\n", " const a = document.createElement('a');\n", " a.href = window.URL.createObjectURL(blob);\n", " a.download = filename;\n", " div.appendChild(a);\n", " a.click();\n", " div.remove();\n", " }\n", " " ], "text/plain": [ "" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "application/javascript": [ "download(\"download_3e3ca242-937f-408e-a16c-4aa5bb2b9e50\", \"Carmen-Habanera_(Love_is_Like_a_Woo_-_Marguerite_D'Alvarez_noisy_input_denoised.wav\", 17961334)" ], "text/plain": [ "" ] }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "" ], "metadata": { "id": "v_FuSJ4J-WO-" }, "id": "v_FuSJ4J-WO-", "execution_count": null, "outputs": [] } ], "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.8.5" }, "colab": { "name": "demo.ipynb", "provenance": [], "include_colab_link": true }, "accelerator": "GPU" }, "nbformat": 4, "nbformat_minor": 5 }