Open1

Tsukasa SpeechをWindows+Dockerで動かすメモ

レオンレオン

Tsukasa_SpeechをWindows + Dockerで動かす方法

TTSモデルのTsukasa_SpeechをWindows + Dockerで動かす方法を書きます

Tsukasa Speechとは

Style TTS2をベースにしたText-to-Speechモデルです
詳しくは本家のモデルカード(日本語版)を参考にしてください
Hugging Face Spaceでモデルを試せます

環境

  • Windows 11
  • NVIDIA GeForce GTX 1650 Ti
  • CUDA 12.4
  • Docker 27.2.0

Dockerfile

  • ベースイメージはnvidia/cuda:12.4.1-base-ubuntu22.04
    • GPUを使わない、あるいはホストPCにCUDAが入ってないなら素のubuntuでも動くはず
  • 必要なもの
    • git
      • ないとTukasa Speechをインストールできない
    • git-lfs
      • gitででかいファイルを扱うのに使う
      • 忘れるとモデルを読み込む際意味わからんエラーを吐く(1敗)
    • gcc
      • 依存ライブラリの一つmonotonic_alignで使用されている
      • 無いとpip install -r requirements.txtが失敗する(1敗)
    • socat
      • 172.0.0.1:7861を0.0.0.0:7860に転送するのに使用
        • Dockerのポートフォワード(-p 7860:7860)と合わせてコンテナ外から172.0.0.1:7861にアクセス可能にするのに使用
      • socatを使うとなぜかGradioが7860ではなく7861で起動するようになる
  • Python3.11 & pip
    • 3.10および3.12はpip install -r requirements.txtが失敗する(2敗)
  • torch
    • Start Locally | PyTorchから自分の環境(主にCUDA)にあったコマンドを選択する
    • 今回はStable, Linux, Pip, Python, CUDA12.4なのでpip install torch torchvision torchaudio
  • requirements.txtで依存ライブラリをインストールする
  • 足りないPythonのライブラリ群(sentencepiece,konoha, openai, gradio)もインストールする
    • (requirements.txtにまとめといて欲しい...)
FROM nvidia/cuda:12.4.1-base-ubuntu22.04
WORKDIR /home/ubuntu/Kanade_Project/gradio

RUN apt update && \
    apt install curl -y && \
    apt install git -y && \
    apt install git-lfs -y && \
    apt install gcc -y && \
    apt install socat -y 

RUN apt install python3.11 python3.11-distutils python3.11-venv python3.11-dev -y && \ 
    rm /usr/bin/python3 && \
    ln -s /usr/bin/python3.11 /usr/bin/python && \
    ln -s /usr/bin/python3.11 /usr/bin/python3 && \
    curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python get-pip.py && \
    rm get-pip.py

RUN pip install torch torchvision torchaudio && \
    git clone https://huggingface.co/Respair/Tsukasa_Speech && \ 
    pip install -r Tsukasa_Speech/requirements.txt && \
    pip install sentencepiece && \
    pip install konoha && \
    pip install openai && \
    pip install gradio

WORKDIR /home/ubuntu/Kanade_Project/gradio/Tsukasa_Speech

CMD ["bash", "-c", "socat TCP-LISTEN:7860,fork TCP:127.0.0.1:7861 & python app_tsuka.py"]

(Docker初心者なので変な書き方してたらマサカリ投げて)

起動方法

コマンドプロンプトから下のコマンドを入力

docker build -t "tsukasa" <Dockerfileが存在するディレクトリのパス>
docker run -it --gpus all --name "tsukasa" -p 7860:7860 "tsukasa"

localhost:7860にアクセスするとGradioのアプリが起動できる
パスの指定はDockerfileの本体へのパスではなく、Dockerileの存在するディレクトリのパスなことに注意

ローマ字を打ち込むとエラーが出る

ローマ字をIPAに変換する機能?(importable.p2g)が動いていない模様
応急処置的な解決策でapp_tsukasa.pyLongformSynth_Textを次のように変更

app_tsukasa.py
def LongformSynth_Text(text, s_prev=None, Kotodama=None, alpha=.0, beta=0, t=.8, diffusion_steps=5, embedding_scale=1, rate_of_speech=1.):
		...
+	    kotodama_prompt = text
-         if is_japanese(text):
-          kotodama_prompt = text
-        else:
-          kotodama_prompt = importable.p2g(smart_phonemize(text))
-          kotodama_prompt = re.sub(r'\s+', ' ', kotodama_prompt).strip()
-          print('kimia activated! the converted text is:\n ', kotodama_prompt)
		...

一応この方法でエラーは出なくなる
(そのうち完全に解決するような方法を探すかも)

旧バージョン

Dockerfile (仮)

(TODO: RUN命令をひとつにまとめレイヤーを少なくする)

  • ベースイメージはnvidia/cuda:12.4.1-base-ubuntu22.04
    • GPUを使わない, ホストPCにCUDAがそもそも入ってないなら素のubuntuでも動くはず
  • Python3.11 & pip
    • 3.10および3.12はpip install -r requirements.txtが失敗する(2敗)
  • torch
    • Start Locally | PyTorchから自分の環境(主にCUDA)にあったコマンドを選択する
    • 今回はStable, Linux, Pip, Python, CUDA12.4なのでpip install torch torchvision torchaudio
  • その他必要なもの
    • Jupyterlab
      • devcontainer経由で使う場合あると便利、なくても問題ない
    • git
      • ないとTukasa Speechをインストールできない
    • git-lfs
      • gitででかいファイルを扱うのに使う
      • 忘れるとモデルを読み込む際意味わからんエラーを吐く(1敗)
    • gcc
      • 依存ライブラリの一つmonotonic_alignで使用されている
      • 無いとpip install -r requirements.txtが失敗する(1敗)
FROM nvidia/cuda:12.4.1-base-ubuntu22.04
RUN apt update
RUN apt install curl -y  

RUN apt install python3.11 python3.11-distutils python3.11-venv -y && \ 
    rm /usr/bin/python3 && \
    ln -s /usr/bin/python3.11 /usr/bin/python && \
    ln -s /usr/bin/python3.11 /usr/bin/python3

RUN curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py  &&\
    python get-pip.py && \
    rm get-pip.py

RUN pip install torch torchvision torchaudio
RUN pip install jupyterlab 

RUN apt install git -y
RUN apt install gcc -y
RUN apt install python3.11-dev -y
RUN apt install git-lfs -y

Tsukasa_Speechをクローン

git clone https://huggingface.co/Respair/Tsukasa_Speech
cd Tsukasa_Speech

依存ライブラリをインストール

pip install -r requirements.txt

実行する

python app_tsukasa.py

... するとNo Module エラーが出る(エラー内容は保存し忘れた)

ライブラリが不足しているので以下のパッケージをインストールする

pip install sentencepiece
pip install konoha
pip install openai
pip install gradio

再度エラーが発生する

FileNotFoundError: [Errno 2] No such file or directory: '/home/ubuntu/Kanade_Project/gradio/Tsukasa_Speech/reference_sample_wavs'

パスがハードコーディングされているので絶対パスに書き換える
app_tsukasa.py の80行目あたりを次のように修正

tsukasa.py
from Modules.diffusion.sampler import DiffusionSampler, ADPM2Sampler, KarrasSchedule
+ import pathlib
+ cwd = pathlib.Path().absolute()

+ voicelist = [v for v in os.listdir(cwd / "reference_sample_wavs")]
- voicelist = [v for v in os.listdir("/home/ubuntu/Kanade_Project/gradio/Tsukasa_Speech/reference_sample_wavs")]

for v in voicelist:
    voices[v] = f'reference_sample_wavs/{v}'

+ with open(cwd / f'Inference/random_texts.txt', 'r') as r:
- with open(f'Inference/random_texts.txt', 'r') as r:
    random_texts = [line.strip() for line in r]

    example_texts = {f"{text[:30]}...": text for text in random_texts}
    
def update_text_input(preview):
    return example_texts[preview]

def get_random_text():
    return random.choice(random_texts)

+ with open(cwd / 'Inference/prompt.txt', 'r') as p:
- with open('Inference/prompt.txt', 'r') as p:
    prompts = [line.strip() for line in p]
    
+ with open(cwd / 'Inference/input_for_prompt.txt', 'r') as i:
- with open('Inference/input_for_prompt.txt', 'r') as i:
    inputs = [line.strip() for line in i]

再度以下のコマンドを実行

python app_tsukasa.py

出力:

* Running on local URL:  http://127.0.0.1:7860

モデルのロードが完了するとローカルホストでGradioアプリが起動する
ポートフォワーディングを設定すれば外部からアクセス可能になる

ローマ字を打ち込むとエラーが出る

ローマ字をIPAに変換する機能?(importable.p2g)が動いていない模様
応急処置的な解決策でapp_tsukasa.pyLongformSynth_Textを次のように変更

app_tsukasa.py
def LongformSynth_Text(text, s_prev=None, Kotodama=None, alpha=.0, beta=0, t=.8, diffusion_steps=5, embedding_scale=1, rate_of_speech=1.):
		...
+	    kotodama_prompt = text
-         if is_japanese(text):
-          kotodama_prompt = text
-        else:
-          kotodama_prompt = importable.p2g(smart_phonemize(text))
-          kotodama_prompt = re.sub(r'\s+', ' ', kotodama_prompt).strip()
-          print('kimia activated! the converted text is:\n ', kotodama_prompt)
		...

一応この方法でエラーは出なくなる
(そのうち完全に解決するような方法を探すかも)