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にアクセス可能にするのに使用
- Dockerのポートフォワード(
- socatを使うとなぜかGradioが7860ではなく7861で起動するようになる
- 172.0.0.1:7861を0.0.0.0:7860に転送するのに使用
- git
- Python3.11 & pip
- 3.10および3.12は
pip install -r requirements.txt
が失敗する(2敗)
- 3.10および3.12は
- 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.py
のLongformSynth_Text
を次のように変更
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敗)
- 3.10および3.12は
- 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敗)
- 依存ライブラリの一つ
- Jupyterlab
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行目あたりを次のように修正
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.py
のLongformSynth_Text
を次のように変更
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)
...
一応この方法でエラーは出なくなる
(そのうち完全に解決するような方法を探すかも)