{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fb38c6f2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "%pylab inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "808ab61e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ['CUDA_VISIBLE_DEVICES'] = ''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6f6fa2f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# cd /home/georg/code/NeMo\n",
    "# git checkout univnet_test\n",
    "# ./reinstall"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ad30d77c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import librosa\n",
    "from scipy.io import wavfile\n",
    "import librosa.display\n",
    "from pydub import AudioSegment\n",
    "from IPython.display import display_html\n",
    "import torch\n",
    "\n",
    "\n",
    "def _array_to_numpy(arr):\n",
    "    # convert to np if torch\n",
    "    if isinstance(arr, torch.Tensor):\n",
    "        arr = arr.detach().cpu().numpy()\n",
    "    # squash extra dimensions\n",
    "    arr = arr.squeeze()\n",
    "    # TODO: deal with 2 channels\n",
    "    if 2 in arr.shape:\n",
    "        raise NotImplementedError(\"stereo detected\")\n",
    "    return arr\n",
    "    \n",
    "    \n",
    "def _array_to_float(arr):\n",
    "    arr = _array_to_numpy(arr)\n",
    "    arr = arr = arr.copy().astype(np.float32) / 32768\n",
    "    return arr\n",
    "\n",
    "\n",
    "def _array_to_int(arr):\n",
    "    arr = _array_to_numpy(arr)\n",
    "    # enforce int16\n",
    "    if arr.dtype == np.int16:\n",
    "        pass\n",
    "    elif arr.dtype in (np.float32, np.float64):\n",
    "        # alert if signal too high\n",
    "        if np.abs(arr).max() > 1:\n",
    "            raise ValueError(\"signal overflow\")\n",
    "        arr = (arr * 32768).clip(-32768, 32767).astype(np.int16)\n",
    "    else:\n",
    "        # TODO: convert other formats\n",
    "        raise NotImplementedError(\"unknown format\")\n",
    "    # alert if audio too loud\n",
    "    if np.abs(arr).mean() / 32768 >= 0.1:\n",
    "        raise ValueError(\"audio seems too loud\")\n",
    "    return arr\n",
    "\n",
    "\n",
    "def plot_ft(arr, window_size=1024, hop_length=512, n_mels=128, sr=22050):\n",
    "    arr = _array_to_float(arr)\n",
    "    window = np.hanning(window_size)\n",
    "    stft= librosa.core.spectrum.stft(arr, n_fft=window_size, hop_length=hop_length, window=window)\n",
    "    out = 2 * np.abs(stft) / np.sum(window)\n",
    "    data = librosa.amplitude_to_db(out, ref=np.max)\n",
    "    plt.figure(figsize=(16, 10))\n",
    "    librosa.display.specshow(data, x_axis='time', y_axis='mel', sr=sr)\n",
    "    plt.set_cmap('afmhot')\n",
    "    \n",
    "\n",
    "def play_array(arr, sr=22050):  \n",
    "    arr = _array_to_int(arr)\n",
    "    display(AudioSegment(\n",
    "        arr.tobytes(), \n",
    "        frame_rate=sr,\n",
    "        sample_width=2, \n",
    "        channels=1\n",
    "    ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e9306a8b",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-01-20 21:00:13 optimizers:52] Apex was not found. Using the lamb or fused_adam optimizer will error out.\n",
      "################################################################################\n",
      "### WARNING, path does not exist: KALDI_ROOT=/mnt/matylda5/iveselyk/Tools/kaldi-trunk\n",
      "###          (please add 'export KALDI_ROOT=<your_path>' in your $HOME/.profile)\n",
      "###          (or run as: KALDI_ROOT=<your_path> python <your_script>.py)\n",
      "################################################################################\n",
      "\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <function get_argmin_mat at 0x7f4907ff5940> is experimental, not ready for production and is not fully supported. Use at your own risk.\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <function getMultiScaleCosAffinityMatrix at 0x7f4907ff59d0> is experimental, not ready for production and is not fully supported. Use at your own risk.\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <function parse_scale_configs at 0x7f490a846550> is experimental, not ready for production and is not fully supported. Use at your own risk.\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <function get_embs_and_timestamps at 0x7f4907ff5af0> is experimental, not ready for production and is not fully supported. Use at your own risk.\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <class 'nemo.collections.tts.modules.univnet_modules.DiscriminatorR'> is experimental, not ready for production and is not fully supported. Use at your own risk.\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <class 'nemo.collections.tts.modules.univnet_modules.MultiResolutionDiscriminator'> is experimental, not ready for production and is not fully supported. Use at your own risk.\n",
      "[NeMo W 2022-01-20 21:00:13 experimental:27] Module <class 'nemo.collections.tts.models.univnet.UnivNetModel'> is experimental, not ready for production and is not fully supported. Use at your own risk.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NeMo I 2022-01-20 21:00:13 cloud:56] Found existing object /home/georg/.cache/torch/NeMo/NeMo_1.6.0rc0/tts_en_fastpitch_align/b50e16c5d695b00855ae53d6ba4e4f7f/tts_en_fastpitch_align.nemo.\n",
      "[NeMo I 2022-01-20 21:00:13 cloud:62] Re-using file from: /home/georg/.cache/torch/NeMo/NeMo_1.6.0rc0/tts_en_fastpitch_align/b50e16c5d695b00855ae53d6ba4e4f7f/tts_en_fastpitch_align.nemo\n",
      "[NeMo I 2022-01-20 21:00:13 common:729] Instantiating model from pre-trained checkpoint\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo E 2022-01-20 21:00:14 vocabs:323] Torch distributed needs to be initialized before you initialized <nemo.collections.common.data.vocabs.Phonemes object at 0x7f490583eca0>. This class is prone to data access race conditions. Now downloading corpora from global rank 0. If other ranks pass this before rank 0, errors might result.\n",
      "[NeMo W 2022-01-20 21:00:15 modelPT:135] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n",
      "    Train config : \n",
      "    dataset:\n",
      "      _target_: nemo.collections.asr.data.audio_to_text.AudioToCharWithPriorAndPitchDataset\n",
      "      manifest_filepath: /raid/LJSpeech/nvidia_ljspeech_train.json\n",
      "      max_duration: null\n",
      "      min_duration: 0.1\n",
      "      int_values: false\n",
      "      normalize: true\n",
      "      sample_rate: 22050\n",
      "      trim: false\n",
      "      sup_data_path: /raid/LJSpeech/prior\n",
      "      n_window_stride: 256\n",
      "      n_window_size: 1024\n",
      "      pitch_fmin: 80\n",
      "      pitch_fmax: 640\n",
      "      pitch_avg: 211.27540199742586\n",
      "      pitch_std: 52.1851002822779\n",
      "      vocab:\n",
      "        notation: phonemes\n",
      "        punct: true\n",
      "        spaces: true\n",
      "        stresses: true\n",
      "        add_blank_at: None\n",
      "        pad_with_space: true\n",
      "        chars: true\n",
      "        improved_version_g2p: true\n",
      "    dataloader_params:\n",
      "      drop_last: false\n",
      "      shuffle: true\n",
      "      batch_size: 32\n",
      "      num_workers: 12\n",
      "    \n",
      "[NeMo W 2022-01-20 21:00:15 modelPT:142] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n",
      "    Validation config : \n",
      "    dataset:\n",
      "      _target_: nemo.collections.asr.data.audio_to_text.AudioToCharWithPriorAndPitchDataset\n",
      "      manifest_filepath: /raid/LJSpeech/nvidia_ljspeech_val.json\n",
      "      max_duration: null\n",
      "      min_duration: null\n",
      "      int_values: false\n",
      "      normalize: true\n",
      "      sample_rate: 22050\n",
      "      trim: false\n",
      "      sup_data_path: /raid/LJSpeech/prior\n",
      "      n_window_stride: 256\n",
      "      n_window_size: 1024\n",
      "      pitch_fmin: 80\n",
      "      pitch_fmax: 640\n",
      "      pitch_avg: 211.27540199742586\n",
      "      pitch_std: 52.1851002822779\n",
      "      vocab:\n",
      "        notation: phonemes\n",
      "        punct: true\n",
      "        spaces: true\n",
      "        stresses: true\n",
      "        add_blank_at: None\n",
      "        pad_with_space: true\n",
      "        chars: true\n",
      "        improved_version_g2p: true\n",
      "    dataloader_params:\n",
      "      drop_last: false\n",
      "      shuffle: false\n",
      "      batch_size: 32\n",
      "      num_workers: 8\n",
      "    \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NeMo I 2022-01-20 21:00:15 features:264] PADDING: 1\n",
      "[NeMo I 2022-01-20 21:00:15 features:281] STFT using torch\n",
      "[NeMo I 2022-01-20 21:00:16 save_restore_connector:149] Model FastPitchModel was successfully restored from /home/georg/.cache/torch/NeMo/NeMo_1.6.0rc0/tts_en_fastpitch_align/b50e16c5d695b00855ae53d6ba4e4f7f/tts_en_fastpitch_align.nemo.\n"
     ]
    }
   ],
   "source": [
    "# Load PastPitch\n",
    "from nemo.collections.tts.models import FastPitchModel\n",
    "spec_generator = FastPitchModel.from_pretrained(\"tts_en_fastpitch\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "29316557",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-01-20 21:00:36 modelPT:135] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n",
      "    Train config : \n",
      "    dataset:\n",
      "      _target_: nemo.collections.tts.data.datalayers.AudioDataset\n",
      "      manifest_filepath: /home/tkdrlf9202/Datasets/LibriTTS-22k/train-all.json\n",
      "      max_duration: null\n",
      "      min_duration: 0.75\n",
      "      n_segments: 16384\n",
      "      trim: false\n",
      "    dataloader_params:\n",
      "      drop_last: false\n",
      "      shuffle: true\n",
      "      batch_size: 8\n",
      "      num_workers: 4\n",
      "    \n",
      "[NeMo W 2022-01-20 21:00:36 modelPT:142] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n",
      "    Validation config : \n",
      "    dataset:\n",
      "      _target_: nemo.collections.tts.data.datalayers.AudioDataset\n",
      "      manifest_filepath: /home/tkdrlf9202/Datasets/LibriTTS-22k/dev-clean-mini.json\n",
      "      max_duration: null\n",
      "      min_duration: null\n",
      "      n_segments: -1\n",
      "      trim: false\n",
      "    dataloader_params:\n",
      "      drop_last: false\n",
      "      shuffle: false\n",
      "      batch_size: 16\n",
      "      num_workers: 1\n",
      "    \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NeMo I 2022-01-20 21:00:36 features:264] PADDING: 0\n",
      "[NeMo I 2022-01-20 21:00:36 features:281] STFT using torch\n",
      "[NeMo I 2022-01-20 21:00:36 features:283] STFT using exact pad\n",
      "[NeMo I 2022-01-20 21:00:36 features:264] PADDING: 0\n",
      "[NeMo I 2022-01-20 21:00:36 features:281] STFT using torch\n",
      "[NeMo I 2022-01-20 21:00:36 features:283] STFT using exact pad\n",
      "[NeMo I 2022-01-20 21:00:36 save_restore_connector:149] Model UnivNetModel was successfully restored from /home/georg/models/tts_en_libritts_multispeaker_univnet.nemo.\n"
     ]
    }
   ],
   "source": [
    "# Load UnivNet\n",
    "from nemo.collections.tts.models import UnivNetModel\n",
    "model = UnivNetModel.restore_from(\"/home/georg/models/tts_en_lj_univnet.nemo\")\n",
    "# model = UnivNetModel.restore_from(\"/home/georg/models/tts_en_libritts_multispeaker_univnet.nemo\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e1b07a6f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate audio\n",
    "import soundfile as sf\n",
    "parsed = spec_generator.parse(\"You can type your sentence here to get nemo to produce speech.\")\n",
    "spectrogram = spec_generator.generate_spectrogram(tokens=parsed)#, speaker=5)\n",
    "audio = model.convert_spectrogram_to_audio(spec=spectrogram)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "16ac21f3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "                    <audio controls>\n",
       "                        <source src=\"data:audio/mpeg;base64,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\" type=\"audio/mpeg\"/>\n",
       "                        Your browser does not support the audio element.\n",
       "                    </audio>\n",
       "                  "
      ],
      "text/plain": [
       "<pydub.audio_segment.AudioSegment at 0x7f490815eaf0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "play_array(audio)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "78c7597a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ### Save the audio to disk in a file called speech.wav\n",
    "# sf.write(\"speech.wav\", audio.to('cpu').numpy(), 22050)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "49acccfe",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "383e9c06",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27eb4c9b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "69dd213b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e744b44f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c105d405",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
