From 30687b6369016dee7ff0a974ae50bea1bc6b4d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ante=20Jukic=CC=81?= Date: Tue, 9 May 2023 10:07:15 -0700 Subject: [PATCH] Added consistency projection, addressed comments for the notebook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ante Jukić --- .../asr/models/enhancement_models.py | 9 + nemo/collections/asr/modules/audio_modules.py | 69 + .../Speech_Enhancement_with_NeMo.ipynb | 2476 +++++++++-------- .../images/dual_output_example_model.png | Bin 98511 -> 0 bytes .../images/encmaskdecoder_model.png | Bin 63160 -> 0 bytes .../images/single_output_example_model.png | Bin 74867 -> 0 bytes 6 files changed, 1393 insertions(+), 1161 deletions(-) delete mode 100644 tutorials/audio_tasks/speech_enhancement/images/dual_output_example_model.png delete mode 100644 tutorials/audio_tasks/speech_enhancement/images/encmaskdecoder_model.png delete mode 100644 tutorials/audio_tasks/speech_enhancement/images/single_output_example_model.png diff --git a/nemo/collections/asr/models/enhancement_models.py b/nemo/collections/asr/models/enhancement_models.py index 755ec99628d5..a25bf882a23b 100644 --- a/nemo/collections/asr/models/enhancement_models.py +++ b/nemo/collections/asr/models/enhancement_models.py @@ -60,6 +60,11 @@ def __init__(self, cfg: DictConfig, trainer: Trainer = None): self.mask_processor = EncMaskDecAudioToAudioModel.from_config_dict(self._cfg.mask_processor) self.decoder = EncMaskDecAudioToAudioModel.from_config_dict(self._cfg.decoder) + if 'mixture_consistency' in self._cfg: + self.mixture_consistency = EncMaskDecAudioToAudioModel.from_config_dict(self._cfg.mixture_consistency) + else: + self.mixture_consistency = None + # Future enhancement: # If subclasses need to modify the config before calling super() # Check ASRBPE* classes do with their mixin @@ -370,6 +375,10 @@ def forward(self, input_signal, input_length=None): # Mask-based processor in the encoded domain processed, processed_length = self.mask_processor(input=encoded, input_length=encoded_length, mask=mask) + # Mixture consistency + if self.mixture_consistency is not None: + processed = self.mixture_consistency(mixture=encoded, estimate=processed) + # Decoder processed, processed_length = self.decoder(input=processed, input_length=processed_length) diff --git a/nemo/collections/asr/modules/audio_modules.py b/nemo/collections/asr/modules/audio_modules.py index fbbc96c8144f..e2218d2118cf 100644 --- a/nemo/collections/asr/modules/audio_modules.py +++ b/nemo/collections/asr/modules/audio_modules.py @@ -878,3 +878,72 @@ def forward( output, output_length = self.filter(input=output, input_length=input_length, power=power) return output.to(io_dtype), output_length + + +class MixtureConsistencyProjection(NeuralModule): + """Ensure estimated sources are consistent with the input mixture. + Note that the input mixture is assume to be a single-channel signal. + + Args: + weighting: Optional weighting mode for the consistency constraint. + If `None`, use uniform weighting. If `power`, use the power of the + estimated source as the weight. + eps: Small positive value for regularization + + Reference: + Wisdom et al., Differentiable consistency constraints for improved deep speech enhancement, 2018 + """ + + def __init__(self, weighting: Optional[str] = None, eps: float = 1e-8): + super().__init__() + self.weighting = weighting + self.eps = eps + + if self.weighting not in [None, 'power']: + raise NotImplementedError(f'Weighting mode {self.weighting} not implemented') + + @property + def input_types(self) -> Dict[str, NeuralType]: + """Returns definitions of module output ports. + """ + return { + "mixture": NeuralType(('B', 'C', 'D', 'T'), SpectrogramType()), + "estimate": NeuralType(('B', 'C', 'D', 'T'), SpectrogramType()), + } + + @property + def output_types(self) -> Dict[str, NeuralType]: + """Returns definitions of module output ports. + """ + return { + "output": NeuralType(('B', 'C', 'D', 'T'), SpectrogramType()), + } + + @typecheck() + def forward(self, mixture: torch.Tensor, estimate: torch.Tensor) -> torch.Tensor: + """Enforce mixture consistency on the estimated sources. + Args: + mixture: Single-channel mixture, shape (B, 1, F, N) + estimate: M estimated sources, shape (B, M, F, N) + + Returns: + Source estimates consistent with the mixture, shape (B, M, F, N) + """ + # number of sources + M = estimate.size(-3) + # estimated mixture based on the estimated sources + estimated_mixture = torch.sum(estimate, dim=-3, keepdim=True) + + # weighting + if self.weighting is None: + weight = 1 / M + elif self.weighting == 'power': + weight = estimate.abs().pow(2) + weight = weight / (weight.sum(dim=-3, keepdim=True) + self.eps) + else: + raise NotImplementedError(f'Weighting mode {self.weighting} not implemented') + + # consistent estimate + consistent_estimate = estimate + weight * (mixture - estimated_mixture) + + return consistent_estimate diff --git a/tutorials/audio_tasks/speech_enhancement/Speech_Enhancement_with_NeMo.ipynb b/tutorials/audio_tasks/speech_enhancement/Speech_Enhancement_with_NeMo.ipynb index c7c1d5113341..41a49688d35e 100644 --- a/tutorials/audio_tasks/speech_enhancement/Speech_Enhancement_with_NeMo.ipynb +++ b/tutorials/audio_tasks/speech_enhancement/Speech_Enhancement_with_NeMo.ipynb @@ -1,1162 +1,1316 @@ { - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "2fb43f21", - "metadata": {}, - "source": [ - "# Introduction\n", - "\n", - "The goal of this tutorial is to demonstrate the basic steps required to setup and train train a simple single-channel speech enhancement model in NeMo.\n", - "\n", - "This notebook covers the following steps:\n", - "\n", - "* Download speech and noise data\n", - "* Prepare the training data by mixing speech and noise\n", - "* Configure and train a simple single-output model\n", - "* Configure and train a simple dual-output model\n", - "\n", - "Note that this tutorial is only for demonstration purposes.\n", - "To achieve best performance for a particular use case, carefully prepared data and more advanced models should be used.\n", - "\n", - "*Disclamer:*\n", - "User is responsible for checking the content of datasets and the applicable licenses and determining if suitable for the intended use." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "50525ece", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"\n", - "You can run either this notebook locally (if you have all the dependencies and a GPU) or on Google Colab.\n", - "\n", - "Instructions for setting up Colab are as follows:\n", - "1. Open a new Python 3 notebook.\n", - "2. Import this notebook from GitHub (File -> Upload Notebook -> \"GITHUB\" tab -> copy/paste GitHub URL)\n", - "3. Connect to an instance with a GPU (Runtime -> Change runtime type -> select \"GPU\" for hardware accelerator)\n", - "4. Run this cell to set up dependencies.\n", - "5. Restart the runtime (Runtime -> Restart Runtime) for any upgraded packages to take effect\n", - "\"\"\"\n", - "\n", - "GIT_USER = 'anteju' # TODO: change to 'NVIDIA'\n", - "GIT_BRANCH = 'dev/se-tutorial' # TODO: change to 'main'\n", - "\n", - "if 'google.colab' in str(get_ipython()):\n", - "\n", - " # Install dependencies\n", - " !pip install wget\n", - " !apt-get install sox libsndfile1 ffmpeg\n", - " !pip install text-unidecode\n", - " !pip install matplotlib>=3.3.2\n", - "\n", - " ## Install NeMo\n", - " !python -m pip install git+https://github.com/{GIT_USER}/NeMo.git@{GIT_BRANCH}#egg=nemo_toolkit[all]\n", - "\n", - " ## Install TorchAudio\n", - " !pip install torchaudio>=0.13.0 -f https://download.pytorch.org/whl/torch_stable.html" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "765e8b8a", - "metadata": {}, - "source": [ - "The following cell will take care of the necessary imports and prepare utility functions used throughout the notebook." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9248dd5f", - "metadata": {}, - "outputs": [], - "source": [ - "import glob\n", - "import librosa\n", - "import os\n", - "import torch\n", - "import tqdm\n", - "\n", - "import IPython.display as ipd\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pytorch_lightning as pl\n", - "import soundfile as sf\n", - "\n", - "from pathlib import Path\n", - "from torchmetrics.functional.audio import signal_distortion_ratio, scale_invariant_signal_distortion_ratio\n", - "\n", - "from nemo.utils.notebook_utils import download_an4\n", - "from nemo.collections.asr.parts.preprocessing.segment import AudioSegment\n", - "from nemo.collections.asr.parts.utils.manifest_utils import read_manifest, write_manifest\n", - "\n", - "\n", - "# Used to download data processing scripts\n", - "USER = 'anteju' # TODO: change to 'NVIDIA'\n", - "BRANCH = 'dev/se-tutorial' # TODO: change to 'main'\n", - "\n", - "\n", - "# Utility functions for displaying signals and metrics\n", - "def show_signal(signal: np.ndarray, sample_rate: int = 16000, tag: str = 'Signal'):\n", - " \"\"\"Show the time-domain signal and its spectrogram.\n", - " \"\"\"\n", - " fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 2.5))\n", - "\n", - " # show waveform\n", - " t = np.arange(0, len(signal)) / sample_rate\n", - "\n", - " ax[0].plot(t, signal)\n", - " ax[0].set_xlim(0, t.max())\n", - " ax[0].grid()\n", - " ax[0].set_xlabel('time / s')\n", - " ax[0].set_ylabel('amplitude')\n", - " ax[0].set_title(tag)\n", - "\n", - " n_fft = 1024\n", - " hop_length = 256\n", - "\n", - " D = librosa.amplitude_to_db(np.abs(librosa.stft(signal, n_fft=n_fft, hop_length=hop_length)), ref=np.max)\n", - " img = librosa.display.specshow(D, y_axis='linear', x_axis='time', sr=sample_rate, n_fft=n_fft, hop_length=hop_length, ax=ax[1])\n", - " ax[1].set_title(tag)\n", - " \n", - " plt.tight_layout()\n", - " plt.colorbar(img, format=\"%+2.f dB\", ax=ax)\n", - "\n", - "def show_metrics(signal: np.ndarray, reference: np.ndarray, sample_rate: int = 16000, tag: str = 'Signal'):\n", - " \"\"\"Show metrics for the time-domain signal and the reference signal.\n", - " \"\"\"\n", - " sdr = signal_distortion_ratio(preds=torch.tensor(signal), target=torch.tensor(reference))\n", - " sisdr = scale_invariant_signal_distortion_ratio(preds=torch.tensor(signal), target=torch.tensor(reference))\n", - " print(tag)\n", - " print('\\tsdr: ', sdr.item())\n", - " print('\\tsisdr:', sisdr.item())" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "bfa2199e", - "metadata": {}, - "source": [ - "### Data preparation" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "0aa05a36", - "metadata": {}, - "source": [ - "In this notebook, it is assumed that all audio will be resampled to 16kHz and the data and configuration will be stored under `root_dir` as defined below." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8e790630", - "metadata": {}, - "outputs": [], - "source": [ - "# sample rate used throughout the notebook\n", - "sample_rate = 16000\n", - "\n", - "# root directory for data preparation, configurations, etc\n", - "root_dir = Path('./')\n", - "\n", - "# data directory\n", - "data_dir = root_dir / 'data'\n", - "data_dir.mkdir(exist_ok=True)\n", - "\n", - "# scripts directory\n", - "scripts_dir = root_dir / 'scripts'\n", - "scripts_dir.mkdir(exist_ok=True)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "9af717ad", - "metadata": {}, - "source": [ - "Clean speech data is used to prepare datasets used for training a simple speech enhancement model.\n", - "\n", - "In this tutorial, a subset of LibriSpeech dataset [1] will be downloaded and used as the speech material.\n", - "The following cell will download and prepare the speech data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e1c5a60a", - "metadata": {}, - "outputs": [], - "source": [ - "speech_dir = data_dir / 'speech'\n", - "speech_data_set = 'mini'\n", - "\n", - "# Copy script\n", - "get_librispeech_script = os.path.join(scripts_dir, 'get_librispeech_data.py')\n", - "if not os.path.exists(get_librispeech_script):\n", - " !wget -P $scripts_dir https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/scripts/dataset_processing/get_librispeech_data.py\n", - "\n", - "# Dowload the data\n", - "if not speech_dir.is_dir():\n", - " speech_dir.mkdir(exist_ok=True)\n", - " !python {get_librispeech_script} --data_root={speech_dir} --data_set={speech_data_set}\n", - "else:\n", - " print('Speech dataset already exists in:', speech_dir)\n", - "\n", - "# Reduce the size of test dataset for this tutorial to 1000 clean utterances for train and 100 clean utterances for test\n", - "train_metadata = read_manifest(speech_dir / 'train_clean_5.json')\n", - "write_manifest(speech_dir / 'train.json', train_metadata[:1000])\n", - "\n", - "test_metadata = read_manifest(speech_dir / 'dev_clean_2.json')\n", - "write_manifest(speech_dir / 'test.json', test_metadata[:100])\n", - "\n", - "# Speech manifests\n", - "speech_manifest = {\n", - " 'train': speech_dir / 'train.json',\n", - " 'test': speech_dir / 'test.json',\n", - "}" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "06f07374", - "metadata": {}, - "source": [ - "Noise data will be mixed with the downloaded speech data to prepare a noisy dataset.\n", - "\n", - "The following cell will download and prepare the noise data using a subset of the DEMAND dataset [2] will be downloaded and used as the noise data." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b1de1089", - "metadata": {}, - "outputs": [], - "source": [ - "noise_dir = data_dir / 'noise'\n", - "noise_data_set = 'STRAFFIC,PSTATION'\n", - "\n", - "# Copy script\n", - "get_demand_script = os.path.join(scripts_dir, 'get_demand_data.py')\n", - "if not os.path.exists(get_demand_script):\n", - " !wget -P $scripts_dir https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/scripts/dataset_processing/get_demand_data.py\n", - "\n", - "if not noise_dir.is_dir():\n", - " noise_dir.mkdir(exist_ok=True)\n", - " !python {get_demand_script} --data_root={noise_dir} --data_sets={noise_data_set}\n", - "else:\n", - " print('Noise directory already exists in:', noise_dir)\n", - "\n", - "\n", - "def create_noise_manifest(base_dir, subset, offset=0, duration=None):\n", - " \"\"\"Split the noise data set into train and test subsets.\n", - " \"\"\"\n", - " complete_noise_manifests = glob.glob(str(base_dir / 'manifests' / '*.json'))\n", - " subset_noise_manifest = base_dir / f'{subset}_manifest.json'\n", - " \n", - " subset_metadata = []\n", - "\n", - " for noise_manifest in complete_noise_manifests:\n", - " complete_metadata = read_manifest(noise_manifest)\n", - " \n", - " for item in complete_metadata:\n", - " new_item = item.copy()\n", - " new_item['offset'] = offset\n", - " new_item['duration'] = duration\n", - " subset_metadata.append(new_item)\n", - "\n", - " write_manifest(subset_noise_manifest.as_posix(), subset_metadata)\n", - "\n", - " return subset_noise_manifest\n", - "\n", - "noise_manifest = {\n", - " 'train': create_noise_manifest(noise_dir, 'train', offset=0, duration=200),\n", - " 'test': create_noise_manifest(noise_dir, 'test', offset=200, duration=100),\n", - "}" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "1378d78a", - "metadata": {}, - "source": [ - "For this tutorial, a single-channel noisy dataset is constructed by adding speech and noise.\n", - "\n", - "The following block will add speech and noise and save the noisy data. The noisy data is created by mixing speech and noise at a few pre-defined signal-to-noise ratios (SNRs). Note that a separate manifest will be created for each SNR." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d6c678a0", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "# Suppress output of this cell, since the script used below is relatively verbose.\n", - "\n", - "# Copy script\n", - "add_noise_script = os.path.join(scripts_dir, 'add_noise.py')\n", - "if not os.path.exists(add_noise_script):\n", - " !wget -P $scripts_dir https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/scripts/dataset_processing/add_noise.py\n", - "\n", - "# Generate noisy datasets and save the noise component as well.\n", - "noisy_dir = data_dir / 'noisy'\n", - "noisy_dir.mkdir(exist_ok=True)\n", - "\n", - "for subset in ['train', 'test']:\n", - " noisy_subset_dir = noisy_dir / subset\n", - "\n", - " if not noisy_subset_dir.is_dir():\n", - " noisy_subset_dir.mkdir(exist_ok=True)\n", - " !python {add_noise_script} --input_manifest={speech_manifest[subset]} --noise_manifest={noise_manifest[subset]} --out_dir={noisy_subset_dir} --snrs 0 5 10 15 20 --num_workers 4 --save_noise" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "c4cd1426", - "metadata": {}, - "source": [ - "Training a model requires an input dataset which includes information about the noisy input signal and the desired (target) output signal.\n", - "\n", - "In this tutorial, train and test manifests are created by combining the information from the speech manifests and each noisy manifest generated in the previous step. Note that the final manifests include `noisy_filepath`, `speech_filepath` and `noise_filepath`. These keys can be used to define the input signal and the output signal for the model." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fcfeb639", - "metadata": {}, - "outputs": [], - "source": [ - "dataset_manifest = {\n", - " 'train': data_dir / 'dataset_train.json',\n", - " 'test': data_dir / 'dataset_test.json',\n", - "}\n", - "\n", - "for subset in ['train', 'test']:\n", - " # Load clean manifest\n", - " speech_metadata = read_manifest(speech_manifest[subset])\n", - "\n", - " # Load noisy manifests\n", - " noisy_manifests = glob.glob(str(noisy_dir / subset / 'manifests/*.json'))\n", - " noisy_manifests.sort()\n", - "\n", - " subset_metadata = []\n", - "\n", - " for noisy_manifest in noisy_manifests:\n", - " noisy_metadata = read_manifest(noisy_manifest)\n", - "\n", - " for speech_item, noisy_item in tqdm.tqdm(zip(speech_metadata, noisy_metadata), total=len(noisy_metadata)):\n", - " # Check that the file matches\n", - " assert os.path.basename(speech_item['audio_filepath']) == os.path.basename(noisy_item['audio_filepath']), f'Speech: {speech_item}. Noisy: {noisy_item}'\n", - "\n", - " # Create a new item for the subset manifest\n", - " subset_item = {\n", - " 'noisy_filepath': noisy_item['audio_filepath'],\n", - " 'speech_filepath': speech_item['audio_filepath'],\n", - " 'noise_filepath': noisy_item['noise_filepath'],\n", - " 'duration': noisy_item['duration'],\n", - " 'offset': noisy_item.get('offset', 0)\n", - " }\n", - "\n", - " subset_metadata.append(subset_item)\n", - "\n", - " # Save the subset manifest\n", - " write_manifest(dataset_manifest[subset].as_posix(), subset_metadata)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "aa4248ab", - "metadata": {}, - "source": [ - "### Model configuration\n", - "\n", - "Here, a simple encoder-mask-decoder model will be used to process the noisy input signal and produce an enhanced output signal.\n", - "\n", - "In general, an encoder-mask-decoder model can be confugured using `EncMaskDecAudioToAudioModel` class, which is depicted in the following block diagram." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "9ce4eebe", - "metadata": {}, - "source": [ - "\"encmaskdecoder_model\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "c236542c", - "metadata": {}, - "source": [ - "The model structure can briefly be described as follows:\n", - "* Input to the model is a time-domain signal.\n", - "* Encoder transforms the input signal to the analysis domain.\n", - "* Mask estimator estimates a mask used to generate the output signal.\n", - "* Mask processor combines the estimated mask and the encoded input to produce the encoded output.\n", - "* Decoder transforms the encoded output into a time-domain signal.\n", - "* Output is a time-domain signal." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "fb046853", - "metadata": {}, - "source": [ - "For this example, the model will be configured to use a fixed short-time Fourier transform-based encoder and decoder, and the mask will be estimated using a recurrent neural network. The model used here is depicted in the following block diagram." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "4404d6af", - "metadata": {}, - "source": [ - "\"single_output_example_model\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "45670180", - "metadata": {}, - "source": [ - "In this particular configuration, the model structure can be described as follows:\n", - "* `AudioToSpectrogram` implements the analysis STFT transform.\n", - "* `MaskEstimatorRNN` is a mask estimator using RNNs.\n", - "* `MaskReferenceChannel` is a simple processor whith applies the estimated mask on the reference channel. In this tutorial, the input signal has only a single channel, so the reference channel will be set to `0`.\n", - "* `SpectrogramToAudio` implements the synthesis STFT transform." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "8e3624c8", - "metadata": {}, - "source": [ - "The following cell will load and show the default configuration for the model depicted above." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "002b917c", - "metadata": {}, - "outputs": [], - "source": [ - "from omegaconf import OmegaConf\n", - "\n", - "config_dir = root_dir / 'conf'\n", - "config_dir.mkdir(exist_ok=True)\n", - "\n", - "config_path = config_dir / 'masking.yaml'\n", - "\n", - "if not config_path.is_file():\n", - " !wget https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/examples/audio_tasks/conf/masking.yaml -P {config_dir.as_posix()}\n", - "\n", - "config = OmegaConf.load(config_path)\n", - "config = OmegaConf.to_container(config, resolve=True)\n", - "config = OmegaConf.create(config)\n", - "\n", - "print('Loaded config')\n", - "print(OmegaConf.to_yaml(config))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "65cab3ad", - "metadata": {}, - "source": [ - "Training dataset is configured with the following parameters\n", - "* `manifest_filepath` points to a manifest file, with each line containing a dictionary corresponding to a single example\n", - "* `input_key` is the key corresponding to the input audio signal in the example dictionary\n", - "* `target_key` is the key corresponding to the desired output (target) audio signal in the example dictionary\n", - "* `min_duration` can be used to filter out short examples" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "91717b15", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup training dataset\n", - "config.model.train_ds.manifest_filepath = dataset_manifest['train'].as_posix()\n", - "config.model.train_ds.input_key = 'noisy_filepath'\n", - "config.model.train_ds.target_key = 'speech_filepath'\n", - "config.model.train_ds.min_duration = 0 # load all audio files, without filtering short ones\n", - "\n", - "print(\"Train dataset config:\")\n", - "print(OmegaConf.to_yaml(config.model.train_ds))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "c11592e4", - "metadata": {}, - "source": [ - "Validation and test datasets can be configured in the same way as the training dataset. Here, we use the same dataset for validation and testing purposes for simplicity." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d8bc0a0a", - "metadata": {}, - "outputs": [], - "source": [ - "# Use test manifest for validation and test sets\n", - "config.model.validation_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", - "config.model.validation_ds.input_key = 'noisy_filepath'\n", - "config.model.validation_ds.target_key = 'speech_filepath'\n", - "\n", - "config.model.test_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", - "config.model.test_ds.input_key = 'noisy_filepath'\n", - "config.model.test_ds.target_key = 'speech_filepath'\n", - "\n", - "print(\"Validation dataset config:\")\n", - "print(OmegaConf.to_yaml(config.model.validation_ds))\n", - "\n", - "print(\"Test dataset config:\")\n", - "print(OmegaConf.to_yaml(config.model.test_ds))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "1bc0f8f3", - "metadata": {}, - "source": [ - "Metrics for validation and test set are configured in the following cell.\n", - "\n", - "In this tutorial, signal-to-distortion ratio (SDR) and scale-invariant SDR from torch metrics are used [4]." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "82de1dbb", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup metrics to compute on validation and test sets\n", - "metrics = {\n", - " 'sisdr': {\n", - " '_target_': 'torchmetrics.audio.ScaleInvariantSignalDistortionRatio',\n", - " },\n", - " 'sdr': {\n", - " '_target_': 'torchmetrics.audio.SignalDistortionRatio',\n", - " }\n", - "}\n", - "config.model.metrics.validation = metrics\n", - "config.model.metrics.test = metrics\n", - "\n", - "print(\"Metrics config:\")\n", - "print(OmegaConf.to_yaml(config.model.metrics))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "4eda2d65", - "metadata": {}, - "source": [ - "### Trainer configuration\n", - "NeMo models are primarily PyTorch Lightning modules and therefore are entirely compatible with the PyTorch Lightning ecosystem." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e53ba6ef", - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Trainer config:\")\n", - "print(OmegaConf.to_yaml(config.trainer))" - ] - }, - { - "cell_type": "markdown", - "id": "a9201689", - "metadata": {}, - "source": [ - "We can modify some trainer configs for this tutorial.\n", - "Most importantly, the number of epochs is set to a small value, to limit the runtime for the purpose of this example." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "17b7499f", - "metadata": {}, - "outputs": [], - "source": [ - "# Checks if we have GPU available and uses it\n", - "accelerator = 'gpu' if torch.cuda.is_available() else 'cpu'\n", - "config.trainer.devices = 1\n", - "config.trainer.accelerator = accelerator\n", - "\n", - "# Reduces maximum number of epochs for quick demonstration\n", - "config.trainer.max_epochs = 10\n", - "\n", - "# Remove distributed training flags\n", - "config.trainer.strategy = None\n", - "\n", - "# Instantiate the trainer\n", - "trainer = pl.Trainer(**config.trainer)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "053192a4", - "metadata": {}, - "source": [ - "### Experiment manager\n", - "\n", - "NeMo has an experiment manager that handles logging and checkpointing." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ccb8948d", - "metadata": {}, - "outputs": [], - "source": [ - "from nemo.utils.exp_manager import exp_manager\n", - "\n", - "exp_dir = exp_manager(trainer, config.get(\"exp_manager\", None))\n", - "# The exp_dir provides a path to the current experiment for easy access\n", - "\n", - "print(\"Experiment directory:\")\n", - "print(exp_dir)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "8bb583f8", - "metadata": {}, - "source": [ - "### Model instantiation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6905fea2", - "metadata": {}, - "outputs": [], - "source": [ - "from nemo.collections import asr as nemo_asr\n", - "\n", - "enhancement_model = nemo_asr.models.EncMaskDecAudioToAudioModel(cfg=config.model, trainer=trainer)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "6ee1a6d2", - "metadata": {}, - "source": [ - "### Training\n", - "Create a Tensorboard visualization to monitor progress" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dc9e7639", - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " from google import colab\n", - " COLAB_ENV = True\n", - "except (ImportError, ModuleNotFoundError):\n", - " COLAB_ENV = False\n", - "\n", - "# Load the TensorBoard notebook extension\n", - "if COLAB_ENV:\n", - " %load_ext tensorboard\n", - " %tensorboard --logdir {exp_dir}\n", - "else:\n", - " print(\"To use tensorboard, please use this notebook in a Google Colab environment.\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "5e962b9b", - "metadata": {}, - "source": [ - "Training can be started using `trainer.fit`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0b00b3f4", - "metadata": {}, - "outputs": [], - "source": [ - "trainer.fit(enhancement_model)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "5b5c1e78", - "metadata": {}, - "source": [ - "After the training is completed, the configured metrics can be easily computed on the test set as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5216195d", - "metadata": {}, - "outputs": [], - "source": [ - "trainer.test(enhancement_model, ckpt_path=None)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "bf5b73e6", - "metadata": {}, - "source": [ - "### Inference\n", - "\n", - "The following cell provides an example of inference on an single audio file.\n", - "For simplicity, the audio file information is taken from the test dataset." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6b5cf923", - "metadata": {}, - "outputs": [], - "source": [ - "# Load a single audio example from the test set\n", - "test_metadata = read_manifest(dataset_manifest['test'].as_posix())\n", - "\n", - "# Path to audio files\n", - "noisy_filepath = test_metadata[-1]['noisy_filepath'] # noisy audio\n", - "speech_filepath = test_metadata[-1]['speech_filepath'] # clean speech\n", - "noise_filepath = test_metadata[-1]['noise_filepath'] # corresponding noise\n", - "\n", - "# Load audio\n", - "noisy_signal = AudioSegment.from_file(noisy_filepath, target_sr=sample_rate).samples\n", - "speech_signal = AudioSegment.from_file(speech_filepath, target_sr=sample_rate).samples\n", - "\n", - "# Process using the model\n", - "noisy_tensor = torch.tensor(noisy_signal).reshape(1, 1, -1) # (batch, channel, time)\n", - "output_tensor, _ = enhancement_model(input_signal=noisy_tensor)\n", - "output_signal = output_tensor[0][0].detach().numpy()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "90f6c0d0", - "metadata": {}, - "source": [ - "Signals can be easily plotted and signal metrics can be calculated for the given example." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4aec5c64", - "metadata": {}, - "outputs": [], - "source": [ - "# Show noisy and clean signals\n", - "show_metrics(signal=noisy_signal, reference=speech_signal, tag='Noisy signal', sample_rate=sample_rate)\n", - "show_metrics(signal=output_signal, reference=speech_signal, tag='Output signal', sample_rate=sample_rate)\n", - "\n", - "# Show signals\n", - "show_signal(speech_signal, tag='Speech signal')\n", - "show_signal(noisy_signal, tag='Noisy signal')\n", - "show_signal(output_signal, tag='Output signal')\n", - "\n", - "# Play audio\n", - "print('Speech signal')\n", - "ipd.display(ipd.Audio(speech_signal, rate=sample_rate))\n", - "\n", - "print('Noisy signal')\n", - "ipd.display(ipd.Audio(noisy_signal, rate=sample_rate))\n", - "\n", - "print('Output signal')\n", - "ipd.display(ipd.Audio(output_signal, rate=sample_rate))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "77135c85", - "metadata": {}, - "source": [ - "If necessary, it is easy to limit the amount of suppression by setting the value of `mask_min` of the `mask_processor`.\n", - "\n", - "This will add a lower-bound (limit) on the applied mask, thereby limiting the amount of signal suppression that the model can achieve." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b13e5c83", - "metadata": {}, - "outputs": [], - "source": [ - "from nemo.collections.asr.parts.utils.audio_utils import db2mag\n", - "\n", - "# Limit suppression to 10dB\n", - "min_mask_db = -10\n", - "enhancement_model.mask_processor.mask_min = db2mag(min_mask_db)\n", - "\n", - "output_tensor_min_mask, _ = enhancement_model(input_signal=noisy_tensor)\n", - "output_signal_min_mask = output_tensor_min_mask[0][0].detach().numpy()\n", - "\n", - "print('Noisy signal')\n", - "ipd.display(ipd.Audio(noisy_signal, rate=sample_rate))\n", - "\n", - "print(f'Output signal with min_mask = {min_mask_db}dB')\n", - "ipd.display(ipd.Audio(output_signal_min_mask, rate=sample_rate))\n", - "\n", - "show_metrics(signal=output_signal_min_mask, reference=speech_signal, tag=f'Output signal with min_mask = {min_mask_db}dB', sample_rate=sample_rate)\n", - "show_signal(output_signal_min_mask, tag=f'Output signal with min_mask = {min_mask_db}dB')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "381479ba", - "metadata": {}, - "source": [ - "### Training a multi-output model\n", - "\n", - "The simple model used in this tutorial can be easily configured to generate two outputs.\n", - "This can be useful for either performing speech enhancement or source separation.\n", - "\n", - "For example, it may be beneficial to enforce noise reconstruction in the loss, as has been demonstrated in [3].\n", - "\n", - "This can be achieved with small changes to the model configuration.\n", - "\n", - "\"dual_output_example_model\"" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "9cd911f9", - "metadata": {}, - "source": [ - "For start, load the same config as earlier and set the number of outputs to two." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "196096ce", - "metadata": {}, - "outputs": [], - "source": [ - "# Dual output model\n", - "config_dual_output = OmegaConf.load(config_path)\n", - "\n", - "# Set model to have two outputs\n", - "config_dual_output.model.num_outputs = 2\n", - "config_dual_output = OmegaConf.to_container(config_dual_output, resolve=True)\n", - "config_dual_output = OmegaConf.create(config_dual_output)\n", - "\n", - "print('Loaded config for dual output model')\n", - "print(OmegaConf.to_yaml(config_dual_output))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "8a17a741", - "metadata": {}, - "source": [ - "Now, datasets need to be configured to generate a single-channel input signal and a two-channel output signal.\n", - "This can be easily achieved by providing multiple keys for `target_key`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5134ba29", - "metadata": {}, - "outputs": [], - "source": [ - "# Use the same dataset as before\n", - "config_dual_output.model.train_ds.manifest_filepath = dataset_manifest['train'].as_posix()\n", - "\n", - "# The input signal is the same as before\n", - "config_dual_output.model.train_ds.input_key = 'noisy_filepath'\n", - "\n", - "# The target signal is not two channel:\n", - "# the first channel is the clean speech signal\n", - "# the second channel is the noise signal\n", - "config_dual_output.model.train_ds.target_key = 'speech_filepath,noise_filepath'\n", - "config_dual_output.model.train_ds.min_duration = 0 # load all audio files, without filtering out short files\n", - "\n", - "# Validation and test datasets are configured in the same way\n", - "config_dual_output.model.validation_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", - "config_dual_output.model.validation_ds.input_key = 'noisy_filepath'\n", - "config_dual_output.model.validation_ds.target_key = 'speech_filepath,noise_filepath'\n", - "\n", - "config_dual_output.model.test_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", - "config_dual_output.model.test_ds.input_key = 'noisy_filepath'\n", - "config_dual_output.model.test_ds.target_key = 'speech_filepath,noise_filepath'" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "c544b494", - "metadata": {}, - "source": [ - "The loss can be easily configured by assigning weights for each output of the model.\n", - "For example, equal weight for speech- and noise-related loss can be configured as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "096f8c25", - "metadata": {}, - "outputs": [], - "source": [ - "# Asign equal weights to speech and noise loss\n", - "# total_loss = 0.5 * speech_loss + 0.5 * noise_loss\n", - "config_dual_output.model.loss.weight = [0.5, 0.5]" - ] - }, - { - "cell_type": "markdown", - "id": "5b9574a6", - "metadata": {}, - "source": [ - "Similarly, it is possible to calculate metrics for each output channel separately.\n", - "For example, this can be configured as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68b25ade", - "metadata": {}, - "outputs": [], - "source": [ - "# Setup metrics\n", - "metrics = {\n", - " # Calculate speech metric using the first channel\n", - " 'speech_sisdr': {\n", - " '_target_': 'torchmetrics.audio.ScaleInvariantSignalDistortionRatio',\n", - " 'channel': 0,\n", - " },\n", - " 'speech_sdr': {\n", - " '_target_': 'torchmetrics.audio.SignalDistortionRatio',\n", - " 'channel': 0,\n", - " },\n", - " # Calculate noise metric using the second channel\n", - " 'noise_sisdr': {\n", - " '_target_': 'torchmetrics.audio.ScaleInvariantSignalDistortionRatio',\n", - " 'channel': 1,\n", - " },\n", - " 'noise_sdr': {\n", - " '_target_': 'torchmetrics.audio.SignalDistortionRatio',\n", - " 'channel': 1,\n", - " },\n", - "}\n", - "config_dual_output.model.metrics.validation = metrics\n", - "config_dual_output.model.metrics.test = metrics" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "b26b09d4", - "metadata": {}, - "source": [ - "The trainer and the experiment manager are set up in the exactly the same way as earlier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "039b2f7d", - "metadata": {}, - "outputs": [], - "source": [ - "# Checks if we have GPU available and uses it\n", - "accelerator = 'gpu' if torch.cuda.is_available() else 'cpu'\n", - "config_dual_output.trainer.devices = 1\n", - "config_dual_output.trainer.accelerator = accelerator\n", - "\n", - "# Reduces maximum number of epochs for quick demonstration\n", - "config_dual_output.trainer.max_epochs = 10\n", - "\n", - "# Remove distributed training flags\n", - "config_dual_output.trainer.strategy = None\n", - "\n", - "# Instantiate the trainer\n", - "trainer = pl.Trainer(**config_dual_output.trainer)\n", - "\n", - "exp_dir = exp_manager(trainer, config_dual_output.get(\"exp_manager\", None))\n", - "# The exp_dir provides a path to the current experiment for easy access\n", - "\n", - "print(\"Experiment directory:\")\n", - "print(exp_dir)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "14f43c9d", - "metadata": {}, - "source": [ - "As earlier, training can be started using `trainer.fit`:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ca7de4ce", - "metadata": {}, - "outputs": [], - "source": [ - "trainer.fit(dual_output_model)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "3ae5a38e", - "metadata": {}, - "source": [ - "As earlier, metrics on the test set can be easily calculated as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f17ed63", - "metadata": {}, - "outputs": [], - "source": [ - "trainer.test(dual_output_model, ckpt_path=None)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "110df622", - "metadata": {}, - "source": [ - "As earlier, it is easy to run inference on an inout signal, and the output will contain multiple channels." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cd797128", - "metadata": {}, - "outputs": [], - "source": [ - "# (batch, channel, time)\n", - "noisy_tensor = torch.tensor(noisy_signal).reshape(1, 1, -1)\n", - "processed_tensor, _ = dual_output_model(input_signal=noisy_tensor)\n", - "\n", - "# First output channel is the speech estimate\n", - "output_speech = processed_tensor[0][0].detach().numpy()\n", - "\n", - "# The second output channel is the noise estimate\n", - "output_noise = processed_tensor[0][1].detach().numpy()\n", - "\n", - "show_metrics(signal=output_speech, reference=speech_signal, tag='Output speech', sample_rate=sample_rate)\n", - "\n", - "show_signal(noisy_signal, tag='Noisy input')\n", - "show_signal(output_speech, tag='Output speech')\n", - "show_signal(output_noise, tag='Output noise')\n", - "\n", - "print('Noisy input')\n", - "ipd.display(ipd.Audio(noisy_signal, rate=sample_rate))\n", - "\n", - "print('Output speech')\n", - "ipd.display(ipd.Audio(output_speech, rate=sample_rate))\n", - "\n", - "print('Output noise')\n", - "ipd.display(ipd.Audio(output_noise, rate=sample_rate))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "46a855e3", - "metadata": {}, - "source": [ - "### References\n", - "\n", - "[1] V. Panayotov, G. Chen, D. Povery, S. Khudanpur, LibriSpeech: An ASR corpus based on public domain audio books, ICASSP 2015\n", - "\n", - "[2] J. Thieman, N. Ito, V. Emmanuel, DEMAND: collection of multi-channel recordings of acoustic noise in diverse environments, ICA 2013\n", - "\n", - "[3] K. Kinoshita, T. Ochiai, M. Delcroix, T. Nakatani, Improving noise robust automatic speech recognition with single-channel time-domain enhancement network, ICASSP 2020.\n", - "\n", - "[4] https://github.com/Lightning-AI/torchmetrics" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.10.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} + "cells": [ + { + "cell_type": "markdown", + "id": "2fb43f21", + "metadata": { + "id": "2fb43f21" + }, + "source": [ + "# Introduction\n", + "\n", + "The goal of this tutorial is to demonstrate the basic steps required to setup and train train a simple single-channel speech enhancement model in NeMo.\n", + "\n", + "This notebook covers the following steps:\n", + "\n", + "* Download speech and noise data\n", + "* Prepare the training data by mixing speech and noise\n", + "* Configure and train a simple single-output model\n", + "* Configure and train a simple dual-output model\n", + "\n", + "Note that this tutorial is only for demonstration purposes.\n", + "To achieve best performance for a particular use case, carefully prepared data and more advanced models should be used.\n", + "\n", + "*Disclamer:*\n", + "User is responsible for checking the content of datasets and the applicable licenses and determining if suitable for the intended use." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50525ece", + "metadata": { + "id": "50525ece" + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "You can run either this notebook locally (if you have all the dependencies and a GPU) or on Google Colab.\n", + "\n", + "Instructions for setting up Colab are as follows:\n", + "1. Open a new Python 3 notebook.\n", + "2. Import this notebook from GitHub (File -> Upload Notebook -> \"GITHUB\" tab -> copy/paste GitHub URL)\n", + "3. Connect to an instance with a GPU (Runtime -> Change runtime type -> select \"GPU\" for hardware accelerator)\n", + "4. Run this cell to set up dependencies.\n", + "5. Restart the runtime (Runtime -> Restart Runtime) for any upgraded packages to take effect\n", + "\"\"\"\n", + "\n", + "GIT_USER, GIT_BRANCH = 'NVIDIA', 'main'\n", + "\n", + "if 'google.colab' in str(get_ipython()):\n", + "\n", + " # Install dependencies\n", + " !pip install wget\n", + " !apt-get install sox libsndfile1 ffmpeg\n", + " !pip install text-unidecode\n", + " !pip install matplotlib>=3.3.2\n", + "\n", + " ## Install NeMo\n", + " !python -m pip install git+https://github.com/{GIT_USER}/NeMo.git@{GIT_BRANCH}#egg=nemo_toolkit[all]\n", + "\n", + " ## Install TorchAudio\n", + " !pip install torchaudio>=0.13.0 -f https://download.pytorch.org/whl/torch_stable.html" + ] + }, + { + "cell_type": "markdown", + "id": "765e8b8a", + "metadata": { + "id": "765e8b8a" + }, + "source": [ + "The following cell will take care of the necessary imports and prepare utility functions used throughout the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9248dd5f", + "metadata": { + "id": "9248dd5f" + }, + "outputs": [], + "source": [ + "import glob\n", + "import librosa\n", + "import os\n", + "import torch\n", + "import tqdm\n", + "\n", + "import IPython.display as ipd\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pytorch_lightning as pl\n", + "import soundfile as sf\n", + "\n", + "from omegaconf import OmegaConf, open_dict\n", + "from pathlib import Path\n", + "from torchmetrics.functional.audio import signal_distortion_ratio, scale_invariant_signal_distortion_ratio\n", + "\n", + "from nemo.utils.notebook_utils import download_an4\n", + "from nemo.collections.asr.parts.preprocessing.segment import AudioSegment\n", + "from nemo.collections.asr.parts.utils.manifest_utils import read_manifest, write_manifest\n", + "\n", + "\n", + "# Used to download data processing scripts\n", + "USER = 'anteju' # TODO: change to 'NVIDIA'\n", + "BRANCH = 'dev/se-tutorial' # TODO: change to 'main'\n", + "\n", + "\n", + "# Utility functions for displaying signals and metrics\n", + "def show_signal(signal: np.ndarray, sample_rate: int = 16000, tag: str = 'Signal'):\n", + " \"\"\"Show the time-domain signal and its spectrogram.\n", + " \"\"\"\n", + " fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 2.5))\n", + "\n", + " # show waveform\n", + " t = np.arange(0, len(signal)) / sample_rate\n", + "\n", + " ax[0].plot(t, signal)\n", + " ax[0].set_xlim(0, t.max())\n", + " ax[0].grid()\n", + " ax[0].set_xlabel('time / s')\n", + " ax[0].set_ylabel('amplitude')\n", + " ax[0].set_title(tag)\n", + "\n", + " n_fft = 1024\n", + " hop_length = 256\n", + "\n", + " D = librosa.amplitude_to_db(np.abs(librosa.stft(signal, n_fft=n_fft, hop_length=hop_length)), ref=np.max)\n", + " img = librosa.display.specshow(D, y_axis='linear', x_axis='time', sr=sample_rate, n_fft=n_fft, hop_length=hop_length, ax=ax[1])\n", + " ax[1].set_title(tag)\n", + " \n", + " plt.tight_layout()\n", + " plt.colorbar(img, format=\"%+2.f dB\", ax=ax)\n", + "\n", + "def show_metrics(signal: np.ndarray, reference: np.ndarray, sample_rate: int = 16000, tag: str = 'Signal'):\n", + " \"\"\"Show metrics for the time-domain signal and the reference signal.\n", + " \"\"\"\n", + " sdr = signal_distortion_ratio(preds=torch.tensor(signal), target=torch.tensor(reference))\n", + " sisdr = scale_invariant_signal_distortion_ratio(preds=torch.tensor(signal), target=torch.tensor(reference))\n", + " print(tag)\n", + " print('\\tsdr: ', sdr.item())\n", + " print('\\tsisdr:', sisdr.item())" + ] + }, + { + "cell_type": "markdown", + "id": "bfa2199e", + "metadata": { + "id": "bfa2199e" + }, + "source": [ + "### Data preparation" + ] + }, + { + "cell_type": "markdown", + "id": "0aa05a36", + "metadata": { + "id": "0aa05a36" + }, + "source": [ + "In this notebook, it is assumed that all audio will be resampled to 16kHz and the data and configuration will be stored under `root_dir` as defined below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e790630", + "metadata": { + "id": "8e790630" + }, + "outputs": [], + "source": [ + "# sample rate used throughout the notebook\n", + "sample_rate = 16000\n", + "\n", + "# root directory for data preparation, configurations, etc\n", + "root_dir = Path('./')\n", + "\n", + "# data directory\n", + "data_dir = root_dir / 'data'\n", + "data_dir.mkdir(exist_ok=True)\n", + "\n", + "# scripts directory\n", + "scripts_dir = root_dir / 'scripts'\n", + "scripts_dir.mkdir(exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "id": "9af717ad", + "metadata": { + "id": "9af717ad" + }, + "source": [ + "Clean speech data is used to prepare datasets used for training a simple speech enhancement model.\n", + "\n", + "In this tutorial, a subset of LibriSpeech dataset [1] will be downloaded and used as the speech material.\n", + "The following cell will download and prepare the speech data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e1c5a60a", + "metadata": { + "id": "e1c5a60a" + }, + "outputs": [], + "source": [ + "speech_dir = data_dir / 'speech'\n", + "speech_data_set = 'mini'\n", + "\n", + "# Copy script\n", + "get_librispeech_script = os.path.join(scripts_dir, 'get_librispeech_data.py')\n", + "if not os.path.exists(get_librispeech_script):\n", + " !wget -P $scripts_dir https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/scripts/dataset_processing/get_librispeech_data.py\n", + "\n", + "# Dowload the data\n", + "if not speech_dir.is_dir():\n", + " speech_dir.mkdir(exist_ok=True)\n", + " !python {get_librispeech_script} --data_root={speech_dir} --data_set={speech_data_set}\n", + "else:\n", + " print('Speech dataset already exists in:', speech_dir)\n", + "\n", + "# Reduce the size of test dataset for this tutorial to 1000 clean utterances for train and 100 clean utterances for test\n", + "train_metadata = read_manifest(speech_dir / 'train_clean_5.json')\n", + "write_manifest(speech_dir / 'train.json', train_metadata[:1000])\n", + "\n", + "test_metadata = read_manifest(speech_dir / 'dev_clean_2.json')\n", + "write_manifest(speech_dir / 'test.json', test_metadata[:100])\n", + "\n", + "# Speech manifests\n", + "speech_manifest = {\n", + " 'train': speech_dir / 'train.json',\n", + " 'test': speech_dir / 'test.json',\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "06f07374", + "metadata": { + "id": "06f07374" + }, + "source": [ + "Noise data will be mixed with the downloaded speech data to prepare a noisy dataset.\n", + "\n", + "The following cell will download and prepare the noise data using a subset of the DEMAND dataset [2] will be downloaded and used as the noise data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1de1089", + "metadata": { + "id": "b1de1089" + }, + "outputs": [], + "source": [ + "noise_dir = data_dir / 'noise'\n", + "noise_data_set = 'STRAFFIC,PSTATION'\n", + "\n", + "# Copy script\n", + "get_demand_script = os.path.join(scripts_dir, 'get_demand_data.py')\n", + "if not os.path.exists(get_demand_script):\n", + " !wget -P $scripts_dir https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/scripts/dataset_processing/get_demand_data.py\n", + "\n", + "if not noise_dir.is_dir():\n", + " noise_dir.mkdir(exist_ok=True)\n", + " !python {get_demand_script} --data_root={noise_dir} --data_sets={noise_data_set}\n", + "else:\n", + " print('Noise directory already exists in:', noise_dir)\n", + "\n", + "\n", + "def create_noise_manifest(base_dir, subset, offset=0, duration=None):\n", + " \"\"\"Split the noise data set into train and test subsets.\n", + " \"\"\"\n", + " complete_noise_manifests = glob.glob(str(base_dir / 'manifests' / '*.json'))\n", + " subset_noise_manifest = base_dir / f'{subset}_manifest.json'\n", + " \n", + " subset_metadata = []\n", + "\n", + " for noise_manifest in complete_noise_manifests:\n", + " complete_metadata = read_manifest(noise_manifest)\n", + " \n", + " for item in complete_metadata:\n", + " new_item = item.copy()\n", + " new_item['offset'] = offset\n", + " new_item['duration'] = duration\n", + " subset_metadata.append(new_item)\n", + "\n", + " write_manifest(subset_noise_manifest.as_posix(), subset_metadata)\n", + "\n", + " return subset_noise_manifest\n", + "\n", + "noise_manifest = {\n", + " 'train': create_noise_manifest(noise_dir, 'train', offset=0, duration=200),\n", + " 'test': create_noise_manifest(noise_dir, 'test', offset=200, duration=100),\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1378d78a", + "metadata": { + "id": "1378d78a" + }, + "source": [ + "For this tutorial, a single-channel noisy dataset is constructed by adding speech and noise.\n", + "\n", + "The following block will add speech and noise and save the noisy data. The noisy data is created by mixing speech and noise at a few pre-defined signal-to-noise ratios (SNRs). Note that a separate manifest will be created for each SNR." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6c678a0", + "metadata": { + "id": "d6c678a0" + }, + "outputs": [], + "source": [ + "%%capture\n", + "# Suppress output of this cell, since the script used below is relatively verbose.\n", + "\n", + "# Copy script\n", + "add_noise_script = os.path.join(scripts_dir, 'add_noise.py')\n", + "if not os.path.exists(add_noise_script):\n", + " !wget -P $scripts_dir https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/scripts/dataset_processing/add_noise.py\n", + "\n", + "# Generate noisy datasets and save the noise component as well.\n", + "noisy_dir = data_dir / 'noisy'\n", + "noisy_dir.mkdir(exist_ok=True)\n", + "\n", + "for subset in ['train', 'test']:\n", + " noisy_subset_dir = noisy_dir / subset\n", + "\n", + " if not noisy_subset_dir.is_dir():\n", + " noisy_subset_dir.mkdir(exist_ok=True)\n", + " !python {add_noise_script} --input_manifest={speech_manifest[subset]} --noise_manifest={noise_manifest[subset]} --out_dir={noisy_subset_dir} --snrs 0 5 10 15 20 --num_workers 4 --save_noise" + ] + }, + { + "cell_type": "markdown", + "id": "c4cd1426", + "metadata": { + "id": "c4cd1426" + }, + "source": [ + "Training a model requires an input dataset which includes information about the noisy input signal and the desired (target) output signal.\n", + "\n", + "In this tutorial, train and test manifests are created by combining the information from the speech manifests and each noisy manifest generated in the previous step. Note that the final manifests include `noisy_filepath`, `speech_filepath` and `noise_filepath`. These keys can be used to define the input signal and the output signal for the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcfeb639", + "metadata": { + "id": "fcfeb639" + }, + "outputs": [], + "source": [ + "dataset_manifest = {\n", + " 'train': data_dir / 'dataset_train.json',\n", + " 'test': data_dir / 'dataset_test.json',\n", + "}\n", + "\n", + "for subset in ['train', 'test']:\n", + " # Load clean manifest\n", + " speech_metadata = read_manifest(speech_manifest[subset])\n", + "\n", + " # Load noisy manifests\n", + " noisy_manifests = glob.glob(str(noisy_dir / subset / 'manifests/*.json'))\n", + " noisy_manifests.sort()\n", + "\n", + " subset_metadata = []\n", + "\n", + " for noisy_manifest in noisy_manifests:\n", + " noisy_metadata = read_manifest(noisy_manifest)\n", + "\n", + " for speech_item, noisy_item in tqdm.tqdm(zip(speech_metadata, noisy_metadata), total=len(noisy_metadata)):\n", + " # Check that the file matches\n", + " assert os.path.basename(speech_item['audio_filepath']) == os.path.basename(noisy_item['audio_filepath']), f'Speech: {speech_item}. Noisy: {noisy_item}'\n", + "\n", + " # Create a new item for the subset manifest\n", + " subset_item = {\n", + " 'noisy_filepath': noisy_item['audio_filepath'],\n", + " 'speech_filepath': speech_item['audio_filepath'],\n", + " 'noise_filepath': noisy_item['noise_filepath'],\n", + " 'duration': noisy_item['duration'],\n", + " 'offset': noisy_item.get('offset', 0)\n", + " }\n", + "\n", + " subset_metadata.append(subset_item)\n", + "\n", + " # Save the subset manifest\n", + " write_manifest(dataset_manifest[subset].as_posix(), subset_metadata)" + ] + }, + { + "cell_type": "markdown", + "id": "aa4248ab", + "metadata": { + "id": "aa4248ab" + }, + "source": [ + "### Model configuration\n", + "\n", + "Here, a simple encoder-mask-decoder model will be used to process the noisy input signal and produce an enhanced output signal.\n", + "\n", + "In general, an encoder-mask-decoder model can be confugured using `EncMaskDecAudioToAudioModel` class, which is depicted in the following block diagram." + ] + }, + { + "cell_type": "markdown", + "id": "9ce4eebe", + "metadata": { + "id": "9ce4eebe" + }, + "source": [ + "\"encmaskdecoder_model\"" + ] + }, + { + "cell_type": "markdown", + "id": "c236542c", + "metadata": { + "id": "c236542c" + }, + "source": [ + "The model structure can briefly be described as follows:\n", + "* Input to the model is a time-domain signal.\n", + "* Encoder transforms the input signal to the analysis domain.\n", + "* Mask estimator estimates a mask used to generate the output signal.\n", + "* Mask processor combines the estimated mask and the encoded input to produce the encoded output.\n", + "* Decoder transforms the encoded output into a time-domain signal.\n", + "* Output is a time-domain signal." + ] + }, + { + "cell_type": "markdown", + "id": "fb046853", + "metadata": { + "id": "fb046853" + }, + "source": [ + "For this example, the model will be configured to use a fixed short-time Fourier transform-based encoder and decoder, and the mask will be estimated using a recurrent neural network. The model used here is depicted in the following block diagram." + ] + }, + { + "cell_type": "markdown", + "id": "4404d6af", + "metadata": { + "id": "4404d6af" + }, + "source": [ + "\"single_output_example_model\"" + ] + }, + { + "cell_type": "markdown", + "id": "45670180", + "metadata": { + "id": "45670180" + }, + "source": [ + "In this particular configuration, the model structure can be described as follows:\n", + "* `AudioToSpectrogram` implements the analysis STFT transform.\n", + "* `MaskEstimatorRNN` is a mask estimator using RNNs.\n", + "* `MaskReferenceChannel` is a simple processor whith applies the estimated mask on the reference channel. In this tutorial, the input signal has only a single channel, so the reference channel will be set to `0`.\n", + "* `SpectrogramToAudio` implements the synthesis STFT transform." + ] + }, + { + "cell_type": "markdown", + "id": "8e3624c8", + "metadata": { + "id": "8e3624c8" + }, + "source": [ + "The following cell will load and show the default configuration for the model depicted above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "002b917c", + "metadata": { + "id": "002b917c" + }, + "outputs": [], + "source": [ + "config_dir = root_dir / 'conf'\n", + "config_dir.mkdir(exist_ok=True)\n", + "\n", + "config_path = config_dir / 'masking.yaml'\n", + "\n", + "if not config_path.is_file():\n", + " !wget https://raw.githubusercontent.com/{GIT_USER}/NeMo/{GIT_BRANCH}/examples/audio_tasks/conf/masking.yaml -P {config_dir.as_posix()}\n", + "\n", + "config = OmegaConf.load(config_path)\n", + "config = OmegaConf.to_container(config, resolve=True)\n", + "config = OmegaConf.create(config)\n", + "\n", + "print('Loaded config')\n", + "print(OmegaConf.to_yaml(config))" + ] + }, + { + "cell_type": "markdown", + "id": "65cab3ad", + "metadata": { + "id": "65cab3ad" + }, + "source": [ + "Training dataset is configured with the following parameters\n", + "* `manifest_filepath` points to a manifest file, with each line containing a dictionary corresponding to a single example\n", + "* `input_key` is the key corresponding to the input audio signal in the example dictionary\n", + "* `target_key` is the key corresponding to the desired output (target) audio signal in the example dictionary\n", + "* `min_duration` can be used to filter out short examples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91717b15", + "metadata": { + "id": "91717b15" + }, + "outputs": [], + "source": [ + "# Setup training dataset\n", + "config.model.train_ds.manifest_filepath = dataset_manifest['train'].as_posix()\n", + "config.model.train_ds.input_key = 'noisy_filepath'\n", + "config.model.train_ds.target_key = 'speech_filepath'\n", + "config.model.train_ds.min_duration = 0 # load all audio files, without filtering short ones\n", + "\n", + "print(\"Train dataset config:\")\n", + "print(OmegaConf.to_yaml(config.model.train_ds))" + ] + }, + { + "cell_type": "markdown", + "id": "c11592e4", + "metadata": { + "id": "c11592e4" + }, + "source": [ + "Validation and test datasets can be configured in the same way as the training dataset. Here, we use the same dataset for validation and testing purposes for simplicity." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8bc0a0a", + "metadata": { + "id": "d8bc0a0a" + }, + "outputs": [], + "source": [ + "# Use test manifest for validation and test sets\n", + "config.model.validation_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", + "config.model.validation_ds.input_key = 'noisy_filepath'\n", + "config.model.validation_ds.target_key = 'speech_filepath'\n", + "\n", + "config.model.test_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", + "config.model.test_ds.input_key = 'noisy_filepath'\n", + "config.model.test_ds.target_key = 'speech_filepath'\n", + "\n", + "print(\"Validation dataset config:\")\n", + "print(OmegaConf.to_yaml(config.model.validation_ds))\n", + "\n", + "print(\"Test dataset config:\")\n", + "print(OmegaConf.to_yaml(config.model.test_ds))" + ] + }, + { + "cell_type": "markdown", + "id": "1bc0f8f3", + "metadata": { + "id": "1bc0f8f3" + }, + "source": [ + "Metrics for validation and test set are configured in the following cell.\n", + "\n", + "In this tutorial, signal-to-distortion ratio (SDR) and scale-invariant SDR from torch metrics are used [4]." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82de1dbb", + "metadata": { + "id": "82de1dbb" + }, + "outputs": [], + "source": [ + "# Setup metrics to compute on validation and test sets\n", + "metrics = OmegaConf.create({\n", + " 'sisdr': {\n", + " '_target_': 'torchmetrics.audio.ScaleInvariantSignalDistortionRatio',\n", + " },\n", + " 'sdr': {\n", + " '_target_': 'torchmetrics.audio.SignalDistortionRatio',\n", + " }\n", + "})\n", + "config.model.metrics.validation = metrics\n", + "config.model.metrics.test = metrics\n", + "\n", + "print(\"Metrics config:\")\n", + "print(OmegaConf.to_yaml(config.model.metrics))" + ] + }, + { + "cell_type": "markdown", + "id": "4eda2d65", + "metadata": { + "id": "4eda2d65" + }, + "source": [ + "### Trainer configuration\n", + "NeMo models are primarily PyTorch Lightning modules and therefore are entirely compatible with the PyTorch Lightning ecosystem." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e53ba6ef", + "metadata": { + "id": "e53ba6ef" + }, + "outputs": [], + "source": [ + "print(\"Trainer config:\")\n", + "print(OmegaConf.to_yaml(config.trainer))" + ] + }, + { + "cell_type": "markdown", + "id": "a9201689", + "metadata": { + "id": "a9201689" + }, + "source": [ + "We can modify some trainer configs for this tutorial.\n", + "Most importantly, the number of epochs is set to a small value, to limit the runtime for the purpose of this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17b7499f", + "metadata": { + "id": "17b7499f" + }, + "outputs": [], + "source": [ + "# Checks if we have GPU available and uses it\n", + "accelerator = 'gpu' if torch.cuda.is_available() else 'cpu'\n", + "config.trainer.devices = 1\n", + "config.trainer.accelerator = accelerator\n", + "\n", + "# Reduces maximum number of epochs for quick demonstration\n", + "config.trainer.max_epochs = 10\n", + "\n", + "# Remove distributed training flags\n", + "config.trainer.strategy = None\n", + "\n", + "# Instantiate the trainer\n", + "trainer = pl.Trainer(**config.trainer)" + ] + }, + { + "cell_type": "markdown", + "id": "053192a4", + "metadata": { + "id": "053192a4" + }, + "source": [ + "### Experiment manager\n", + "\n", + "NeMo has an experiment manager that handles logging and checkpointing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ccb8948d", + "metadata": { + "id": "ccb8948d" + }, + "outputs": [], + "source": [ + "from nemo.utils.exp_manager import exp_manager\n", + "\n", + "exp_dir = exp_manager(trainer, config.get(\"exp_manager\", None))\n", + "# The exp_dir provides a path to the current experiment for easy access\n", + "\n", + "print(\"Experiment directory:\")\n", + "print(exp_dir)" + ] + }, + { + "cell_type": "markdown", + "id": "8bb583f8", + "metadata": { + "id": "8bb583f8" + }, + "source": [ + "### Model instantiation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6905fea2", + "metadata": { + "id": "6905fea2" + }, + "outputs": [], + "source": [ + "from nemo.collections import asr as nemo_asr\n", + "\n", + "enhancement_model = nemo_asr.models.EncMaskDecAudioToAudioModel(cfg=config.model, trainer=trainer)" + ] + }, + { + "cell_type": "markdown", + "id": "6ee1a6d2", + "metadata": { + "id": "6ee1a6d2" + }, + "source": [ + "### Training\n", + "Create a Tensorboard visualization to monitor progress" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc9e7639", + "metadata": { + "id": "dc9e7639" + }, + "outputs": [], + "source": [ + "try:\n", + " from google import colab\n", + " COLAB_ENV = True\n", + "except (ImportError, ModuleNotFoundError):\n", + " COLAB_ENV = False\n", + "\n", + "# Load the TensorBoard notebook extension\n", + "if COLAB_ENV:\n", + " %load_ext tensorboard\n", + " %tensorboard --logdir {exp_dir}\n", + "else:\n", + " print(\"To use tensorboard, please use this notebook in a Google Colab environment.\")" + ] + }, + { + "cell_type": "markdown", + "id": "5e962b9b", + "metadata": { + "id": "5e962b9b" + }, + "source": [ + "Training can be started using `trainer.fit`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b00b3f4", + "metadata": { + "id": "0b00b3f4" + }, + "outputs": [], + "source": [ + "trainer.fit(enhancement_model)" + ] + }, + { + "cell_type": "markdown", + "id": "5b5c1e78", + "metadata": { + "id": "5b5c1e78" + }, + "source": [ + "After the training is completed, the configured metrics can be easily computed on the test set as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5216195d", + "metadata": { + "id": "5216195d" + }, + "outputs": [], + "source": [ + "trainer.test(enhancement_model, ckpt_path=None)" + ] + }, + { + "cell_type": "markdown", + "id": "bf5b73e6", + "metadata": { + "id": "bf5b73e6" + }, + "source": [ + "### Inference\n", + "\n", + "The following cell provides an example of inference on an single audio file.\n", + "For simplicity, the audio file information is taken from the test dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b5cf923", + "metadata": { + "id": "6b5cf923" + }, + "outputs": [], + "source": [ + "# Load a single audio example from the test set\n", + "test_metadata = read_manifest(dataset_manifest['test'].as_posix())\n", + "\n", + "# Path to audio files\n", + "noisy_filepath = test_metadata[-1]['noisy_filepath'] # noisy audio\n", + "speech_filepath = test_metadata[-1]['speech_filepath'] # clean speech\n", + "noise_filepath = test_metadata[-1]['noise_filepath'] # corresponding noise\n", + "\n", + "# Load audio\n", + "noisy_signal = AudioSegment.from_file(noisy_filepath, target_sr=sample_rate).samples\n", + "speech_signal = AudioSegment.from_file(speech_filepath, target_sr=sample_rate).samples\n", + "\n", + "# Process using the model\n", + "noisy_tensor = torch.tensor(noisy_signal).reshape(1, 1, -1) # (batch, channel, time)\n", + "with torch.no_grad():\n", + " output_tensor, _ = enhancement_model(input_signal=noisy_tensor)\n", + "output_signal = output_tensor[0][0].detach().numpy()" + ] + }, + { + "cell_type": "markdown", + "id": "90f6c0d0", + "metadata": { + "id": "90f6c0d0" + }, + "source": [ + "Signals can be easily plotted and signal metrics can be calculated for the given example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4aec5c64", + "metadata": { + "id": "4aec5c64" + }, + "outputs": [], + "source": [ + "# Show noisy and clean signals\n", + "show_metrics(signal=noisy_signal, reference=speech_signal, tag='Noisy signal', sample_rate=sample_rate)\n", + "show_metrics(signal=output_signal, reference=speech_signal, tag='Output signal', sample_rate=sample_rate)\n", + "\n", + "# Show signals\n", + "show_signal(speech_signal, tag='Speech signal')\n", + "show_signal(noisy_signal, tag='Noisy signal')\n", + "show_signal(output_signal, tag='Output signal')\n", + "\n", + "# Play audio\n", + "print('Speech signal')\n", + "ipd.display(ipd.Audio(speech_signal, rate=sample_rate))\n", + "\n", + "print('Noisy signal')\n", + "ipd.display(ipd.Audio(noisy_signal, rate=sample_rate))\n", + "\n", + "print('Output signal')\n", + "ipd.display(ipd.Audio(output_signal, rate=sample_rate))" + ] + }, + { + "cell_type": "markdown", + "id": "77135c85", + "metadata": { + "id": "77135c85" + }, + "source": [ + "If necessary, it is easy to limit the amount of suppression by setting the value of `mask_min` of the `mask_processor`.\n", + "\n", + "This will add a lower-bound (limit) on the applied mask, thereby limiting the amount of signal suppression that the model can achieve." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b13e5c83", + "metadata": { + "id": "b13e5c83" + }, + "outputs": [], + "source": [ + "from nemo.collections.asr.parts.utils.audio_utils import db2mag\n", + "\n", + "# Limit suppression to 10dB\n", + "min_mask_db = -10\n", + "enhancement_model.mask_processor.mask_min = db2mag(min_mask_db)\n", + "\n", + "with torch.no_grad():\n", + " output_tensor_min_mask, _ = enhancement_model(input_signal=noisy_tensor)\n", + "output_signal_min_mask = output_tensor_min_mask[0][0].detach().numpy()\n", + "\n", + "print('Noisy signal')\n", + "ipd.display(ipd.Audio(noisy_signal, rate=sample_rate))\n", + "\n", + "print(f'Output signal with min_mask = {min_mask_db}dB')\n", + "ipd.display(ipd.Audio(output_signal_min_mask, rate=sample_rate))\n", + "\n", + "show_metrics(signal=output_signal_min_mask, reference=speech_signal, tag=f'Output signal with min_mask = {min_mask_db}dB', sample_rate=sample_rate)\n", + "show_signal(output_signal_min_mask, tag=f'Output signal with min_mask = {min_mask_db}dB')" + ] + }, + { + "cell_type": "markdown", + "id": "381479ba", + "metadata": { + "id": "381479ba" + }, + "source": [ + "### Training a multi-output model\n", + "\n", + "The simple model used in this tutorial can be easily configured to generate two outputs.\n", + "This can be useful for either performing speech enhancement or source separation.\n", + "\n", + "For example, it may be beneficial to enforce noise reconstruction in the loss, as has been demonstrated in [3].\n", + "\n", + "This can be achieved with small changes to the model configuration.\n", + "\n", + "\"dual_output_example_model\"" + ] + }, + { + "cell_type": "markdown", + "id": "9cd911f9", + "metadata": { + "id": "9cd911f9" + }, + "source": [ + "For start, load the same config as earlier and set the number of outputs to two." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "196096ce", + "metadata": { + "id": "196096ce" + }, + "outputs": [], + "source": [ + "# Dual output model\n", + "config_dual_output = OmegaConf.load(config_path)\n", + "\n", + "# Set model to have two outputs\n", + "config_dual_output.model.num_outputs = 2\n", + "config_dual_output = OmegaConf.to_container(config_dual_output, resolve=True)\n", + "config_dual_output = OmegaConf.create(config_dual_output)\n", + "\n", + "print('Loaded config for dual output model')\n", + "print(OmegaConf.to_yaml(config_dual_output))" + ] + }, + { + "cell_type": "markdown", + "id": "8a17a741", + "metadata": { + "id": "8a17a741" + }, + "source": [ + "Now, datasets need to be configured to generate a single-channel input signal and a two-channel output signal.\n", + "This can be easily achieved by providing multiple keys for `target_key`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5134ba29", + "metadata": { + "id": "5134ba29" + }, + "outputs": [], + "source": [ + "# Use the same dataset as before\n", + "config_dual_output.model.train_ds.manifest_filepath = dataset_manifest['train'].as_posix()\n", + "\n", + "# The input signal is the same as before\n", + "config_dual_output.model.train_ds.input_key = 'noisy_filepath'\n", + "\n", + "# The target signal is not two channel:\n", + "# the first channel is the clean speech signal\n", + "# the second channel is the noise signal\n", + "config_dual_output.model.train_ds.target_key = 'speech_filepath,noise_filepath'\n", + "config_dual_output.model.train_ds.min_duration = 0 # load all audio files, without filtering out short files\n", + "\n", + "# Validation and test datasets are configured in the same way\n", + "config_dual_output.model.validation_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", + "config_dual_output.model.validation_ds.input_key = 'noisy_filepath'\n", + "config_dual_output.model.validation_ds.target_key = 'speech_filepath,noise_filepath'\n", + "\n", + "config_dual_output.model.test_ds.manifest_filepath = dataset_manifest['test'].as_posix()\n", + "config_dual_output.model.test_ds.input_key = 'noisy_filepath'\n", + "config_dual_output.model.test_ds.target_key = 'speech_filepath,noise_filepath'" + ] + }, + { + "cell_type": "markdown", + "id": "c544b494", + "metadata": { + "id": "c544b494" + }, + "source": [ + "The loss can be easily configured by assigning weights for each output of the model.\n", + "For example, speech- and noise-related losses with equal weights can be configured as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "096f8c25", + "metadata": { + "id": "096f8c25" + }, + "outputs": [], + "source": [ + "# Asign equal weights to speech and noise loss\n", + "# total_loss = 0.5 * speech_loss + 0.5 * noise_loss\n", + "config_dual_output.model.loss.weight = [0.5, 0.5]" + ] + }, + { + "cell_type": "markdown", + "id": "a0ca1eda", + "metadata": { + "id": "a0ca1eda" + }, + "source": [ + "A mixture consistency layer can be added to enforce the estimated sources (speech and noise, in this case) to be consistent with the input mixture [5]." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a967f683", + "metadata": { + "id": "a967f683" + }, + "outputs": [], + "source": [ + "# Add a mixture consistency projection\n", + "with open_dict(config_dual_output):\n", + " config_dual_output.model.mixture_consistency = OmegaConf.create({\n", + " '_target_': 'nemo.collections.asr.modules.audio_modules.MixtureConsistencyProjection',\n", + " 'weighting': 'power',\n", + " })" + ] + }, + { + "cell_type": "markdown", + "id": "5b9574a6", + "metadata": { + "id": "5b9574a6" + }, + "source": [ + "Metrics can be calculated for each output channel separately.\n", + "If a channel parameter is not provided, the configured metrics are averaged across all channels.\n", + "For example, this can be configured as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68b25ade", + "metadata": { + "id": "68b25ade" + }, + "outputs": [], + "source": [ + "# Setup metrics\n", + "metrics = OmegaConf.create({\n", + " # Calculate speech metric using the first channel\n", + " 'speech_sisdr': {\n", + " '_target_': 'torchmetrics.audio.ScaleInvariantSignalDistortionRatio',\n", + " 'channel': 0,\n", + " },\n", + " 'speech_sdr': {\n", + " '_target_': 'torchmetrics.audio.SignalDistortionRatio',\n", + " 'channel': 0,\n", + " },\n", + " # Calculate noise metric using the second channel\n", + " 'noise_sisdr': {\n", + " '_target_': 'torchmetrics.audio.ScaleInvariantSignalDistortionRatio',\n", + " 'channel': 1,\n", + " },\n", + " 'noise_sdr': {\n", + " '_target_': 'torchmetrics.audio.SignalDistortionRatio',\n", + " 'channel': 1,\n", + " },\n", + "})\n", + "config_dual_output.model.metrics.validation = metrics\n", + "config_dual_output.model.metrics.test = metrics" + ] + }, + { + "cell_type": "markdown", + "id": "b26b09d4", + "metadata": { + "id": "b26b09d4" + }, + "source": [ + "The trainer and the experiment manager are set up in the exactly the same way as earlier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "039b2f7d", + "metadata": { + "id": "039b2f7d" + }, + "outputs": [], + "source": [ + "# Checks if we have GPU available and uses it\n", + "accelerator = 'gpu' if torch.cuda.is_available() else 'cpu'\n", + "config_dual_output.trainer.devices = 1\n", + "config_dual_output.trainer.accelerator = accelerator\n", + "\n", + "# Reduces maximum number of epochs for quick demonstration\n", + "config_dual_output.trainer.max_epochs = 10\n", + "\n", + "# Remove distributed training flags\n", + "config_dual_output.trainer.strategy = None\n", + "\n", + "# Instantiate the trainer\n", + "trainer = pl.Trainer(**config_dual_output.trainer)\n", + "exp_dir = exp_manager(trainer, config_dual_output.get(\"exp_manager\", None))\n", + "\n", + "print(\"Experiment directory:\")\n", + "print(exp_dir)" + ] + }, + { + "cell_type": "markdown", + "id": "14f43c9d", + "metadata": { + "id": "14f43c9d" + }, + "source": [ + "As earlier, training can be started using `trainer.fit`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca7de4ce", + "metadata": { + "id": "ca7de4ce" + }, + "outputs": [], + "source": [ + "dual_output_model = nemo_asr.models.EncMaskDecAudioToAudioModel(cfg=config_dual_output.model, trainer=trainer)\n", + "trainer.fit(dual_output_model)" + ] + }, + { + "cell_type": "markdown", + "id": "3ae5a38e", + "metadata": { + "id": "3ae5a38e" + }, + "source": [ + "As earlier, metrics on the test set can be easily calculated as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f9d68b2", + "metadata": { + "id": "5f9d68b2" + }, + "outputs": [], + "source": [ + "trainer.test(dual_output_model, ckpt_path=None)" + ] + }, + { + "cell_type": "markdown", + "id": "110df622", + "metadata": { + "id": "110df622" + }, + "source": [ + "As earlier, it is easy to run inference on an input signal, and the output will contain multiple channels." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd797128", + "metadata": { + "id": "cd797128" + }, + "outputs": [], + "source": [ + "# (batch, channel, time)\n", + "noisy_tensor = torch.tensor(noisy_signal).reshape(1, 1, -1)\n", + "\n", + "with torch.no_grad():\n", + " processed_tensor, _ = dual_output_model(input_signal=noisy_tensor)\n", + "\n", + "# First output channel is the speech estimate\n", + "output_speech = processed_tensor[0][0].detach().numpy()\n", + "\n", + "# The second output channel is the noise estimate\n", + "output_noise = processed_tensor[0][1].detach().numpy()\n", + "\n", + "show_metrics(signal=output_speech, reference=speech_signal, tag='Output speech', sample_rate=sample_rate)\n", + "\n", + "show_signal(noisy_signal, tag='Noisy input')\n", + "show_signal(output_speech, tag='Output speech')\n", + "show_signal(output_noise, tag='Output noise')\n", + "\n", + "print('Noisy input')\n", + "ipd.display(ipd.Audio(noisy_signal, rate=sample_rate))\n", + "\n", + "print('Output speech')\n", + "ipd.display(ipd.Audio(output_speech, rate=sample_rate))\n", + "\n", + "print('Output noise')\n", + "ipd.display(ipd.Audio(output_noise, rate=sample_rate))" + ] + }, + { + "cell_type": "markdown", + "id": "cd6da1f0", + "metadata": { + "id": "cd6da1f0" + }, + "source": [ + "## Next steps\n", + "This is a simple tutorial which can serve as a starting point for prototyping and experimentation with audio-to-audio models.\n", + "A processed audio output can be used, for example, for ASR or TTS.\n", + "\n", + "For more details about NeMo models and applications in in ASR and TTS, we recommend you checkout other tutorials next:\n", + "\n", + "* [NeMo fundamentals](https://colab.research.google.com/github/NVIDIA/NeMo/blob/stable/tutorials/00_NeMo_Primer.ipynb)\n", + "* [NeMo models](https://colab.research.google.com/github/NVIDIA/NeMo/blob/stable/tutorials/01_NeMo_Models.ipynb)\n", + "* [Speech Recognition](https://colab.research.google.com/github/NVIDIA/NeMo/blob/stable/tutorials/asr/ASR_with_NeMo.ipynb)\n", + "* [Speech Synthesis](https://colab.research.google.com/github/NVIDIA/NeMo/blob/stable/tutorials/tts/Inference_ModelSelect.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "46a855e3", + "metadata": { + "id": "46a855e3" + }, + "source": [ + "## References\n", + "\n", + "[1] V. Panayotov, G. Chen, D. Povery, S. Khudanpur, \"LibriSpeech: An ASR corpus based on public domain audio books,\" ICASSP 2015\n", + "\n", + "[2] J. Thieman, N. Ito, V. Emmanuel, \"DEMAND: collection of multi-channel recordings of acoustic noise in diverse environments,\" ICA 2013\n", + "\n", + "[3] K. Kinoshita, T. Ochiai, M. Delcroix, T. Nakatani, \"Improving noise robust automatic speech recognition with single-channel time-domain enhancement network,\" ICASSP 2020.\n", + "\n", + "[4] https://github.com/Lightning-AI/torchmetrics\n", + "\n", + "[5] Wisdom et al., Differentiable consistency constraints for improved deep speech enhancement, ICASSP 2018" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.10" + }, + "colab": { + "provenance": [], + "gpuType": "T4" + }, + "accelerator": "GPU", + "gpuClass": "standard" + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/tutorials/audio_tasks/speech_enhancement/images/dual_output_example_model.png b/tutorials/audio_tasks/speech_enhancement/images/dual_output_example_model.png deleted file mode 100644 index 1ea01c7e1373e354afb9fd1d6623cb909c2f44c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98511 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 Q`WS$~)78&qol`;+0DUOk(EtDd diff --git a/tutorials/audio_tasks/speech_enhancement/images/encmaskdecoder_model.png b/tutorials/audio_tasks/speech_enhancement/images/encmaskdecoder_model.png deleted file mode 100644 index d5cdfb251872d6daa4e6f4b0d32afbc7969de021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63160 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 diff --git a/tutorials/audio_tasks/speech_enhancement/images/single_output_example_model.png b/tutorials/audio_tasks/speech_enhancement/images/single_output_example_model.png deleted file mode 100644 index 4aae35fbcdbcdb323648124247f74f4561dc864b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74867 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

^IQ5NbPE_>xTERQ-5RGEA1~5yhXjY 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