0.1.1 • Published 5 months ago

@kajidog/mcp-tts-voicevox v0.1.1

Weekly downloads
-
License
ISC
Repository
github
Last release
5 months ago

MCP TTS VOICEVOX

VOICEVOX を使用した音声合成 MCP サーバー

特徴

  • キュー管理機能 - 複数の音声合成リクエストを効率的に処理
  • プリフェッチ - 次の音声を事前に生成し、再生をスムーズに
  • クロスプラットフォーム対応 - Windows、macOS で動作
  • Stdio 対応 - 標準入出力による MCP プロトコル通信(Claude Desktop 等で推奨)
  • SSE 対応 - Server-Sent Events によるリアルタイム対話形式音声再生
  • StreamableHTTP 対応 - ストリーミング形式での HTTP 通信による高速音声合成
  • 対話形式音声再生 - チャット形式でのリアルタイム音声合成・再生機能
  • 複数話者対応 - セグメント単位での個別話者指定が可能
  • テキスト自動分割 - 長文の自動分割による安定した音声合成
  • 独立したクライアントライブラリ - @kajidog/voicevox-client として別パッケージで提供

必要条件

インストール

npm install -g @kajidog/mcp-tts-voicevox

使い方

MCP サーバーとして

1. VOICEVOX エンジンを起動

VOICEVOX エンジンを起動し、デフォルトポート(http://localhost:50021)で待機状態にします。

2. MCP サーバーを起動

標準入出力モード(推奨):

npx @kajidog/mcp-tts-voicevox

HTTP サーバーモード:

# Linux/macOS
MCP_HTTP_MODE=true npx @kajidog/mcp-tts-voicevox

# Windows PowerShell
$env:MCP_HTTP_MODE='true'; npx @kajidog/mcp-tts-voicevox

MCP ツール一覧

MCP サーバーは以下のツールを提供します:

speak - テキスト読み上げ

テキストを音声に変換して再生します。

パラメータ:

  • text: 文字列配列、またはテキストと話者ペアの配列
  • speaker (オプション): 話者 ID
  • speedScale (オプション): 再生速度
  • query (オプション): 事前生成済みクエリ

使用例:

// シンプルなテキスト
{ "text": ["こんにちは", "今日はいい天気ですね"] }

// 話者指定
{ "text": ["こんにちは", "今日はいい天気ですね"], "speaker": 3 }

// セグメント別話者指定
{ "text": [{"text": "こんにちは", "speaker": 1}, {"text": "今日はいい天気ですね", "speaker": 3}] }

generate_query - クエリ生成

音声合成用クエリを生成します。

パラメータ:

  • text: 合成するテキスト
  • speaker (オプション): 話者 ID
  • speedScale (オプション): 再生速度

synthesize_file - ファイル生成

音声ファイルを生成し、パスを返します。

パラメータ:

  • text (オプション): 合成するテキスト
  • query (オプション): 事前生成済みクエリ
  • output: 出力ファイルパス
  • speaker (オプション): 話者 ID
  • speedScale (オプション): 再生速度

stop_speaker - 再生停止

現在の音声合成キューをクリアします。

get_speakers - 話者一覧取得

利用可能な話者一覧を取得します。

get_speaker_detail - 話者詳細取得

指定した UUID の話者詳細情報を取得します。

パラメータ:

  • uuid: 話者 UUID

対話形式音声再生の使用例

StreamableHTTP を使用した対話形式再生

// セッション初期化
const response = await fetch("http://localhost:3000/mcp", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    method: "initialize",
    params: {
      protocolVersion: "2024-11-05",
      capabilities: {},
    },
    id: 1,
  }),
});

const sessionData = await response.json();
const sessionId = response.headers.get("mcp-session-id");

// 音声合成・再生リクエスト
const speakResponse = await fetch("http://localhost:3000/mcp", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "mcp-session-id": sessionId,
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    method: "tools/call",
    params: {
      name: "speak",
      arguments: {
        text: ["こんにちは、対話形式で音声を再生します"],
        speaker: 1,
        speedScale: 1.0,
      },
    },
    id: 2,
  }),
});

const result = await speakResponse.json();
console.log("結果:", result);

複数話者を使用した対話例

// 複数話者での会話例
const conversationResponse = await fetch("http://localhost:3000/mcp", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "mcp-session-id": sessionId,
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    method: "tools/call",
    params: {
      name: "speak",
      arguments: {
        text: [
          { text: "こんにちは!", speaker: 1 },
          { text: "お元気ですか?", speaker: 3 },
          { text: "とても元気です!", speaker: 1 },
        ],
      },
    },
    id: 3,
  }),
});

SSE を使用した対話形式再生(レガシー)

// SSE接続の確立
const eventSource = new EventSource("http://localhost:3000/sse");
let sessionId = null;

eventSource.onopen = function (event) {
  console.log("SSE接続が確立されました");
};

eventSource.onmessage = function (event) {
  const data = JSON.parse(event.data);

  if (data.type === "session") {
    sessionId = data.sessionId;
    console.log("セッションID:", sessionId);

    // 音声合成リクエストを送信
    sendSpeakRequest();
  }
};

async function sendSpeakRequest() {
  await fetch(`http://localhost:3000/messages?sessionId=${sessionId}`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      jsonrpc: "2.0",
      method: "tools/call",
      params: {
        name: "speak",
        arguments: {
          text: ["SSEを使用した音声再生です"],
          speaker: 1,
        },
      },
      id: 1,
    }),
  });
}

パッケージ構成

このプロジェクトは以下の2つのパッケージで構成されています:

@kajidog/mcp-tts-voicevox (このパッケージ)

  • MCPサーバー - Claude Desktop等のMCPクライアントと通信するサーバー
  • Node.js専用 - デスクトップ環境やCLI環境での使用を想定
  • ツール提供 - speak, generate_query, synthesize_file 等のMCPツール
  • HTTPサーバー - SSE/StreamableHTTP対応のWebサーバー

@kajidog/voicevox-client (独立パッケージ)

  • 汎用ライブラリ - VOICEVOXエンジンとの通信機能を提供
  • クロスプラットフォーム - Node.js とブラウザ環境の両方で動作
  • キュー管理 - 複数の音声合成リクエストを効率的に処理
  • プリフェッチ機能 - 次の音声を事前に生成し、再生をスムーズに

使い分けガイド

MCPサーバーを使用する場合 (@kajidog/mcp-tts-voicevox):

  • Claude Desktop でTTSツールを使いたい
  • コマンドラインからMCPサーバーを起動したい
  • Webアプリケーション向けのHTTP APIが必要

クライアントライブラリを使用する場合 (@kajidog/voicevox-client):

  • 独自のNode.jsアプリケーションにTTS機能を組み込みたい
  • ブラウザアプリケーションでVOICEVOXを使いたい
  • MCPプロトコルを使わずに直接VOICEVOX機能を利用したい

詳細な使用方法は @kajidog/voicevox-client のドキュメント を参照してください。

MCP 設定例

Claude Desktop での設定

⚠️ 重要: Claude Desktop の通信モードについて

Claude Desktop は現在 Stdio モードのみ をサポートしており、SSE/HTTP モードは直接サポートされていません。

推奨設定(Stdio モード)

claude_desktop_config.json ファイルに以下の設定を追加:

{
  "mcpServers": {
    "tts-mcp": {
      "command": "npx",
      "args": ["-y", "@kajidog/mcp-tts-voicevox"],
    }
  }
}

SSE モードが必要な場合

SSE モードでの音声合成が必要な場合は、mcp-remote を使用して SSE↔Stdio 変換を行えます:

  1. Claude Desktop 設定

    {
      "mcpServers": {
        "tts-mcp-proxy": {
          "command": "npx",
          "args": ["-y", "mcp-remote", "http://localhost:3000/sse"]
        }
      }
    }
  2. SSE サーバーの起動

    Mac/Linux:

    MCP_HTTP_MODE=true MCP_HTTP_PORT=3000 npx @kajidog/mcp-tts-voicevox

    Windows:

    $env:MCP_HTTP_MODE='true'; $env:MCP_HTTP_PORT='3000'; npx @kajidog/mcp-tts-voicevox

AivisSpeech での設定例

{
  "mcpServers": {
    "tts-mcp": {
      "command": "npx",
      "args": ["-y", "@kajidog/mcp-tts-voicevox"],
      "env": {
        "VOICEVOX_URL": "http://127.0.0.1:10101",
        "VOICEVOX_DEFAULT_SPEAKER": "888753764"
      }
    }
  }
}

HTTP モードでの設定

{
  "mcpServers": {
    "tts-mcp-http": {
      "command": "npx",
      "args": ["-y", "@kajidog/mcp-tts-voicevox"],
      "env": {
        "MCP_HTTP_MODE": "true",
        "MCP_HTTP_PORT": "3000",
        "MCP_HTTP_HOST": "0.0.0.0",
        "VOICEVOX_URL": "http://localhost:50021",
        "VOICEVOX_DEFAULT_SPEAKER": "1"
      }
    }
  }
}

環境変数

VOICEVOX 設定

  • VOICEVOX_URL: VOICEVOX エンジンの URL(デフォルト: http://localhost:50021
  • VOICEVOX_DEFAULT_SPEAKER: デフォルト話者 ID(デフォルト: 1
  • VOICEVOX_DEFAULT_SPEED_SCALE: デフォルト再生速度(デフォルト: 1.0

サーバー設定

  • MCP_HTTP_MODE: HTTP サーバーモードの有効化(true で有効)
  • MCP_HTTP_PORT: HTTP サーバーのポート番号(デフォルト: 3000
  • MCP_HTTP_HOST: HTTP サーバーのホスト(デフォルト: 0.0.0.0
  • NODE_ENV: 開発モード(development で有効)

トラブルシューティング

よくある問題

  1. VOICEVOX エンジンが起動していない

    curl http://localhost:50021/speakers
  2. ポートが既に使用されている (EADDRINUSE エラー)

    • 別のポート番号を使用するか、既存のプロセスを終了してください
  3. MCP クライアントで認識されない

    • パッケージのインストールを確認:npm list -g @kajidog/mcp-tts-voicevox
    • 設定ファイルの JSON 構文を確認
  4. 音声が再生されない

    • システムの音声出力デバイスを確認
    • VOICEVOX エンジンの動作確認:
      curl -X POST "http://localhost:50021/audio_query?text=テスト&speaker=1"

ライセンス

ISC

MseeP.ai Security Assessment Badge

0.1.1

5 months ago

0.1.0

5 months ago

0.0.13

5 months ago

0.0.12

6 months ago

0.0.11

6 months ago

0.0.10

6 months ago

0.0.9

6 months ago

0.0.8

7 months ago

0.0.7

7 months ago

0.0.6

7 months ago

0.0.5

7 months ago

0.0.4

7 months ago

0.0.3

7 months ago

0.0.2

7 months ago