STATE_Suzuna_Setup_Wizard.md
概要
Suzunaの初回起動時に自動で Python 環境を構築するセットアップウィザード。
python-build-standalone でPython 3.10を同梱し、初回のみ依存関係をpip installで自動インストールする。
GPU(CUDA)の有無を自動検出して、PyTorchのインストール内容を切り替える。
方針
| 項目 | 内容 |
|---|---|
| Python同梱 | python-build-standalone (3.10.x, Windows x86_64) |
| 同梱先 | src-tauri/resources/python/ |
| venv作成先 | {app_data_dir}/Suzuna/venv/ (%APPDATA%\Suzuna\venv\) |
| GPU検出 | Rustから nvidia-smi を実行して有無を判定 |
| pip install | 初回起動時にRustの Command でバックグラウンド実行 |
| セットアップ完了フラグ | {app_data_dir}/Suzuna/setup_done.json に記録 |
| 2回目以降 | フラグを見てスキップ、即起動 |
フロー
アプリ起動
↓
setup_done.json を確認
├── 存在する → 通常起動(Python serverをそのまま起動)
└── 存在しない → セットアップウィザード画面へ
↓
Step 1: nvidia-smi でGPU検出
├── GPU あり → CUDA用PyTorchをインストール
└── GPU なし → CPU版PyTorchをインストール
↓
Step 2: venv作成(同梱Pythonで)
↓
Step 3: pip install(進捗をフロントに通知)
↓
Step 4: setup_done.json を書き込み
↓
通常起動
Rustの実装タスク(src-tauri/src/lib.rs)
追加するTauriコマンド
// GPU検出
#[tauri::command]
async fn detect_gpu() -> bool
// セットアップ済みか確認
#[tauri::command]
async fn is_setup_done(app: tauri::AppHandle) -> bool
// セットアップ実行(進捗をフロントにemit)
#[tauri::command]
async fn run_setup(app: tauri::AppHandle, window: tauri::Window)
detect_gpu の実装方針
async fn detect_gpu() -> bool {
// nvidia-smiをwhereで探してから実行
// 成功(exit code 0)ならtrue
// 失敗 or 見つからないならfalse
Command::new("nvidia-smi")
.output()
.map(|o| o.status.success())
.unwrap_or(false)
}
run_setup の実装方針
進捗はTauriのeventでフロントに送る。
// emit するイベント
window.emit("setup_progress", SetupProgress {
step: "venv", // "venv" | "pip_torch" | "pip_rvc" | "pip_other" | "done" | "error"
message: "仮想環境を作成中...",
percent: 10, // 0-100
}).unwrap();
ステップ別コマンド
Step 1: venv作成
{resources}/python/python.exe -m venv {app_data}/Suzuna/venv
Step 2: pip upgrade
{app_data}/Suzuna/venv/Scripts/pip.exe install --upgrade pip
Step 3a: PyTorch(GPU検出時)
{app_data}/Suzuna/venv/Scripts/pip.exe install
torch==2.4.1 torchaudio==2.4.1
--index-url https://download.pytorch.org/whl/cu118
Step 3b: PyTorch(CPU時)
{app_data}/Suzuna/venv/Scripts/pip.exe install
torch==2.4.1 torchaudio==2.4.1
Step 4: FastAPI他
{app_data}/Suzuna/venv/Scripts/pip.exe install
fastapi "uvicorn[standard]" pydantic httpx librosa soundfile scipy numpy av
Step 5: rvc-python
{app_data}/Suzuna/venv/Scripts/pip.exe install rvc-python
⚠ rvc-pythonはnumpy<=1.23.5をピン留めするため、必ずfastapi等の後にインストールする
Python server起動の変更点
既存の .venv 優先ロジックを以下の優先順位に変更:
1. {app_data}/Suzuna/venv/Scripts/python.exe ← 新規追加(最優先)
2. {app_dir}/.venv/Scripts/python.exe ← 既存(開発用フォールバック)
3. システムpython ← 最終フォールバック
フロントの実装タスク(React/TypeScript)
新規ファイル: src/pages/SetupPage.tsx
セットアップウィザード画面。App.tsxで is_setup_done をチェックして、未完了なら最初に表示する。
UI構成
┌─────────────────────────────────────┐
│ Suzuna セットアップ │
│ │
│ 初回のみ、依存関係をインストール │
│ します(3〜8分) │
│ │
│ [GPU検出中...] │
│ ✅ NVIDIA GPU を検出しました │
│ → CUDA版PyTorchをインストール │
│ │
│ ████████████░░░░░░ 60% │
│ rvc-python をインストール中... │
│ │
│ ※ この画面は初回のみ表示されます │
└─────────────────────────────────────┘
状態管理
type SetupStep =
| "idle"
| "detecting_gpu"
| "venv"
| "pip_torch"
| "pip_rvc"
| "pip_other"
| "done"
| "error";
interface SetupProgress {
step: SetupStep;
message: string;
percent: number;
}
Tauriイベントのリッスン
import { listen } from "@tauri-apps/api/event";
import { invoke } from "@tauri-apps/api/core";
// セットアップ進捗を受け取る
const unlisten = await listen<SetupProgress>("setup_progress", (event) => {
setProgress(event.payload);
});
// セットアップ開始
await invoke("run_setup");
App.tsx の変更点
// 起動時にセットアップ済みか確認
const [setupDone, setSetupDone] = useState<boolean | null>(null);
useEffect(() => {
invoke<boolean>("is_setup_done").then(setSetupDone);
}, []);
if (setupDone === null) return <SplashScreen />;
if (!setupDone) return <SetupPage onComplete={() => setSetupDone(true)} />;
return <MainApp />;
同梱Python(python-build-standalone)の取得
ダウンロード先
https://github.com/indygreg/python-build-standalone/releases
使用するビルド
cpython-3.10.x+xxxxxxxx-x86_64-pc-windows-msvc-install_only.tar.gz
install_only ビルドを使う(最小構成)。
配置
src-tauri/resources/python/
├── python.exe
├── python310.dll
├── Lib/
└── ...(展開したファイルすべて)
tauri.conf.json への追記
"bundle": {
"resources": {
"resources/python/**/*": "python/"
}
}
setup_done.json のフォーマット
{
"version": "1.0.0",
"gpu": true,
"torch": "cu118",
"installed_at": "2025-05-09T12:00:00Z"
}
バージョンが変わったら再セットアップを促す仕組みを将来的に追加できる。
エラーハンドリング方針
| エラー | 対応 |
|---|---|
| pip install失敗 | エラーメッセージ + ログ表示 + 「再試行」ボタン |
| ネットワーク未接続 | 「インターネット接続を確認してください」 |
| ディスク空き不足 | 「空き容量が不足しています(5GB以上必要)」 |
エラー発生時は setup_done.json を書き込まないことで、次回起動時に再チャレンジできる。
実装の優先順位
detect_gpu()コマンド追加(Rust)is_setup_done()コマンド追加(Rust)run_setup()コマンド追加(Rust) + progressイベントemit- Python server起動ロジックをvenv優先に変更(Rust)
SetupPage.tsx作成(React)App.tsxにセットアップチェック追加(React)- python-build-standaloneをresourcesに配置 + tauri.conf.json更新
注意事項
resources/python/はgit管理外にする(.gitignoreに追加)- CIビルド時はpython-build-standaloneの取得をビルドスクリプトに組み込む
rvc-pythonはnumpy<=1.23.5をピン留めするため、インストール順は必ず最後praat-parselmouthはGPLv3+のため依存しないよう注意(既存のREADMEにも記載あり)