Suzuna - STATE v1
Overview
Suzuna(鈴の音)は、ユーザー自身の声をキャラクター固有の音声へと変換・育てるための音声制作スタジオアプリ。 男性声を中性〜女性声に変換するRVCパイプラインを起点に、カスタム音声モデルの学習、TTSボイスロイド化までを一貫して行える。 看板娘キャラクターの人格形成・Live2D連動を最終目標とした長期スコープの中核ツール。
ターゲット: 個人Vtuber・同人開発者・キャラクター音声を自作したいクリエイター
リリース戦略
| フェーズ | 内容 | 配布形態 | 価格 |
|---|---|---|---|
| Phase 1 | 録音 & RVC声質変換 | ena-dri.dev フリーソフト | 無料 |
| Phase 2+3 | 学習UI + TTS化 | BOOTHアーリーアクセス | 1,980円 → 2,980円(値上げ予定) |
| Phase 4 | Live2D連動 | 既存スコープと統合 | TBD |
Tech Stack
Tauri v2 (Rust)
├─ フロントエンド: React + TypeScript
└─ サイドカープロセス: Python (埋め込みバンドル)
├─ RVC / rvc-python (MIT) : 声質変換エンジン
├─ AivisSpeech Engine : TTSエンジン (Phase 3)
└─ FastAPI : Tauri↔Python IPC
バンドル構成
Kotoha/
├─ src-tauri/
├─ src/ # React UI
├─ python/
│ ├─ python-3.10-embed/ # 埋め込みPython (Windows embeddable)
│ ├─ site-packages/ # rvc-python + 依存関係
│ └─ server.py # FastAPIサーバー起動エントリ
├─ models/
│ ├─ hubert_base.pt # RVC基盤モデル (~300MB)
│ ├─ rmvpe.pt # F0推定モデル (~200MB)
│ └─ custom/ # ユーザー学習済みモデル置き場
│ └─ .gitkeep
└─ assets/
└─ kotoha-icon.ico
ライセンスまとめ
| コンポーネント | ライセンス | 配布可否 |
|---|---|---|
| Tauri v2 | MIT / Apache-2.0 | ✅ |
| rvc-python | MIT | ✅ |
| RVC本体 | MIT | ✅ |
| AivisSpeech Engine | MIT系 | ✅ |
| hubert_base.pt | MIT | ✅ |
| Style-Bert-VITS2 | AGPL-3.0 | ❌ 使用しない |
Phase 1 仕様 — 録音 & 声質変換(フリー版)
概要
男性声のWAVファイルを入力として受け取り、RVCで声質変換したWAVを出力する。 マイク録音UIはスタブ(後実装)、初期はファイルインポートで動作。
UI構成
┌─────────────────────────────────────────┐
│ Kotoha [≡] │
├─────────────────────────────────────────┤
│ [🎤 録音する] [📁 ファイルを開く] │ ← 入力パネル
│ │
│ 入力: voice_input.wav [▶試聴] │
├─────────────────────────────────────────┤
│ 変換設定 │
│ モデル: [custom_v1.pth ▼] │
│ ピッチ: [──●────────] +12 │ ← -24 〜 +24
│ インデックス強度: [──●──] 0.75 │
│ F0推定: [rmvpe ▼] │
├─────────────────────────────────────────┤
│ [▶ 変換する] [出力先: 変更] │
│ │
│ 出力: voice_output.wav [▶試聴] [💾保存] │
└─────────────────────────────────────────┘
Pythonバックエンド API
POST /convert
body: {
input_path: string, # 入力WAVパス
model_path: string, # .pthファイルパス
index_path?: string, # .indexファイルパス (optional)
pitch_shift: int, # -24〜+24 (男→女は+12推奨)
index_rate: float, # 0.0〜1.0
f0_method: string # "rmvpe" | "harvest" | "crepe"
}
response: {
output_path: string,
duration_ms: int
}
GET /models
response: {
models: [{ name: string, pth: string, index?: string }]
}
GET /health
response: { status: "ok", gpu: string }
Python起動フロー(Tauri sidecar)
// src-tauri/src/main.rs
let sidecar = app.shell().sidecar("python_server")?;
let (mut rx, child) = sidecar.args(["server.py"]).spawn()?;
// ヘルスチェックポーリング → UIに "ready" 通知
# python/server.py
import uvicorn
from fastapi import FastAPI
from rvc_python.infer import RVCInference
app = FastAPI()
rvc = RVCInference(device="cuda:0") # CPUフォールバックあり
@app.post("/convert")
async def convert(req: ConvertRequest):
rvc.load_model(req.model_path)
rvc.infer_file(req.input_path, req.output_path,
f0_up_key=req.pitch_shift,
f0_method=req.f0_method,
index_rate=req.index_rate)
return {"output_path": req.output_path}
GPU / CPUフォールバック
import torch
device = "cuda:0" if torch.cuda.is_available() else "cpu"
rvc = RVCInference(device=device)
起動時にGPU検出 → UIにバッジ表示(“GPU加速中” / “CPUモード”)
Phase 1 完了条件
- Tauriアプリ起動 → Pythonサーバー自動起動
- WAVインポート → RVC変換 → WAV出力
- ピッチ/インデックス強度のUIコントロール
- 変換結果の試聴(HTML5 Audio)
- モデルフォルダ自動スキャン
- GPU/CPUバッジ表示
Phase 2 仕様 — カスタムモデル学習 UI(アーリーアクセス)
概要
Phase 1で変換した音声を蓄積し、RVCカスタムモデルを学習するUIを提供。 「看板娘の声」としてモデルを固定化することが目標。
UI構成
┌─ 学習データ管理 ──────────────────────────┐
│ データセット: kotoha_voice/ │
│ ├─ 001_converted.wav 3.2s [▶][🗑] │
│ ├─ 002_converted.wav 4.1s [▶][🗑] │
│ └─ ... (合計: 12分34秒) │
│ [+ 音声を追加] [📁 フォルダから一括追加] │
├─ 学習設定 ────────────────────────────────┤
│ モデル名: [kotoha_v1 ] │
│ エポック数: [100 ▲▼] │
│ バッチサイズ: [自動 ▼] │
│ [▶ 学習開始] │
│ │
│ 進捗: ████████░░░░ 67% Epoch 67/100 │
│ loss: 0.342 eta: 8分32秒 │
└──────────────────────────────────────────┘
バックエンド API追加
POST /train
body: {
dataset_dir: string,
model_name: string,
epochs: int,
batch_size?: int
}
response: { job_id: string }
GET /train/status/{job_id}
response: {
status: "running" | "done" | "error",
epoch: int,
total_epochs: int,
loss: float,
eta_seconds: int
}
Phase 2 完了条件
- 音声データセット管理UI(追加・削除・試聴)
- RVC学習キック → 進捗表示
- 学習完了モデルの自動検出・一覧表示
- Phase 1のモデル選択に学習済みモデルが表示される
Phase 3 仕様 — TTS化 / ボイスロイド化(アーリーアクセス)
概要
AivisSpeech EngineをバックエンドTTSとして、テキスト入力からカスタム声で音声生成する。 「看板娘がテキストを読み上げる」状態を実現。
アーキテクチャ
テキスト入力
│
▼
AivisSpeech Engine (標準TTSとして読み上げ)
│ WAV生成
▼
RVCカスタムモデルで声質変換
│
▼
看板娘の声のWAV出力
UI構成
┌─ TTS Studio ──────────────────────────────┐
│ 声モデル: [kotoha_v1.pth ▼] │
│ ベース音声: [AivisSpeech女性1 ▼] │
│ ピッチ: [──●──] +6 │
├────────────────────────────────────────────┤
│ テキスト入力: │
│ ┌──────────────────────────────────────┐ │
│ │ こんにちは!今日もよろしくお願いします。│ │
│ └──────────────────────────────────────┘ │
│ [▶ 生成する] [💾 WAVで保存] │
│ │
│ 履歴: │
│ ├─ "こんにちは!今日も..." [▶][💾][🗑] │
│ └─ "よろしくお願いします" [▶][💾][🗑] │
└────────────────────────────────────────────┘
バックエンド API追加
POST /tts
body: {
text: string,
aivis_speaker_id: int,
rvc_model_path: string,
pitch_shift: int,
speed: float # 0.5〜2.0
}
response: {
output_path: string,
duration_ms: int
}
GET /aivis/speakers
response: { speakers: [{ id: int, name: string }] }
Phase 3 完了条件
- AivisSpeech Engine 内包・自動起動
- テキスト → AivisSpeech → RVC変換パイプライン
- 音声履歴管理
- WAVエクスポート
Phase 4 メモ — Live2D連動(将来)
- 音声振幅をリアルタイム解析 → 口パクパラメータ(
ParamMouthOpenY)出力 - WebSocket or Named Pipe で Live2D側に送信
- 看板娘Live2Dスコープと統合
ディレクトリ構成(Claude Code向け)
kotoha/
├─ src/
│ ├─ App.tsx
│ ├─ pages/
│ │ ├─ ConvertPage.tsx # Phase 1メイン
│ │ ├─ TrainPage.tsx # Phase 2
│ │ └─ TTSPage.tsx # Phase 3
│ ├─ components/
│ │ ├─ AudioPlayer.tsx
│ │ ├─ ModelSelector.tsx
│ │ ├─ PitchSlider.tsx
│ │ └─ ProgressBar.tsx
│ └─ lib/
│ └─ api.ts # FastAPI呼び出しラッパー
├─ src-tauri/
│ ├─ src/main.rs
│ ├─ tauri.conf.json
│ └─ capabilities/
├─ python/
│ ├─ server.py # FastAPIエントリ
│ ├─ routers/
│ │ ├─ convert.py
│ │ ├─ train.py
│ │ └─ tts.py
│ └─ requirements.txt
├─ models/
│ └─ custom/
├─ DESIGN.md
└─ STATE_Kotoha_v1.md
開発優先順位
python/server.py+/health/convertエンドポイント実装- Tauri sidecar でPython自動起動
ConvertPage.tsx— ファイルインポート・変換・試聴UI- モデルスキャン・選択UI
- Phase 2以降は別STATEに切り出し
注意事項
- Python埋め込みは Windows embeddable package (3.10.x) を使用
torch+torchaudioはCUDA 11.8 build を同梱(RTX 3070対応)- インストーラサイズ目安: ~2GB(モデル込み)
- macOS / Linux は Phase 1では対象外