suzuna / state kotoha v1

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 4Live2D連動既存スコープと統合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 v2MIT / Apache-2.0
rvc-pythonMIT
RVC本体MIT
AivisSpeech EngineMIT系
hubert_base.ptMIT
Style-Bert-VITS2AGPL-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

開発優先順位

  1. python/server.py + /health /convert エンドポイント実装
  2. Tauri sidecar でPython自動起動
  3. ConvertPage.tsx — ファイルインポート・変換・試聴UI
  4. モデルスキャン・選択UI
  5. Phase 2以降は別STATEに切り出し

注意事項

  • Python埋め込みは Windows embeddable package (3.10.x) を使用
  • torch + torchaudio はCUDA 11.8 build を同梱(RTX 3070対応)
  • インストーラサイズ目安: ~2GB(モデル込み)
  • macOS / Linux は Phase 1では対象外