OmniVoice
概要
ローカルで音声を生成する OmniVoice Studio MCP サーバーを利用します。ツール: generate_speech, list_voices, list_personalities, list_languages, check_health。リソース: voice://{id}, history://recent。
前提条件 — バックエンドが稼働している必要があります
MCP ツールはすべて $OMNIVOICE_API_URL(デフォルトは http://localhost:3900)にアクセスします。バックエンドがダウンしていると、すべてのツールが接続エラーを返します。インストールと起動:
git clone https://github.com/debpalash/OmniVoice-Studio.git "$OMNIVOICE_HOME"
cd "$OMNIVOICE_HOME"
uv sync
VIRTUAL_ENV="$(pwd)/.venv" uv pip install 'mcp[cli]'
その後:
scripts/check-health.sh # 起動していれば exit 0
scripts/start-backend.sh # バックグラウンドで起動 (MPS/CUDA 自動検出)
初回の合成呼び出しで k2-fsa/OmniVoice モデル (~2.4 GB) を HuggingFace から遅延ダウンロードします。キャッシュされるため、2回目以降の起動は高速です。
タスク一覧 — 適切なツールを選択
| タスク | ツール | 備考 |
|---|---|---|
| バックエンドが起動しているか確認 | check_health | `{"status":"ok","device":"mps |
| 保存された音声でテキスト→音声 | generate_speech(text, profile_id) | base64 WAV を返す。 profile_id="demo0001" はバンドルされたデモ音声 |
| クローンなしでテキスト→音声 (音声デザイン) | generate_speech(text, instruct="…") | profile_id を省略し、instruct に例: "優しい中年女性ナレーター、落ち着いた口調" を指定 |
| 多言語ナレーション | generate_speech(text, language="es") | ISO 639 コードまたは "Auto" が使用可能 |
| 既存の音声一覧表示 | list_voices | id、名前、タイプ、パーソナリティを返す |
| パーソナリティプリセット一覧表示 | list_personalities | ナレーター / カジュアル / ニュースアンカーなどとその instruct 文字列を返す |
| サポート言語一覧表示 | list_languages | 合計 646 言語。人気20言語 + 総数を返す |
重要な判断(どのエンジンを使うか、OmniVoice を kokoro / Edge TTS / ElevenLabs の代わりに選ぶタイミング)については、references/engines-comparison.md を参照してください。
MCP の配線詳細、バックエンドのライフサイクル、トラブルシューティング、クリーンな停止方法については、references/mcp-setup.md を参照してください。
一般的なワークフロー
1. デモ音声を使ったワンショットナレーション
# MCP クライアント経由で呼び出されます(エージェントが自動実行します):
result = generate_speech(
text="こんにちは — これは OmniVoice がローカルで音声を生成しているテストです。",
profile_id="demo0001",
language="Japanese",
steps=16, # 8 = 高速/下書き · 16 = バランス · 32 = 高品質
)
# result は JSON で、audio_id、generation_time_s、audio_duration_s、format、wav_base64 を含みます
ベンチマーク: Apple Silicon MPS 上、16 拡散ステップで約 4.2 秒の音声をサーバー側約 24 秒で生成。
2. WAV をディスクに保存して再生
ツールは base64 エンコードされた PCM WAV(16ビット、モノラル、24 kHz)を返します。デコードして書き込み:
import base64, json
payload = json.loads(result_text) # ツールが返す JSON をパース
open("out.wav","wb").write(base64.b64decode(payload["wav_base64"]))
macOS の場合: afplay out.wav。MP3 変換: ffmpeg -i out.wav -codec:a libmp3lame -b:a 128k out.mp3。
3. 音声クローン — エンドツーエンドのレシピ
クローンには、モデルが話者埋め込みとして使用する 3~10 秒の参照クリップが必要です。MCP サーバーはプロファイル作成機能を公開していません — 既存のプロファイルを読み取るのみです。プロファイルを作成するには 2 つの方法があります:
方法 A — バンドルヘルパー (macOS、新規クローンに推奨):
scripts/record-reference.sh ~/Downloads/my-ref.wav 12 1
# 引数: 出力パス 録音時間(秒) マイクインデックス
# デフォルトの mic_index=1 (MacBook 内蔵); デバイス一覧表示:
# ffmpeg -f avfoundation -list_devices true -i ""
このスクリプトは、macOS の say コマンドと /System/Library/Sounds/Ping.aiff を使用して聴覚可能なカウントダウンと開始/終了合図を提供するため、ユーザーは発話タイミングを正確に把握できます(ターミナルの stdout はバッファリングされるため、テキスト「speak now」プロンプトは遅れて届きます)。より長い生の録音ウィンドウを取得した後、silenceremove + atrim で約 10 秒の音声にトリミングし、再生確認を行い、次のステップの curl コマンドを表示します。
方法 B — 手動:
# 1. 録音 (モノラル、24 kHz ネイティブ — モデルの内部レートに一致)
ffmpeg -f avfoundation -i ":1" -t 12 -ac 1 -ar 24000 raw.wav
# 2. 先頭の無音を除去し、最初の 10 秒の音声を抽出
ffmpeg -i raw.wav \
-af "silenceremove=start_periods=1:start_silence=0.05:start_threshold=-40dB,atrim=end=10" \
-ac 1 -ar 24000 ref.wav
# 3. 確認
ffmpeg -i ref.wav -af volumedetect -f null - 2>&1 | grep volume # 最大値は -20 dB より大きいこと
afplay ref.wav
/profiles に POST (multipart/form-data — 必須フィールド: name, ref_audio):
curl -X POST http://127.0.0.1:3900/profiles \
-F "name=carlos-clone" \
-F "[email protected]" \
-F "ref_text=クリップ内で話されている正確なテキスト" \
-F "language=Japanese" \
| python3 -m json.tool
# 返り値: { "id": "abc12345", "name": "carlos-clone" }
作成後、profile_id を generate_speech(MCP 経由)または直接 POST /generate で使用します。プロファイルは SQLite と参照音声ファイル(~/Library/Application Support/OmniVoice/voices/<id>.<ext>)に保存されます。バックエンドはアップロードされた拡張子を保持します(WAV の場合は .wav、MP3 の場合は .mp3 など)。状態はバックエンドの再起動後も維持されます。
品質に大きく影響する参照クリップのヒント:
| 要因 | なぜ重要か |
|---|---|
| 単一話者 | 複数話者が混ざると埋め込みがぼやける |
| クリーンな音声、音楽やノイズなし | モデルはノイズも埋め込んでしまう |
| 自然なプロソディ(パングラムを避ける) | 拡散サンプルは音色だけでなくプロソディも再現する |
| 3~10 秒が最適 | 3 秒未満は情報不足、10 秒超は品質向上なく計算量が増加 |
ref_text を実際の発話に合わせる | 特にノイズの多い参照でアライメントが向上 |
language が正しい | 言語が間違っていると、言語横断的な転移アーティファクトが発生 |
| ラウドネスのピーク ≥ -15 dB | 静かな参照でも動作するが、正規化が不十分 |
4. 音声デザイン(参照クリップ不要)
profile_id を省略し、希望する音声を説明する instruct 文字列を提供:
generate_speech(
text="エージェントシステムの未来へようこそ。",
instruct="温かみのある中年女性ナレーター、落ち着いた権威ある口調、ドキュメンタリースタイル",
)
list_personalities で既製の instruct を取得し、目的に合ったもの(ナレーター、カジュアル、ニュースアンカーなど)をコピーしてください。
5. ビデオ吹き替え(ウェブ UI のみ)
MCP サーバーは吹き替えエンドポイントを公開していません。文字起こし→翻訳→再音声→マルチプレックスの完全なパイプラインは、デスクトップ UI($OMNIVOICE_HOME で bun run desktop)と /dub/* REST ルートの背後にあります。ユーザーがビデオ吹き替えを依頼した場合は、UI を案内し、このスキルは上記の合成プリミティブにのみ使用してください。
OmniVoice を使用すべきでない場合
- 低スペックハードウェアでの高速英語ナレーションのみ →
kokoro-ttsは約 10 分の 1 のサイズで、CPU 上でリアルタイムの 2 倍の速度(references/engines-comparison.md 参照) - 最も低い摩擦で一度だけ TTS を使いたい場合 → Edge TTS はインストールもバックエンドも不要
- コストを気にせず最高品質を求める場合 → ElevenLabs は依然として英語ナレーションの洗練度で優位。OmniVoice は多言語とクローンで同等かそれ以上
- リアルタイムストリーミングディクテーション → OmniVoice デスクトップウィジェット(
⌘+⇧+Space)を使用し、MCP サーバーは使用しない
リソース
- references/engines-comparison.md — OmniVoice / kokoro / Voicebox / Edge TTS / ElevenLabs / クラウド API 間の判断ツリー
- references/mcp-setup.md — MCP 配線、バックエンドライフサイクル、環境変数、トラブルシューティング
- scripts/check-health.sh —
curl /health、exit 0/1 - scripts/start-backend.sh — uvicorn を 127.0.0.1:3900 で起動、ヘルスプローブ付き
- scripts/stop-backend.sh — バインドされた PID に
kill -TERMでクリーンシャットダウン - scripts/record-reference.sh — macOS のみ: クローン用の参照クリップを録音、トリミング、確認。ターミナル出力のバッファリングを回避する聴覚合図(
say+ システムビープ)を提供
バックエンド Swagger / OpenAPI: http://127.0.0.1:3900/docs(バックエンド起動時)
アップストリーム: github.com/debpalash/OmniVoice-Studio — FSL-1.1-ALv2(個人/内部/非商用利用は無料。各リリースから 2 年後に自動的に Apache-2.0 に変更)