Skip to content

feat: WebブラウザTTS高速化基盤 — ベンチマーク・キャッシュ・WebGPU・ストリーミング (全97テストパス) - #246

Merged
ayutaz merged 8 commits into
devfrom
feature/webgpu-optimization
Mar 16, 2026
Merged

feat: WebブラウザTTS高速化基盤 — ベンチマーク・キャッシュ・WebGPU・ストリーミング (全97テストパス)#246
ayutaz merged 8 commits into
devfrom
feature/webgpu-optimization

Conversation

@ayutaz

@ayutaz ayutaz commented Mar 16, 2026

Copy link
Copy Markdown
Owner

Summary

WebブラウザTTSの高速化・最適化基盤を構築。TDD方針で全97テストを先行作成し、以下の機能を実装。

実装内容

機能 内容 テスト
ベンチマーク基盤 BenchmarkRunner + RegressionDetector 12/12
IndexedDBキャッシュ CacheManager + DictionaryLoader統合 (iOS 50MB対応) 19/19
ORT更新 1.17.1→1.21.0, graphOptimizationLevel='extended' 13ファイル
リサンプラー SimpleResampler (線形補間, 22kHz→48kHz) 8/8
AudioWorklet PushAudioWorkletProcessor + AudioBackendFactory (3段フォールバック) 8/8
WebGPUセッション WebGPUSessionManager (webgpu→wasm-simd→wasm, WebGL除外) 11/11
統合テスト クロスモジュール統合テスト 10/10
ストリーミング TextChunker + StreamingTTSPipeline + ChunkCrossfader + RingBuffer 16/16
メモリプール TypedArrayPool (プールサイズ上限/TTL/ゼロクリア) 7/7

新規ファイル (実装)

  • src/benchmark.js — パフォーマンス計測 + リグレッション検知
  • src/cache-manager.js — IndexedDBキャッシュ (優先度ベースeviction)
  • src/resampler.js — サンプルレート変換
  • src/webgpu-session-manager.js — WebGPU/WASMフォールバック管理
  • src/streaming-pipeline.js — ストリーミングTTSパイプライン
  • src/memory-pool.js — TypedArray再利用プール
  • src/audio-worklet-processor.js — AudioWorkletプロセッサ
  • src/audio-backend-factory.js — AudioWorklet→ScriptProcessor→HTMLAudio フォールバック

新規ファイル (テスト: 9本, 97テスト)

  • test-benchmark-runner.js, test-cache-manager.js, test-dictionary-cache.js
  • test-resampler.js, test-webgpu-session.js, test-audio-backend.js
  • test-streaming-pipeline.js, test-memory-pool.js, test-phase2-integration.js

新規ファイル (ドキュメント)

  • docs/webgpu-optimization-plan.md — 最適化計画
  • docs/browser-compatibility-matrix.md — ブラウザ互換性マトリックス
  • docs/demo-integration-plan.md — デモ統合計画

コードレビュー指摘対応 (13件)

  • CRITICAL: 除算ゼロ防止、URLメモリリーク修正、TOCTOU競合解消
  • HIGH: WebGPUエラー詳細表示、nullガード、AudioNodeリーク防止
  • MEDIUM: 型検証追加、戻り値統一、タイミングテスト安定化

Test plan

  • npm run test:optimization — 91テストパス
  • node --test test/js/test-dictionary-cache.js — 6テストパス
  • ブラウザE2E (Chrome/Firefox/Safari)
  • iOS Safari手動テスト

ayutaz added 4 commits March 16, 2026 22:57
- WebGPU最適化計画ドキュメント・マイルストーン (M1-M12) 作成
- Phase 1-3 TDDテスト56本 (6ファイル) 作成、未実装分はスキップ
- M1 BenchmarkRunner + RegressionDetector 実装 (12テストパス)
- M2 CacheManager (IndexedDB, iOS 50MB制限, 優先度eviction) 実装 (13テストパス)
- GitHub Actions CI (test-web-optimization.yml) でPhase別並列テスト
- DictionaryLoaderにオプションのcacheManager/dictVersionパラメータ追加
- 辞書ファイルをhigh優先度でIndexedDBにキャッシュし2回目以降はfetchスキップ
- clearCache()メソッド追加
- 辞書キャッシュ統合テスト6本追加 (test-dictionary-cache.js)
M3: ORT 1.17.1→1.21.0 (13ファイル), graphOptimizationLevel='extended'統一
M4: SimpleResampler (線形補間, 22kHz→48kHz)
M5: AudioWorkletProcessor + AudioBackendFactory (3段フォールバック)
M6: WebGPUSessionManager (webgpu→wasm-simd→wasm, WebGL除外)
M7: Phase2統合テスト10本 + ブラウザ互換性マトリックス + デモ統合計画
M8: StreamingTTSPipeline + TextChunker + ChunkCrossfader + RingBuffer (前倒し)
M9: TypedArrayPool (MAX_POOL_SIZE/TTL/ゼロクリア) (前倒し)

レビュー指摘修正:
- CRITICAL: RegressionDetector除算ゼロ防止、HTMLAudioBackend URLリーク修正、
  getOrFetch TOCTOU競合解消
- HIGH: WebGPU失敗時エラー詳細表示、requestAdapter nullガード、
  AudioNode再生時リーク防止、test-dictionary-cacheをPhase1に追加
- MEDIUM: ChunkCrossfader戻り値統一、コールバック型検証、
  returnArrayバリデーション、タイミングテスト安定化、リサンプラーJSDoc追加
Copilot AI review requested due to automatic review settings March 16, 2026 14:55
@ayutaz ayutaz self-assigned this Mar 16, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Webブラウザ向け OpenJTalk/Piper TTS の最適化基盤(WebGPUフォールバック、IndexedDBキャッシュ、ストリーミング再生、メモリプール、ベンチマーク)を追加し、関連テスト/CI/ドキュメントを整備するPRです。src/wasm/openjtalk-web/ 配下の性能・互換性改善を段階的に進めるための土台になります。

Changes:

  • 最適化コンポーネント群(Benchmark/Cache/WebGPU session/Resampler/Streaming/Memory pool/Audio backend)を新規追加
  • Node node:test によるTDDテスト群と統合テスト、GitHub Actions ワークフローを追加
  • デモ/テスト用HTMLで ORT CDN を 1.21.0 へ更新し、セッションオプションを更新

Reviewed changes

Copilot reviewed 38 out of 38 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
src/wasm/openjtalk-web/test_synthesis_comparison.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test_padding_fix.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test_audio_length.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test/multilingual-demo/simple-multilingual.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test/multilingual-demo/piper-espeak-english.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test/multilingual-demo/piper-espeak-complete.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test/multilingual-demo/multilingual.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test/multilingual-demo/index.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/test/js/test-webgpu-session.js WebGPUSessionManager のテスト追加
src/wasm/openjtalk-web/test/js/test-streaming-pipeline.js StreamingTTSPipeline/TextChunker等のテスト追加
src/wasm/openjtalk-web/test/js/test-resampler.js SimpleResampler のテスト追加
src/wasm/openjtalk-web/test/js/test-phase2-integration.js 最適化コンポーネント横断の統合テスト追加
src/wasm/openjtalk-web/test/js/test-memory-pool.js TypedArrayPool のテスト追加
src/wasm/openjtalk-web/test/js/test-dictionary-cache.js DictionaryLoader × CacheManager 統合テスト追加
src/wasm/openjtalk-web/test/js/test-cache-manager.js CacheManager のテスト追加
src/wasm/openjtalk-web/test/js/test-benchmark-runner.js BenchmarkRunner/RegressionDetector のテスト追加
src/wasm/openjtalk-web/test/js/test-audio-backend.js AudioBackendFactory/各Backendのテスト追加
src/wasm/openjtalk-web/test/js/openjtalk-piper-integration-lazy.js ORT session options更新
src/wasm/openjtalk-web/src/webgpu-session-manager.js WebGPU→wasm-simd→wasm フォールバック実装
src/wasm/openjtalk-web/src/streaming-pipeline.js TextChunker/RingBuffer/Crossfader/Streaming pipeline 実装
src/wasm/openjtalk-web/src/resampler.js 線形補間リサンプラー実装
src/wasm/openjtalk-web/src/memory-pool.js TypedArrayPool(上限/TTL/ゼロクリア)実装
src/wasm/openjtalk-web/src/dictionary-loader.js CacheManager統合(辞書ファイルのキャッシュ)
src/wasm/openjtalk-web/src/cache-manager.js IndexedDBキャッシュ + eviction/versioning 実装
src/wasm/openjtalk-web/src/benchmark.js BenchmarkRunner/RegressionDetector 実装
src/wasm/openjtalk-web/src/audio-worklet-processor.js push型 AudioWorkletProcessor 実装
src/wasm/openjtalk-web/src/audio-backend-factory.js AudioWorklet→ScriptProcessor→HTMLAudio フォールバック実装
src/wasm/openjtalk-web/package.json 最適化テスト用npm scripts追加
src/wasm/openjtalk-web/demo/simple-multilingual.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/demo/piper-espeak-english.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/demo/piper-espeak-complete.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/demo/multilingual.html ORT CDN更新 + session options更新
src/wasm/openjtalk-web/demo/index.html ORT CDN更新 + session options更新
docs/webgpu-optimization-plan.md 最適化計画ドキュメント追加
docs/milestones/webgpu-optimization-milestones.md マイルストーン/テスト状況ドキュメント追加
docs/demo-integration-plan.md 既存デモへの統合計画ドキュメント追加
docs/browser-compatibility-matrix.md ブラウザ互換性マトリックス追加
.github/workflows/test-web-optimization.yml 最適化テスト用CIワークフロー追加

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/wasm/openjtalk-web/test/js/test-webgpu-session.js Outdated
Comment thread src/wasm/openjtalk-web/src/cache-manager.js
Comment thread src/wasm/openjtalk-web/src/cache-manager.js Outdated
Comment thread src/wasm/openjtalk-web/src/audio-backend-factory.js
Comment thread src/wasm/openjtalk-web/src/audio-backend-factory.js
Comment thread src/wasm/openjtalk-web/src/streaming-pipeline.js Outdated
Comment thread src/wasm/openjtalk-web/src/dictionary-loader.js Outdated
@ayutaz ayutaz changed the title feat: WebGPU/Web最適化基盤 — M1-M9実装 (全97テストパス) feat: WebブラウザTTS高速化基盤 — ベンチマーク・キャッシュ・WebGPU・ストリーミング (全97テストパス) Mar 16, 2026
ayutaz added 3 commits March 17, 2026 00:28
- CacheManager: dbFactory必須チェック追加、objectStore(name)呼び出し修正、
  _wrap()をMock/実IDBで正しく分岐(_mockフラグ方式)
- AudioBackendFactory: Workletフォールバック時にAudioContextをclose()、
  HTMLAudioBackend.play()で既存再生を停止してからBlob生成
- ChunkCrossfader: クロスフェード係数をactualFadeLenで正規化(0..1保証)
- DictionaryLoader: getOrFetch()にpriority引数追加、冗長なset()削除
- テストコメント修正、MockIndexedDB 4箇所を_mock対応に統一
ソース修正:
- WebGPUSessionManager: 無効なwasm-simd EP削除、maxStorageBufferBindingSize
  チェック追加、エラーメッセージ安全化
- CacheManager: 実IDB対応のstatic async create()追加、getOrFetch()の
  インフライト重複排除、dbFactory戻り値検証、_wrap()ハングガード
- ChunkCrossfader: 空チャンクガード追加、1サンプル50/50ブレンド修正
- AudioBackendFactory: dispose()をasync化、play()失敗時blob URLクリーンアップ、
  onaudioprocess null化
- DictionaryLoader: キャッシュ時の逐次ロード化(TOCTOU解消)、
  loadFromArchive dead code削除、_loadSingleFile()抽出

テスト改善:
- MockIndexedDB を test/helpers/ に共通化 (DRY違反解消)
- 18テスト追加: eviction動作、コンストラクタ検証、priority伝播、
  インフライト重複排除、空チャンク、短チャンク、1サンプルcrossfade、
  dispose Promise、onaudioprocess null化、double-play、null adapter等
Ubuntu Debugビルドでapt-get installが10分を超えタイムアウトするケースがあったため。
削除: webgpu-optimization-plan.md, milestones/, demo-integration-plan.md,
usability-issues-2026-03.md, browser-compatibility-matrix.md,
license-compliance.md, cli-enhancements.md, custom_dictionary.md,
gpu-configuration.md, streaming-mode.md, multi-gpu-training.md,
model-size-impact-analysis-ja.md, arm64-optimization.md, japanese-usage.md,
features/README.md, getting-started/README.md

docs/README.md のリンクを現存ファイルのみに修正。
@ayutaz
ayutaz merged commit bff4781 into dev Mar 16, 2026
41 checks passed
@ayutaz
ayutaz deleted the feature/webgpu-optimization branch March 16, 2026 17:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants