📢

Windows + RTX 5080 で Style-Bert-VITS2 を動かすまでの記録

に公開

はじめに

これは Windows + RTX 5080 で faster-whisper を動かすまでの記録 の続きにあたる記事です。

前回は音声入力側として faster-whisper を動かしました。今回はその反対側、音声出力側として日本語 TTS の Style-Bert-VITS2 を動かします。最終的には両者と LLM を組み合わせて音声対話システムにする予定ですが、本記事では出力側の環境構築のみを扱います。

本記事で扱う対処

  1. CMake 4 と pyopenjtalk-dict の非互換
  2. Visual Studio Build Tools の未インストール
  3. Developer PowerShell がデフォルトで x86(32bit) モードで起動すること
  4. PyPI からインストールされる torch が CPU 版であること
  5. transformers 5.x が BERT を fp16 でロードし、TTS モデル(fp32)と型が一致しないこと

1〜3 はインストール時、4〜5 は実行時に発生します。以降の章で順に説明します。

対象とする読者

  • Style-Bert-VITS2 を Windows 上の NVIDIA GPU で動かしたい方
  • Blackwell 世代の NVIDIA GPU(RTX 50 シリーズ)を利用している方
  • pip install や実行時に error LNK1120 あるいは Input type (struct c10::Half) といったエラーに遭遇している方

本記事で扱わないこと

  • Style-Bert-VITS2 のモデル学習(本記事は推論のみを扱います)
  • Linux および macOS での構築
  • CPU での実行

実行環境

前回の記事と同じ環境で作業しています。詳細は前回記事を参照ください。

ハードウェア

項目
CPU Intel Core Ultra 7 265K (20 コア / 20 スレッド / 3.9 GHz)
GPU NVIDIA GeForce RTX 5080 (VRAM 16,303 MiB、Blackwell、sm_120)
RAM 192 GB
OS Windows 11 Pro 24H2 (Build 26200)

ソフトウェア

項目 バージョン
NVIDIA Driver 591.86
CUDA Toolkit 13.2.51
Python 3.13.12 (Miniconda base 環境)
pip 26.0.1
conda 26.1.1
Git 2.53.0.windows.2
CMake 4.3.1

作業ディレクトリ

C:\dev\voice-ai-test

前回記事で faster-whisper を動かしたのと同じディレクトリです。

Style-Bert-VITS2 とは

日本語を含む多言語の音声合成に使える TTS(Text-to-Speech)ライブラリです。オリジナルの Bert-VITS2 v2.1 をベースに、感情や発話スタイルを制御できるよう拡張されたものです。開発者は litagin02 氏で、リポジトリは litagin02/Style-Bert-VITS2 にあります。

特徴

  • テキストに対応した BERT 埋め込みを条件として与えることで、自然なイントネーションを生成する
  • スタイル埋め込みにより Neutral / Happy / Sad / Angry などの発話スタイルを切り替えられる
  • 日本語特化版(JP-Extra)が提供されており、日本語の発音・アクセントの自然さが向上している
  • 推論のみであれば CPU でも動作するが、GPU 利用で大幅に高速化する

ライセンス

  • 本体: GNU Affero General Public License v3.0
  • text/user_dict/ モジュール: GNU Lesser General Public License v3.0(VOICEVOX エンジン由来)
  • 本記事で使用する JVNV 音声モデルは別途 litagin/style_bert_vits2_jvnv のライセンスに従います

インストール方法

公式には次の二つの経路があります。

  1. リポジトリを clone して Install-Style-Bert-VITS2.bat を実行する方法(学習・GUI ツール込み)
  2. PyPI から pip install style-bert-vits2 でライブラリとしてインストールする方法(推論専用)

本記事では 2 の方法を採用します。音声対話システムの出力側として組み込むことが目的なので、学習ツールや GUI は不要です。

PyTorch を避けたかった話

本題に入る前に、少し背景を書いておきます。

前回記事では、RTX 5080 の CUDA 対応を考慮して、あえて PyTorch を使わず ONNX Runtime ベースの faster-whisper を選択しました。当時の判断理由は次の通りです。

  • RTX 5080 は Blackwell アーキテクチャ(sm_120)である
  • 当時の PyTorch は sm_120 を stable 版でサポートしておらず、nightly ビルドが必要だった
  • nightly 依存は陳腐化のリスクが高い
  • 既に入れた CUDA 関連のライブラリ(nvidia-cublas-cu12 など)を使い回せる

今回 Style-Bert-VITS2 についても、同じ理由から PyTorch を避けて ONNX Runtime 版で進められないかと考えていました。リポジトリには ONNX Runtime 対応を追加する Pull Request #165 も存在します。

しかし実際に pip install style-bert-vits2 を実行してみると、依存パッケージとして torch>=2.1 が自動的に取得されます。PyPI で公開されている style-bert-vits2 の wheel は PyTorch を前提に作られているためです。

ここで方針を切り替えました。調査してみると、PyTorch の stable 版に cu128 ビルドが提供されており、sm_120 にも対応していることがわかりました。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

前回記事の執筆時点では nightly 必須だった状況から、数週間のうちに stable でインストールできるようになっていたことになります。本記事ではこの cu128 stable を利用する前提で進めます。

インストール編

本章では pip install style-bert-vits2 が通らずに遭遇した三つの問題と、それぞれの対処を記録します。問題は次の順で現れます。

  1. CMake 4 と pyopenjtalk-dict の非互換
  2. Visual Studio Build Tools の未インストール
  3. Developer PowerShell がデフォルトで x86 モードで起動する

一見すると無関係に見えますが、いずれも pyopenjtalk-dict のビルド過程で連鎖的に発生します。

5-1. CMake 4 と pyopenjtalk-dict の非互換

症状

作業用ディレクトリで pip install style-bert-vits2 を実行すると、依存パッケージのビルド中に次のエラーが出ます。

CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 3.5 has been removed from CMake.

  Update the VERSION argument <min> value.  Or, use the ...
  <min>...<max> syntax to tell CMake that the project does not need
  compatibility with older versions.

原因

pyopenjtalk-dict(Style-Bert-VITS2 が依存している日本語音声処理ライブラリ)の CMakeLists.txtcmake_minimum_required(VERSION 3.0) のように古い最小バージョンを宣言しています。

一方、CMake 4 系では 3.5 未満を最小バージョンとして指定することが削除され、エラーになるようになりました。ビルド元の CMakeLists.txt を直接編集するのは難しいため、外側から最低要件を底上げする必要があります。

対処

環境変数 CMAKE_POLICY_VERSION_MINIMUM を 3.5 に設定してから pip install を再実行します。

$env:CMAKE_POLICY_VERSION_MINIMUM = "3.5"
pip install style-bert-vits2

この指定により、CMakeLists.txt 側が 3.0 を要求していても、CMake は 3.5 を最低とみなしてビルドを続行します。

確認

エラーが Compatibility with CMake < 3.5 has been removed から別のエラー、具体的には次の内容に変わっていれば、CMake 側の問題は解決しています。

CMake Error: CMAKE_C_COMPILER not set

この新しいエラーは次節で扱います。

5-2. Visual Studio Build Tools のインストール

症状

5-1 の対処を行った後、同じ pip install style-bert-vits2 を実行すると、今度は別のエラーで止まります。

CMake Error at CMakeLists.txt:12 (project):
  The CMAKE_C_COMPILER:
    cl
  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.

または nmake が見つからないという旨のエラーが出ることもあります。

Running 'nmake' '-?' failed with: no such file or directory

原因

pyopenjtalk-dict のビルドには C/C++ コンパイラ(cl.exe)とビルドツール(nmake.exe)が必要です。Windows では通常、これらは Visual Studio または Visual Studio Build Tools に含まれています。

素の Windows 環境には C++ コンパイラは入っていないため、別途インストールする必要があります。

対処

Visual Studio Build Tools をインストールします。Visual Studio 本体ではなく、ビルドツールだけの軽量版で十分です。

  1. Visual Studio Build Tools のダウンロードページ にアクセスする
  2. 「Build Tools for Visual Studio」をダウンロードしてインストーラを起動する
  3. ワークロードの選択画面で **「C++ によるデスクトップ開発」**を選択する
  4. インストールを実行する(数 GB のダウンロードがあります)
  5. インストール完了後、Windows を再起動する

インストール後、cl.exenmake.exe は次のようなパスに配置されます。

C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\bin\Hostx64\x64\

バージョン番号(1814.50.35717)はインストール時期によって異なります。

確認

この時点ではまだ pip install を再実行しません。理由は次節で説明します。通常の PowerShell から where.exe cl を実行しても、cl.exe は見つからないはずです。

where.exe cl
# INFO: Could not find files for the given pattern(s).

Visual Studio のビルドツールは、意図的に通常の PATH に加えられないようになっています。次節でこの挙動への対処を記述します。

5-3. Developer PowerShell を x64 モードで起動する

症状

Visual Studio Build Tools をインストールした後、Developer PowerShell から pip install style-bert-vits2 を再実行すると、ビルド自体は大量のコンパイラ出力とともに進みます。しかし最終段階のリンク処理で、次のようなエラーが大量に発生して失敗します。

openjtalk.obj : error LNK2001: 外部シンボル __imp__PySequence_List は未解決です
openjtalk.obj : error LNK2001: 外部シンボル __imp__PyBaseObject_Type は未解決です
openjtalk.obj : error LNK2001: 外部シンボル __imp__PyModuleDef_Init は未解決です
(...同様のエラーが 176 件続く...)
build\lib.win32-cpython-313\pyopenjtalk\openjtalk.cp313-win_amd64.pyd : fatal error LNK1120: 176 件の未解決の外部参照
error: command 'link.exe' failed with exit code 1120

すべての未解決シンボルが Python C API のもの(Py で始まる関数・型・定数)である点に特徴があります。

原因

ビルドの出力をよく見ると、次のことがわかります。

  1. 使用されているコンパイラは Hostx86\x86\cl.exe(32 ビット向けコンパイラ)
  2. 出力先は build\temp.win32-cpython-313\(win32 は 32 ビットを示す)
  3. 一方で Python 自体は 64 ビット版

つまり、32 ビット向けにコンパイルされたオブジェクトファイルを、64 ビット Python のライブラリ(python313.lib)とリンクしようとして、すべての Python API シンボルが見つからない状態になっています。

なぜ 32 ビット向けになってしまうのかというと、Launch-VsDevShell.ps1 を引数なしで実行すると、デフォルトで x86(32 ビット)ホスト・x86 ターゲットの Developer PowerShell が起動するためです。バナーには次のように表示されるだけで、ホストとターゲットのアーキテクチャは明示されません。

**********************************************************************
** Visual Studio 2026 Developer PowerShell v18.5.0
** Copyright (c) 2026 Microsoft Corporation
**********************************************************************

この挙動は Microsoft の設計によるものですが、64 ビット Python の拡張モジュールをビルドする場合には致命的です。

対処

Launch-VsDevShell.ps1-Arch amd64 -HostArch amd64 オプションを明示して、x64 ホスト・x64 ターゲットの Developer PowerShell を起動します。

& "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\Common7\Tools\Launch-VsDevShell.ps1" -Arch amd64 -HostArch amd64

ここで注意点が二つあります。

  • Launch-VsDevShell.ps1 は通常の PowerShell セッション内で実行します。別ウィンドウは開きません
  • スクリプトは作業ディレクトリを変える場合があるため、実行後に必要なら cd で戻ります

環境変数 CMAKE_POLICY_VERSION_MINIMUM は同じセッション内で維持されますが、別のセッションに切り替えた場合は再設定が必要です。

確認

where.exe cl を実行して、パスに Hostx64\x64 が含まれていれば x64 モードで起動できています。

where.exe cl
# C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\bin\Hostx64\x64\cl.exe

一方で、以下のように Hostx86\x86 が表示される場合は、x86 モードのまま起動しています。この状態で pip install を実行すると、先ほどのリンクエラーに再び遭遇します。

where.exe cl
# C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Tools\MSVC\14.50.35717\bin\Hostx86\x86\cl.exe

5-4. インストールの完了

ここまでの三つの対処を適用すれば、インストールが成功します。コマンドをまとめておきます。

# x64 モードの Developer PowerShell を起動
& "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\Common7\Tools\Launch-VsDevShell.ps1" -Arch amd64 -HostArch amd64

# CMake の最小バージョン要件を緩和
$env:CMAKE_POLICY_VERSION_MINIMUM = "3.5"

# 作業ディレクトリに戻る(Launch-VsDevShell.ps1 が別の場所に移動している可能性があるため)
cd C:\dev\voice-ai-test

# インストールを実行
pip install style-bert-vits2

成功時のログには、次のような行が含まれるはずです。

Building wheels for collected packages: pyopenjtalk-dict
  Building wheel for pyopenjtalk-dict (pyproject.toml) ... done
  Created wheel for pyopenjtalk-dict: filename=pyopenjtalk_dict-0.3.4.dev2-cp313-cp313-win_amd64.whl
Successfully built pyopenjtalk-dict
Successfully installed ... style-bert-vits2-2.5.0 torch-2.11.0 transformers-5.5.4 ...

wheel ファイル名に win_amd64 が含まれていれば、x64 向けの正しいビルドが生成されています。win32 になっていた場合は 5-3 の対処が効いていない可能性があります。

依存パッケージとして次のようなものが一緒に入ります。

  • torch 2.11.0(CPU 版。次章で入れ替えます)
  • transformers 5.5.4
  • numbapyworld-prebuiltpypinyinjieba など

インストールが完了した時点では、PyTorch は PyPI 由来の CPU 版が入っている状態です。このままでは GPU を利用できないため、次章で CUDA 対応版に差し替えます。

CUDA セットアップ

第5章でインストールは完了しましたが、入った PyTorch は CPU 版でした。GPU 推論を行うには、CUDA 対応版に差し替える必要があります。

症状

CUDA が使えるか確認してみます。

python -c "import torch; print(torch.cuda.is_available())"
# False

False と返ってきました。RTX 5080 が装着されていて、NVIDIA ドライバも導入済みであるにもかかわらず、PyTorch からは GPU が見えない状態です。

原因

pip install style-bert-vits2 の依存解決で入った torch 2.11.0 は、PyPI からダウンロードされた CPU 版です。

pip show torch
# Name: torch
# Version: 2.11.0
# ...

PyTorch は用途ごとに複数のビルド(CPU 版、CUDA 12.6 版、CUDA 12.8 版、CUDA 13.0 版)を提供していますが、PyPI のデフォルトリポジトリに登録されているのは CPU 版です。GPU 対応版は PyTorch 公式の独自インデックスからインストールする必要があります。

RTX 5080 は Blackwell アーキテクチャ(compute capability 12.0、sm_120)であり、これに対応したビルドは cu128(CUDA 12.8)または cu130(CUDA 13.0)です。本記事では stable 版として配布されている cu128 を選択します。

対処

現在入っている CPU 版の torch を一旦アンインストールし、cu128 版をインストールし直します。

# 現在の torch を削除
pip uninstall torch torchvision torchaudio -y

# cu128 版をインストール
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

確認

CUDA が認識され、RTX 5080 の compute capability が (12, 0) と表示されれば成功です。

python -c "import torch; print('torch:', torch.__version__); print('cuda:', torch.cuda.is_available()); print('device:', torch.cuda.get_device_name(0)); print('capability:', torch.cuda.get_device_capability(0))"
torch: 2.11.0+cu128
cuda: True
device: NVIDIA GeForce RTX 5080
capability: (12, 0)

torch.__version__+cu128 のサフィックスがあり、capability(12, 0) と表示されれば、sm_120 対応の PyTorch が正しく動作しています。

この時点でインストール面の準備は完了です。次章では実際にモデルを呼び出して音声を生成する際に遭遇した問題を扱います。

実行編

環境構築が完了したので、実際にモデルを動かしてみます。本章では公式のライブラリガイド(library.ipynb)に準じた最小構成のスクリプトで動作確認を行い、その過程で遭遇した一つの問題と対処を記述します。

最小構成のスクリプト

まず、モデルのダウンロードと音声生成を行うスクリプトを用意します。

from pathlib import Path
import time

from style_bert_vits2.nlp import bert_models
from style_bert_vits2.constants import Languages
from huggingface_hub import hf_hub_download

# BERT モデルと tokenizer を読み込み
bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")

# TTS モデル(JVNV 女性話者 F1)をダウンロード
model_file = "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors"
config_file = "jvnv-F1-jp/config.json"
style_file = "jvnv-F1-jp/style_vectors.npy"

for file in [model_file, config_file, style_file]:
    hf_hub_download("litagin/style_bert_vits2_jvnv", file, local_dir="model_assets")

# TTS モデルを読み込み、音声を生成
from style_bert_vits2.tts_model import TTSModel

assets_root = Path("model_assets")
model = TTSModel(
    model_path=assets_root / model_file,
    config_path=assets_root / config_file,
    style_vec_path=assets_root / style_file,
    device="cuda",
)

sr, audio = model.infer(text="こんにちは、世界。")

import soundfile as sf
sf.write("output.wav", audio, sr)

soundfile パッケージが未インストールの場合は別途 pip install soundfile を実行してください。

症状

上記スクリプトを実行すると、モデル読み込みまでは問題なく通りますが、推論の段階で次のエラーが発生します。

File "...\style_bert_vits2\models\models_jp_extra.py", line 418, in forward
    bert_emb = self.bert_proj(bert).transpose(1, 2)
    ...
RuntimeError: Input type (struct c10::Half) and bias type (float) should be the same

原因

エラーメッセージの意味は次の通りです。

  • Input(入力テンソル)の型は float16
  • bias(層のバイアス)の型は float32

型が一致していないため、畳み込み層(Conv1d)の計算が実行できない状態です。具体的には、BERT モデルの出力が float16 である一方、TTS モデルの bert_proj 層が float32 で定義されています。

この原因は、pip install style-bert-vits2 で入った transformers 5.5.4 の挙動にあります。transformers 5.0 からは破壊的変更として、from_pretrained のデフォルト dtype が "auto" に変更されました。これによりモデルが Hugging Face に保存されているときの dtype がそのまま使われるようになっています。ku-nlp/deberta-v2-large-japanese-char-wwm の重みは float16 で保存されているため、今回のケースでは BERT モデルが float16 でロードされます。

一方、Style-Bert-VITS2 側の TTS モデルは float32 で構築される前提であり、BERT 出力を float32 として受け取ることを想定しています。この想定と transformers 5.x 以降のデフォルト挙動がずれたことで、型の不一致が発生しています。

対処

BERT モデルをロードした直後に、明示的に float32 に変換します。load_model の戻り値として PreTrainedModel オブジェクトが返るため、その .float() メソッドを呼び出すだけです。

bert_model = bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_model.float()

この 1 行で、BERT モデル全体のパラメータが float32 に変換され、出力テンソルも float32 になります。結果として、TTS モデル側の bert_proj 層と型が一致して推論が通るようになります。

確認

修正版のスクリプトを実行すると、エラーなく音声生成が完了し、output.wav が保存されます。

Start generating audio data from text:
こんにちは、世界。
Audio data generated successfully

生成された output.wav を再生し、日本語の音声が出力されれば成功です。

実測データ

最終的に動作確認用のスクリプトを少し拡張し、推論時間と VRAM 使用量を計測してみました。

計測スクリプト

from pathlib import Path
import time

from style_bert_vits2.nlp import bert_models
from style_bert_vits2.constants import Languages
from style_bert_vits2.tts_model import TTSModel

bert_model = bert_models.load_model(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_models.load_tokenizer(Languages.JP, "ku-nlp/deberta-v2-large-japanese-char-wwm")
bert_model.float()

assets_root = Path("model_assets")
model = TTSModel(
    model_path=assets_root / "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors",
    config_path=assets_root / "jvnv-F1-jp/config.json",
    style_vec_path=assets_root / "jvnv-F1-jp/style_vectors.npy",
    device="cuda",
)

text = "また、東寺のように五大明王と呼ばれる主要な明王の中央に配されることも多い。"

t0 = time.time()
sr, audio = model.infer(text=text)
elapsed = time.time() - t0
audio_sec = len(audio) / sr
print(f"推論時間: {elapsed:.2f} 秒 / 音声長: {audio_sec:.2f} 秒 / リアルタイム比: {audio_sec / elapsed:.2f}x")

第1回の記事で Whisper の音声認識に使ったのと同じ文を入力にしています。

結果

推論時間: 0.17 秒 / 音声長: 約 7 秒 / リアルタイム比: 約 40x

7 秒程度の音声を 0.2 秒未満で生成しています。これは既に生成し終わったモデルでの 2 回目以降の計測値で、初回はモデルの CUDA 初期化が入るため 1.5 秒ほどかかります。

なお、第1回で Whisper が「東寺」を「当時」と誤認識した同じ文が、今回はきちんと「とうじ」(寺院の東寺)として発音されていました。入力が文字列である TTS では、同音異義語の判定は発話側の辞書情報に依存するため、音声認識側と比べて扱いやすい場面です。

VRAM 使用量

推論中の VRAM 使用量を nvidia-smi で確認したところ、BERT モデルと TTS モデルを両方載せた状態で約 4 GB でした。RTX 5080 の 16 GB 全体からすると余裕があり、同時に他のモデル(LLM など)を載せる余地も残されています。

サンプリングレート

JVNV モデルのサンプリングレートは 44,100 Hz でした。音声対話システムで使用する場合、一般的な 16 kHz 入力との組み合わせではリサンプリングが必要になる場合があります。

まとめ

Style-Bert-VITS2 を Windows + RTX 5080 環境で動かすために必要だった対処を振り返ります。

  • CMake 4 と pyopenjtalk-dict の非互換は、環境変数 CMAKE_POLICY_VERSION_MINIMUM=3.5 で回避できる
  • Visual Studio Build Tools をインストールするだけでは不十分で、Developer PowerShell を x64 モードで起動する必要がある
  • PyPI のデフォルトから入る torch は CPU 版であるため、RTX 5080 (sm_120) で使うには cu128 版を別途インストールする必要がある
  • transformers の新しいバージョンは BERT モデルを float16 でロードする挙動があり、TTS モデル(float32)との型不一致を起こす。bert_model.float() で明示的に変換することで解消できる

これらの対処を適用した結果、RTX 5080 上で日本語音声を生成できる環境が整いました。

前回の faster-whisperと合わせて、音声対話システムの入力側と出力側が揃ったことになります。次は両者と LLM を組み合わせた音声対話パイプラインを構築する予定です。

リンク集

前回の記事

本記事で使用したライブラリ・モデル

開発環境

参考にしたリソース

Discussion