432 lines
24 KiB
Plaintext
432 lines
24 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": "markdown",
|
|
"source": [
|
|
"### Instructions for running:\n",
|
|
"\n",
|
|
"* Make sure to use a GPU runtime, click: __Runtime >> Change Runtime Type >> GPU__\n",
|
|
"* Press ▶️ on the left of each of the cells\n",
|
|
"* View the code: Double-click any of the cells\n",
|
|
"* Hide the code: Double click the right side of the cell\n"
|
|
],
|
|
"metadata": {
|
|
"id": "8UON6ncSApA9"
|
|
},
|
|
"id": "8UON6ncSApA9"
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"#@title #Install and Import\n",
|
|
"\n",
|
|
"#@markdown Installing the required data and dependencies. This step might take some minutes\n",
|
|
"\n",
|
|
"#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/\n",
|
|
"\n",
|
|
"%cd denoising-historical-recordings\n",
|
|
"\n",
|
|
"#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": {
|
|
"cellView": "form",
|
|
"id": "TQBDTmO4mUBx"
|
|
},
|
|
"id": "TQBDTmO4mUBx",
|
|
"execution_count": 4,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"source": [
|
|
"#@title #Upload file to denoise\n",
|
|
"\n",
|
|
"#@markdown Execute this cell to upload a single audio recording you would like to denoise (accepted extensions: .wav, .flac, .mp3)\n",
|
|
"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
|
|
},
|
|
"cellView": "form",
|
|
"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": [
|
|
"#@title #Denoise\n",
|
|
"\n",
|
|
"#@markdown Execute this cell to denoise the uploaded file\n",
|
|
"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/"
|
|
},
|
|
"cellView": "form",
|
|
"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": [
|
|
"#@title #Download\n",
|
|
"\n",
|
|
"#@markdown Execute this cell to download the denoised recording\n",
|
|
"files.download(wav_output_name)"
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 17
|
|
},
|
|
"cellView": "form",
|
|
"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
|
|
} |