@kajidog/mcp-tts-voicevox 0.0.9 → 0.0.13
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 +513 -17
- package/dist/client.d.ts +11 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +35 -0
- package/dist/client.js.map +1 -0
- package/dist/index.browser.d.ts +2 -0
- package/dist/index.browser.d.ts.map +1 -0
- package/dist/index.browser.js +22 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +217 -127
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +179 -0
- package/dist/server.js.map +1 -0
- package/dist/sse.d.ts +4 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +255 -0
- package/dist/sse.js.map +1 -0
- package/dist/stdio.d.ts +3 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +9 -0
- package/dist/stdio.js.map +1 -0
- package/dist/test.js +1 -0
- package/dist/test.js.map +1 -0
- package/dist/voicevox/api.d.ts +9 -1
- package/dist/voicevox/api.d.ts.map +1 -1
- package/dist/voicevox/api.js +31 -0
- package/dist/voicevox/api.js.map +1 -0
- package/dist/voicevox/error.js +1 -0
- package/dist/voicevox/error.js.map +1 -0
- package/dist/voicevox/index.d.ts +51 -3
- package/dist/voicevox/index.d.ts.map +1 -1
- package/dist/voicevox/index.js +139 -58
- package/dist/voicevox/index.js.map +1 -0
- package/dist/voicevox/player.js +1 -0
- package/dist/voicevox/player.js.map +1 -0
- package/dist/voicevox/queue/__tests__/manager.test.js +1 -0
- package/dist/voicevox/queue/__tests__/manager.test.js.map +1 -0
- package/dist/voicevox/queue/audio-generator.d.ts.map +1 -1
- package/dist/voicevox/queue/audio-generator.js +14 -2
- package/dist/voicevox/queue/audio-generator.js.map +1 -0
- package/dist/voicevox/queue/audio-player.d.ts +9 -1
- package/dist/voicevox/queue/audio-player.d.ts.map +1 -1
- package/dist/voicevox/queue/audio-player.js +176 -4
- package/dist/voicevox/queue/audio-player.js.map +1 -0
- package/dist/voicevox/queue/event-manager.js +1 -0
- package/dist/voicevox/queue/event-manager.js.map +1 -0
- package/dist/voicevox/queue/file-manager.d.ts +32 -5
- package/dist/voicevox/queue/file-manager.d.ts.map +1 -1
- package/dist/voicevox/queue/file-manager.js +255 -13
- package/dist/voicevox/queue/file-manager.js.map +1 -0
- package/dist/voicevox/queue/index.js +1 -0
- package/dist/voicevox/queue/index.js.map +1 -0
- package/dist/voicevox/queue/manager.d.ts +5 -0
- package/dist/voicevox/queue/manager.d.ts.map +1 -1
- package/dist/voicevox/queue/manager.js +23 -0
- package/dist/voicevox/queue/manager.js.map +1 -0
- package/dist/voicevox/queue/types.js +1 -0
- package/dist/voicevox/queue/types.js.map +1 -0
- package/dist/voicevox/types.d.ts +20 -0
- package/dist/voicevox/types.d.ts.map +1 -1
- package/dist/voicevox/types.js +1 -0
- package/dist/voicevox/types.js.map +1 -0
- package/dist/voicevox/utils.d.ts +19 -0
- package/dist/voicevox/utils.d.ts.map +1 -1
- package/dist/voicevox/utils.js +98 -1
- package/dist/voicevox/utils.js.map +1 -0
- package/package.json +63 -6
- package/scripts/fix-permissions.js +84 -0
package/README.md
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
# MCP TTS VOICEVOX
|
|
2
2
|
|
|
3
|
-
VOICEVOXを使用した音声合成MCPサーバー
|
|
3
|
+
VOICEVOX を使用した音声合成 MCP サーバー
|
|
4
4
|
|
|
5
5
|
## 特徴
|
|
6
6
|
|
|
7
7
|
- **キュー管理機能** - 複数の音声合成リクエストを効率的に処理
|
|
8
8
|
- **プリフェッチ** - 次の音声を事前に生成し、再生をスムーズに
|
|
9
|
+
- **クロスプラットフォーム対応** - Windows、macOS で動作
|
|
10
|
+
- **マルチ環境対応** - Node.js(ライブラリ/CLI)とブラウザの環境で利用可能
|
|
11
|
+
- **ファイルダウンロード機能** - ブラウザ環境での音声ファイル保存をサポート
|
|
12
|
+
- **Stdio 対応** - 標準入出力による MCP プロトコル通信(Claude Desktop 等で推奨)
|
|
13
|
+
- **SSE 対応** - Server-Sent Events によるリアルタイム対話形式音声再生
|
|
14
|
+
- **StreamableHTTP 対応** - ストリーミング形式での HTTP 通信による高速音声合成
|
|
15
|
+
- **対話形式音声再生** - チャット形式でのリアルタイム音声合成・再生機能
|
|
16
|
+
- **複数話者対応** - セグメント単位での個別話者指定が可能
|
|
17
|
+
- **テキスト自動分割** - 長文の自動分割による安定した音声合成
|
|
9
18
|
|
|
10
19
|
## 必要条件
|
|
11
20
|
|
|
12
|
-
- Node.js
|
|
13
|
-
- [VOICEVOXエンジン](https://voicevox.hiroshiba.jp/)
|
|
21
|
+
- Node.js 18.0.0 以上
|
|
22
|
+
- [VOICEVOX エンジン](https://voicevox.hiroshiba.jp/) または互換エンジン
|
|
14
23
|
|
|
15
24
|
## インストール
|
|
16
25
|
|
|
@@ -20,15 +29,220 @@ npm install -g @kajidog/mcp-tts-voicevox
|
|
|
20
29
|
|
|
21
30
|
## 使い方
|
|
22
31
|
|
|
23
|
-
### MCPサーバーとして
|
|
32
|
+
### MCP サーバーとして
|
|
24
33
|
|
|
25
|
-
1. VOICEVOXエンジンを起動
|
|
26
|
-
|
|
34
|
+
#### 1. VOICEVOX エンジンを起動
|
|
35
|
+
|
|
36
|
+
VOICEVOX エンジンを起動し、デフォルトポート(`http://localhost:50021`)で待機状態にします。
|
|
37
|
+
|
|
38
|
+
#### 2. MCP サーバーを起動
|
|
39
|
+
|
|
40
|
+
**標準入出力モード(推奨):**
|
|
27
41
|
|
|
28
42
|
```bash
|
|
29
43
|
npx @kajidog/mcp-tts-voicevox
|
|
30
44
|
```
|
|
31
45
|
|
|
46
|
+
**HTTP サーバーモード:**
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Linux/macOS
|
|
50
|
+
MCP_HTTP_MODE=true npx @kajidog/mcp-tts-voicevox
|
|
51
|
+
|
|
52
|
+
# Windows PowerShell
|
|
53
|
+
$env:MCP_HTTP_MODE='true'; npx @kajidog/mcp-tts-voicevox
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### MCP ツール一覧
|
|
57
|
+
|
|
58
|
+
MCP サーバーは以下のツールを提供します:
|
|
59
|
+
|
|
60
|
+
#### `speak` - テキスト読み上げ
|
|
61
|
+
|
|
62
|
+
テキストを音声に変換して再生します。
|
|
63
|
+
|
|
64
|
+
**パラメータ:**
|
|
65
|
+
|
|
66
|
+
- `text`: 文字列配列、またはテキストと話者ペアの配列
|
|
67
|
+
- `speaker` (オプション): 話者 ID
|
|
68
|
+
- `speedScale` (オプション): 再生速度
|
|
69
|
+
- `query` (オプション): 事前生成済みクエリ
|
|
70
|
+
|
|
71
|
+
**使用例:**
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
// シンプルなテキスト
|
|
75
|
+
{ "text": ["こんにちは", "今日はいい天気ですね"] }
|
|
76
|
+
|
|
77
|
+
// 話者指定
|
|
78
|
+
{ "text": ["こんにちは", "今日はいい天気ですね"], "speaker": 3 }
|
|
79
|
+
|
|
80
|
+
// セグメント別話者指定
|
|
81
|
+
{ "text": [{"text": "こんにちは", "speaker": 1}, {"text": "今日はいい天気ですね", "speaker": 3}] }
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### `generate_query` - クエリ生成
|
|
85
|
+
|
|
86
|
+
音声合成用クエリを生成します。
|
|
87
|
+
|
|
88
|
+
**パラメータ:**
|
|
89
|
+
|
|
90
|
+
- `text`: 合成するテキスト
|
|
91
|
+
- `speaker` (オプション): 話者 ID
|
|
92
|
+
- `speedScale` (オプション): 再生速度
|
|
93
|
+
|
|
94
|
+
#### `synthesize_file` - ファイル生成
|
|
95
|
+
|
|
96
|
+
音声ファイルを生成し、パスを返します。
|
|
97
|
+
|
|
98
|
+
**パラメータ:**
|
|
99
|
+
|
|
100
|
+
- `text` (オプション): 合成するテキスト
|
|
101
|
+
- `query` (オプション): 事前生成済みクエリ
|
|
102
|
+
- `output`: 出力ファイルパス
|
|
103
|
+
- `speaker` (オプション): 話者 ID
|
|
104
|
+
- `speedScale` (オプション): 再生速度
|
|
105
|
+
|
|
106
|
+
#### `stop_speaker` - 再生停止
|
|
107
|
+
|
|
108
|
+
現在の音声合成キューをクリアします。
|
|
109
|
+
|
|
110
|
+
#### `get_speakers` - 話者一覧取得
|
|
111
|
+
|
|
112
|
+
利用可能な話者一覧を取得します。
|
|
113
|
+
|
|
114
|
+
#### `get_speaker_detail` - 話者詳細取得
|
|
115
|
+
|
|
116
|
+
指定した UUID の話者詳細情報を取得します。
|
|
117
|
+
|
|
118
|
+
**パラメータ:**
|
|
119
|
+
|
|
120
|
+
- `uuid`: 話者 UUID
|
|
121
|
+
|
|
122
|
+
### 対話形式音声再生の使用例
|
|
123
|
+
|
|
124
|
+
#### StreamableHTTP を使用した対話形式再生
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
// セッション初期化
|
|
128
|
+
const response = await fetch("http://localhost:3000/mcp", {
|
|
129
|
+
method: "POST",
|
|
130
|
+
headers: {
|
|
131
|
+
"Content-Type": "application/json",
|
|
132
|
+
},
|
|
133
|
+
body: JSON.stringify({
|
|
134
|
+
jsonrpc: "2.0",
|
|
135
|
+
method: "initialize",
|
|
136
|
+
params: {
|
|
137
|
+
protocolVersion: "2024-11-05",
|
|
138
|
+
capabilities: {},
|
|
139
|
+
},
|
|
140
|
+
id: 1,
|
|
141
|
+
}),
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const sessionData = await response.json();
|
|
145
|
+
const sessionId = response.headers.get("mcp-session-id");
|
|
146
|
+
|
|
147
|
+
// 音声合成・再生リクエスト
|
|
148
|
+
const speakResponse = await fetch("http://localhost:3000/mcp", {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: {
|
|
151
|
+
"Content-Type": "application/json",
|
|
152
|
+
"mcp-session-id": sessionId,
|
|
153
|
+
},
|
|
154
|
+
body: JSON.stringify({
|
|
155
|
+
jsonrpc: "2.0",
|
|
156
|
+
method: "tools/call",
|
|
157
|
+
params: {
|
|
158
|
+
name: "speak",
|
|
159
|
+
arguments: {
|
|
160
|
+
text: ["こんにちは、対話形式で音声を再生します"],
|
|
161
|
+
speaker: 1,
|
|
162
|
+
speedScale: 1.0,
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
id: 2,
|
|
166
|
+
}),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const result = await speakResponse.json();
|
|
170
|
+
console.log("結果:", result);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
#### 複数話者を使用した対話例
|
|
174
|
+
|
|
175
|
+
```javascript
|
|
176
|
+
// 複数話者での会話例
|
|
177
|
+
const conversationResponse = await fetch("http://localhost:3000/mcp", {
|
|
178
|
+
method: "POST",
|
|
179
|
+
headers: {
|
|
180
|
+
"Content-Type": "application/json",
|
|
181
|
+
"mcp-session-id": sessionId,
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({
|
|
184
|
+
jsonrpc: "2.0",
|
|
185
|
+
method: "tools/call",
|
|
186
|
+
params: {
|
|
187
|
+
name: "speak",
|
|
188
|
+
arguments: {
|
|
189
|
+
text: [
|
|
190
|
+
{ text: "こんにちは!", speaker: 1 },
|
|
191
|
+
{ text: "お元気ですか?", speaker: 3 },
|
|
192
|
+
{ text: "とても元気です!", speaker: 1 },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
id: 3,
|
|
197
|
+
}),
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
#### SSE を使用した対話形式再生(レガシー)
|
|
202
|
+
|
|
203
|
+
```javascript
|
|
204
|
+
// SSE接続の確立
|
|
205
|
+
const eventSource = new EventSource("http://localhost:3000/sse");
|
|
206
|
+
let sessionId = null;
|
|
207
|
+
|
|
208
|
+
eventSource.onopen = function (event) {
|
|
209
|
+
console.log("SSE接続が確立されました");
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
eventSource.onmessage = function (event) {
|
|
213
|
+
const data = JSON.parse(event.data);
|
|
214
|
+
|
|
215
|
+
if (data.type === "session") {
|
|
216
|
+
sessionId = data.sessionId;
|
|
217
|
+
console.log("セッションID:", sessionId);
|
|
218
|
+
|
|
219
|
+
// 音声合成リクエストを送信
|
|
220
|
+
sendSpeakRequest();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
async function sendSpeakRequest() {
|
|
225
|
+
await fetch(`http://localhost:3000/messages?sessionId=${sessionId}`, {
|
|
226
|
+
method: "POST",
|
|
227
|
+
headers: {
|
|
228
|
+
"Content-Type": "application/json",
|
|
229
|
+
},
|
|
230
|
+
body: JSON.stringify({
|
|
231
|
+
jsonrpc: "2.0",
|
|
232
|
+
method: "tools/call",
|
|
233
|
+
params: {
|
|
234
|
+
name: "speak",
|
|
235
|
+
arguments: {
|
|
236
|
+
text: ["SSEを使用した音声再生です"],
|
|
237
|
+
speaker: 1,
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
id: 1,
|
|
241
|
+
}),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
32
246
|
### ライブラリとして
|
|
33
247
|
|
|
34
248
|
プロジェクトに直接インポートして使用することも可能です:
|
|
@@ -37,39 +251,321 @@ npx @kajidog/mcp-tts-voicevox
|
|
|
37
251
|
npm install @kajidog/mcp-tts-voicevox
|
|
38
252
|
```
|
|
39
253
|
|
|
254
|
+
#### Node.js 環境での使用例
|
|
255
|
+
|
|
40
256
|
```javascript
|
|
41
257
|
import { VoicevoxClient } from "@kajidog/mcp-tts-voicevox";
|
|
42
258
|
|
|
43
259
|
// クライアントを初期化
|
|
44
260
|
const client = new VoicevoxClient({
|
|
45
261
|
url: "http://localhost:50021", // VOICEVOXエンジンのURL
|
|
46
|
-
defaultSpeaker: 1,
|
|
47
|
-
defaultSpeedScale: 1.0
|
|
262
|
+
defaultSpeaker: 1, // デフォルト話者ID(オプション)
|
|
263
|
+
defaultSpeedScale: 1.0, // デフォルト速度(オプション)
|
|
48
264
|
});
|
|
49
265
|
|
|
50
266
|
// テキストを音声に変換して再生
|
|
51
267
|
await client.speak("こんにちは");
|
|
52
268
|
|
|
269
|
+
// 配列でのテキスト読み上げ
|
|
270
|
+
await client.speak(["こんにちは", "今日はいい天気ですね"]);
|
|
271
|
+
|
|
272
|
+
// 話者を個別指定
|
|
273
|
+
await client.speak([
|
|
274
|
+
{ text: "こんにちは", speaker: 1 },
|
|
275
|
+
{ text: "お元気ですか?", speaker: 3 },
|
|
276
|
+
]);
|
|
277
|
+
|
|
53
278
|
// テキストから音声ファイルを生成
|
|
54
279
|
const filePath = await client.generateAudioFile("こんにちは", "./output.wav");
|
|
55
280
|
|
|
56
281
|
// キューをクリア
|
|
57
282
|
await client.clearQueue();
|
|
283
|
+
|
|
284
|
+
// スピーカー一覧を取得
|
|
285
|
+
const speakers = await client.getSpeakers();
|
|
286
|
+
|
|
287
|
+
// スピーカー詳細を取得
|
|
288
|
+
const speakerInfo = await client.getSpeakerInfo(speakers[0].speaker_uuid);
|
|
58
289
|
```
|
|
59
290
|
|
|
60
|
-
|
|
291
|
+
#### ブラウザ環境での使用例
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
import { VoicevoxClient } from "@kajidog/mcp-tts-voicevox";
|
|
295
|
+
|
|
296
|
+
// クライアントを初期化(VOICEVOXエンジンが稼働しているURLを指定)
|
|
297
|
+
const client = new VoicevoxClient({
|
|
298
|
+
url: "http://localhost:50021",
|
|
299
|
+
defaultSpeaker: 1,
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// ボタンクリックでテキストを音声に変換して再生
|
|
303
|
+
document.querySelector("#playButton").addEventListener("click", async () => {
|
|
304
|
+
await client.speak("こんにちは");
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// ファイルダウンロードボタン
|
|
308
|
+
document
|
|
309
|
+
.querySelector("#downloadButton")
|
|
310
|
+
.addEventListener("click", async () => {
|
|
311
|
+
try {
|
|
312
|
+
// 音声ファイルを生成してダウンロード(ファイル名を指定)
|
|
313
|
+
const filename = `voice-${Date.now()}.wav`;
|
|
314
|
+
const result = await client.generateAudioFile("こんにちは", filename);
|
|
315
|
+
console.log("ダウンロードしたファイル:", result);
|
|
316
|
+
} catch (error) {
|
|
317
|
+
console.error("エラー:", error);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
```
|
|
61
321
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
322
|
+
## MCP 設定例
|
|
323
|
+
|
|
324
|
+
### Claude Desktop での設定
|
|
325
|
+
|
|
326
|
+
`mcp.json`ファイルに以下の設定を追加:
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
{
|
|
330
|
+
"mcpServers": {
|
|
331
|
+
"tts-mcp": {
|
|
332
|
+
"command": "npx",
|
|
333
|
+
"args": ["-y", "@kajidog/mcp-tts-voicevox"],
|
|
334
|
+
"env": {
|
|
335
|
+
"VOICEVOX_URL": "http://localhost:50021",
|
|
336
|
+
"VOICEVOX_DEFAULT_SPEAKER": "1"
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### AivisSpeech での設定例
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"mcpServers": {
|
|
348
|
+
"tts-mcp": {
|
|
349
|
+
"command": "npx",
|
|
350
|
+
"args": ["-y", "@kajidog/mcp-tts-voicevox"],
|
|
351
|
+
"env": {
|
|
352
|
+
"VOICEVOX_URL": "http://127.0.0.1:10101",
|
|
353
|
+
"VOICEVOX_DEFAULT_SPEAKER": "888753764"
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### HTTP モードでの設定
|
|
361
|
+
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"mcpServers": {
|
|
365
|
+
"tts-mcp-http": {
|
|
366
|
+
"command": "npx",
|
|
367
|
+
"args": ["-y", "@kajidog/mcp-tts-voicevox"],
|
|
368
|
+
"env": {
|
|
369
|
+
"MCP_HTTP_MODE": "true",
|
|
370
|
+
"MCP_HTTP_PORT": "3000",
|
|
371
|
+
"MCP_HTTP_HOST": "0.0.0.0",
|
|
372
|
+
"VOICEVOX_URL": "http://localhost:50021",
|
|
373
|
+
"VOICEVOX_DEFAULT_SPEAKER": "1"
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
66
379
|
|
|
67
380
|
## 環境変数
|
|
68
381
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- `
|
|
382
|
+
### VOICEVOX 設定
|
|
383
|
+
|
|
384
|
+
- `VOICEVOX_URL`: VOICEVOX エンジンの URL(デフォルト: `http://localhost:50021`)
|
|
385
|
+
- `VOICEVOX_DEFAULT_SPEAKER`: デフォルト話者 ID(デフォルト: `1`)
|
|
386
|
+
- `VOICEVOX_DEFAULT_SPEED_SCALE`: デフォルト再生速度(デフォルト: `1.0`)
|
|
387
|
+
|
|
388
|
+
### サーバー設定
|
|
389
|
+
|
|
390
|
+
- `MCP_HTTP_MODE`: HTTP サーバーモードの有効化(`true` で有効)
|
|
391
|
+
- `MCP_HTTP_PORT`: HTTP サーバーのポート番号(デフォルト: `3000`)
|
|
392
|
+
- `MCP_HTTP_HOST`: HTTP サーバーのホスト(デフォルト: `0.0.0.0`)
|
|
393
|
+
- `NODE_ENV`: 開発モード(`development` で有効)
|
|
394
|
+
|
|
395
|
+
## トラブルシューティング
|
|
396
|
+
|
|
397
|
+
### VOICEVOX エンジンの確認
|
|
398
|
+
|
|
399
|
+
1. VOICEVOX エンジンが起動していることを確認:
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
curl http://localhost:50021/speakers
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
2. ファイアウォールやセキュリティソフトがポートをブロックしていないか確認
|
|
406
|
+
|
|
407
|
+
### Stdio モードの問題
|
|
408
|
+
|
|
409
|
+
#### MCP クライアントで認識されない場合
|
|
410
|
+
|
|
411
|
+
1. パッケージが正しくインストールされているか確認:
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
npm list -g @kajidog/mcp-tts-voicevox
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
2. 実行権限があることを確認:
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
# Linux/macOS
|
|
421
|
+
chmod +x $(npm root -g)/@kajidog/mcp-tts-voicevox/dist/index.js
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
3. Claude Desktop の場合、設定ファイルの構文が正しいか確認
|
|
425
|
+
|
|
426
|
+
#### 環境変数の設定例
|
|
427
|
+
|
|
428
|
+
```bash
|
|
429
|
+
# Linux/macOS の .bashrc または .zshrc
|
|
430
|
+
export VOICEVOX_URL="http://localhost:50021"
|
|
431
|
+
export VOICEVOX_DEFAULT_SPEAKER="1"
|
|
432
|
+
|
|
433
|
+
# Windows PowerShell Profile
|
|
434
|
+
$env:VOICEVOX_URL="http://localhost:50021"
|
|
435
|
+
$env:VOICEVOX_DEFAULT_SPEAKER="1"
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### HTTP モードの問題
|
|
439
|
+
|
|
440
|
+
#### ポート競合
|
|
441
|
+
|
|
442
|
+
ポート 3000 が使用中の場合:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
MCP_HTTP_PORT=3001 npx @kajidog/mcp-tts-voicevox
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
#### CORS エラー
|
|
449
|
+
|
|
450
|
+
ブラウザからアクセスする際に CORS エラーが発生する場合、VOICEVOX エンジン側でも CORS 設定が必要です。
|
|
451
|
+
|
|
452
|
+
### 権限エラー
|
|
453
|
+
|
|
454
|
+
ファイル生成時に権限エラーが発生する場合:
|
|
455
|
+
|
|
456
|
+
```bash
|
|
457
|
+
# Linux/macOS
|
|
458
|
+
chmod +x node_modules/.bin/mcp-tts-voicevox
|
|
459
|
+
|
|
460
|
+
# または
|
|
461
|
+
sudo npm install -g @kajidog/mcp-tts-voicevox
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### 音声再生されない場合
|
|
465
|
+
|
|
466
|
+
1. システムの音声出力デバイスが正しく設定されているか確認
|
|
467
|
+
2. 他のアプリケーションが音声デバイスを占有していないか確認
|
|
468
|
+
3. VOICEVOX エンジンが正常に動作しているか確認:
|
|
469
|
+
```bash
|
|
470
|
+
curl -X POST "http://localhost:50021/audio_query?text=テスト&speaker=1"
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
## 開発
|
|
474
|
+
|
|
475
|
+
### 開発環境の起動
|
|
476
|
+
|
|
477
|
+
```bash
|
|
478
|
+
# 標準入出力モード
|
|
479
|
+
npm run dev
|
|
480
|
+
|
|
481
|
+
# HTTPモード
|
|
482
|
+
npm run dev:http
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### ビルド
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
npm run build
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### テスト実行
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
# 音声テスト
|
|
495
|
+
npm run test:sound
|
|
496
|
+
|
|
497
|
+
# 単体テスト
|
|
498
|
+
npm test
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### 各モードの動作確認
|
|
502
|
+
|
|
503
|
+
#### 1. ライブラリモードの確認
|
|
504
|
+
|
|
505
|
+
```bash
|
|
506
|
+
# ライブラリとして正常にインポートできるかテスト
|
|
507
|
+
node -e "const { VoicevoxClient } = require('@kajidog/mcp-tts-voicevox'); console.log('✅ Library import successful:', typeof VoicevoxClient);"
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
#### 2. CLI/Stdio モードの確認
|
|
511
|
+
|
|
512
|
+
```bash
|
|
513
|
+
# Stdioモードで起動(MCP標準プロトコル通信)
|
|
514
|
+
npx @kajidog/mcp-tts-voicevox
|
|
515
|
+
|
|
516
|
+
# または、ローカルビルド版で確認
|
|
517
|
+
node dist/index.js
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
#### 3. HTTP モードの確認
|
|
521
|
+
|
|
522
|
+
```bash
|
|
523
|
+
# HTTPサーバーモードで起動
|
|
524
|
+
MCP_HTTP_MODE=true npx @kajidog/mcp-tts-voicevox
|
|
525
|
+
|
|
526
|
+
# ヘルスチェック(別ターミナルで実行)
|
|
527
|
+
curl http://localhost:3000/health
|
|
528
|
+
|
|
529
|
+
# Windowsの場合
|
|
530
|
+
$env:MCP_HTTP_MODE='true'; npx @kajidog/mcp-tts-voicevox
|
|
531
|
+
Invoke-WebRequest -Uri http://localhost:3000/health
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
#### 4. ブラウザモードの確認
|
|
535
|
+
|
|
536
|
+
ブラウザ環境での動作確認は、Web アプリケーション内で以下のようにテストできます:
|
|
537
|
+
|
|
538
|
+
```javascript
|
|
539
|
+
// ESModule import
|
|
540
|
+
import { VoicevoxClient } from "@kajidog/mcp-tts-voicevox";
|
|
541
|
+
|
|
542
|
+
// CommonJS require (Webpack等のバンドラー経由)
|
|
543
|
+
const { VoicevoxClient } = require("@kajidog/mcp-tts-voicevox");
|
|
544
|
+
|
|
545
|
+
// クライアント初期化
|
|
546
|
+
const client = new VoicevoxClient({
|
|
547
|
+
url: "http://localhost:50021",
|
|
548
|
+
defaultSpeaker: 1,
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
// 動作確認
|
|
552
|
+
console.log("✅ Browser library loaded successfully");
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
## ブラウザ互換性
|
|
556
|
+
|
|
557
|
+
- **Chrome, Firefox, Edge**: 完全対応
|
|
558
|
+
- **Safari**: ファイルダウンロードに特殊対応あり
|
|
559
|
+
|
|
560
|
+
## パフォーマンス最適化
|
|
561
|
+
|
|
562
|
+
- **テキスト分割**: 長文は自動的に 150 文字以下に分割されます
|
|
563
|
+
- **非同期処理**: 最初のセグメントを優先処理し、残りは非同期で処理
|
|
564
|
+
- **キュー管理**: 複数のリクエストを効率的に管理
|
|
565
|
+
- **プリフェッチ**: 次の音声を事前生成してスムーズな再生を実現
|
|
72
566
|
|
|
73
567
|
## ライセンス
|
|
74
568
|
|
|
75
|
-
ISC
|
|
569
|
+
ISC
|
|
570
|
+
|
|
571
|
+
[](https://mseep.ai/app/kajidog-mcp-tts-voicevox)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP TTS Voicevox Client
|
|
3
|
+
* ライブラリとして使用するためのエントリーポイント
|
|
4
|
+
*/
|
|
5
|
+
export { VoicevoxClient } from "./voicevox";
|
|
6
|
+
export { AudioQuery, VoicevoxConfig, VoicevoxError, Score, Note, FrameAudioQuery, } from "./voicevox/types";
|
|
7
|
+
export * from "./voicevox/queue";
|
|
8
|
+
export * from "./voicevox/api";
|
|
9
|
+
export * from "./voicevox/utils";
|
|
10
|
+
export { isBrowser } from "./voicevox/utils";
|
|
11
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,EACL,IAAI,EACJ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP TTS Voicevox Client
|
|
4
|
+
* ライブラリとして使用するためのエントリーポイント
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.isBrowser = exports.VoicevoxError = exports.VoicevoxClient = void 0;
|
|
22
|
+
// クライアント
|
|
23
|
+
var voicevox_1 = require("./voicevox");
|
|
24
|
+
Object.defineProperty(exports, "VoicevoxClient", { enumerable: true, get: function () { return voicevox_1.VoicevoxClient; } });
|
|
25
|
+
// 型定義
|
|
26
|
+
var types_1 = require("./voicevox/types");
|
|
27
|
+
Object.defineProperty(exports, "VoicevoxError", { enumerable: true, get: function () { return types_1.VoicevoxError; } });
|
|
28
|
+
// 一部のコンポーネントを選択的に直接利用できるようにエクスポート
|
|
29
|
+
__exportStar(require("./voicevox/queue"), exports);
|
|
30
|
+
__exportStar(require("./voicevox/api"), exports);
|
|
31
|
+
__exportStar(require("./voicevox/utils"), exports);
|
|
32
|
+
// ブラウザ対応
|
|
33
|
+
var utils_1 = require("./voicevox/utils");
|
|
34
|
+
Object.defineProperty(exports, "isBrowser", { enumerable: true, get: function () { return utils_1.isBrowser; } });
|
|
35
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,SAAS;AACT,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AAEvB,MAAM;AACN,0CAO0B;AAJxB,sGAAA,aAAa,OAAA;AAMf,kCAAkC;AAClC,mDAAiC;AACjC,iDAA+B;AAC/B,mDAAiC;AAEjC,SAAS;AACT,0CAA6C;AAApC,kGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// MCP TTS Voicevox ブラウザエントリーポイント
|
|
3
|
+
// ブラウザ環境用の簡略化されたエントリーポイント
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
16
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
// ライブラリとして使用する場合のエクスポート
|
|
20
|
+
__exportStar(require("./client"), exports);
|
|
21
|
+
// ログ出力は削除
|
|
22
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC,0BAA0B;;;;;;;;;;;;;;;;AAE1B,wBAAwB;AACxB,2CAAyB;AAEzB,UAAU"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { AudioQuery, VoicevoxConfig, VoicevoxError, Score, Note, FrameAudioQuery } from "./voicevox/types";
|
|
4
|
-
export { AudioQuery, VoicevoxConfig, VoicevoxClient, VoicevoxError, Score, Note, FrameAudioQuery, };
|
|
2
|
+
export * from "./client";
|
|
5
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAKA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAKA,cAAc,UAAU,CAAC"}
|