{
   "nbformat":4,
   "nbformat_minor":0,
   "metadata":{
      "colab":{
         "private_outputs":true,
         "provenance":[
            
         ]
      },
      "kernelspec":{
         "name":"python3",
         "display_name":"Python 3"
      },
      "language_info":{
         "name":"python"
      },
      "accelerator":"GPU",
      "gpuClass":"standard"
   },
   "cells":[
      {
         "cell_type":"markdown",
         "source":[
            "## Initialization"
         ],
         "metadata":{
            "id":"ni41hmE03DL6"
         }
      },
      {
         "cell_type":"code",
         "execution_count":null,
         "metadata":{
            "id":"FtsMKKfH18iM"
         },
         "outputs":[
            
         ],
         "source":[
            "!git clone https://git.ecker.tech/mrq/ai-voice-cloning/\n",
            "%cd ai-voice-cloning\n",
            "\n",
            "!git submodule init\n",
            "!git submodule update --remote\n",
            "\n",
            "# TODO: fix venvs working for subprocess.Popen calling a bash script\n",
            "#!apt install python3.8-venv\n",
            "#!python -m venv venv\n",
            "#!source ./venv/bin/activate\n",
            "\n",
            "!python -m pip install --upgrade pip\n",
            "!pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116\n",
            "!python -m pip install -r ./dlas/requirements.txt\n",
            "!python -m pip install -r ./tortoise-tts/requirements.txt\n",
            "!python -m pip install -r ./requirements.txt\n",
            "!python -m pip install -e ./tortoise-tts/\n",
            "\n",
            "!rm ./tortoise-tts/{main,webui}.py"
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "# Update Repos"
         ],
         "metadata":{
            "id":"IzrGt5IcHlAD"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "# for my debugging purposes\n",
            "%cd /content/ai-voice-cloning/\n",
            "!./update.sh"
         ],
         "metadata":{
            "id":"3DktoOXSHmtw"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "# Mount Drive"
         ],
         "metadata":{
            "id":"2Y4t9zDIZMTg"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "# only run once, this will save all userdata to your Drive\n",
            "# it shouldn't delete through symlinks, but you never know\n",
            "\n",
            "from google.colab import drive\n",
            "\n",
            "%cd /content/ai-voice-cloning\n",
            "drive.flush_and_unmount()\n",
            "!rm -r ./{training,results,voices,config}\n",
            "drive.mount('/content/drive')\n",
            "!mkdir /content/drive/MyDrive/ai-voice-cloning/\n",
            "!mv /content/drive/MyDrive/{training,results,voices,config} /content/drive/MyDrive/ai-voice-cloning\n",
            "!mkdir /content/drive/MyDrive/ai-voice-cloning/{training,results,voices,config}\n",
            "!ln -s /content/drive/MyDrive/ai-voice-cloning/{training,results,voices,config} ./"
         ],
         "metadata":{
            "id":"SGt9gyvubveT"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "## Running (Inlined)"
         ],
         "metadata":{
            "id":"o1gkfw3B3JSk"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "%cd /content/ai-voice-cloning\n",
            "#!source ./venv/bin/activate\n",
            "\n",
            "import os\n",
            "import sys\n",
            "\n",
            "sys.argv = [\"\"]\n",
            "if './src/' not in sys.path:\n",
            "\tsys.path.append('./src/')\n",
            "if './tortoise-tts/' not in sys.path:\n",
            "\tsys.path.append('./tortoise-tts/')\n",
            "\n",
            "if 'TORTOISE_MODELS_DIR' not in os.environ:\n",
            "\tos.environ['TORTOISE_MODELS_DIR'] = os.path.realpath(os.path.join(os.getcwd(), './models/tortoise/'))\n",
            "\n",
            "if 'TRANSFORMERS_CACHE' not in os.environ:\n",
            "\tos.environ['TRANSFORMERS_CACHE'] = os.path.realpath(os.path.join(os.getcwd(), './models/transformers/'))\n",
            "\n",
            "import utils\n",
            "import webui\n",
            "\n",
            "args = utils.setup_args()\n",
            "ui = webui.setup_gradio()\n",
            "# Be very, very sure to check \"Defer TTS Load\" in Settings, then restart, before you start training\n",
            "# You'll crash the runtime if you don't\n",
            "if not args.defer_tts_load:\n",
            "\tutils.setup_tortoise()\n",
            "\n",
            "ui.launch(share=True, prevent_thread_lock=True, height=1000)\n",
            "ui.block_thread()"
         ],
         "metadata":{
            "id":"c_EQZLTA19c7"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "## Running (non-inlined)"
         ],
         "metadata":{
            "id":"EM3iNqgJF6Be"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "%cd /content/ai-voice-cloning/\n",
            "!./start.sh"
         ],
         "metadata":{
            "id":"QRA8jF3cF-YJ"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "# Restart Runtime"
         ],
         "metadata":{
            "id":"vH9KU7SMGDxb"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "!rm ./tortoise-tts/{main,webui}.py\n",
            "exit()"
         ],
         "metadata":{
            "id":"EWeyUPvgGDX5"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "# Fallback Training"
         ],
         "metadata":{
            "id":"ggLY9A9KA21D"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "# This is in case you can't get training through the web UI\n",
            "%cd /content/ai-voice-cloning\n",
            "!python ./dlas/codes/train.py -opt ./training/finetune.yaml"
         ],
         "metadata":{
            "id":"-KayB8klA5tY"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      },
      {
         "cell_type":"markdown",
         "source":[
            "## Exporting"
         ],
         "metadata":{
            "id":"2AnVQxEJx47p"
         }
      },
      {
         "cell_type":"code",
         "source":[
            "# if you're not using drive mounting\n",
            "%cd /content/ai-voice-cloning\n",
            "!apt install -y p7zip-full\n",
            "from datetime import datetime\n",
            "timestamp = datetime.now().strftime('%m-%d-%Y_%H:%M:%S')\n",
            "!mkdir -p \"../{timestamp}/results\"\n",
            "!mv ./results/* \"../{timestamp}/results/.\"\n",
            "!mv ./training/* \"../{timestamp}/training/.\"\n",
            "!7z a -t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on \"../{timestamp}.7z\" \"../{timestamp}/\"\n",
            "!ls ~/\n",
            "!echo \"Finished zipping, archive is available at {timestamp}.7z\""
         ],
         "metadata":{
            "id":"YOACiDCXx72G"
         },
         "execution_count":null,
         "outputs":[
            
         ]
      }
   ]
}