@kajidog/mcp-tts-voicevox 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -205
- package/dist/index.js +0 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -18
- package/dist/server.js.map +1 -1
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +49 -7
- package/dist/sse.js.map +1 -1
- package/package.json +2 -4
- package/dist/test.d.ts +0 -2
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -347
- package/dist/test.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,13 +4,10 @@ VOICEVOX を使用した音声合成 MCP サーバー
|
|
|
4
4
|
|
|
5
5
|
## 特徴
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- **高度な再生制御** - キュー管理・即時再生・同期/非同期制御による柔軟な音声処理
|
|
8
8
|
- **プリフェッチ** - 次の音声を事前に生成し、再生をスムーズに
|
|
9
|
-
- **クロスプラットフォーム対応** - Windows、macOS で動作
|
|
10
|
-
- **Stdio 対応** -
|
|
11
|
-
- **SSE 対応** - Server-Sent Events によるリアルタイム対話形式音声再生
|
|
12
|
-
- **StreamableHTTP 対応** - ストリーミング形式での HTTP 通信による高速音声合成
|
|
13
|
-
- **対話形式音声再生** - チャット形式でのリアルタイム音声合成・再生機能
|
|
9
|
+
- **クロスプラットフォーム対応** - Windows、macOS、Linux で動作
|
|
10
|
+
- **Stdio/HTTP 対応** - Claude Desktop(Stdio)や Web API(HTTP)に対応
|
|
14
11
|
- **複数話者対応** - セグメント単位での個別話者指定が可能
|
|
15
12
|
- **テキスト自動分割** - 長文の自動分割による安定した音声合成
|
|
16
13
|
- **独立したクライアントライブラリ** - [`@kajidog/voicevox-client`](https://www.npmjs.com/package/@kajidog/voicevox-client) として別パッケージで提供
|
|
@@ -52,237 +49,112 @@ MCP_HTTP_MODE=true npx @kajidog/mcp-tts-voicevox
|
|
|
52
49
|
$env:MCP_HTTP_MODE='true'; npx @kajidog/mcp-tts-voicevox
|
|
53
50
|
```
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
## MCP ツール
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
#### `speak` - テキスト読み上げ
|
|
54
|
+
### `speak` - テキスト読み上げ
|
|
60
55
|
|
|
61
56
|
テキストを音声に変換して再生します。
|
|
62
57
|
|
|
63
58
|
**パラメータ:**
|
|
64
59
|
|
|
65
|
-
- `text`:
|
|
60
|
+
- `text`: 文字列(改行区切りで複数テキスト、話者指定は「1:テキスト」形式)
|
|
66
61
|
- `speaker` (オプション): 話者 ID
|
|
67
62
|
- `speedScale` (オプション): 再生速度
|
|
68
|
-
- `
|
|
63
|
+
- `immediate` (オプション): 即座に再生開始するか(デフォルト: true)
|
|
64
|
+
- `waitForStart` (オプション): 再生開始まで待機するか(デフォルト: false)
|
|
65
|
+
- `waitForEnd` (オプション): 再生終了まで待機するか(デフォルト: false)
|
|
69
66
|
|
|
70
67
|
**使用例:**
|
|
71
68
|
|
|
72
69
|
```javascript
|
|
73
70
|
// シンプルなテキスト
|
|
74
|
-
{ "text":
|
|
71
|
+
{ "text": "こんにちは\n今日はいい天気ですね" }
|
|
75
72
|
|
|
76
73
|
// 話者指定
|
|
77
|
-
{ "text":
|
|
74
|
+
{ "text": "こんにちは", "speaker": 3 }
|
|
78
75
|
|
|
79
76
|
// セグメント別話者指定
|
|
80
|
-
{ "text":
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
#### `generate_query` - クエリ生成
|
|
84
|
-
|
|
85
|
-
音声合成用クエリを生成します。
|
|
86
|
-
|
|
87
|
-
**パラメータ:**
|
|
88
|
-
|
|
89
|
-
- `text`: 合成するテキスト
|
|
90
|
-
- `speaker` (オプション): 話者 ID
|
|
91
|
-
- `speedScale` (オプション): 再生速度
|
|
92
|
-
|
|
93
|
-
#### `synthesize_file` - ファイル生成
|
|
94
|
-
|
|
95
|
-
音声ファイルを生成し、パスを返します。
|
|
96
|
-
|
|
97
|
-
**パラメータ:**
|
|
98
|
-
|
|
99
|
-
- `text` (オプション): 合成するテキスト
|
|
100
|
-
- `query` (オプション): 事前生成済みクエリ
|
|
101
|
-
- `output`: 出力ファイルパス
|
|
102
|
-
- `speaker` (オプション): 話者 ID
|
|
103
|
-
- `speedScale` (オプション): 再生速度
|
|
104
|
-
|
|
105
|
-
#### `stop_speaker` - 再生停止
|
|
77
|
+
{ "text": "1:こんにちは\n3:今日はいい天気ですね" }
|
|
106
78
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
#### `get_speaker_detail` - 話者詳細取得
|
|
79
|
+
// 即座に再生(キューを迂回)
|
|
80
|
+
{
|
|
81
|
+
"text": "緊急メッセージです",
|
|
82
|
+
"immediate": true,
|
|
83
|
+
"waitForEnd": true
|
|
84
|
+
}
|
|
114
85
|
|
|
115
|
-
|
|
86
|
+
// 再生終了まで待機(同期処理)
|
|
87
|
+
{
|
|
88
|
+
"text": "この音声の再生が完了するまで次の処理を待機",
|
|
89
|
+
"waitForEnd": true
|
|
90
|
+
}
|
|
116
91
|
|
|
117
|
-
|
|
92
|
+
// キューに追加するが自動再生しない
|
|
93
|
+
{
|
|
94
|
+
"text": "手動で再生開始するまで待機",
|
|
95
|
+
"immediate": false
|
|
96
|
+
}
|
|
97
|
+
```
|
|
118
98
|
|
|
119
|
-
|
|
99
|
+
### 高度な再生制御機能
|
|
120
100
|
|
|
121
|
-
|
|
101
|
+
#### 即時再生(`immediate: true`)
|
|
122
102
|
|
|
123
|
-
|
|
103
|
+
キューを迂回して音声を即座に再生:
|
|
124
104
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
method: "POST",
|
|
129
|
-
headers: {
|
|
130
|
-
"Content-Type": "application/json",
|
|
131
|
-
},
|
|
132
|
-
body: JSON.stringify({
|
|
133
|
-
jsonrpc: "2.0",
|
|
134
|
-
method: "initialize",
|
|
135
|
-
params: {
|
|
136
|
-
protocolVersion: "2024-11-05",
|
|
137
|
-
capabilities: {},
|
|
138
|
-
},
|
|
139
|
-
id: 1,
|
|
140
|
-
}),
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
const sessionData = await response.json();
|
|
144
|
-
const sessionId = response.headers.get("mcp-session-id");
|
|
145
|
-
|
|
146
|
-
// 音声合成・再生リクエスト
|
|
147
|
-
const speakResponse = await fetch("http://localhost:3000/mcp", {
|
|
148
|
-
method: "POST",
|
|
149
|
-
headers: {
|
|
150
|
-
"Content-Type": "application/json",
|
|
151
|
-
"mcp-session-id": sessionId,
|
|
152
|
-
},
|
|
153
|
-
body: JSON.stringify({
|
|
154
|
-
jsonrpc: "2.0",
|
|
155
|
-
method: "tools/call",
|
|
156
|
-
params: {
|
|
157
|
-
name: "speak",
|
|
158
|
-
arguments: {
|
|
159
|
-
text: ["こんにちは、対話形式で音声を再生します"],
|
|
160
|
-
speaker: 1,
|
|
161
|
-
speedScale: 1.0,
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
id: 2,
|
|
165
|
-
}),
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
const result = await speakResponse.json();
|
|
169
|
-
console.log("結果:", result);
|
|
170
|
-
```
|
|
105
|
+
- **通常のキューと並行動作**: 既存のキュー再生を妨げません
|
|
106
|
+
- **複数同時再生**: 複数の即時再生を同時に実行可能
|
|
107
|
+
- **緊急通知に最適**: 重要なメッセージを優先的に再生
|
|
171
108
|
|
|
172
|
-
####
|
|
109
|
+
#### 同期再生制御(`waitForEnd: true`)
|
|
173
110
|
|
|
174
|
-
|
|
175
|
-
// 複数話者での会話例
|
|
176
|
-
const conversationResponse = await fetch("http://localhost:3000/mcp", {
|
|
177
|
-
method: "POST",
|
|
178
|
-
headers: {
|
|
179
|
-
"Content-Type": "application/json",
|
|
180
|
-
"mcp-session-id": sessionId,
|
|
181
|
-
},
|
|
182
|
-
body: JSON.stringify({
|
|
183
|
-
jsonrpc: "2.0",
|
|
184
|
-
method: "tools/call",
|
|
185
|
-
params: {
|
|
186
|
-
name: "speak",
|
|
187
|
-
arguments: {
|
|
188
|
-
text: [
|
|
189
|
-
{ text: "こんにちは!", speaker: 1 },
|
|
190
|
-
{ text: "お元気ですか?", speaker: 3 },
|
|
191
|
-
{ text: "とても元気です!", speaker: 1 },
|
|
192
|
-
],
|
|
193
|
-
},
|
|
194
|
-
},
|
|
195
|
-
id: 3,
|
|
196
|
-
}),
|
|
197
|
-
});
|
|
198
|
-
```
|
|
111
|
+
再生完了まで待機して処理を同期化:
|
|
199
112
|
|
|
200
|
-
|
|
113
|
+
- **順次処理**: 音声再生後に次の処理を実行
|
|
114
|
+
- **タイミング制御**: 音声と他の処理の連携が可能
|
|
115
|
+
- **UI 同期**: 画面表示と音声のタイミングを合わせる
|
|
201
116
|
|
|
202
117
|
```javascript
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
eventSource.onmessage = function (event) {
|
|
212
|
-
const data = JSON.parse(event.data);
|
|
213
|
-
|
|
214
|
-
if (data.type === "session") {
|
|
215
|
-
sessionId = data.sessionId;
|
|
216
|
-
console.log("セッションID:", sessionId);
|
|
118
|
+
// 例1: 緊急メッセージを即座に再生し、完了まで待機
|
|
119
|
+
{
|
|
120
|
+
"text": "緊急!すぐに確認してください",
|
|
121
|
+
"immediate": true,
|
|
122
|
+
"waitForEnd": true
|
|
123
|
+
}
|
|
217
124
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
async function sendSpeakRequest() {
|
|
224
|
-
await fetch(`http://localhost:3000/messages?sessionId=${sessionId}`, {
|
|
225
|
-
method: "POST",
|
|
226
|
-
headers: {
|
|
227
|
-
"Content-Type": "application/json",
|
|
228
|
-
},
|
|
229
|
-
body: JSON.stringify({
|
|
230
|
-
jsonrpc: "2.0",
|
|
231
|
-
method: "tools/call",
|
|
232
|
-
params: {
|
|
233
|
-
name: "speak",
|
|
234
|
-
arguments: {
|
|
235
|
-
text: ["SSEを使用した音声再生です"],
|
|
236
|
-
speaker: 1,
|
|
237
|
-
},
|
|
238
|
-
},
|
|
239
|
-
id: 1,
|
|
240
|
-
}),
|
|
241
|
-
});
|
|
125
|
+
// 例2: ステップバイステップの音声ガイド
|
|
126
|
+
{
|
|
127
|
+
"text": "手順1: ファイルを開いてください",
|
|
128
|
+
"waitForEnd": true
|
|
242
129
|
}
|
|
130
|
+
// 上記の音声が完了してから次の処理が実行される
|
|
243
131
|
```
|
|
244
132
|
|
|
133
|
+
### その他のツール
|
|
245
134
|
|
|
246
|
-
|
|
135
|
+
- `generate_query` - 音声合成用クエリを生成
|
|
136
|
+
- `synthesize_file` - 音声ファイルを生成
|
|
137
|
+
- `stop_speaker` - 再生停止・キュークリア
|
|
138
|
+
- `get_speakers` - 話者一覧取得
|
|
139
|
+
- `get_speaker_detail` - 話者詳細取得
|
|
247
140
|
|
|
248
|
-
|
|
141
|
+
## パッケージ構成
|
|
249
142
|
|
|
250
143
|
### @kajidog/mcp-tts-voicevox (このパッケージ)
|
|
251
|
-
- **MCPサーバー** - Claude Desktop等のMCPクライアントと通信するサーバー
|
|
252
|
-
- **Node.js専用** - デスクトップ環境やCLI環境での使用を想定
|
|
253
|
-
- **ツール提供** - `speak`, `generate_query`, `synthesize_file` 等のMCPツール
|
|
254
|
-
- **HTTPサーバー** - SSE/StreamableHTTP対応のWebサーバー
|
|
255
|
-
|
|
256
|
-
### [@kajidog/voicevox-client](https://www.npmjs.com/package/@kajidog/voicevox-client) (独立パッケージ)
|
|
257
|
-
- **汎用ライブラリ** - VOICEVOXエンジンとの通信機能を提供
|
|
258
|
-
- **クロスプラットフォーム** - Node.js とブラウザ環境の両方で動作
|
|
259
|
-
- **キュー管理** - 複数の音声合成リクエストを効率的に処理
|
|
260
|
-
- **プリフェッチ機能** - 次の音声を事前に生成し、再生をスムーズに
|
|
261
144
|
|
|
262
|
-
|
|
145
|
+
- **MCP サーバー** - Claude Desktop 等の MCP クライアントと通信
|
|
146
|
+
- **HTTP サーバー** - REST API 提供
|
|
263
147
|
|
|
264
|
-
|
|
265
|
-
- Claude Desktop でTTSツールを使いたい
|
|
266
|
-
- コマンドラインからMCPサーバーを起動したい
|
|
267
|
-
- Webアプリケーション向けのHTTP APIが必要
|
|
268
|
-
|
|
269
|
-
**クライアントライブラリを使用する場合 (`@kajidog/voicevox-client`)**:
|
|
270
|
-
- 独自のNode.jsアプリケーションにTTS機能を組み込みたい
|
|
271
|
-
- ブラウザアプリケーションでVOICEVOXを使いたい
|
|
272
|
-
- MCPプロトコルを使わずに直接VOICEVOX機能を利用したい
|
|
148
|
+
### [@kajidog/voicevox-client](https://www.npmjs.com/package/@kajidog/voicevox-client) (独立パッケージ)
|
|
273
149
|
|
|
274
|
-
|
|
150
|
+
- **汎用ライブラリ** - VOICEVOX エンジンとの通信機能
|
|
151
|
+
- **クロスプラットフォーム** - Node.js、ブラウザ環境対応
|
|
152
|
+
- **高度な再生制御** - 即時再生・同期再生・キュー管理機能
|
|
275
153
|
|
|
276
154
|
## MCP 設定例
|
|
277
155
|
|
|
278
156
|
### Claude Desktop での設定
|
|
279
157
|
|
|
280
|
-
**⚠️ 重要: Claude Desktop の通信モードについて**
|
|
281
|
-
|
|
282
|
-
Claude Desktop は現在 **Stdio モードのみ** をサポートしており、SSE/HTTP モードは直接サポートされていません。
|
|
283
|
-
|
|
284
|
-
#### 推奨設定(Stdio モード)
|
|
285
|
-
|
|
286
158
|
`claude_desktop_config.json` ファイルに以下の設定を追加:
|
|
287
159
|
|
|
288
160
|
```json
|
|
@@ -290,7 +162,7 @@ Claude Desktop は現在 **Stdio モードのみ** をサポートしており
|
|
|
290
162
|
"mcpServers": {
|
|
291
163
|
"tts-mcp": {
|
|
292
164
|
"command": "npx",
|
|
293
|
-
"args": ["-y", "@kajidog/mcp-tts-voicevox"]
|
|
165
|
+
"args": ["-y", "@kajidog/mcp-tts-voicevox"]
|
|
294
166
|
}
|
|
295
167
|
}
|
|
296
168
|
}
|
|
@@ -327,6 +199,8 @@ SSE モードでの音声合成が必要な場合は、`mcp-remote` を使用し
|
|
|
327
199
|
$env:MCP_HTTP_MODE='true'; $env:MCP_HTTP_PORT='3000'; npx @kajidog/mcp-tts-voicevox
|
|
328
200
|
```
|
|
329
201
|
|
|
202
|
+
````
|
|
203
|
+
|
|
330
204
|
### AivisSpeech での設定例
|
|
331
205
|
|
|
332
206
|
```json
|
|
@@ -342,7 +216,7 @@ SSE モードでの音声合成が必要な場合は、`mcp-remote` を使用し
|
|
|
342
216
|
}
|
|
343
217
|
}
|
|
344
218
|
}
|
|
345
|
-
|
|
219
|
+
````
|
|
346
220
|
|
|
347
221
|
### HTTP モードでの設定
|
|
348
222
|
|
|
@@ -372,12 +246,36 @@ SSE モードでの音声合成が必要な場合は、`mcp-remote` を使用し
|
|
|
372
246
|
- `VOICEVOX_DEFAULT_SPEAKER`: デフォルト話者 ID(デフォルト: `1`)
|
|
373
247
|
- `VOICEVOX_DEFAULT_SPEED_SCALE`: デフォルト再生速度(デフォルト: `1.0`)
|
|
374
248
|
|
|
249
|
+
### 再生オプション設定
|
|
250
|
+
|
|
251
|
+
- `VOICEVOX_DEFAULT_IMMEDIATE`: キュー追加時に即座に再生開始するか(デフォルト: `true`)
|
|
252
|
+
- `VOICEVOX_DEFAULT_WAIT_FOR_START`: 再生開始まで待機するか(デフォルト: `false`)
|
|
253
|
+
- `VOICEVOX_DEFAULT_WAIT_FOR_END`: 再生終了まで待機するか(デフォルト: `false`)
|
|
254
|
+
|
|
255
|
+
**使用例:**
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# 例1: 全ての音声再生で完了まで待機(同期処理)
|
|
259
|
+
export VOICEVOX_DEFAULT_WAIT_FOR_END=true
|
|
260
|
+
npx @kajidog/mcp-tts-voicevox
|
|
261
|
+
|
|
262
|
+
# 例2: 再生開始と終了の両方を待機
|
|
263
|
+
export VOICEVOX_DEFAULT_WAIT_FOR_START=true
|
|
264
|
+
export VOICEVOX_DEFAULT_WAIT_FOR_END=true
|
|
265
|
+
npx @kajidog/mcp-tts-voicevox
|
|
266
|
+
|
|
267
|
+
# 例3: 手動制御(自動再生無効)
|
|
268
|
+
export VOICEVOX_DEFAULT_IMMEDIATE=false
|
|
269
|
+
npx @kajidog/mcp-tts-voicevox
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
これらのオプションにより、アプリケーションの要件に応じて音声再生の挙動を細かく制御できます。
|
|
273
|
+
|
|
375
274
|
### サーバー設定
|
|
376
275
|
|
|
377
276
|
- `MCP_HTTP_MODE`: HTTP サーバーモードの有効化(`true` で有効)
|
|
378
277
|
- `MCP_HTTP_PORT`: HTTP サーバーのポート番号(デフォルト: `3000`)
|
|
379
278
|
- `MCP_HTTP_HOST`: HTTP サーバーのホスト(デフォルト: `0.0.0.0`)
|
|
380
|
-
- `NODE_ENV`: 開発モード(`development` で有効)
|
|
381
279
|
|
|
382
280
|
## トラブルシューティング
|
|
383
281
|
|
|
@@ -389,22 +287,18 @@ SSE モードでの音声合成が必要な場合は、`mcp-remote` を使用し
|
|
|
389
287
|
curl http://localhost:50021/speakers
|
|
390
288
|
```
|
|
391
289
|
|
|
392
|
-
2.
|
|
290
|
+
2. **音声が再生されない**
|
|
393
291
|
|
|
394
|
-
-
|
|
292
|
+
- システムの音声出力デバイスを確認
|
|
293
|
+
- プラットフォーム固有の音声再生ツールの確認:
|
|
294
|
+
- **Linux**: `aplay`, `paplay`, `play`, `ffplay` のいずれかが必要
|
|
295
|
+
- **macOS**: `afplay` (標準でインストール済み)
|
|
296
|
+
- **Windows**: PowerShell (標準でインストール済み)
|
|
395
297
|
|
|
396
298
|
3. **MCP クライアントで認識されない**
|
|
397
|
-
|
|
398
299
|
- パッケージのインストールを確認:`npm list -g @kajidog/mcp-tts-voicevox`
|
|
399
300
|
- 設定ファイルの JSON 構文を確認
|
|
400
301
|
|
|
401
|
-
4. **音声が再生されない**
|
|
402
|
-
- システムの音声出力デバイスを確認
|
|
403
|
-
- VOICEVOX エンジンの動作確認:
|
|
404
|
-
```bash
|
|
405
|
-
curl -X POST "http://localhost:50021/audio_query?text=テスト&speaker=1"
|
|
406
|
-
```
|
|
407
|
-
|
|
408
302
|
## ライセンス
|
|
409
303
|
|
|
410
304
|
ISC
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2CpE,eAAO,MAAM,MAAM,WAKjB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -13,8 +13,8 @@ const TextSegmentSchema = zod_1.z.object({
|
|
|
13
13
|
.describe("Speaker ID for this specific text segment"),
|
|
14
14
|
});
|
|
15
15
|
const TextInputSchema = zod_1.z
|
|
16
|
-
.
|
|
17
|
-
.describe('
|
|
16
|
+
.string()
|
|
17
|
+
.describe('Text string with line breaks and optional speaker prefix "1:Hello\\n2:World". For faster playback start, make the first element short.');
|
|
18
18
|
const CommonParametersSchema = {
|
|
19
19
|
speaker: zod_1.z.number().optional().describe("Default speaker ID (optional)"),
|
|
20
20
|
speedScale: zod_1.z
|
|
@@ -22,10 +22,24 @@ const CommonParametersSchema = {
|
|
|
22
22
|
.optional()
|
|
23
23
|
.describe("Playback speed (optional, default from environment)"),
|
|
24
24
|
};
|
|
25
|
+
const PlaybackOptionsSchema = {
|
|
26
|
+
immediate: zod_1.z
|
|
27
|
+
.boolean()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Start playback immediately (optional, default: true)"),
|
|
30
|
+
waitForStart: zod_1.z
|
|
31
|
+
.boolean()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("Wait for playback to start (optional, default: false)"),
|
|
34
|
+
waitForEnd: zod_1.z
|
|
35
|
+
.boolean()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Wait for playback to end (optional, default: false)"),
|
|
38
|
+
};
|
|
25
39
|
// サーバー初期化
|
|
26
40
|
exports.server = new mcp_js_1.McpServer({
|
|
27
41
|
name: "MCP TTS Voicevox",
|
|
28
|
-
version: "0.
|
|
42
|
+
version: "0.2.0",
|
|
29
43
|
description: "A Voicevox server that converts text to speech for playback and saving.",
|
|
30
44
|
});
|
|
31
45
|
// Voicevoxクライアント初期化
|
|
@@ -53,32 +67,45 @@ const parseAudioQuery = (query, speedScale) => {
|
|
|
53
67
|
}
|
|
54
68
|
return audioQuery;
|
|
55
69
|
};
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
|
|
70
|
+
const parseStringInput = (input) => {
|
|
71
|
+
// \n と \\n の両方に対応するため、まず \\n を \n に変換してから分割
|
|
72
|
+
const normalizedInput = input.replace(/\\n/g, "\n");
|
|
73
|
+
const lines = normalizedInput.split("\n").filter((line) => line.trim());
|
|
74
|
+
return lines.map((line) => {
|
|
75
|
+
const match = line.match(/^(\d+):(.*)$/);
|
|
76
|
+
if (match) {
|
|
77
|
+
return { text: match[2].trim(), speaker: parseInt(match[1], 10) };
|
|
78
|
+
}
|
|
79
|
+
return { text: line };
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
const processTextInput = async (text, speaker, speedScale, playbackOptions) => {
|
|
83
|
+
const segments = parseStringInput(text);
|
|
84
|
+
return await voicevoxClient.speak(segments, speaker, speedScale, playbackOptions);
|
|
68
85
|
};
|
|
69
86
|
// ツール定義
|
|
70
87
|
exports.server.tool("speak", "Convert text to speech and play it", {
|
|
71
88
|
text: TextInputSchema,
|
|
72
89
|
...CommonParametersSchema,
|
|
90
|
+
...PlaybackOptionsSchema,
|
|
73
91
|
query: zod_1.z.string().optional().describe("Voice synthesis query"),
|
|
74
|
-
}, async ({ text, speaker, query, speedScale }) => {
|
|
92
|
+
}, async ({ text, speaker, query, speedScale, immediate, waitForStart, waitForEnd, }) => {
|
|
75
93
|
try {
|
|
94
|
+
// 環境変数からデフォルトの再生オプションを取得
|
|
95
|
+
const defaultImmediate = process.env.VOICEVOX_DEFAULT_IMMEDIATE !== "false";
|
|
96
|
+
const defaultWaitForStart = process.env.VOICEVOX_DEFAULT_WAIT_FOR_START === "true";
|
|
97
|
+
const defaultWaitForEnd = process.env.VOICEVOX_DEFAULT_WAIT_FOR_END === "true";
|
|
98
|
+
const playbackOptions = {
|
|
99
|
+
immediate: immediate ?? defaultImmediate,
|
|
100
|
+
waitForStart: waitForStart ?? defaultWaitForStart,
|
|
101
|
+
waitForEnd: waitForEnd ?? defaultWaitForEnd,
|
|
102
|
+
};
|
|
76
103
|
if (query) {
|
|
77
104
|
const audioQuery = parseAudioQuery(query, speedScale);
|
|
78
|
-
const result = await voicevoxClient.enqueueAudioGeneration(audioQuery, speaker);
|
|
105
|
+
const result = await voicevoxClient.enqueueAudioGeneration(audioQuery, speaker, speedScale, playbackOptions);
|
|
79
106
|
return createSuccessResponse(result);
|
|
80
107
|
}
|
|
81
|
-
const result = await processTextInput(text, speaker, speedScale);
|
|
108
|
+
const result = await processTextInput(text, speaker, speedScale, playbackOptions);
|
|
82
109
|
return createSuccessResponse(result);
|
|
83
110
|
}
|
|
84
111
|
catch (error) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AACpE,6BAAwB;AACxB,8DAAsE;AAEtE,MAAM;AACN,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACvD,OAAO,EAAE,OAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2CAA2C,CAAC;CACzD,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,OAAC;KACtB,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/sse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAsW5B,QAAA,MAAM,GAAG,4EAAa,CAAC;AAUvB,eAAe,GAAG,CAAC"}
|
package/dist/sse.js
CHANGED
|
@@ -3,8 +3,50 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const hono_1 = require("hono");
|
|
4
4
|
const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
|
|
5
5
|
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
6
|
-
const fetch_to_node_1 = require("fetch-to-node");
|
|
7
6
|
const server_1 = require("./server");
|
|
7
|
+
// Helper functions to convert between Hono and Node.js request/response
|
|
8
|
+
const toReqRes = (request) => {
|
|
9
|
+
// Create a mock IncomingMessage and ServerResponse
|
|
10
|
+
const req = {
|
|
11
|
+
headers: Object.fromEntries(request.headers.entries()),
|
|
12
|
+
method: request.method,
|
|
13
|
+
url: request.url,
|
|
14
|
+
};
|
|
15
|
+
const res = {
|
|
16
|
+
statusCode: 200,
|
|
17
|
+
headers: {},
|
|
18
|
+
setHeader: function (name, value) {
|
|
19
|
+
this.headers[name] = value;
|
|
20
|
+
},
|
|
21
|
+
writeHead: function (statusCode, headers) {
|
|
22
|
+
this.statusCode = statusCode;
|
|
23
|
+
if (headers) {
|
|
24
|
+
Object.assign(this.headers, headers);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
write: function (chunk) {
|
|
28
|
+
if (!this._body)
|
|
29
|
+
this._body = [];
|
|
30
|
+
this._body.push(chunk);
|
|
31
|
+
},
|
|
32
|
+
end: function (chunk) {
|
|
33
|
+
if (chunk)
|
|
34
|
+
this.write(chunk);
|
|
35
|
+
this._ended = true;
|
|
36
|
+
},
|
|
37
|
+
_body: [],
|
|
38
|
+
_ended: false,
|
|
39
|
+
};
|
|
40
|
+
return { req, res };
|
|
41
|
+
};
|
|
42
|
+
const toFetchResponse = (res) => {
|
|
43
|
+
// Convert ServerResponse back to Fetch Response
|
|
44
|
+
const body = res._body ? Buffer.concat(res._body.map((b) => Buffer.isBuffer(b) ? b : Buffer.from(b))) : null;
|
|
45
|
+
return new Response(body, {
|
|
46
|
+
status: res.statusCode || 200,
|
|
47
|
+
headers: res.headers || {},
|
|
48
|
+
});
|
|
49
|
+
};
|
|
8
50
|
/**
|
|
9
51
|
* JSONRPCエラーレスポンスを生成するヘルパー関数
|
|
10
52
|
*/
|
|
@@ -164,7 +206,7 @@ class RouteHandlers {
|
|
|
164
206
|
*/
|
|
165
207
|
async handleStreamableHTTP(c) {
|
|
166
208
|
console.log(`Received ${c.req.method} request for StreamableHTTP`);
|
|
167
|
-
const { req, res } =
|
|
209
|
+
const { req, res } = toReqRes(c.req.raw);
|
|
168
210
|
try {
|
|
169
211
|
const sessionId = req.headers["mcp-session-id"];
|
|
170
212
|
let body = null;
|
|
@@ -189,7 +231,7 @@ class RouteHandlers {
|
|
|
189
231
|
}
|
|
190
232
|
// リクエスト処理
|
|
191
233
|
await transport.handleRequest(req, res, body);
|
|
192
|
-
return
|
|
234
|
+
return toFetchResponse(res);
|
|
193
235
|
}
|
|
194
236
|
catch (e) {
|
|
195
237
|
console.error("StreamableHTTP connection error:", e);
|
|
@@ -201,10 +243,10 @@ class RouteHandlers {
|
|
|
201
243
|
*/
|
|
202
244
|
async handleSSE(c) {
|
|
203
245
|
console.log("Received GET SSE request for SSE connection (legacy)");
|
|
204
|
-
const { req, res } =
|
|
246
|
+
const { req, res } = toReqRes(c.req.raw);
|
|
205
247
|
try {
|
|
206
248
|
await this.transportManager.createSSETransport(res);
|
|
207
|
-
return
|
|
249
|
+
return toFetchResponse(res);
|
|
208
250
|
}
|
|
209
251
|
catch (e) {
|
|
210
252
|
console.error("SSE connection error:", e);
|
|
@@ -216,7 +258,7 @@ class RouteHandlers {
|
|
|
216
258
|
*/
|
|
217
259
|
async handleSSEMessage(c) {
|
|
218
260
|
console.log("Received POST message request (legacy SSE)");
|
|
219
|
-
const { req, res } =
|
|
261
|
+
const { req, res } = toReqRes(c.req.raw);
|
|
220
262
|
const sessionId = c.req.query("sessionId");
|
|
221
263
|
if (!sessionId) {
|
|
222
264
|
return c.json(ErrorResponseBuilder.missingSessionId(), { status: 400 });
|
|
@@ -228,7 +270,7 @@ class RouteHandlers {
|
|
|
228
270
|
try {
|
|
229
271
|
const body = await c.req.json();
|
|
230
272
|
await transport.handlePostMessage(req, res, body);
|
|
231
|
-
return
|
|
273
|
+
return toFetchResponse(res);
|
|
232
274
|
}
|
|
233
275
|
catch (e) {
|
|
234
276
|
console.error("Message handling error:", e);
|
package/dist/sse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":";;AAAA,+BAA4B;AAC5B,oEAA6E;AAC7E,0FAAmG;AAEnG,
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kajidog/mcp-tts-voicevox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "VOICEVOX integration for MCP - Text-to-Speech server using VOICEVOX engine",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
"type": "commonjs",
|
|
24
24
|
"scripts": {
|
|
25
25
|
"test": "jest",
|
|
26
|
-
"test:sound": "ts-node src/test.ts",
|
|
27
26
|
"start": "node dist/index.js",
|
|
28
27
|
"start:stdio": "node dist/stdio.js",
|
|
29
28
|
"start:http": "MCP_HTTP_MODE=true node dist/index.js",
|
|
@@ -69,9 +68,8 @@
|
|
|
69
68
|
},
|
|
70
69
|
"dependencies": {
|
|
71
70
|
"@hono/node-server": "^1.14.2",
|
|
72
|
-
"@kajidog/voicevox-client": "
|
|
71
|
+
"@kajidog/voicevox-client": "0.2.0",
|
|
73
72
|
"@modelcontextprotocol/sdk": "^1.8.0",
|
|
74
|
-
"fetch-to-node": "^2.1.0",
|
|
75
73
|
"hono": "^4.7.10",
|
|
76
74
|
"zod": "^3.22.4"
|
|
77
75
|
},
|
package/dist/test.d.ts
DELETED
package/dist/test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
|
package/dist/test.js
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const voicevox_client_1 = require("@kajidog/voicevox-client");
|
|
37
|
-
const path_1 = require("path");
|
|
38
|
-
const os_1 = require("os");
|
|
39
|
-
const fs = __importStar(require("fs/promises"));
|
|
40
|
-
const soundPlay = require("sound-play");
|
|
41
|
-
// ----- ユーティリティ関数 -----
|
|
42
|
-
/**
|
|
43
|
-
* 音声ファイルを再生するユーティリティ関数
|
|
44
|
-
* @param filePath 再生する音声ファイルのパス
|
|
45
|
-
* @param description 再生内容の説明
|
|
46
|
-
*/
|
|
47
|
-
async function playAudioFile(filePath, description = "") {
|
|
48
|
-
try {
|
|
49
|
-
const displayText = description ? `${description} (${filePath})` : filePath;
|
|
50
|
-
console.log(`🔊 音声ファイル「${displayText}」の再生を開始します...`);
|
|
51
|
-
await soundPlay.play(filePath);
|
|
52
|
-
console.log(`✅ 音声ファイル「${displayText}」の再生が完了しました`);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
console.error(`❌ 音声再生中にエラーが発生しました: ${error}`);
|
|
56
|
-
throw error;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* ヘッダーを出力する関数
|
|
61
|
-
* @param title セクションタイトル
|
|
62
|
-
*/
|
|
63
|
-
function printHeader(title) {
|
|
64
|
-
console.log(`\n${"=".repeat(80)}`);
|
|
65
|
-
console.log(`📌 ${title}`);
|
|
66
|
-
console.log(`${"=".repeat(80)}`);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* サブセクションのヘッダーを出力する関数
|
|
70
|
-
* @param title セクションタイトル
|
|
71
|
-
*/
|
|
72
|
-
function printSubHeader(title) {
|
|
73
|
-
console.log(`\n${"- ".repeat(40)}`);
|
|
74
|
-
console.log(`🔹 ${title}`);
|
|
75
|
-
console.log(`${"- ".repeat(40)}`);
|
|
76
|
-
}
|
|
77
|
-
// ----- クライアントテスト関数 -----
|
|
78
|
-
/**
|
|
79
|
-
* VoicevoxClientの基本機能をテストする
|
|
80
|
-
*/
|
|
81
|
-
async function testTextToSpeech(client, speaker) {
|
|
82
|
-
printSubHeader("テキストから音声再生のテスト");
|
|
83
|
-
const testText = "これはテストです。VOICEVOXの機能を検証します。";
|
|
84
|
-
// 1. speak テスト - テキストからの音声再生
|
|
85
|
-
console.log("➡️ テキストから直接音声再生");
|
|
86
|
-
const speakResult = await client.speak(testText, speaker);
|
|
87
|
-
console.log("✅ 結果:", speakResult);
|
|
88
|
-
// 2. generateQuery テスト - テキストから音声合成用クエリを生成
|
|
89
|
-
console.log("\n➡️ テキストから音声合成用クエリ生成");
|
|
90
|
-
const query = await client.generateQuery(testText, speaker);
|
|
91
|
-
console.log("✅ クエリ生成結果 (一部):", JSON.stringify(query).substring(0, 100) + "...");
|
|
92
|
-
return query;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* 音声ファイル生成機能をテストする
|
|
96
|
-
*/
|
|
97
|
-
async function testAudioFileGeneration(client, query, speaker) {
|
|
98
|
-
printSubHeader("音声ファイル生成のテスト");
|
|
99
|
-
// 1. クエリから音声ファイルを生成
|
|
100
|
-
console.log("➡️ クエリから音声ファイル生成");
|
|
101
|
-
const outputPath = (0, path_1.join)((0, os_1.tmpdir)(), `voicevox-${Date.now()}.wav`);
|
|
102
|
-
const filePath = await client.generateAudioFile(query, outputPath, speaker);
|
|
103
|
-
console.log(`✅ 音声ファイル生成: ${filePath}`);
|
|
104
|
-
// ファイルが存在するか確認
|
|
105
|
-
const fileExists = await fs
|
|
106
|
-
.stat(filePath)
|
|
107
|
-
.then(() => true)
|
|
108
|
-
.catch(() => false);
|
|
109
|
-
console.log(`📂 ファイルの存在確認: ${fileExists ? "✅ 存在します" : "❌ 存在しません"}`);
|
|
110
|
-
// 生成した音声ファイルを再生
|
|
111
|
-
if (fileExists) {
|
|
112
|
-
await playAudioFile(filePath, "クエリから生成した音声");
|
|
113
|
-
}
|
|
114
|
-
// 2. テキストから直接音声ファイルを生成
|
|
115
|
-
console.log("\n➡️ テキストから直接音声ファイル生成");
|
|
116
|
-
const directFilePath = await client.generateAudioFile("直接ファイルに変換するテスト。", undefined, speaker);
|
|
117
|
-
console.log(`✅ 直接音声ファイル生成: ${directFilePath}`);
|
|
118
|
-
await playAudioFile(directFilePath, "テキストから直接生成した音声");
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* 再生速度変更機能をテストする
|
|
122
|
-
*/
|
|
123
|
-
async function testSpeedScale(client, speaker) {
|
|
124
|
-
printSubHeader("再生速度の変更テスト");
|
|
125
|
-
// 1. 速い再生速度のテスト
|
|
126
|
-
console.log("➡️ 再生速度を1.5倍に設定したテスト");
|
|
127
|
-
const speedTestFilePath = await client.generateAudioFile("これは再生速度を1.5倍に設定したテストです。", (0, path_1.join)((0, os_1.tmpdir)(), `voicevox-speed-${Date.now()}.wav`), speaker, 1.5 // 速度を1.5倍に設定
|
|
128
|
-
);
|
|
129
|
-
console.log(`✅ 再生速度1.5倍: ${speedTestFilePath}`);
|
|
130
|
-
await playAudioFile(speedTestFilePath, "速度を1.5倍に設定した音声");
|
|
131
|
-
// 遅い再生速度のテストはタイムアウトを起こしやすいため、条件付きでスキップ
|
|
132
|
-
const doSlowTest = process.env.TEST_SLOW_SPEED === "true";
|
|
133
|
-
if (doSlowTest) {
|
|
134
|
-
// 2. 遅い再生速度のテスト
|
|
135
|
-
console.log("\n➡️ 再生速度を0.8倍に設定したテスト");
|
|
136
|
-
try {
|
|
137
|
-
const slowSpeedTestFilePath = await client.generateAudioFile("これは再生速度を0.8倍に設定したテストです。ゆっくり話します。", (0, path_1.join)((0, os_1.tmpdir)(), `voicevox-slow-${Date.now()}.wav`), speaker, 0.8 // 速度を0.8倍に設定
|
|
138
|
-
);
|
|
139
|
-
console.log(`✅ 再生速度0.8倍: ${slowSpeedTestFilePath}`);
|
|
140
|
-
await playAudioFile(slowSpeedTestFilePath, "速度を0.8倍に設定した音声");
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
console.warn(`⚠️ 遅い再生速度のテストはスキップされました: ${error}`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
console.log("\n⏭️ 再生速度0.8倍のテストはスキップします (タイムアウト防止のため)");
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* 音声生成キュー機能をテストする
|
|
152
|
-
*/
|
|
153
|
-
async function testAudioQueue(client, query, speaker) {
|
|
154
|
-
printSubHeader("音声生成キューテスト");
|
|
155
|
-
// クエリを使って音声生成キューに追加
|
|
156
|
-
console.log("➡️ クエリを使って音声生成キューへの追加");
|
|
157
|
-
const enqueueResult = await client.enqueueAudioGeneration(query, speaker);
|
|
158
|
-
console.log(`✅ キュー追加結果:`, enqueueResult);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* VoicevoxClientの基本機能をテストする統合関数
|
|
162
|
-
*/
|
|
163
|
-
async function testClient() {
|
|
164
|
-
try {
|
|
165
|
-
printHeader("VoicevoxClient直接テスト");
|
|
166
|
-
const client = new voicevox_client_1.VoicevoxClient({
|
|
167
|
-
url: "http://localhost:50021",
|
|
168
|
-
defaultSpeaker: 1,
|
|
169
|
-
defaultSpeedScale: 1.0,
|
|
170
|
-
});
|
|
171
|
-
// テスト用の話者
|
|
172
|
-
const speaker = 5; // 四国めたん (ノーマル)
|
|
173
|
-
// 1. 基本的なテキスト読み上げとクエリ生成
|
|
174
|
-
const query = await testTextToSpeech(client, speaker);
|
|
175
|
-
// 2. 音声ファイル生成
|
|
176
|
-
await testAudioFileGeneration(client, query, speaker);
|
|
177
|
-
// 3. 再生速度変更
|
|
178
|
-
await testSpeedScale(client, speaker);
|
|
179
|
-
// 4. 音声生成キュー
|
|
180
|
-
await testAudioQueue(client, query, speaker);
|
|
181
|
-
return query; // 後のテストで使用するためにクエリを返す
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
console.error("❌ クライアントテスト中にエラーが発生しました:", error);
|
|
185
|
-
throw error;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// ----- MCPツール関数 -----
|
|
189
|
-
/**
|
|
190
|
-
* speak MCPツールをテストする
|
|
191
|
-
*/
|
|
192
|
-
async function testSpeakTool(client) {
|
|
193
|
-
printSubHeader("speak ツールのテスト");
|
|
194
|
-
// speak ツールハンドラ
|
|
195
|
-
const speakHandler = async (args) => {
|
|
196
|
-
try {
|
|
197
|
-
const { text, speaker, speedScale } = args;
|
|
198
|
-
console.log(`➡️ テキスト「${text}」を話者${speaker}、速度${speedScale || 1.0}で発話`);
|
|
199
|
-
const result = await client.speak(text, speaker, speedScale);
|
|
200
|
-
console.log("✅ speak 結果:", result);
|
|
201
|
-
return {
|
|
202
|
-
content: [{ type: "text", text: result }],
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
207
|
-
console.error("❌ エラーが発生しました:", error);
|
|
208
|
-
return {
|
|
209
|
-
content: [{ type: "text", text: `エラー: ${errorMessage}` }],
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
// 通常のテスト
|
|
214
|
-
await speakHandler({ text: "MCPツールからのテスト発話です。", speaker: 1 });
|
|
215
|
-
// 速度を変更したテスト
|
|
216
|
-
await speakHandler({
|
|
217
|
-
text: "MCPツールから速度を1.3倍に設定したテスト発話です。",
|
|
218
|
-
speaker: 1,
|
|
219
|
-
speedScale: 1.3,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* generate_query MCPツールをテストする
|
|
224
|
-
*/
|
|
225
|
-
async function testGenerateQueryTool(client) {
|
|
226
|
-
printSubHeader("generate_query ツールのテスト");
|
|
227
|
-
// generate_query ツールハンドラ
|
|
228
|
-
const generateQueryHandler = async (args) => {
|
|
229
|
-
try {
|
|
230
|
-
const { text, speaker, speedScale } = args;
|
|
231
|
-
console.log(`➡️ テキスト「${text}」を話者${speaker}、速度${speedScale || 1.0}でクエリ生成`);
|
|
232
|
-
const generatedQuery = await client.generateQuery(text, speaker, speedScale);
|
|
233
|
-
const queryJson = JSON.stringify(generatedQuery);
|
|
234
|
-
console.log("✅ クエリ生成結果 (一部):", queryJson.substring(0, 100) + "...");
|
|
235
|
-
return {
|
|
236
|
-
content: [{ type: "text", text: queryJson }],
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
catch (error) {
|
|
240
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
241
|
-
console.error("❌ エラーが発生しました:", error);
|
|
242
|
-
return {
|
|
243
|
-
content: [{ type: "text", text: `エラー: ${errorMessage}` }],
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
// 実行
|
|
248
|
-
const queryResponse = await generateQueryHandler({
|
|
249
|
-
text: "MCPツールからのクエリ生成テスト。",
|
|
250
|
-
speaker: 1,
|
|
251
|
-
speedScale: 1.2,
|
|
252
|
-
});
|
|
253
|
-
// テキストからJSONに変換
|
|
254
|
-
return JSON.parse(queryResponse.content[0].text);
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* synthesize_file MCPツールをテストする
|
|
258
|
-
*/
|
|
259
|
-
async function testSynthesizeFileTool(client, query) {
|
|
260
|
-
printSubHeader("synthesize_file ツールのテスト");
|
|
261
|
-
// synthesize_file ツールハンドラ
|
|
262
|
-
const synthesizeFileHandler = async (args) => {
|
|
263
|
-
try {
|
|
264
|
-
const { query: testQuery, output, speaker, speedScale } = args;
|
|
265
|
-
console.log(`➡️ クエリから音声ファイルを生成: 出力パス=${output}`);
|
|
266
|
-
const filePath = await client.generateAudioFile(testQuery, output, speaker, speedScale);
|
|
267
|
-
console.log("✅ ファイル生成結果:", filePath);
|
|
268
|
-
return {
|
|
269
|
-
content: [{ type: "text", text: filePath }],
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
274
|
-
console.error("❌ エラーが発生しました:", error);
|
|
275
|
-
return {
|
|
276
|
-
content: [{ type: "text", text: `エラー: ${errorMessage}` }],
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
// 実行
|
|
281
|
-
const testOutputPath = "";
|
|
282
|
-
const fileResponse = await synthesizeFileHandler({
|
|
283
|
-
query: query,
|
|
284
|
-
output: testOutputPath,
|
|
285
|
-
speaker: 1,
|
|
286
|
-
speedScale: 0.9,
|
|
287
|
-
});
|
|
288
|
-
return fileResponse.content[0].text;
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* MCPツールをテストする統合関数
|
|
292
|
-
*/
|
|
293
|
-
async function testMcpTools(query) {
|
|
294
|
-
try {
|
|
295
|
-
printHeader("MCPツールテスト");
|
|
296
|
-
// VoicevoxClientを初期化
|
|
297
|
-
const client = new voicevox_client_1.VoicevoxClient({
|
|
298
|
-
url: process.env.VOICEVOX_URL ?? "http://localhost:50021",
|
|
299
|
-
defaultSpeaker: 1,
|
|
300
|
-
defaultSpeedScale: Number(process.env.VOICEVOX_DEFAULT_SPEED_SCALE || "1.0"),
|
|
301
|
-
});
|
|
302
|
-
// 1. speak ツールのテスト
|
|
303
|
-
await testSpeakTool(client);
|
|
304
|
-
// 2. generate_query ツールのテスト
|
|
305
|
-
const generatedQuery = await testGenerateQueryTool(client);
|
|
306
|
-
// 3. synthesize_file ツールのテスト
|
|
307
|
-
const filePath = await testSynthesizeFileTool(client, generatedQuery);
|
|
308
|
-
// 生成したファイルを再生
|
|
309
|
-
printSubHeader("生成したファイルの再生テスト");
|
|
310
|
-
console.log(`➡️ ファイル ${filePath} を再生します...`);
|
|
311
|
-
await playAudioFile(filePath, "MCPツールで生成した音声ファイル");
|
|
312
|
-
console.log("✅ ファイルの再生が完了しました");
|
|
313
|
-
// 待機してキューの処理が完了するのを待つ
|
|
314
|
-
console.log("\n⏳ MCP音声再生を待機しています...");
|
|
315
|
-
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
console.error("❌ MCPツールテスト中にエラーが発生しました:", error);
|
|
319
|
-
throw error;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
// ----- メイン実行関数 -----
|
|
323
|
-
/**
|
|
324
|
-
* メイン実行関数
|
|
325
|
-
*/
|
|
326
|
-
async function main() {
|
|
327
|
-
try {
|
|
328
|
-
console.log("🚀 VOICEVOXテストを開始します...");
|
|
329
|
-
// クライアントテスト実行
|
|
330
|
-
const query = await testClient();
|
|
331
|
-
// MCPツールテスト実行
|
|
332
|
-
await testMcpTools(query);
|
|
333
|
-
console.log("\n🎉 すべてのテストが完了しました!");
|
|
334
|
-
}
|
|
335
|
-
catch (error) {
|
|
336
|
-
console.error("❌ テスト中にエラーが発生しました:", error);
|
|
337
|
-
process.exit(1);
|
|
338
|
-
}
|
|
339
|
-
finally {
|
|
340
|
-
// 強制的にプロセスを終了
|
|
341
|
-
console.log("👋 プロセスを終了します...");
|
|
342
|
-
setTimeout(() => process.exit(0), 1000);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// プログラム実行
|
|
346
|
-
main();
|
|
347
|
-
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|