{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "collapsed_sections": [], "authorship_tag": "ABX9TyN7lDdQ3iB8T1SI4BKFzkWz", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU", "gpuClass": "standard" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "source": [ "Voice Changer Simple (デモ版)\n", "---\n", "\n", "このノートはVoice ChangerをColab上で動かすデモ版です。\n", "\n", "正式版はローカルPCのDocker上で動かすアプリケーションです。\n", "\n", "正式版は、多くの場合より少ないタイムラグで滑らかに音声を変換できます。\n", "\n", "詳細な使用方法はこちらの[リポジトリ](https://github.com/w-okada/voice-changer)からご確認ください。\n" ], "metadata": { "id": "Lbbmx_Vjl0zo" } }, { "cell_type": "markdown", "source": [ "# GPUを確認\n", "GPUを用いたほうが高速に処理が行えます。\n", "\n", "下記のコマンドでGPUが確認できない場合は、上のメニューから\n", "\n", "「ランタイム」→「ランタイムの変更」→「ハードウェア アクセラレータ」\n", "\n", "でGPUを選択してください。" ], "metadata": { "id": "oUKi1NYMmXrr" } }, { "cell_type": "code", "source": [ "# (1) GPUの確認\n", "!nvidia-smi" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vV1t7PBRm-o6", "outputId": "2ab5d79e-0fe1-4e48-9fb4-8a61399e0b60" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Sun Oct 30 10:03:39 2022 \n", "+-----------------------------------------------------------------------------+\n", "| NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 |\n", "|-------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|===============================+======================+======================|\n", "| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n", "| N/A 35C P8 9W / 70W | 0MiB / 15109MiB | 0% Default |\n", "| | | N/A |\n", "+-------------------------------+----------------------+----------------------+\n", " \n", "+-----------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=============================================================================|\n", "| No running processes found |\n", "+-----------------------------------------------------------------------------+\n" ] } ] }, { "cell_type": "markdown", "source": [ "# 使用するモデルとコンフィグファイルの指定\n", "\n", "使用するトレーニング済みのモデルと、トレーニングで使用したコンフィグファイルのパスを指定してください。\n", "\n", "多くの場合はGoogle Driveに格納されているファイルを使用すると思います。その場合は、下の(2-2)のセルを実行してドライブをマウントしてください" ], "metadata": { "id": "mHvGrgaWnIPA" } }, { "cell_type": "code", "source": [ "# # (2-1) 使用するモデルとコンフィグファイルの指定\n", "# CONFIG=\"/content/drive/MyDrive/VoiceChanger/config.json\"\n", "# MODEL=\"/content/drive/MyDrive/VoiceChanger/G_326000.pth\"" ], "metadata": { "id": "nSXATMWYb4Ik" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2wxD-gRSMU5R", "outputId": "dabd982a-87c7-44d1-b9e8-986691190771" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Mounted at /content/drive\n" ] } ], "source": [ "# # (2-2) Google Driveのマウント\n", "# from google.colab import drive\n", "# drive.mount('/content/drive')" ] }, { "cell_type": "markdown", "source": [ "# リポジトリのクローン\n", "リポジトリをクローンします" ], "metadata": { "id": "sLBfykjBnjWc" } }, { "cell_type": "code", "source": [ "# (3) リポジトリのクローン\n", "!git clone --depth 1 https://github.com/isletennos/MMVC_Trainer.git -b v1.3.1.3 /MMVC_Trainer\n", "!git clone --depth 1 https://github.com/w-okada/voice-changer.git -b dev\n", "%cd voice-changer/demo/\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "86wTFmqsNMnD", "outputId": "a52d5b0e-826e-445d-cd3a-4a42cbd52212" }, "execution_count": 36, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "fatal: destination path '/MMVC_Trainer' already exists and is not an empty directory.\n", "Cloning into 'voice-changer'...\n", "remote: Enumerating objects: 88, done.\u001b[K\n", "remote: Counting objects: 100% (88/88), done.\u001b[K\n", "remote: Compressing objects: 100% (74/74), done.\u001b[K\n", "remote: Total 88 (delta 14), reused 57 (delta 6), pack-reused 0\u001b[K\n", "Unpacking objects: 100% (88/88), done.\n", "/content/voice-changer/demo/voice-changer/demo/voice-changer/demo/voice-changer/demo/voice-changer/demo\n" ] } ] }, { "cell_type": "markdown", "source": [ "# ファイルの配置\n", "アプリケーションの挙動を記した設定ファイルをコピーします(4-1)。(4-2)はコピーした設定ファイルを表示しています。もしかしたらうまく動かないときに役立つかもしれません。" ], "metadata": { "id": "jmDY8W_fnuSi" } }, { "cell_type": "code", "source": [ "# (4-1) 設定ファイルの配置\n", "!cp ../template/setting_mmvc_colab.json ../frontend/dist/assets/setting.json\n" ], "metadata": { "id": "Bn4kV8TgXp8i" }, "execution_count": 37, "outputs": [] }, { "cell_type": "code", "source": [ "# (4-2) 設定ファイルの確認\n", "!cat ../frontend/dist/assets/setting.json\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "pjxPsOOaXXTj", "outputId": "425a36dd-fbdc-4f55-825e-a2c7026f2aab" }, "execution_count": 38, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "{\n", " \"app_title\": \"voice-changer\",\n", " \"majar_mode\": \"colab\",\n", " \"voice_changer_server_url\": \"/test\",\n", " \"sample_rate\": 48000,\n", " \"buffer_size\": 1024,\n", " \"prefix_chunk_size\": 36,\n", " \"chunk_size\": 36,\n", " \"speaker_ids\": [100, 107, 101, 102, 103],\n", " \"speaker_names\": [\"ずんだもん\", \"user\", \"そら\", \"めたん\", \"つむぎ\"],\n", " \"src_id\": 107,\n", " \"dst_id\": 100,\n", " \"vf_enable\": true,\n", " \"voice_changer_mode\": \"realtime\",\n", " \"gpu\": 0,\n", " \"available_gpus\": [-1, 0, 1, 2, 3, 4],\n", " \"avatar\": {\n", " \"enable_avatar\": true, \n", " \"motion_capture_face\": true,\n", " \"motion_capture_upperbody\": true,\n", " \"lip_overwrite_with_voice\": true,\n", " \"avatar_url\": \"./assets/vrm/zundamon/zundamon.vrm\",\n", " \"backgournd_image_url\": \"./assets/images/bg_natural_sougen.jpg\",\n", " \"background_color\": \"#0000dd\",\n", " \"chroma_key\": \"#0000dd\",\n", " \"avatar_canvas_size\": [1280, 720],\n", " \"screen_canvas_size\": [1280, 720]\n", " },\n", " \"advance\": {\n", " \"avatar_draw_skip_rate\": 3,\n", " \"screen_draw_skip_rate\": 3,\n", " \"visualizer_draw_skip_rate\": 3,\n", " \"cross_fade_lower_value\": 0.1,\n", " \"cross_fade_offset_rate\": 0.3,\n", " \"cross_fade_end_rate\": 0.6,\n", " \"cross_fade_type\": 2\n", " }\n", "}\n" ] } ] }, { "cell_type": "markdown", "source": [ "# モジュールのインストール\n", "\n", "必要なモジュールをインストールします。" ], "metadata": { "id": "8Na2PbLZSWgZ" } }, { "cell_type": "code", "source": [ "# (5) 設定ファイルの確認\n", "!apt-get install -y espeak libsndfile1-dev &> /dev/null\n", "!pip install unidecode &> /dev/null\n", "!pip install phonemizer &> /dev/null\n", "!pip install retry &> /dev/null\n", "!pip install python-socketio &> /dev/null\n", "!pip install fastapi &> /dev/null\n", "!pip install python-multipart &> /dev/null\n", "!pip install uvicorn &> /dev/null\n", "!pip install websockets &> /dev/null\n", "!pip install pyOpenSSL &> /dev/null\n" ], "metadata": { "id": "LwZAAuqxX7yY" }, "execution_count": 44, "outputs": [] }, { "cell_type": "markdown", "source": [ "# サーバの起動\n", "\n", "サーバを起動します。(6-1)\n", "\n", "サーバの起動状況を確認します。(6-2) \n", "\n", "このセルは繰り返し実行することになるのでCtrl+Retでセルを実行してください。\n", "\n", "アクセスできるようになるまで、1~2分かかるようです。コーヒーでも飲みに行きましょう。\n", "\n", "下記のようなテキストが表示されたら起動完了です。\n", "\n", "**`DEBUG:asyncio:Using selector: EpollSelector`**\n", "\n", "```\n", " Phase name:__main__\n", " PHASE3:__main__\n", " PHASE1:__main__\n", "Start MMVC SocketIO Server\n", " CONFIG:None, MODEL:None\n", "DEBUG:asyncio:Using selector: EpollSelector\n", "```\n", "\n" ], "metadata": { "id": "-_2OcN9Borke" } }, { "cell_type": "code", "source": [ "# (6-1) サーバの起動\n", "import random\n", "PORT = 10000 + random.randint(1, 9999)\n", "LOG_FILE = f\"LOG_FILE_{PORT}\"\n", "\n", "get_ipython().system_raw(f'python3 MMVCServerSIO.py -p {PORT} --colab True >{LOG_FILE} 2>&1 &')\n", "#print(f\"PORT:{PORT}, LOG_FILE:{LOG_FILE}\")" ], "metadata": { "id": "G-nMdPxEW1rc", "outputId": "ed5fc2d9-f1c5-4aa3-df8d-e306de2e2a30", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": 40, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "PORT:19751, LOG_FILE:LOG_FILE_19751\n" ] } ] }, { "cell_type": "code", "source": [ "# (6-2) サーバの起動確認 (Ctrl+Retで実行)\n", "!tail -20 {LOG_FILE}" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "chu06KpAjEK6", "outputId": "e6b67606-1279-49aa-e276-4e2bb83284c1" }, "execution_count": 45, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\u001b[32m Phase name:__main__\u001b[0m\n", "\u001b[32m PHASE3:__main__\u001b[0m\n", "\u001b[32m PHASE1:__main__\u001b[0m\n", "\u001b[17mStart MMVC SocketIO Server\u001b[0m\n", "\u001b[34m CONFIG:None, MODEL:None\u001b[0m\n", "DEBUG:asyncio:Using selector: EpollSelector\n", "\u001b[32m Phase name:MMVCServerSIO\u001b[0m\n", "\u001b[32m PHASE3:MMVCServerSIO\u001b[0m\n", "File saved to: G_326000.pth\n", "Load: config.json, G_326000.pth\n", "INFO:root:Loaded checkpoint 'model_upload_dir/G_326000.pth' (iteration 1136)\n" ] } ] }, { "cell_type": "markdown", "source": [ "# プロキシを起動\n", "ウェブサーバへのアクセスをするためのプロキシを起動します。\n", "\n", "表示されたURLをクリックして開くと別タブでアプリが開きます。\n", "\n", "Colabなので、ロードにある程度時間がかかります(30秒くらい)。" ], "metadata": { "id": "WhxcFLQEpctq" } }, { "cell_type": "code", "source": [ "# (7) プロキシを起動\n", "from google.colab.output import eval_js\n", "proxy = eval_js( \"google.colab.kernel.proxyPort(\" + str(PORT) + \")\" )\n", "print(f\"{proxy}front/\")" ], "metadata": { "id": "nkRjZm95l87C", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "bbc830e9-209a-4b71-891d-8cf78cf3077d" }, "execution_count": 43, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "https://w6x1mbngbj-496ff2e9c6d22116-19751-colab.googleusercontent.com/front/\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "axkt5BjhoiPV" }, "execution_count": null, "outputs": [] } ] }