Voice Cloning, SSML, Unity UPM, Wyoming Docker 他全実装 - #331
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR delivers a broad set of end-to-end features across training, inference, integrations, and packaging: VITS2-style adversarial duration training, voice cloning via speaker embeddings / reference audio, basic SSML parsing across multiple runtimes, a Unity UPM package, and a Wyoming Protocol adapter (Docker + HA guide), plus CI/doc improvements.
Changes:
- Add VITS2 Duration Discriminator (training-only) and wire adversarial losses + optimizer into Lightning training/export.
- Add voice cloning path via
speaker_embedding(+ mask) and speaker-encoder tooling/CLI flags across runtimes. - Add SSML parsing utilities and new integration artifacts (Wyoming server + Docker, Unity UPM package, docs/CI updates).
Reviewed changes
Copilot reviewed 122 out of 156 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| src/python/piper_train/vits/models.py | Adds DurationDiscriminator, speaker_embedding projection, and passes duration info for VITS2 losses |
| src/python/piper_train/vits/lightning.py | Wires VITS2 losses/optimizer into training loop and optimizer config |
| src/python/piper_train/export_onnx.py | Excludes dur_disc from export and adds speaker_embedding(+mask) inputs to ONNX graph |
| src/python/piper_train/infer_onnx.py | Adds CLI support for speaker embeddings / reference audio and feeds ONNX inputs |
| src/python/piper_train/speaker_encoder/export_encoder.py | Adds ECAPA-TDNN checkpoint→ONNX export utility with optional FP16 conversion |
| src/python/piper_train/speaker_encoder/audio_utils.py | Adds NumPy audio→mel pipeline for speaker encoder (no librosa/torchaudio dependency) |
| src/python/piper_wyoming/main.py | Implements Wyoming Protocol TTS server using PiperPlus API |
| src/python/piper_wyoming/handler.py | Adds language resolution and Wyoming Info discovery helpers |
| docker/wyoming/Dockerfile | Adds multi-stage image for Wyoming adapter (HA integration) |
| docker/wyoming/docker-compose.yml | Adds compose setup with caching + healthcheck for Wyoming server |
| src/cpp/piper_plus.h | Extends C API synth options with speaker embedding fields |
| src/cpp/piper_plus_c_api.cpp | Applies speaker embedding to synthesis config and adds (placeholder) speaker encoder C API surface |
| src/go/piperplus/engine.go | Adds speaker_embedding(+mask) support to Go runtime invocation |
| src/csharp/PiperPlus.Core/Inference/PiperSession.cs | Adds speaker embedding option to C# inference input and ONNX feed logic |
| com.piper-plus.tts/Runtime/AudioClipExtensions.cs | Adds PCM→AudioClip utilities for Unity |
| com.piper-plus.tts/Editor/PiperPlusEditor.cs | Adds Unity custom inspector with test synthesis button |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
ayutaz
added a commit
that referenced
this pull request
Apr 9, 2026
- VITS2 dur_info を SDP パスでも計算 (models.py) - Generator step で dur_disc の requires_grad 切替 (lightning.py) - ONNX export speaker_embedding axis 1 を fixed 256 に変更 - C# PiperSession/SessionFactory: 未指定時もゼロテンソル提供 + mask 2D化 - Go engine: mask 形状 (1) → (1,1) に修正 - Unity: PCM除数 32767→32768, Editor preview を update callback に変更 - C API: _reserved[5] で ABI サイズ維持, Speaker Encoder を experimental 明記 - SSML: 100KB サイズ制限追加 - CI gate: cancelled も失敗扱いに変更
ayutaz
added a commit
that referenced
this pull request
Apr 9, 2026
…ンド (#331) ## Dockerfile修正 - Alpine (musl) → Debian (glibc) に変更し ORT 互換性を確保 - ORT v1.21.0 (存在しない) → v1.24.4 (go-ci.yml と統一) - URL 命名規則を x86_64 → x64 に修正 - pyopenjtalk-plus から OpenJTalk を CMake ビルドし -tags openjtalk で日本語G2P有効化 - MeCab 辞書をイメージに同梱 ## serve サブコマンド追加 - piper-plus serve -m model.onnx --addr :8080 で HTTP TTS サーバー起動 - 共有フラグ (--model, --config, --device 等) を PersistentFlags に移動 - エンドポイント: /synthesize, /health, /info ## テスト・CI - serve_test.go: Cobra コマンド構造のユニットテスト (5テスト) - go-ci.yml: docker-build ジョブ追加 (PR時にDockerイメージビルド検証)
ayutaz
added a commit
that referenced
this pull request
Apr 9, 2026
* fix: Go Docker — Debian化 + ORT 1.24.4 + OpenJTalk日本語G2P対応 + serveサブコマンド (#331) ## Dockerfile修正 - Alpine (musl) → Debian (glibc) に変更し ORT 互換性を確保 - ORT v1.21.0 (存在しない) → v1.24.4 (go-ci.yml と統一) - URL 命名規則を x86_64 → x64 に修正 - pyopenjtalk-plus から OpenJTalk を CMake ビルドし -tags openjtalk で日本語G2P有効化 - MeCab 辞書をイメージに同梱 ## serve サブコマンド追加 - piper-plus serve -m model.onnx --addr :8080 で HTTP TTS サーバー起動 - 共有フラグ (--model, --config, --device 等) を PersistentFlags に移動 - エンドポイント: /synthesize, /health, /info ## テスト・CI - serve_test.go: Cobra コマンド構造のユニットテスト (5テスト) - go-ci.yml: docker-build ジョブ追加 (PR時にDockerイメージビルド検証) * fix: Copilot レビュー対応 — 辞書パス修正・SHA256検証・graceful shutdown - Dockerfile: OPENJTALK_DIC_DIR → OPENJTALK_DICTIONARY_PATH (Goコードが実際に読む変数名) - Dockerfile: 辞書パスを /usr/share → /usr/local/share に修正 (exe-relative Tier 2 と一致) - Dockerfile: pyopenjtalk-plus と ORT の SHA-256 チェックサム検証を追加 - serve.go: SIGTERM ハンドリング追加 (Docker/K8s 対応) - serve.go: http.Server.Shutdown() による graceful shutdown 実装 - serve_test.go: TestServeCmd_RequiresModel → TestServeCmd_RunESet にリネーム
M1 First Impression フェーズの12チケットを docs/tickets/M1/ に作成。 各チケットに目的・実装詳細・エージェントチーム構成・テスト計画・ 懸念事項・設計振り返り・後続連絡事項の7セクションを記載。
M2a コア開発+DX フェーズの9チケットを docs/tickets/M2/ に作成。 PiperPlusクラス設計、dorny/paths-filter CI最適化、CONTRIBUTING拡充など。
M2b エコシステム統合+認知度フェーズの12チケットを docs/tickets/M2/ に作成。 Wyoming Protocol、Show HN/Reddit、Rust SynthesisParams設計など。
M3a 音質・コア機能フェーズの9チケット (8タスク+Go/No-Goゲート) を作成。 ZSE-VITS Speaker Encoder、VITS2 adversarial DP、研究バッファ含む。
M3b エコシステム拡張フェーズの11チケットを作成。 LJSpeech/あみたろ/HiFi-TTS/SIWIS/KOモデル学習、Unity P/Invoke統合など。
- docs/tickets/README.md: 全53チケットのインデックス + 進捗サマリー + 依存関係図 + フェーズ横断設計振り返り - milestones-2026-H1H2.md: 全タスク一覧にチケット詳細リンク列を追加 - v1.11.0-market-reaction-and-improvements-2026-04.md: ソースドキュメント追加
Critical: M1-01 CLI例修正 (piper-tts-plusはCLI非対応) Major: M1-03 library_name判断基準、M1-06 Optional/Required区別、 M1-07 Windows psutil対応、M1-08 Piper/piper1-gpl混同修正、 M1-09 LangChain例修正、M1-12 latestタグ条件修正 Minor: M1-02/05/10/11 改善 新規: M1-13 v1.12.0リリース作業チケット
Critical: M2-01 piper_train依存方向の明確化・パッケージツリー図追加 Major: M2-03 CI WF作成タイミング、M2-04 ORT pip競合解決、 M2-05 required checks解決策・全WF分類・Cargoパス修正 Minor: M2-02 format制限、M2-06〜09 各種改善 橋渡し: M2-01にM3-1 Speaker Encoder連携情報追加
Critical: M2-19 Rust API設計を実コードと整合 (PiperVoice対象に再定義) Major: M2-10 piper_train依存明確化・6言語限定 Minor: M2-11 docker-compose v2対応、M2-13〜18 各種改善、 M2-20 SV文字修正、M2-21 PR#297補足
Major: M3-02 speaker_embedding_mask方式確定、M3-03 VC専用resume設計、 M3-06 DiDiSpeech-2(SA)除外・WenetSpeech+AISHELL-3安全案 中: M3-01 ECAPA-TDNN次元確認、M3-04 メルONNX内包を本案に、 M3-05 manual optimization調査、M3-07 pitch除外(v2.1.0延期) GATE: Stage 2品質ゲート追加、F5-TTS工数修正(+45-60d)
Critical: M3-09〜12 --ljspeech-dir修正(存在しないオプション)、 M3-15 P/Invoke宣言をC API実シグネチャと整合 Major: M3-13 emb_lang拡張PoC追加・KSS(NC)除外・CSS10第一候補 中: M3-10 ライセンスブロッカー化、M3-11 リサンプリング具体化、 M3-15 バイナリ配布方式調査、M3-17 ORT調達・macOS明示 Minor: M3-14/16/18/19 各種改善
M1-01: README「30秒で試す」セクション追加 (日英) M1-02: 「Try in Browser」WebAssemblyバッジ追加 M1-07: scripts/benchmark.py ベンチマークスクリプト作成 M1-08: README にベンチマーク比較表追加 (暫定値) M1-09: docs/guides/llm-ecosystem.md LLMエコシステム統合ガイド M1-10: docker/ollama-stack/ Ollama+piper-plus docker-compose M1-12: docker-build.yml に v* タグでのDocker Hub公開を追加
M2-01: Python高レベルAPI (PiperPlus クラス) + AudioResult (M2-02統合) M2-05: CI path filter導入 (dorny/paths-filter) + required pass-through jobs M2-07: PRテンプレート拡充 (コンポーネントチェックリスト) M2-08: CONTRIBUTING.md拡充 (テストコマンド、ライセンスポリシー、初PRガイド) M2-13: npm README改善 (importmap、Kokoro.js比較表) M2-14: WASM バンドラーガイド (Vite/webpack/Next.js)
M2-06: 14 PRワークフローに concurrency group 追加 M2-10: Wyoming Protocol TTS アダプタ (Home Assistant統合) M2-19: Rust SynthesisParams + synthesize_with_params() API改善 M2-20: SV phonemizer 統合テスト 30件追加
4チーム (API設計/コード品質/市場戦略/アーキテクチャ) による 独立分析の結果を統合。主要発見: - 推論ロジック4箇所重複 → piper_plus.engine 共通化 - Wyoming が PiperPlus 未使用 + 同期ブロッキング - README 英語デフォルト化が国際認知度のボトルネック - HACS アドオンが最大の採用機会
アーキテクチャ (CRITICAL): - piper_plus.engine モジュール新設 — piper_train 非依存の推論エンジン - api.py を engine ベースに書き換え (piper_train import を排除) - Wyoming アダプタを PiperPlus 使用の薄いラッパーに書き換え (240→71行) - Wyoming に asyncio.to_thread() 追加 (イベントループブロッキング解消) コード品質 (HIGH): - api.py: 空テキストバリデーション、パラメータ範囲チェック追加 - _model_resolver.py: アトミックDL (tmpdir→rename)、エラーメッセージ改善 - audio.py: 空音声ガード追加 - benchmark.py: --threads 引数追加 CI簡素化 (MEDIUM): - 7つの -required ジョブを1つの ci-required に統合 - CI config トリガーを言語別に細分化 (不要なジョブ実行を削減) ドキュメント (MEDIUM): - README「30秒で試す」に PiperPlus API を反映 - ベンチマーク表の「暫定値」表記を改善 - Piper archived メッセージを強化 - Quick Start 重複に相互リンク追加 - llm-ecosystem.md の「準備中」を修正 - モデル解決仕様書 + テストベクトル作成
M3a (v2.0.0) 音質・コア機能: - M3-01: Speaker Encoder (ECAPA-TDNN) モジュール実装 - M3-02: SynthesizerTrn speaker_embedding 入力パス追加 - M3-04: 全5ランタイム (Rust/C#/Go/WASM/C++) Voice Cloning 統合 - M3-05: VITS2 adversarial Duration Predictor アップグレード - M3-07: SSML 基本サポート (speak, break, prosody rate) - M3-08: MOS ベンチマークツール群 M3b (v2.1.0) エコシステム拡張: - M3-14: モデル投稿ガイド + Issue テンプレート - M3-15: Unity UPM パッケージ (P/Invoke + AudioClip) - M3-16: Unity サンプルシーン 5種 + 統合ドキュメント - M3-17: iOS/Android ビルド CI (toolchain + workflow)
P0 修正: - API層テスト追加: api.py/engine.py/model_resolver.py/audio.py (133テスト) - SSML 3ランタイム実装: Rust (39テスト), C# (59テスト), Go (67テスト) - Speaker Encoder クロスランタイムテスト + Golden file (C# 23, Go 26, Rust 16) P1 修正: - メルフィルタバンク edge case 修正 (Rust/C#/Go/JS 4ランタイム) - VITS2 dur_disc_lr デフォルト 2e-4→1e-4, lambda_dur 1.0→0.5 - speaker_embedding mask 型修正 (>0.5 → >=1), ONNX dummy入力 ones化 - spk_proj 次元不一致時の再生成修正 - Python CLI --reference-audio 統一 (--encode-speaker は後方互換で維持) - Wyoming handler テスト追加 (11テスト) P2 改善: - test_ssml.py parametrize化 (61→36関数, カバレッジ維持) - 共有conftest.py (make_vits_model/make_synthesizer_trn) - テスト名を振る舞い記述に改善 (t-wada TDD原則) - ORT バージョン一元管理 + ort-versions.md - ベンチマークツールテスト (30テスト)
M2-11: Wyoming Dockerfile (multi-stage build) + docker-compose + .env.example M2-12: Home Assistant 統合ガイド + Wyoming Protocol 統合テスト (27テスト)
- tickets/README.md: 31/54チケット完了に進捗表更新 - CLAUDE.md: M3実装済み10機能追加 (+150行) - milestones-2026-H1H2.md: DoD 15項目チェック済み更新 - retrospective: M3振り返りセクション追記
削除: M1 7件, M2 14件, M3 10件 (全てコード実装完了済み) 残存: M1 6件, M2 7件, M3 10件 (HF/GPU/記事/SNS等の外部作業) tickets/README.md を残りチケットのみに更新
全チケットファイル (.md) を削除し、M1/M2/M3 ディレクトリを除去。 README.md はリンクなしの残タスク一覧に書き換え。
- retrospective-m1-m2-from-scratch.md (知見はCLAUDE.mdに反映済み) - benchmark-mos.md (ツールは tools/benchmark/ に存在) - ecosystem-investigation-2026-04.md (時系列調査、役割終了) - releases/ (空ディレクトリ)
- Rust: ort::inputs! 戻り値型修正、SynthesisParams ..Default::default() 追加、golden fixture パス修正 - Python: 冗長 legacy テスト12件削除 (新G2Pテストでカバー済み) - Python: test_custom_dict/test_phonemizer_registry を実APIに修正 - Python runtime: gradio遅延インポート、mock パス修正、config kwarg修正 - Go: French phonemizer i++ 漏れ修正、PT/SV golden test に PUA チェック追加
- python-tests.yml: test/ (58テスト), tools/benchmark/ (30テスト) 追加 - python-tests.yml: runtime テスト全件 (config, training, CLI等) 追加 - test-webassembly.yml: 欠落していた13テストファイル (optimization, edge-cases等) 追加 - pytest.ini: testpaths に test/ と tools/benchmark 追加
- VITS2 dur_info を SDP パスでも計算 (models.py) - Generator step で dur_disc の requires_grad 切替 (lightning.py) - ONNX export speaker_embedding axis 1 を fixed 256 に変更 - C# PiperSession/SessionFactory: 未指定時もゼロテンソル提供 + mask 2D化 - Go engine: mask 形状 (1) → (1,1) に修正 - Unity: PCM除数 32767→32768, Editor preview を update callback に変更 - C API: _reserved[5] で ABI サイズ維持, Speaker Encoder を experimental 明記 - SSML: 100KB サイズ制限追加 - CI gate: cancelled も失敗扱いに変更
PR #240 で全5構成の実験を実施し、VITS2 は単体でも組み合わせでも VITS1 の品質を超えられないことが確認済み。 Duration Discriminator (--vits2) 関連コードを全て除去。 除去対象: DurationDiscriminator クラス, 3-optimizer 構成, --vits2/--dur-disc-lr/--lambda-dur CLI, test_vits2.py
- Python: ruff auto-fix (import順序, deprecated typing, 未使用import) - Rust: clippy修正 (redundant_closure, needless_range_loop, map_or, manual_flatten, approx_constant 等) + rustfmt - C#: dotnet format (SsmlParser.cs インデント) - C++: test_c_api.cpp _reserved配列ループ範囲を sizeof で算出 - Go CI: sparse-checkout に test/fixtures 追加 - WASM: 削除済みファイル参照テスト除去, baseline更新 - Python tests: espeak-ng/huggingface-hub 未インストール時 skip
- ruff: F841 (未使用変数labels), PLC0415 (noqa), E741 (変数名l→lang) - ruff format: 20ファイルのフォーマット統一 - Go lint: if-else→switch (gocritic), gofmt, unused const 除去
ayutaz
force-pushed
the
feat/vits2-voice-cloning-ssml-unity
branch
from
April 9, 2026 10:09
46203ac to
8bd296c
Compare
ayutaz
added a commit
that referenced
this pull request
Apr 10, 2026
dorny/paths-filter は push イベントではローカル git リポジトリが 必要だが、PR #331 で追加された changes ジョブに checkout が欠落 していたため push トリガーで一貫して失敗していた。 PR (pull_request) では GitHub API 経由で動作するため気付かなかった。
2 tasks
ayutaz
added a commit
that referenced
this pull request
Apr 10, 2026
* fix(ci): changes ジョブに checkout ステップを追加 dorny/paths-filter は push イベントではローカル git リポジトリが 必要だが、PR #331 で追加された changes ジョブに checkout が欠落 していたため push トリガーで一貫して失敗していた。 PR (pull_request) では GitHub API 経由で動作するため気付かなかった。 * fix(ci): changes ジョブに contents: read 権限を追加 checkout には contents: read が必要だが、job-level permissions で pull-requests: read のみ指定していたため不足していた。
5 tasks
ayutaz
added a commit
that referenced
this pull request
May 3, 2026
* docs: 監査結果に基づくドキュメント全面同期 v1.11.0 以降の実装変更 (#321 OpenAI互換API, #331 Voice Cloning/SSML, #337 短文品質, #342 HTS voice除去, #349/#367 phoneme timing/streaming, #361 FastAPI移行, #366 arm64 Docker) が CHANGELOG・多言語 README・docstring に未反映だった部分を一括同期。新規に C# CLI/Core README を追加。 - ルート CHANGELOG: Unreleased に #360-#366 (FastAPI移行/arm64 Docker/短文崩壊修正/Wyoming HA等) を追記 - 多言語 README 9 ファイル (DE/ES/FR/HI/KO/PT/RU/SV/ZH): Voice Cloning/SSML/Phoneme Timing/Strategy A/B/C/FastAPI を反映 - C# CLI/Core README 新規作成 (src/csharp/PiperPlus.Cli/, PiperPlus.Core/) - WASM CHANGELOG: [0.3.1] セクション追加 + [0.4.0] 日付修正 (0.3.0 と同日問題解消) - docstring 補強: http_server.py FastAPI エンドポイント / inference.py OpenAI 互換 API - HTS voice 残存言及を削除 (windows-setup.md) - --language-balanced-sampling help を 6 言語対応に更新 (バイリンガル時代の遺物修正) - Go README: Docker multi-arch (amd64/arm64) + serve サブコマンドのセクション追加 - pretrained-models.md: つくよみちゃん 6lang-v2 / 6lang ベースモデルの詳細追記 - huggingface-space/docker/README: 言語表記/Go arm64 表記の整合修正 * docs: 二次監査で発見した取り残しを追加修正 前回コミット (f212aba) では多言語 README 9 ファイルを更新したが、 ベースとなる README.md (日本語) と README_EN.md には Voice Cloning / SSML / 短文品質改善の bullets を入れ忘れていた。 また Rust piper-core/src/lib.rs のクレートドキュメントが「7 言語 (KO 含むが SV を欠く)」のまま、 8 言語 G2P + 6 言語学習済みモデルという最新の状態を反映していなかった。 - README.md / README_EN.md のインターフェースセクション末尾に Voice Cloning / SSML / 短文品質改善 (Strategy A/B/C) の 3 bullets を追加 (多言語版と同等内容) - src/rust/piper-core/src/lib.rs:4 のクレートドキュメントを「8 言語 G2P (JA/EN/ZH/KO/ES/FR/PT/SV)、学習済みモデルは 6 言語」に修正 二次監査で誤指摘と判明した項目はスキップ: - WASM g2p test の "all 7 non-JA languages" は JA を除いた 7 言語の意味で正しい (ALL_NON_JA = en/zh/ko/es/fr/pt/sv) - C# CLI README の --debug/--quiet/--version はすでに L66 に記載済み * docs: 低優先度の取り残し項目をすべて対応 二次監査で「低優先度・別 PR 推奨」と棚上げした 5 項目に対応。レガシー API (BILINGUAL/espeak) の意図と廃止予定を明示し、サンプル/パッケージのバージョン 管理状況をユーザーが誤解しないようドキュメント化する目的。 - Go (src/go/piperplus/config.go): PhonemeTypeEspeak / PhonemeTypeBilingual に Deprecated コメント追加 (CONTRIBUTING.md "espeak-ng Policy" / PR #218 への参照付き) - Python (src/python_run/piper/voice.py): PhonemeType.BILINGUAL 分岐に Deprecation 注記 + SV/KO が学習済みモデル未対応の理由をコメント化 - C# (src/csharp/PiperPlus.Core/Config/PiperConfig.cs): Espeak フィールドに XML doc 追加 (legacy config.json 互換のみ、新規モデルは null とする旨) - examples/{c-api,dart,godot}/README.md: CI で実行検証されているか否かを 各 README 冒頭に明示 (c-api はビルドのみ検証、dart/godot は未検証) - CONTRIBUTING.md: "Package Versioning Policy" セクション新規追加 (8 パッケージそれぞれの独立バージョン管理ポリシーとタグ命名規則を表形式で明文化) 実装ロジックには変更なし (コメント・docstring・README のみ)。 * docs: Copilot レビュー指摘 16 件 + 追加発見をすべて対応 Copilot pull-request reviewer が PR #368 に付けた 16 件のレビューコメントと、 それを契機にした再監査で見つかった整合性問題を一括解消。リリース直前の 一貫性確認に過ぎないので、いずれもドキュメント・コメントレベルの調整のみ。 Copilot 指摘 (16件): - 多言語 README 11 ファイル (README.md/EN/DE/ES/FR/HI/KO/PT/RU/SV/ZH): bullets が 「7 ランタイム」と書きながら列挙は 6 つだったのを「6 ランタイム」に統一。 日本語版/英語版は libpiper_plus を C++ にまとめる旨を補足 - docker/python-inference/inference.py: モジュール docstring が定義されていない `POST /api/phoneme-timing` を載せ、`/synthesize` を POST と書いていたのを修正 (該当エンドポイントは src/python_run/piper/http_server.py 側であることも明記) - src/python/piper_train/__main__.py:255-260: `--language-balanced-sampling` が `num_speakers > 1` も必要 (single-speaker は SpeakerBalancedBatchSampler を バイパス) という条件を help に追記 - docker/README.md:19: Go Dockerfile 行の base image を `golang:1.22` から 実際の `golang:1.26` に修正 - src/go/README.md:380-: `docker buildx build` の例に `--load` (single-arch) と `--push` (multi-arch) の両パターンを示し、ローカル実行不可だった例を解消 - src/go/README.md:298 / 406: 見出し「## HTTP API / HTTPエンドポイント」を 「## HTTP API」に変更してアンカーを `#http-api` に統一、リンク `[HTTP API](#http-api--http-api)` の broken anchor を修正 - src/csharp/PiperPlus.Core/README.md:34: `new DotNetG2PEngine()` は PiperPlus.Cli の `internal sealed class` で外部から呼べないため、 IJapaneseG2PEngine を持ち込む必要がある旨を明記したサンプルに置換
ayutaz
added a commit
that referenced
this pull request
May 4, 2026
* chore(release): v1.12.0 — MB-iSTFT 統一 + Voice Cloning/SSML/短テキスト品質改善 - VERSION を 1.11.0 → 1.12.0 に更新 - CHANGELOG.md に v1.12.0 の全変更点を整理 (34コミット分) ## v1.12.0 ハイライト ### Breaking - Decoder を MB-iSTFT-VITS2 に統一 (HiFi-GAN Generator 削除)、CPU 推論 2.21x 高速化 (#320) ### New Features - 全7ランタイムで短テキスト合成品質改善 Strategy A/B/C (#337) - Voice Cloning (5ランタイム) + SSML (4ランタイム) + Wyoming Docker + iOS/Android CI (#331) - Python ランタイム phoneme timing + ストリーミング文単位分割 (#349, #367) - HTTP server を Flask → FastAPI 移行 + StreamingResponse 対応 (#361) - 汎用 Colab ファインチューニングノートブック (#324) ### Refactor / Removed - HTS voice 依存を完全除去 (#342) - Unity UPM 削除 (#341) ### Chore - .NET 全プロジェクトを net10.0 LTS に移行 (#374) - GitHub Actions runner を ubuntu-24.04、Docker base を Debian trixie (#373) - EOL ランタイム (Node 18, Python 3.8) を更新 (#370) * chore(release): バージョンファイル整合性 + リリースワークフロー動的バージョン化 - src/python/piper_train/VERSION: 1.11.0 → 1.12.0 - src/python/pyproject.toml (piper-train): version 1.11.0 → 1.12.0 - uv.lock 再生成 (piper-train v1.12.0 反映) - CHANGELOG L94: Flask → FastAPI (HTTP server 移行と整合) - dev-create-release.yml: C#/Rust/npm のリリースノート install コマンドを各 manifest から動的取得に変更 (従来 0.1.0 ハードコード) * chore(packages): C#/Rust/npm パッケージのバージョンを v1.12.0 機能反映に合わせて bump v1.12.0 の Voice Cloning / SSML / 短テキスト品質改善 / Phoneme Timing は全ランタイムに影響するため、独立管理パッケージも MINOR を上げる。 - C# `PiperPlus.Core` / `PiperPlus.Cli`: 0.2.0 → 0.3.0 - Rust workspace (`piper-plus`, `piper-plus-cli`, `piper-plus-g2p` 等): 0.3.0 → 0.4.0 - 内部 path+version 依存も 0.3.0 → 0.4.0 に同期 - Cargo.lock 再生成 - npm `piper-plus` (openjtalk-web): 0.5.0 → 0.6.0 - npm `@piper-plus/g2p`: 0.3.0 → 0.4.0 - npm `piper-plus` の `@piper-plus/g2p` 依存も `^0.4.0` に更新 * fix(catalog): モデルカタログ size_bytes と説明を最新 HuggingFace アセットに同期 各言語実装 (cpp / C# / Go / Python / Rust) のモデルカタログで size_bytes と description が異なる値を持っていた問題を解消。HuggingFace Tree API で実ファイルサイズを取得して全実装で統一。 - tsukuyomi-chan-6lang-fp16.onnx: 39,652,717 B (HF 実サイズ) - css10-ja-6lang-fp16.onnx: 39,652,717 B (HF 実サイズ) - C# VoiceCatalog: tsukuyomi の size_bytes 77594624 (誤値、WavLM 旧モデル) → 39652717 に修正、描述 "WavLM discriminator (300 epochs)" → MB-iSTFT 版に更新 - Go voice_catalog: tsukuyomi の placeholder filename を実ファイル名 `tsukuyomi-chan-6lang-fp16.onnx` に修正、css10 の RepoID 誤り (piper-plus-base 指定) を `piper-plus-css10-ja-6lang` に修正 - config.json サイズも HF 実サイズ (6279 B / 5912 B) に統一 - md5_digest は空のまま (verification はスキップ動作で対応済み) * docs: 多言語 README と各種ドキュメントを v1.12.0 内容に追従 ユーザー向け文書から廃止/古い情報を一掃。 ### 多言語 README (11ファイル) - 9言語版 (DE/ES/FR/HI/KO/PT/RU/SV/ZH) で `--mb-istft` フラグ言及を除去 (v1.12.0 で常時有効) - 8言語版で Windows セットアップから espeak-ng / ESPEAK_DATA_PATH を削除し OpenJTalk 自動 DL 説明に統一 (espeak-ng は元から不使用) - 11言語全 README の .NET TFM `net8.0/net9.0` → `net10.0` (PR #374 反映) - 11言語全 README の Rust crate 例 `piper-plus = "0.2.0"` → `"0.3"` ### docs/ - docs/README.md, binary-selection.md, building-from-source.md, troubleshooting.md, windows-setup.md の `.NET 8/9` → `.NET 10` - docs/guides/training.md: `--stochastic` フラグ例を削除 (デフォルト有効のため) ### その他 - CLAUDE.md: npm version 表記 0.3.1 → 0.5.0、v1.12.0 Breaking changes 注意書き追加 - CONTRIBUTING.md: 例示バージョン v1.11.0 → v1.12.0、npm-v0.3.1 → npm-v0.5.0 - README.npm.md: importmap `piper-plus@0.4.0` → `piper-plus@0.5.0` - docker/README.md: C++ Dockerfile から espeak-ng 言及を削除 (HTS voice 依存除去 #342) - src/csharp/PiperPlus.Cli/README.md, src/python_run/README.md: .NET 10 同期 - src/python_run/README_http.md: 「Flask 版からの移行」→「v1.11 以前 (Flask) からの互換性」 - src/python_run/piper/http_server.py: docstring の "Flask-compatible" → "FastAPI compatible" * docs(readme): Rust crate version 例を 0.3 → 0.4 に修正 11 言語 README で workspace 実バージョン (`0.4.0`) と整合させる。前コミット (2686d43) で `0.2.0 → 0.3` に置換したが、bump コミット (9516bb5) で workspace は `0.4.0` まで上げているため不整合。 * docs(changelog): phonemize() Breaking 格上げ + マイグレーションガイド新設 ### CHANGELOG - `PiperVoice.phonemize()` の戻り値**意味論**変更を Added → Changed (Breaking) セクションに移動。 - 戻り値型 `list[list[str]]` は v1.11 と同じだが、v1.11 は 1 要素 (whole text) を返していたのに対し v1.12 は文ごとに N 要素返す。 - `phonemize(text)[0]` で固定アクセスしている呼び出し側は壊れるため Breaking 扱いが妥当。 ### docs/migration/v1.11-to-v1.12.md (新規) ユーザー種別ごとの移行手順を集約: - 推論のみ利用 (Breaking なし) - HiFi-GAN ckpt から学習継続中 (再 FT 必要) - Flask `[http]` extras 利用 (FastAPI 自動切替) - Unity UPM 利用 (`ayutaz/uPiper` 別 repo) - `PiperVoice.phonemize()` 直接利用 (戻り値要素数変更) - バージョン対応表 + トラブルシューティング * feat(train): HiFi-GAN ckpt resume 検出 + CONTRIBUTING に npm リリース順序追記 ### __main__.py: HiFi-GAN ckpt 検出 v1.11.0 以前の HiFi-GAN ckpt を `--resume_from_checkpoint` または `--resume-from-multispeaker-checkpoint` に渡された際、強制的に RuntimeError で migration ガイドへ案内する。検出ロジックは: - state_dict に `model_g.dec.*` がある (= decoder 入りモデル) - かつ `model_g.dec.subband_conv_post` / `model_g.dec.pqmf` の MB-iSTFT マーカーが**ない** これに合致する ckpt は HiFi-GAN ベースとみなしてエラー。従来の strict=False フォールバック (info ログだけ吐いて静かに学習継続) では構造不一致のまま 学習が進み、ユーザーが原因に気づきにくかった。 ### CONTRIBUTING.md: npm リリース順序 `@piper-plus/g2p` のリリースを先に行ってから `piper-plus` を上げる必要が あることを Release order セクションに明記。Manual Release ワークフローは PyPI/NuGet/crates.io のみ自動化されており、npm は `npm-v*` / `g2p-v*` タグ別経路で動くため、順序を間違うと `No matching version found for @piper-plus/g2p@^0.4.0` で install 失敗する。 * chore(deps): ONNX Runtime 1.14.x → 1.17.0 統一 (C++ / Android PR CI / Docker) CVE 残存リスク (GHSA-fp9j-rgxr-w83q 他) のあった C++ ローカルビルドと Android PR CI を release 配布 (release-shared-lib.yml) と同じ 1.17.0 に揃える。 - cmake/OnnxRuntime.cmake: Linux/macOS download URL を 1.14.1 → 1.17.0 - cmake/find_onnxruntime_windows.cmake: Windows download URL を 1.14.1 → 1.17.0 - docker/cpp-dev/Dockerfile: Linux x64 prebuilt 1.14.1 → 1.17.0 - _build-test-cpp.yml: Linux x64 / macOS arm64 / macOS x86_64 / Windows x64 各 ダウンロード URL を 1.14.1 → 1.17.0 - android-build.yml (PR CI): ONNXRUNTIME_VERSION 1.14.0 → 1.17.0 - ort-versions.md: Android (PR CI) 行を 1.14.0 → 1.17.0 に表更新 これで release / iOS / Android (release+PR) / C++ build / Docker dev 全てが 1.17.0 に揃う。Issue #372 の Rust ort 2.0.0-rc.12 や Python `>=1.17` (open range)、C# 1.24.3、Go 1.27.0 はそのまま (別途検討)。 * ci(security): pip-audit / cargo-audit / npm audit + Dependency Review を追加 Dependabot は週次の reactive な検出に依存していたが、PR 時点で proactive に 脆弱性を捕捉するため CVE スキャナを CI に統合。 - dependency-review-action (PR のみ): 新規追加依存の HIGH 以上で fail - pip-audit: pyproject.toml + src/python_run の OSV データソース照合 - cargo-audit: src/rust ワークスペース、warnings も deny - npm audit: src/wasm/{openjtalk-web,g2p} の production 依存 HIGH 以上で fail トリガー: - pull_request (依存ファイル変更時のみ paths フィルタ) - push to dev/main - schedule (weekly Mon 03:00 UTC = 12:00 JST) - workflow_dispatch (手動) * ci(release): WebUI Docker 自動配信 + shared-lib Windows ビルド修正 ### docker-build.yml: build-webui ジョブ追加 build-wyoming と同じパターンで build-webui ジョブを追加。タグ push 時に - ghcr.io/<owner>/<repo>/webui (常時) - DockerHub <USER>/piper-plus-webui (DOCKERHUB_USERNAME/TOKEN 設定時のみ) の両方に publish される。これで python-inference / python-train / cpp-dev / cpp-inference / wyoming / webui の 6 イメージが揃って自動更新される。 ### release-shared-lib.yml: Windows ビルドの CMake パスエスケープ修正 v1.11.0 で Windows ビルドが「`D:apiper-pluspiper-plus/install/...`」と 化けて失敗していた問題を修正。原因は bash on windows-2022 が `${{ github.workspace }}` (= `D:\a\piper-plus\piper-plus`) を展開する際、 バックスラッシュをエスケープシーケンスとして消費していたこと。 対応: - Configure CMake / Build / Verify install layout / Create archive を Unix と Windows で別ステップに分離 - Windows 側は `pwsh` + `${env:GITHUB_WORKSPACE}` + 手動で `\` → `/` 置換 - Install ステップは引数でパスを使わないので bash 共通のまま これで iOS / Android / Linux / macOS / Windows 全 5 ターゲットの shared lib が release タグで揃って配布される。 * docs(changelog): Copilot レビュー指摘を反映 — Colab notebook と HTS voice の記述を正確化 PR #375 の Copilot Reviewer インラインコメント 2 件への対応。 - L62 Colab notebook: 「任意のカスタムデータセット」→「LJSpeech 形式 (wavs/ + metadata.csv) のカスタムデータセット」 notebook の実装は LJSpeech レイアウト前提。任意形式が使える誤解を防ぐ。 - L127 HTS voice 削除: 「ピュアな pyopenjtalk-plus パスのみ使用」→ 「Python ランタイムから HTS voice 依存を完全除去 — Python は pyopenjtalk-plus パスのみ。C++/Go/Rust/WASM の OpenJTalk バックエンドは引き続き利用」 PR #342 は Python ランタイム限定の変更で、他言語の OpenJTalk バックエンドは そのまま残っている。「ピュアな…パスのみ」表記は他ランタイムユーザーを 誤解させる。 * fix(lint): except 内の raise に from None を付与 (ruff B904) HiFi-GAN ckpt 検出ロジック (c873fd4) で追加した raise RuntimeError が except ブロック内にあったため B904 違反。元の Lightning の RuntimeError は strict=False フォールバックの起点であり、HiFi-GAN 検出エラーとは無関係なので from None で抑制する。 * docs(claude): CLAUDE.md を最適化 (966 → 323 行、67% 削減) v1.12.0 リリース直前の状態に同期しつつ、構造を整理して可読性向上。 ### 削減ポイント - **学習コマンドの重複削除**: 6lang 事前学習コマンドとつくよみちゃん FT コマンドを Template A/B に統合 (3重複 → 1) - **実装済み機能セクションの圧縮**: 22 機能をカテゴリ別 (Decoder/学習補助/ONNX/Voice Cloning/G2P/ランタイム/サーバー) にグルーピング、各機能を 1-2 行に - **ファイルパス索引の集約**: 7 言語別の重複表を「Python 学習側 / ランタイム側 / 横断仕様 / 各言語ランタイム」の 4 表に統合 - **アーカイブ圧縮**: バイリンガル v2/v3/v4 詳細をバージョン比較表 + Key learnings に圧縮 - **HuggingFace モデル一覧の更新**: css10-ja-6lang を追加 ### 新規/更新内容 - v1.12.0 Breaking changes 注記をヘッダーに昇格、マイグレーションガイドへリンク - 学習済みモデル一覧を MB-iSTFT 版含めて整理 - ランタイム別パッケージ表で各言語の最新バージョン (1.12.0 / 0.3.0 / 0.4.0 / 0.6.0) を明示 - HiFi-GAN ckpt resume 不可のトラブルシューティング項目追加 - 横断仕様 (`docs/spec/*.toml`) の参照を主要ファイル索引に集約 機能の網羅性は維持。詳細な実装ファイルパスは各機能行に保持し、別途索引と二重管理しない方針に変更。 * fix(ci): CI 失敗 3 件を修正 (build-piper ORT 同期 + audit 設定調整) PR #375 で発生していた CI 失敗 3 件を解消。 ### macOS TTS test (Test Japanese TTS / Test Multilingual TTS on macos-latest) 原因: build-piper.yml は 1.14.1 を /usr/local/lib に置くが、CMake は 1.17.0 を ExternalProject 経由で取得。piper バイナリが rpath @rpath/libonnxruntime.1.17.0.dylib を期待するが、dist/piper/lib にコピーされた のは 1.14.1 dylib。結果「unloadable mach-o file type 10」(dSYM 扱い) で fail。 対応: build-piper.yml の ONNX Runtime 全参照を 1.17.0 に同期 (Linux x64 + macOS arm64、キャッシュキー suffix を v3 に更新)。これで先の C++ ORT 同期コミット (33c203b) と整合する。 ### cargo-audit (Rust) 原因: --deny warnings 指定で unmaintained 警告 (RUSTSEC-2025-0141 bincode、 RUSTSEC-2021-0153 encoding) も fail 扱いに。これらは vulnerabilities ではなく "unmaintained" 警告なのでリリースをブロックすべきではない。 対応: --deny warnings を削除。cargo audit デフォルト挙動 (実 CVE で exit 1、 unmaintained は warn のみ) に戻す。 ### npm audit (src/wasm/g2p) 原因: src/wasm/g2p は package-lock.json をコミットしていないため "This command requires an existing lockfile" で fail。 対応: audit ステップ前に lockfile を生成 (npm install --package-lock-only --no-audit --no-fund)。openjtalk-web 側はコミット済 lockfile を利用。 * fix(ci/windows): build-piper の Windows ビルドで実エラーを可視化 + piper.exe 不在を fail 扱い PR #375 の Windows multilingual ビルドが「Build succeeded」と表示されつつ piper.exe が生成されず、後続の dist 作成ステップで「piper.exe not found, creating minimal package」となり、テストが「lib/onnx not loadable」で fail していた。 原因 (推定): - `$buildResult = cmake --build ...` で stdout を変数にキャプチャしていたため 実際の build ログ (linker エラー等) が一切表示されない - LASTEXITCODE = 0 なのに piper.exe が生成されない場合 (CMake target 不一致や link 失敗の隠蔽) を検知する仕組みが無く、`Warning: piper.exe not found, creating minimal package` で握り潰されていた 対応: - cmake --build の出力をキャプチャせず、`--verbose` と `--target piper` を付与 して直接 stdout/stderr を表示 - build 後に piper.exe の存在を Test-Path で検証し、無ければ Get-ChildItem で実際に生成された exe/dll を一覧表示してから exit 1 これで次の CI 実行で根本原因 (linker エラー等) が log に表示される。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
6ランタイム横断で Voice Cloning・SSML・Unity UPM など主要機能を一括実装した PR。
新機能
<speak>,<break>,<prosody rate>を Python / Rust / C# / Go の 4 ランタイムで実装改善・修正
PiperPlusSynthOptionsに speaker_embedding フィールド追加(ABI サイズ維持)ci-requiredで cancelled も失敗扱いに強化除去
影響範囲
学習ループへの実質的なロジック変更なし。 Voice Cloning 関連の変更は推論パス (
infer(),export_onnx) のみ。Python
piper_train)g2p)piper_wyoming)tests)python_run)他言語ランタイム
CI / インフラ
test/,tools/benchmark追加ドキュメント / ツール
Stats
Test plan