diff --git a/docs-tech/dgx-spark-vibevoice-asr/index.md b/docs-tech/dgx-spark-vibevoice-asr/index.md new file mode 100644 index 0000000..54b7ab2 --- /dev/null +++ b/docs-tech/dgx-spark-vibevoice-asr/index.md @@ -0,0 +1,247 @@ +--- +sidebar_position: 8 +title: DGX SparkでVibeVoice ASRを動かす — リアルタイム日本語音声認識 +description: Microsoft VibeVoice ASRをDGX Spark環境でDockerベースで動かし、バッチ処理とリアルタイム音声認識を実現する方法 +hide_table_of_contents: false +displayed_sidebar: null +--- + +# DGX Spark で VibeVoice ASR を動かす — リアルタイム日本語音声認識 + +## はじめに + +Microsoft の **VibeVoice ASR** を DGX Spark 環境で動作させるための Docker ベースのセットアップ手順です。 + +### VibeVoice ASR とは + +VibeVoice は Microsoft が開発したオープンソースの音声認識モデルで、以下の特徴があります: + +- **高精度な日本語認識** — 日本語を含む多言語対応 +- **話者分離(Diarization)** — 複数話者を区別 +- **タイムスタンプ** — 発話区間を正確に記録 +- **ストリーミング対応** — リアルタイム音声認識 + +### 本セットアップの機能 + +| 機能 | 説明 | ポート | +|------|------|--------| +| **バッチASR (Gradio)** | ファイルアップロード・マイク録音からの認識 | 7860 | +| **リアルタイムASR** | WebSocket によるストリーミング認識 | 8000 | + +追加で以下をサポート: +- MKV/MP4 動画ファイルからの音声抽出 +- 話者分離(Speaker Diarization) +- タイムスタンプ付き出力 + +## 必要環境 + +- **NVIDIA GPU** — CUDA 13.1 対応(DGX Spark / Blackwell GB10) +- **Docker** — NVIDIA Container Toolkit 導入済み +- **VRAM** — 約 8GB 以上 + +## クイックスタート + +### 1. リポジトリをクローン + +```bash +cd ~ +git clone https://github.com/YOUR_REPO/vibevoice-asr.git +cd vibevoice-asr +``` + +### 2. Docker イメージをビルド + +```bash +./setup.sh build +``` + +ビルドには数分かかります(NGC PyTorch コンテナベース)。 + +### 3. サービスを起動 + +**バッチ ASR(Gradio UI)のみ:** + +```bash +./setup.sh demo +``` + +→ `http://localhost:7860` でアクセス + +**リアルタイム ASR のみ:** + +```bash +./setup.sh realtime +``` + +→ WebSocket: `ws://localhost:8000/ws/asr/{session_id}` +→ テストクライアント: `http://localhost:8000/static/realtime_client.html` + +**両方を同時起動:** + +```bash +./setup.sh serve +``` + +## 使い方 + +### Gradio UI(バッチ処理) + +1. ブラウザで `http://:7860` にアクセス +2. 「Upload Audio」でファイルをアップロード、または「Record」でマイク録音 +3. 「Transcribe」をクリック +4. 認識結果(テキスト、話者、タイムスタンプ)が表示される + +対応フォーマット:WAV, MP3, M4A, FLAC, OGG, MKV, MP4 + +### リアルタイム ASR(WebSocket) + +ブラウザからマイク入力をストリーミングで認識: + +```javascript +const ws = new WebSocket('ws://localhost:8000/ws/asr/demo'); + +ws.onopen = () => { + console.log('Connected'); + startAudioCapture(); +}; + +ws.onmessage = (event) => { + const data = JSON.parse(event.data); + if (data.type === 'final_result') { + console.log('認識結果:', data.text); + } else if (data.type === 'partial_result') { + console.log('認識中:', data.text); + } +}; + +// 音声送信 (16kHz, 16-bit PCM) +function sendAudio(pcmData) { + ws.send(pcmData.buffer); +} +``` + +## WebSocket プロトコル + +### クライアント → サーバー + +| 種類 | 形式 | 内容 | +|------|------|------| +| 音声データ | Binary | PCM 16-bit, 16kHz, モノラル | +| 設定変更 | JSON | `{"type": "config", "config": {...}}` | +| 停止 | JSON | `{"type": "stop"}` | + +### サーバー → クライアント + +| type | 説明 | +|------|------| +| `status` | 接続状態の通知 | +| `partial_result` | 認識中の中間結果 | +| `final_result` | 確定した認識結果(タイムスタンプ・話者ID付き) | +| `vad_event` | 発話開始/終了イベント | +| `error` | エラー通知 | + +### レスポンス例 + +```json +{ + "type": "final_result", + "text": "こんにちは、今日の天気はいいですね。", + "is_final": true, + "segments": [ + { + "start_time": 0.5, + "end_time": 3.2, + "speaker_id": "SPEAKER_00", + "text": "こんにちは、今日の天気はいいですね。" + } + ], + "latency_ms": 850 +} +``` + +## 設定オプション + +### 環境変数 + +| 変数 | デフォルト | 説明 | +|------|------------|------| +| `VIBEVOICE_HOST` | `0.0.0.0` | バインドするホスト | +| `VIBEVOICE_PORT` | `8000` | ポート番号 | +| `VIBEVOICE_MODEL_PATH` | `microsoft/VibeVoice-ASR` | モデルパス | +| `VIBEVOICE_DEVICE` | `cuda` | デバイス (cuda/cpu) | +| `VIBEVOICE_MAX_SESSIONS` | `10` | 最大同時接続数 | + +### コマンドラインオプション + +| オプション | デフォルト | 説明 | +|------------|------------|------| +| `--host` | `0.0.0.0` | バインドするホスト | +| `--port` | `8000` | ポート番号 | +| `--model-path` | `microsoft/VibeVoice-ASR` | モデルパス | +| `--device` | `cuda` | デバイス | +| `--max-sessions` | `10` | 最大同時接続数 | +| `--no-preload` | - | モデルの事前ロードを無効化 | + +## Docker 手動実行 + +### バッチ ASR + +```bash +docker run --gpus all -p 7860:7860 vibevoice-asr:dgx-spark +``` + +### リアルタイム ASR + +```bash +docker run --gpus all -p 8000:8000 vibevoice-asr:dgx-spark \ + python -m realtime.server --host 0.0.0.0 --port 8000 +``` + +### 両方同時 + +```bash +docker run --gpus all -p 7860:7860 -p 8000:8000 vibevoice-asr:dgx-spark ./run_all.sh +``` + +## トラブルシューティング + +### GPU メモリ不足 + +モデルは約 8GB 以上の VRAM を必要とします。メモリ不足の場合: + +```bash +docker run --gpus all \ + -e PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ + -p 8000:8000 vibevoice-asr:dgx-spark \ + python -m realtime.server +``` + +### WebSocket 接続エラー + +1. ファイアウォールでポート 8000 が開いているか確認 +2. CORS の問題がある場合は同一オリジンからアクセス +3. `wss://` (HTTPS) 環境では別途 TLS 設定が必要 + +### マイクが認識されない + +ブラウザでマイクへのアクセス許可を確認してください。HTTPS または `localhost` からのアクセスが必要です。 + +## 性能の目安 + +| 項目 | 数値 | +|------|------| +| モデルサイズ | 約 8GB VRAM | +| 初回ロード | 10-20 秒 | +| リアルタイム遅延 | 150-850 ms | +| 対応サンプルレート | 16kHz | + +## 参考リンク + +- [microsoft/VibeVoice](https://github.com/microsoft/VibeVoice) — 公式リポジトリ +- [NGC PyTorch Container](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch) — ベースイメージ +- [DGX Spark セットアップガイド](https://docs.nvidia.com/dgx/) — NVIDIA 公式ドキュメント + +## ライセンス + +VibeVoice ASR は Microsoft 社のオープンソースプロジェクトです。 +ライセンスについては [microsoft/VibeVoice](https://github.com/microsoft/VibeVoice) を参照してください。