516 lines
29 KiB
Plaintext
516 lines
29 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"id": "view-in-github",
|
||
"colab_type": "text"
|
||
},
|
||
"source": [
|
||
"<a href=\"https://colab.research.google.com/github/eloimoliner/denoising-historical-recordings/blob/colab/colab/demo.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
|
||
]
|
||
},
|
||
{
|
||
"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<length_data:\n",
|
||
" segment=data[pointer:pointer+segment_size]\n",
|
||
" #dostft\n",
|
||
" segment_TF=do_stft(segment)\n",
|
||
" segment_TF_ds=tf.data.Dataset.from_tensors(segment_TF)\n",
|
||
" pred = unet_model.predict(segment_TF_ds.batch(1))\n",
|
||
" pred=pred[0]\n",
|
||
" residual=segment_TF-pred[0]\n",
|
||
" residual=np.array(residual)\n",
|
||
" pred_time=do_istft(pred[0])\n",
|
||
" residual_time=do_istft(residual)\n",
|
||
" residual_time=np.array(residual_time)\n",
|
||
"\n",
|
||
" if pointer==0:\n",
|
||
" pred_time=np.concatenate((pred_time[0:int(segment_size-overlapsize)], np.multiply(pred_time[int(segment_size-overlapsize):segment_size],window_right)), axis=0)\n",
|
||
" residual_time=np.concatenate((residual_time[0:int(segment_size-overlapsize)], np.multiply(residual_time[int(segment_size-overlapsize):segment_size],window_right)), axis=0)\n",
|
||
" else:\n",
|
||
" pred_time=np.concatenate((np.multiply(pred_time[0:int(overlapsize)], window_left), pred_time[int(overlapsize):int(segment_size-overlapsize)], np.multiply(pred_time[int(segment_size-overlapsize):int(segment_size)],window_right)), axis=0)\n",
|
||
" residual_time=np.concatenate((np.multiply(residual_time[0:int(overlapsize)], window_left), residual_time[int(overlapsize):int(segment_size-overlapsize)], np.multiply(residual_time[int(segment_size-overlapsize):int(segment_size)],window_right)), axis=0)\n",
|
||
" \n",
|
||
" denoised_data[pointer:pointer+segment_size]=denoised_data[pointer:pointer+segment_size]+pred_time\n",
|
||
" residual_noise[pointer:pointer+segment_size]=residual_noise[pointer:pointer+segment_size]+residual_time\n",
|
||
"\n",
|
||
" pointer=pointer+segment_size-overlapsize\n",
|
||
" else: \n",
|
||
" segment=data[pointer::]\n",
|
||
" lensegment=len(segment)\n",
|
||
" segment=np.concatenate((segment, np.zeros(shape=(int(segment_size-len(segment)),))), axis=0)\n",
|
||
" audio_finished=True\n",
|
||
" #dostft\n",
|
||
" segment_TF=do_stft(segment)\n",
|
||
"\n",
|
||
" segment_TF_ds=tf.data.Dataset.from_tensors(segment_TF)\n",
|
||
"\n",
|
||
" pred = unet_model.predict(segment_TF_ds.batch(1))\n",
|
||
" pred=pred[0]\n",
|
||
" residual=segment_TF-pred[0]\n",
|
||
" residual=np.array(residual)\n",
|
||
" pred_time=do_istft(pred[0])\n",
|
||
" pred_time=np.array(pred_time)\n",
|
||
" pred_time=pred_time[0:segment_size]\n",
|
||
" residual_time=do_istft(residual)\n",
|
||
" residual_time=np.array(residual_time)\n",
|
||
" residual_time=residual_time[0:segment_size]\n",
|
||
" if pointer==0:\n",
|
||
" pred_time=pred_time\n",
|
||
" residual_time=residual_time\n",
|
||
" else:\n",
|
||
" pred_time=np.concatenate((np.multiply(pred_time[0:int(overlapsize)], window_left), pred_time[int(overlapsize):int(segment_size)]),axis=0)\n",
|
||
" residual_time=np.concatenate((np.multiply(residual_time[0:int(overlapsize)], window_left), residual_time[int(overlapsize):int(segment_size)]),axis=0)\n",
|
||
"\n",
|
||
" denoised_data[pointer::]=denoised_data[pointer::]+pred_time[0:lensegment]\n",
|
||
" residual_noise[pointer::]=residual_noise[pointer::]+residual_time[0:lensegment]\n",
|
||
" return denoised_data"
|
||
],
|
||
"metadata": {
|
||
"id": "TQBDTmO4mUBx"
|
||
},
|
||
"id": "TQBDTmO4mUBx",
|
||
"execution_count": 4,
|
||
"outputs": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"source": [
|
||
"from google.colab import files\n",
|
||
"uploaded=files.upload()"
|
||
],
|
||
"metadata": {
|
||
"colab": {
|
||
"resources": {
|
||
"http://localhost:8080/nbextensions/google.colab/files.js": {
|
||
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
|
||
"ok": true,
|
||
"headers": [
|
||
[
|
||
"content-type",
|
||
"application/javascript"
|
||
]
|
||
],
|
||
"status": 200,
|
||
"status_text": ""
|
||
}
|
||
},
|
||
"base_uri": "https://localhost:8080/",
|
||
"height": 72
|
||
},
|
||
"id": "50Kmdy6AtbhW",
|
||
"outputId": "2d05860c-536d-45f8-92b4-d2ba6f5a54c5"
|
||
},
|
||
"id": "50Kmdy6AtbhW",
|
||
"execution_count": 5,
|
||
"outputs": [
|
||
{
|
||
"output_type": "display_data",
|
||
"data": {
|
||
"text/html": [
|
||
"\n",
|
||
" <input type=\"file\" id=\"files-8c1b9bdf-8c48-4470-a703-92cbdabe7d22\" name=\"files[]\" multiple disabled\n",
|
||
" style=\"border:none\" />\n",
|
||
" <output id=\"result-8c1b9bdf-8c48-4470-a703-92cbdabe7d22\">\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",
|
||
" </output>\n",
|
||
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"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": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"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": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"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
|
||
} |