@coeiro-operator/mcp 1.4.6 → 1.4.8
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/dist/server.js +32 -990
- package/dist/server.js.map +1 -1
- package/dist/tools/debug.d.ts +10 -0
- package/dist/tools/debug.d.ts.map +1 -0
- package/dist/tools/debug.js +138 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/dictionary.d.ts +11 -0
- package/dist/tools/dictionary.d.ts.map +1 -0
- package/dist/tools/dictionary.js +69 -0
- package/dist/tools/dictionary.js.map +1 -0
- package/dist/tools/operator.d.ts +32 -0
- package/dist/tools/operator.d.ts.map +1 -0
- package/dist/tools/operator.js +225 -0
- package/dist/tools/operator.js.map +1 -0
- package/dist/tools/playback.d.ts +23 -0
- package/dist/tools/playback.d.ts.map +1 -0
- package/dist/tools/playback.js +219 -0
- package/dist/tools/playback.js.map +1 -0
- package/dist/tools/speech.d.ts +13 -0
- package/dist/tools/speech.d.ts.map +1 -0
- package/dist/tools/speech.js +313 -0
- package/dist/tools/speech.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +33 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +141 -0
- package/dist/utils.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* queue_statusツールの登録
|
|
4
|
+
* 音声キューの状態を確認します
|
|
5
|
+
*/
|
|
6
|
+
export function registerQueueStatusTool(server, sayCoeiroink) {
|
|
7
|
+
server.registerTool('queue_status', {
|
|
8
|
+
description: 'Check the status of the speech queue',
|
|
9
|
+
inputSchema: {},
|
|
10
|
+
}, async () => {
|
|
11
|
+
try {
|
|
12
|
+
const status = sayCoeiroink.getSpeechQueueStatus();
|
|
13
|
+
let statusText = '📊 音声キューステータス\n\n';
|
|
14
|
+
statusText += `キュー長: ${status.queueLength} 個\n`;
|
|
15
|
+
statusText += `処理状態: ${status.isProcessing ? '🔄 処理中' : '⏸️ 待機中'}\n`;
|
|
16
|
+
if (status.nextTaskId !== null) {
|
|
17
|
+
statusText += `次のタスクID: ${status.nextTaskId}\n`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
statusText += `次のタスク: なし\n`;
|
|
21
|
+
}
|
|
22
|
+
if (status.queueLength === 0 && !status.isProcessing) {
|
|
23
|
+
statusText += '\n💡 キューは空で、待機中です。';
|
|
24
|
+
}
|
|
25
|
+
else if (status.isProcessing) {
|
|
26
|
+
statusText += '\n⚡ 音声処理が実行中です。';
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: statusText,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw new Error(`キューステータス取得エラー: ${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* queue_clearツールの登録
|
|
44
|
+
* 音声キューをクリアします
|
|
45
|
+
*/
|
|
46
|
+
export function registerQueueClearTool(server, sayCoeiroink) {
|
|
47
|
+
server.registerTool('queue_clear', {
|
|
48
|
+
description: 'Clear the speech queue (does not stop currently playing audio)',
|
|
49
|
+
inputSchema: {
|
|
50
|
+
taskIds: z
|
|
51
|
+
.array(z.number())
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('List of task IDs to remove (defaults to removing all tasks if omitted)'),
|
|
54
|
+
},
|
|
55
|
+
}, async (args) => {
|
|
56
|
+
const { taskIds } = args || {};
|
|
57
|
+
try {
|
|
58
|
+
const statusBefore = sayCoeiroink.getSpeechQueueStatus();
|
|
59
|
+
const result = await sayCoeiroink.clearSpeechQueue(taskIds);
|
|
60
|
+
let resultText;
|
|
61
|
+
if (taskIds && taskIds.length > 0) {
|
|
62
|
+
// 特定タスクの削除
|
|
63
|
+
resultText = '🗑️ 指定されたタスクを削除しました\n\n';
|
|
64
|
+
resultText += `削除されたタスク数: ${result.removedCount} 個\n`;
|
|
65
|
+
resultText += `指定されたタスクID: ${taskIds.join(', ')}\n`;
|
|
66
|
+
if (result.removedCount < taskIds.length) {
|
|
67
|
+
resultText += `\n⚠️ 一部のタスクIDが見つかりませんでした。`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// 全タスクの削除
|
|
72
|
+
resultText = '🗑️ キューをクリアしました\n\n';
|
|
73
|
+
resultText += `削除されたタスク数: ${result.removedCount} 個\n`;
|
|
74
|
+
}
|
|
75
|
+
if (statusBefore.isProcessing) {
|
|
76
|
+
resultText += '\n⚠️ 注意: 現在再生中の音声は継続されます。';
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: resultText,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`キュークリアエラー: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* playback_stopツールの登録
|
|
94
|
+
* 音声再生を停止します(チャンク境界で停止)
|
|
95
|
+
*/
|
|
96
|
+
export function registerPlaybackStopTool(server, sayCoeiroink) {
|
|
97
|
+
server.registerTool('playback_stop', {
|
|
98
|
+
description: 'Stop currently playing audio (tasks in queue are not deleted)',
|
|
99
|
+
inputSchema: {},
|
|
100
|
+
}, async () => {
|
|
101
|
+
try {
|
|
102
|
+
sayCoeiroink.stopPlayback();
|
|
103
|
+
const status = sayCoeiroink.getSpeechQueueStatus();
|
|
104
|
+
let resultText = '⏹️ 音声再生の停止を要求しました\n\n';
|
|
105
|
+
resultText += '⚠️ 注意:\n';
|
|
106
|
+
resultText += '- 現在再生中のチャンク(文)は最後まで再生されます\n';
|
|
107
|
+
resultText += '- 次のチャンクからは再生されません\n';
|
|
108
|
+
resultText += `- キューにある ${status.queueLength} 個のタスクは削除されていません\n\n`;
|
|
109
|
+
resultText += '💡 タスクも削除する場合は queue_clear を使用してください';
|
|
110
|
+
return {
|
|
111
|
+
content: [
|
|
112
|
+
{
|
|
113
|
+
type: 'text',
|
|
114
|
+
text: resultText,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new Error(`再生停止エラー: ${error.message}`);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* wait_for_task_completionツールの登録
|
|
126
|
+
* 音声タスクの完了を待機します
|
|
127
|
+
*/
|
|
128
|
+
export function registerWaitForTaskCompletionTool(server, sayCoeiroink) {
|
|
129
|
+
server.registerTool('wait_for_task_completion', {
|
|
130
|
+
description: 'Wait for speech tasks to complete',
|
|
131
|
+
inputSchema: {
|
|
132
|
+
timeout: z
|
|
133
|
+
.number()
|
|
134
|
+
.min(1000)
|
|
135
|
+
.max(60000)
|
|
136
|
+
.optional()
|
|
137
|
+
.describe('Timeout in milliseconds (1000-60000, defaults to 30000 if omitted)'),
|
|
138
|
+
remainingQueueLength: z
|
|
139
|
+
.number()
|
|
140
|
+
.min(0)
|
|
141
|
+
.optional()
|
|
142
|
+
.describe('Release wait when queue reduces to this number (defaults to 0 = wait until all tasks complete if omitted)'),
|
|
143
|
+
},
|
|
144
|
+
}, async (args) => {
|
|
145
|
+
const { timeout = 30000, remainingQueueLength = 0 } = args || {};
|
|
146
|
+
try {
|
|
147
|
+
const startTime = Date.now();
|
|
148
|
+
// 初期状態を取得
|
|
149
|
+
const initialStatus = sayCoeiroink.getSpeechQueueStatus();
|
|
150
|
+
// 待機対象がない場合(remainingQueueLengthを考慮)
|
|
151
|
+
if (initialStatus.queueLength <= remainingQueueLength && !initialStatus.isProcessing) {
|
|
152
|
+
return {
|
|
153
|
+
content: [
|
|
154
|
+
{
|
|
155
|
+
type: 'text',
|
|
156
|
+
text: remainingQueueLength === 0
|
|
157
|
+
? '✅ 待機対象のタスクがありません(キューは空で、処理中のタスクもありません)'
|
|
158
|
+
: `✅ キューは既に目標数(${remainingQueueLength}個)以下です(現在: ${initialStatus.queueLength}個)`,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// タイムアウト付きで待機
|
|
164
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
165
|
+
setTimeout(() => reject(new Error('Timeout')), timeout);
|
|
166
|
+
});
|
|
167
|
+
try {
|
|
168
|
+
// waitForQueueLength()を使用してイベントベースで待機
|
|
169
|
+
await Promise.race([
|
|
170
|
+
sayCoeiroink.waitForQueueLength(remainingQueueLength),
|
|
171
|
+
timeoutPromise
|
|
172
|
+
]);
|
|
173
|
+
const waitedSeconds = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
174
|
+
const finalStatus = sayCoeiroink.getSpeechQueueStatus();
|
|
175
|
+
const completionMessage = remainingQueueLength === 0
|
|
176
|
+
? '💡 すべての音声処理が完了しました。'
|
|
177
|
+
: `💡 キューが目標数(${remainingQueueLength}個)になりました。`;
|
|
178
|
+
return {
|
|
179
|
+
content: [
|
|
180
|
+
{
|
|
181
|
+
type: 'text',
|
|
182
|
+
text: `✅ 待機完了\n\n` +
|
|
183
|
+
`待機時間: ${waitedSeconds}秒\n` +
|
|
184
|
+
`最終ステータス:\n` +
|
|
185
|
+
` - キュー長: ${finalStatus.queueLength} 個\n` +
|
|
186
|
+
` - 処理状態: ${finalStatus.isProcessing ? '処理中' : '待機中'}\n\n` +
|
|
187
|
+
completionMessage,
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (error.message === 'Timeout') {
|
|
194
|
+
const currentStatus = sayCoeiroink.getSpeechQueueStatus();
|
|
195
|
+
const timeoutMessage = remainingQueueLength === 0
|
|
196
|
+
? `⚠️ タスクがまだ完了していません。`
|
|
197
|
+
: `⚠️ キューが目標数(${remainingQueueLength}個)まで減っていません。`;
|
|
198
|
+
return {
|
|
199
|
+
content: [
|
|
200
|
+
{
|
|
201
|
+
type: 'text',
|
|
202
|
+
text: `⏱️ タイムアウト(${timeout / 1000}秒)しました\n\n` +
|
|
203
|
+
`現在のステータス:\n` +
|
|
204
|
+
` - キュー長: ${currentStatus.queueLength} 個\n` +
|
|
205
|
+
` - 処理状態: ${currentStatus.isProcessing ? '処理中' : '待機中'}\n\n` +
|
|
206
|
+
timeoutMessage,
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
throw new Error(`タスク待機エラー: ${error.message}`);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=playback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playback.js","sourceRoot":"","sources":["../../src/tools/playback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { SayCoeiroink } from '@coeiro-operator/audio';
|
|
3
|
+
import { OperatorManager, CharacterInfoService, TerminalBackground } from '@coeiro-operator/core';
|
|
4
|
+
/**
|
|
5
|
+
* sayツールの登録
|
|
6
|
+
* COEIROINKを使って日本語音声を非同期で出力します(低レイテンシストリーミング対応)
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerSayTool(server: McpServer, sayCoeiroink: SayCoeiroink, operatorManager: OperatorManager, characterInfoService: CharacterInfoService, terminalBackground: TerminalBackground | null): void;
|
|
9
|
+
/**
|
|
10
|
+
* parallel_generation_controlツールの登録
|
|
11
|
+
* チャンク並行生成機能の制御と設定管理
|
|
12
|
+
*/
|
|
13
|
+
//# sourceMappingURL=speech.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech.d.ts","sourceRoot":"","sources":["../../src/tools/speech.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIlG;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,oBAAoB,EAAE,oBAAoB,EAC1C,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,GAC5C,IAAI,CAiON;AAED;;;GAGG"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { logger } from '@coeiro-operator/common';
|
|
3
|
+
/**
|
|
4
|
+
* sayツールの登録
|
|
5
|
+
* COEIROINKを使って日本語音声を非同期で出力します(低レイテンシストリーミング対応)
|
|
6
|
+
*/
|
|
7
|
+
export function registerSayTool(server, sayCoeiroink, operatorManager, characterInfoService, terminalBackground) {
|
|
8
|
+
server.registerTool('say', {
|
|
9
|
+
description: '日本語音声を非同期で出力します',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
speechText: z.string().describe('Text to speak (Japanese)'),
|
|
12
|
+
characterId: z.string().optional().describe('Character ID (defaults to current operator if omitted)'),
|
|
13
|
+
rate: z.number().optional().describe('Absolute speed in WPM (200 = standard, defaults to config value if omitted)'),
|
|
14
|
+
factor: z.number().optional().describe('Relative speed multiplier (1.0 = normal speed, defaults to character\'s natural speed if omitted)'),
|
|
15
|
+
styleName: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('Style name (e.g., "のーまる", defaults to character\'s default style if omitted)'),
|
|
19
|
+
},
|
|
20
|
+
}, async (args) => {
|
|
21
|
+
const { speechText, characterId, rate, factor, styleName } = args;
|
|
22
|
+
try {
|
|
23
|
+
logger.debug('=== SAY TOOL DEBUG START ===');
|
|
24
|
+
logger.debug(`Input parameters:`);
|
|
25
|
+
logger.debug(` speechText: "${speechText}"`);
|
|
26
|
+
logger.debug(` characterId: ${characterId || 'null (will use operator voice)'}`);
|
|
27
|
+
logger.debug(` rate: ${rate || 'undefined (will use config default)'}`);
|
|
28
|
+
logger.debug(` factor: ${factor || 'undefined (will use speaker natural speed)'}`);
|
|
29
|
+
logger.debug(` styleName: ${styleName || 'undefined (will use operator default)'}`);
|
|
30
|
+
// rateとfactorの同時指定チェック
|
|
31
|
+
if (rate !== undefined && factor !== undefined) {
|
|
32
|
+
throw new Error('rateとfactorは同時に指定できません。どちらか一方を指定してください。');
|
|
33
|
+
}
|
|
34
|
+
// characterId文字列をパース("characterId:styleName"形式に対応)
|
|
35
|
+
let parsedCharacterId = characterId || null;
|
|
36
|
+
let parsedStyleName = styleName;
|
|
37
|
+
if (characterId && characterId.includes(':')) {
|
|
38
|
+
const parts = characterId.split(':');
|
|
39
|
+
if (parts.length === 2) {
|
|
40
|
+
parsedCharacterId = parts[0];
|
|
41
|
+
// styleNameパラメータが明示されていない場合のみ、characterId文字列から抽出したstyleNameを使用
|
|
42
|
+
if (!styleName) {
|
|
43
|
+
parsedStyleName = parts[1];
|
|
44
|
+
logger.debug(` characterId文字列からパース: characterId="${parsedCharacterId}", styleName="${parsedStyleName}"`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
logger.warn(`characterId文字列にstyleNameが含まれていますが、styleNameパラメータが優先されます`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
throw new Error(`不正なcharacterId形式です: "${characterId}"\n` +
|
|
52
|
+
`使用可能な形式:\n` +
|
|
53
|
+
` - "characterId" (例: "alma")\n` +
|
|
54
|
+
` - "characterId:styleName" (例: "alma:のーまる")`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Issue #58: オペレータ未アサイン時の再アサイン促進メッセージ
|
|
58
|
+
// characterIdパラメータが指定されている場合はオペレータ不要
|
|
59
|
+
const currentOperator = await operatorManager.showCurrentOperator();
|
|
60
|
+
if (!currentOperator.characterId && !parsedCharacterId) {
|
|
61
|
+
// オペレータ未割り当て時に背景画像をクリア
|
|
62
|
+
if (terminalBackground) {
|
|
63
|
+
if (await terminalBackground.isEnabled()) {
|
|
64
|
+
await terminalBackground.clearBackground();
|
|
65
|
+
logger.info('オペレータ未割り当てのため背景画像をクリア');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 利用可能なオペレータを取得
|
|
69
|
+
let availableOperators = [];
|
|
70
|
+
try {
|
|
71
|
+
const result = await operatorManager.getAvailableOperators();
|
|
72
|
+
availableOperators = result.available;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
logger.warn(`Failed to get available operators: ${error.message}`);
|
|
76
|
+
}
|
|
77
|
+
let guidanceMessage = '⚠️ オペレータが割り当てられていません。\n\n';
|
|
78
|
+
guidanceMessage += '🔧 次の手順で進めてください:\n';
|
|
79
|
+
guidanceMessage += '1. operator_assign を実行(通常は引数なしで)\n';
|
|
80
|
+
guidanceMessage += '2. 再度 say コマンドで音声を生成\n\n';
|
|
81
|
+
if (availableOperators.length > 0) {
|
|
82
|
+
guidanceMessage += `🎭 利用可能なオペレータ: ${availableOperators.join(', ')}\n\n`;
|
|
83
|
+
guidanceMessage +=
|
|
84
|
+
"💡 operator_assign を引数なしで実行すると、ランダムに選択されます。";
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
guidanceMessage +=
|
|
88
|
+
'❌ 現在利用可能なオペレータがありません。しばらく待ってから再試行してください。';
|
|
89
|
+
}
|
|
90
|
+
guidanceMessage += '\n\n💡 または、characterId パラメータで直接キャラクターを指定することもできます。';
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: guidanceMessage,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Issue #58: 動的タイムアウト延長 - sayコマンド実行時にオペレータ予約を延長
|
|
101
|
+
// ベストエフォート非同期処理(エラーは無視、音声生成をブロックしない)
|
|
102
|
+
// オペレータがアサインされている場合のみ予約を延長
|
|
103
|
+
if (currentOperator.characterId) {
|
|
104
|
+
operatorManager
|
|
105
|
+
.refreshOperatorReservation()
|
|
106
|
+
.then(refreshSuccess => {
|
|
107
|
+
if (refreshSuccess) {
|
|
108
|
+
logger.info(`Operator reservation refreshed for: ${currentOperator.characterId}`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
logger.warn(`Could not refresh operator reservation for: ${currentOperator.characterId} - operator may have already expired`);
|
|
112
|
+
}
|
|
113
|
+
})
|
|
114
|
+
.catch(error => {
|
|
115
|
+
logger.error(`Operator reservation refresh failed: ${error.message} - operator timeout extension failed`);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// スタイル検証(事前チェック)
|
|
119
|
+
// parsedStyleNameとparsedCharacterIdを使用
|
|
120
|
+
if (parsedStyleName) {
|
|
121
|
+
try {
|
|
122
|
+
// characterIdが指定されている場合はそのキャラクターのスタイル、なければ現在のオペレータのスタイルを検証
|
|
123
|
+
const targetCharacterId = parsedCharacterId || currentOperator.characterId;
|
|
124
|
+
if (!targetCharacterId) {
|
|
125
|
+
throw new Error(`キャラクター情報が取得できません`);
|
|
126
|
+
}
|
|
127
|
+
const character = await characterInfoService.getCharacterInfo(targetCharacterId);
|
|
128
|
+
if (!character) {
|
|
129
|
+
throw new Error(`キャラクター '${targetCharacterId}' が見つかりません`);
|
|
130
|
+
}
|
|
131
|
+
// 利用可能なスタイルを取得
|
|
132
|
+
const availableStyles = Object.values(character.styles || {});
|
|
133
|
+
// 指定されたスタイルが存在するか確認
|
|
134
|
+
const styleExists = availableStyles.some(s => s.styleName === parsedStyleName);
|
|
135
|
+
if (!styleExists) {
|
|
136
|
+
const styleNames = availableStyles.map(s => s.styleName);
|
|
137
|
+
throw new Error(`指定されたスタイル '${parsedStyleName}' が ${character.speakerName || targetCharacterId} には存在しません。\n` +
|
|
138
|
+
`利用可能なスタイル: ${styleNames.join(', ')}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
logger.error(`スタイル検証エラー: ${error.message}`);
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 設定情報をログ出力
|
|
147
|
+
// NOTE: ConfigManagerはすでにsayCoeiroink内部で管理されているため、
|
|
148
|
+
// ここでは設定のログ出力をスキップ
|
|
149
|
+
logger.debug('Audio config is managed internally by SayCoeiroink');
|
|
150
|
+
logger.debug('==============================');
|
|
151
|
+
// 速度設定オプションを構築(CLIと同じ形式)
|
|
152
|
+
const speedOptions = {};
|
|
153
|
+
if (rate !== undefined) {
|
|
154
|
+
speedOptions.rate = rate;
|
|
155
|
+
}
|
|
156
|
+
if (factor !== undefined) {
|
|
157
|
+
speedOptions.factor = factor;
|
|
158
|
+
}
|
|
159
|
+
// MCP設計: 音声合成タスクをキューに投稿のみ(再生完了を待たない)
|
|
160
|
+
// - synthesize() はキューに追加して即座にレスポンス
|
|
161
|
+
// - 実際の音声合成・再生は背景のSpeechQueueで非同期処理
|
|
162
|
+
// - CLIとは異なり、MCPではウォームアップ・完了待機は実行しない
|
|
163
|
+
const result = sayCoeiroink.synthesize(speechText, {
|
|
164
|
+
voice: parsedCharacterId,
|
|
165
|
+
...speedOptions, // rateまたはfactorを展開
|
|
166
|
+
style: parsedStyleName,
|
|
167
|
+
allowFallback: false, // MCPツールではオペレータが必須
|
|
168
|
+
});
|
|
169
|
+
// 結果をログ出力
|
|
170
|
+
logger.debug(`Result: ${JSON.stringify(result)}`);
|
|
171
|
+
// オペレータまたはcharacterId指定の情報を取得
|
|
172
|
+
const voiceInfo = currentOperator.characterId
|
|
173
|
+
? `オペレータ: ${currentOperator.characterId}`
|
|
174
|
+
: `characterId指定: ${parsedCharacterId}${parsedStyleName ? `:${parsedStyleName}` : ''}`;
|
|
175
|
+
const modeInfo = `発声キューに追加 - ${voiceInfo}, タスクID: ${result.taskId}`;
|
|
176
|
+
logger.info(modeInfo);
|
|
177
|
+
logger.debug('=== SAY TOOL DEBUG END ===');
|
|
178
|
+
// 即座にレスポンスを返す(音声合成の完了を待たない)
|
|
179
|
+
// タスクIDとキュー長の情報も含める
|
|
180
|
+
const responseText = `音声合成を開始しました - ${voiceInfo}\n` +
|
|
181
|
+
`タスクID: ${result.taskId}\n` +
|
|
182
|
+
`キュー長: ${result.queueLength} 個`;
|
|
183
|
+
return {
|
|
184
|
+
content: [
|
|
185
|
+
{
|
|
186
|
+
type: 'text',
|
|
187
|
+
text: responseText,
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
logger.debug(`SAY TOOL ERROR: ${error.message}`);
|
|
194
|
+
logger.debug(`Stack trace: ${error.stack}`);
|
|
195
|
+
throw new Error(`音声出力エラー: ${error.message}`);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* parallel_generation_controlツールの登録
|
|
201
|
+
* チャンク並行生成機能の制御と設定管理
|
|
202
|
+
*/
|
|
203
|
+
// export function registerParallelGenerationControlTool(
|
|
204
|
+
// server: McpServer,
|
|
205
|
+
// sayCoeiroink: SayCoeiroink
|
|
206
|
+
// ): void {
|
|
207
|
+
// server.registerTool(
|
|
208
|
+
// 'parallel_generation_control',
|
|
209
|
+
// {
|
|
210
|
+
// description:
|
|
211
|
+
// 'チャンク並行生成機能の制御と設定管理を行います。生成の並行数、待機時間、先読み数、初回ポーズ機能などを調整できます。',
|
|
212
|
+
// inputSchema: {
|
|
213
|
+
// action: z
|
|
214
|
+
// .enum(['enable', 'disable', 'status', 'update_options'])
|
|
215
|
+
// .describe('実行するアクション'),
|
|
216
|
+
// options: z
|
|
217
|
+
// .object({
|
|
218
|
+
// maxConcurrency: z.number().min(1).max(5).optional().describe('最大並行生成数(1-5)'),
|
|
219
|
+
// delayBetweenRequests: z
|
|
220
|
+
// .number()
|
|
221
|
+
// .min(0)
|
|
222
|
+
// .max(1000)
|
|
223
|
+
// .optional()
|
|
224
|
+
// .describe('リクエスト間隔(ms、0-1000)'),
|
|
225
|
+
// bufferAheadCount: z.number().min(0).max(3).optional().describe('先読みチャンク数(0-3)'),
|
|
226
|
+
// pauseUntilFirstComplete: z
|
|
227
|
+
// .boolean()
|
|
228
|
+
// .optional()
|
|
229
|
+
// .describe('初回チャンク完了まで並行生成をポーズ(レイテンシ改善)'),
|
|
230
|
+
// })
|
|
231
|
+
// .optional()
|
|
232
|
+
// .describe('更新するオプション(action=update_optionsの場合)'),
|
|
233
|
+
// },
|
|
234
|
+
// },
|
|
235
|
+
// async args => {
|
|
236
|
+
// const { action, options } = args || {};
|
|
237
|
+
// try {
|
|
238
|
+
// switch (action) {
|
|
239
|
+
// case 'enable':
|
|
240
|
+
// sayCoeiroink.setParallelGenerationEnabled(true);
|
|
241
|
+
// return {
|
|
242
|
+
// content: [
|
|
243
|
+
// {
|
|
244
|
+
// type: 'text',
|
|
245
|
+
// text: '✅ 並行チャンク生成を有効化しました。\n\n⚡ 効果:\n- 複数チャンクの同時生成により高速化\n- レスポンシブな音声再生開始\n- 体感的なレイテンシ削減',
|
|
246
|
+
// },
|
|
247
|
+
// ],
|
|
248
|
+
// };
|
|
249
|
+
// case 'disable':
|
|
250
|
+
// sayCoeiroink.setParallelGenerationEnabled(false);
|
|
251
|
+
// return {
|
|
252
|
+
// content: [
|
|
253
|
+
// {
|
|
254
|
+
// type: 'text',
|
|
255
|
+
// text: '⏸️ 並行チャンク生成を無効化しました。\n\n🔄 従来の逐次生成モードに戻りました。\n- 安定性重視の動作\n- メモリ使用量削減',
|
|
256
|
+
// },
|
|
257
|
+
// ],
|
|
258
|
+
// };
|
|
259
|
+
// case 'status': {
|
|
260
|
+
// const currentOptions = sayCoeiroink.getStreamControllerOptions();
|
|
261
|
+
// const stats = sayCoeiroink.getGenerationStats();
|
|
262
|
+
// return {
|
|
263
|
+
// content: [
|
|
264
|
+
// {
|
|
265
|
+
// type: 'text',
|
|
266
|
+
// text:
|
|
267
|
+
// `📊 並行生成ステータス\n\n` +
|
|
268
|
+
// `🎛️ 設定:\n` +
|
|
269
|
+
// ` - 状態: ${currentOptions.maxConcurrency > 1 ? '✅ 並行生成' : '❌ 逐次生成'}\n` +
|
|
270
|
+
// ` - 最大並行数: ${currentOptions.maxConcurrency} ${currentOptions.maxConcurrency === 1 ? '(逐次モード)' : '(並行モード)'}\n` +
|
|
271
|
+
// ` - リクエスト間隔: ${currentOptions.delayBetweenRequests}ms\n` +
|
|
272
|
+
// ` - 先読み数: ${currentOptions.bufferAheadCount}\n` +
|
|
273
|
+
// ` - 初回ポーズ: ${currentOptions.pauseUntilFirstComplete ? '✅ 有効' : '❌ 無効'}\n\n` +
|
|
274
|
+
// `📈 現在の統計:\n` +
|
|
275
|
+
// ` - アクティブタスク: ${stats.activeTasks}\n` +
|
|
276
|
+
// ` - 完了済み結果: ${stats.completedResults}\n` +
|
|
277
|
+
// ` - メモリ使用量: ${(stats.totalMemoryUsage / 1024).toFixed(1)}KB`,
|
|
278
|
+
// },
|
|
279
|
+
// ],
|
|
280
|
+
// };
|
|
281
|
+
// }
|
|
282
|
+
// case 'update_options':
|
|
283
|
+
// if (options) {
|
|
284
|
+
// sayCoeiroink.updateStreamControllerOptions(options);
|
|
285
|
+
// const updatedOptions = sayCoeiroink.getStreamControllerOptions();
|
|
286
|
+
// return {
|
|
287
|
+
// content: [
|
|
288
|
+
// {
|
|
289
|
+
// type: 'text',
|
|
290
|
+
// text:
|
|
291
|
+
// `⚙️ オプション更新完了\n\n` +
|
|
292
|
+
// `🔧 新しい設定:\n` +
|
|
293
|
+
// ` - 最大並行数: ${updatedOptions.maxConcurrency} ${updatedOptions.maxConcurrency === 1 ? '(逐次モード)' : '(並行モード)'}\n` +
|
|
294
|
+
// ` - リクエスト間隔: ${updatedOptions.delayBetweenRequests}ms\n` +
|
|
295
|
+
// ` - 先読み数: ${updatedOptions.bufferAheadCount}\n` +
|
|
296
|
+
// ` - 初回ポーズ: ${updatedOptions.pauseUntilFirstComplete ? '✅ 有効' : '❌ 無効'}\n\n` +
|
|
297
|
+
// `💡 次回の音声合成から適用されます。`,
|
|
298
|
+
// },
|
|
299
|
+
// ],
|
|
300
|
+
// };
|
|
301
|
+
// } else {
|
|
302
|
+
// throw new Error('update_optionsアクションにはoptionsパラメータが必要です');
|
|
303
|
+
// }
|
|
304
|
+
// default:
|
|
305
|
+
// throw new Error(`無効なアクション: ${action}`);
|
|
306
|
+
// }
|
|
307
|
+
// } catch (error) {
|
|
308
|
+
// throw new Error(`並行生成制御エラー: ${(error as Error).message}`);
|
|
309
|
+
// }
|
|
310
|
+
// }
|
|
311
|
+
// );
|
|
312
|
+
// }
|
|
313
|
+
//# sourceMappingURL=speech.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech.js","sourceRoot":"","sources":["../../src/tools/speech.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server共通型定義
|
|
3
|
+
*/
|
|
4
|
+
export interface StyleInfo {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
personality: string;
|
|
8
|
+
speakingStyle: string;
|
|
9
|
+
morasPerSecond?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface AssignResult {
|
|
12
|
+
characterId: string;
|
|
13
|
+
characterName: string;
|
|
14
|
+
currentStyle?: {
|
|
15
|
+
styleId: string;
|
|
16
|
+
styleName: string;
|
|
17
|
+
personality: string;
|
|
18
|
+
speakingStyle: string;
|
|
19
|
+
};
|
|
20
|
+
greeting?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ToolResponse {
|
|
23
|
+
content: Array<{
|
|
24
|
+
type: 'text';
|
|
25
|
+
text: string;
|
|
26
|
+
}>;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server共通ユーティリティ関数
|
|
3
|
+
*/
|
|
4
|
+
import type { Character, OperatorManager, CharacterInfoService } from '@coeiro-operator/core';
|
|
5
|
+
import type { StyleInfo, AssignResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* オペレータ入力のバリデーション
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateOperatorInput(operator?: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* オペレータのアサイン
|
|
12
|
+
*/
|
|
13
|
+
export declare function assignOperator(manager: OperatorManager, operator?: string, style?: string): Promise<AssignResult>;
|
|
14
|
+
/**
|
|
15
|
+
* キャラクターからスタイル情報を抽出
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractStyleInfo(character: Character): StyleInfo[];
|
|
18
|
+
/**
|
|
19
|
+
* アサイン結果をフォーマット
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatAssignmentResult(assignResult: AssignResult, availableStyles: StyleInfo[]): string;
|
|
22
|
+
/**
|
|
23
|
+
* ターゲットキャラクターを取得
|
|
24
|
+
*/
|
|
25
|
+
export declare function getTargetCharacter(manager: OperatorManager, characterInfoService: CharacterInfoService, characterId?: string): Promise<{
|
|
26
|
+
character: Character;
|
|
27
|
+
characterId: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* スタイル結果をフォーマット
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatStylesResult(character: Character, availableStyles: StyleInfo[]): string;
|
|
33
|
+
//# sourceMappingURL=utils.d.ts.map
|