💭 概要・設計思想
「ACS VoiceForge」は、ローカル環境(Mac / Windows デスクトップ)で動作するボイスクローン TTS アプリケーション。日本語特化の Flow Matching TTSモデル「Irodori-TTS-500M-v2」を使用し、リファレンス音声から話者の声を再現してナレーション音声を生成する。
🔧 技術仕様(アーキテクチャ・依存関係)
ACS VoiceForge 仕様書
システム構成・技術スタック
| 項目 | 内容 |
|---|---|
| プラットフォーム | デスクトップアプリ(macOS / Windows) |
| 言語 | Python 3.11 以上 |
| GUIフレームワーク | PySide6(Qt for Python) |
| TTSエンジン | Irodori-TTS-500M-v2(HuggingFace) |
| パッケージ管理 | uv |
| 配布形式 | PyInstaller スタンドアロン実行ファイル |
📁 ファイル構成
ACS VoiceForge/
├── main.py # エントリーポイント・設定ロード・規約チェック・アップデートチェック
├── pyproject.toml # uv 依存管理
├── requirements.txt
├── voiceforge.spec # PyInstaller ビルド設定
│
├── core/
│ ├── tts_engine.py # Irodori-TTS 推論ラッパー(シングルトン・遅延初期化)
│ ├── audio_processor.py # WAV 結合・ポーズ挿入・タイムストレッチ・sounddevice 再生
│ ├── srt_generator.py # 話者別 SRT ファイル生成(改行分割対応)
│ ├── project_manager.py # .vfproj JSON 保存・読み込み
│ ├── emoji_mapper.py # 感情ラベル ↔ 絵文字マッピング
│ └── update_checker.py # 起動時アップデートチェック(サーバーJSON比較)
│
├── ui/
│ ├── main_window.py # QMainWindow・全コンポーネント統合・QThread 管理
│ ├── block_editor.py # ブロックリストコンテナ・D&D 並べ替え
│ ├── block_widget.py # 単一ブロック UI
│ ├── speaker_panel.py # 話者 A/B 設定パネル(左ペイン)
│ ├── export_panel.py # エクスポートオプション・ポーズ設定(右ペイン)
│ ├── profile_dialog.py # リファレンス音声プロファイル管理ダイアログ
│ └── terms_dialog.py # 利用規約ダイアログ(同意モード / 閲覧モード)
│
├── models/
│ ├── block.py # Block データクラス
│ ├── project.py # Project データクラス
│ ├── speaker.py # Speaker データクラス
│ └── profile.py # Profile データクラス
│
└── resources/
├── emoji_annotations.json # 絵文字マッピング定義(UI絵文字 / Irodori絵文字の2層)
└── styles/
└── theme.qss # Catppuccin Mocha ベースのダークテーマ
JSON 形式。台本・話者設定・感情設定・ポーズ設定を保存する。生成済み WAV のパスも保存されるが、移動・削除された場合は再生成が必要。
{
"version": "1.0",
"speaker_a": { "id": "speaker_a", "name": "自分", "color": "#2196F3", "profiles": [...], "active_profile_index": 0 },
"speaker_b": { "id": "speaker_b", "name": "相方", "color": "#F44336", "profiles": [...], "active_profile_index": 0 },
"use_speaker_b": false,
"blocks": [
{ "id": "uuid", "speaker_id": "speaker_a", "emotion": "明るい・嬉しい", "text": "みなさんこんにちは!", "generated_wav_path": "/path/to/uuid.wav", "duration_seconds": 2.4 }
],
"pause_seconds": 0.5
}
