@zhoujinandrew/fish-audio-mcp-server 0.7.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/LICENSE +21 -0
- package/README.md +430 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/services/fishAudioSDK.d.ts +29 -0
- package/dist/services/fishAudioSDK.d.ts.map +1 -0
- package/dist/services/fishAudioSDK.js +185 -0
- package/dist/services/fishAudioSDK.js.map +1 -0
- package/dist/tools/listReferences.d.ts +22 -0
- package/dist/tools/listReferences.d.ts.map +1 -0
- package/dist/tools/listReferences.js +40 -0
- package/dist/tools/listReferences.js.map +1 -0
- package/dist/tools/tts.d.ts +100 -0
- package/dist/tools/tts.d.ts.map +1 -0
- package/dist/tools/tts.js +328 -0
- package/dist/tools/tts.js.map +1 -0
- package/dist/types/index.d.ts +98 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +20 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/audioPlayer.d.ts +3 -0
- package/dist/utils/audioPlayer.d.ts.map +1 -0
- package/dist/utils/audioPlayer.js +35 -0
- package/dist/utils/audioPlayer.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +119 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/realTimePlayer.d.ts +13 -0
- package/dist/utils/realTimePlayer.d.ts.map +1 -0
- package/dist/utils/realTimePlayer.js +92 -0
- package/dist/utils/realTimePlayer.js.map +1 -0
- package/dist/utils/referenceSelector.d.ts +35 -0
- package/dist/utils/referenceSelector.d.ts.map +1 -0
- package/dist/utils/referenceSelector.js +72 -0
- package/dist/utils/referenceSelector.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Session, WebSocketSession, TTSRequest } from 'fish-audio-sdk';
|
|
2
|
+
import { FishAudioError, ErrorCode } from '../types/index.js';
|
|
3
|
+
import { loadConfig } from '../utils/config.js';
|
|
4
|
+
import { createWriteStream } from 'fs';
|
|
5
|
+
/**
|
|
6
|
+
* Extended TTSRequest that adds temperature support on top of the SDK's native prosody support.
|
|
7
|
+
*/
|
|
8
|
+
class ExtendedTTSRequest extends TTSRequest {
|
|
9
|
+
_temperature;
|
|
10
|
+
constructor(text, options = {}) {
|
|
11
|
+
const { temperature, ...sdkOptions } = options;
|
|
12
|
+
super(text, sdkOptions);
|
|
13
|
+
this._temperature = temperature;
|
|
14
|
+
}
|
|
15
|
+
toJSON() {
|
|
16
|
+
return {
|
|
17
|
+
...super.toJSON(),
|
|
18
|
+
...(this._temperature !== undefined && { temperature: this._temperature }),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class FishAudioSDKService {
|
|
23
|
+
apiKey;
|
|
24
|
+
modelId;
|
|
25
|
+
constructor() {
|
|
26
|
+
const config = loadConfig();
|
|
27
|
+
this.apiKey = config.apiKey;
|
|
28
|
+
this.modelId = config.modelId;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate speech using standard HTTP API
|
|
32
|
+
*/
|
|
33
|
+
async generateSpeech(params) {
|
|
34
|
+
try {
|
|
35
|
+
const session = new Session(this.apiKey);
|
|
36
|
+
const chunks = [];
|
|
37
|
+
const request = new ExtendedTTSRequest(params.text, {
|
|
38
|
+
referenceId: params.referenceId,
|
|
39
|
+
format: params.format || 'mp3',
|
|
40
|
+
mp3Bitrate: params.mp3Bitrate,
|
|
41
|
+
normalize: params.normalize !== false,
|
|
42
|
+
latency: params.latency || 'balanced',
|
|
43
|
+
...(params.speed !== undefined || params.volume !== undefined ? {
|
|
44
|
+
prosody: {
|
|
45
|
+
speed: params.speed ?? 1,
|
|
46
|
+
volume: params.volume ?? 0,
|
|
47
|
+
}
|
|
48
|
+
} : {}),
|
|
49
|
+
temperature: params.temperature,
|
|
50
|
+
});
|
|
51
|
+
// Use the specified model
|
|
52
|
+
const headers = { model: this.modelId };
|
|
53
|
+
for await (const chunk of session.tts(request, headers)) {
|
|
54
|
+
chunks.push(Buffer.from(chunk));
|
|
55
|
+
}
|
|
56
|
+
const audioBuffer = Buffer.concat(chunks);
|
|
57
|
+
return {
|
|
58
|
+
audio: audioBuffer,
|
|
59
|
+
format: params.format || 'mp3'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw this.handleError(error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate speech with streaming to file
|
|
68
|
+
*/
|
|
69
|
+
async generateSpeechStream(params, outputPath) {
|
|
70
|
+
try {
|
|
71
|
+
const session = new Session(this.apiKey);
|
|
72
|
+
const writeStream = createWriteStream(outputPath);
|
|
73
|
+
let totalBytes = 0;
|
|
74
|
+
const request = new ExtendedTTSRequest(params.text, {
|
|
75
|
+
referenceId: params.referenceId,
|
|
76
|
+
format: params.format || 'mp3',
|
|
77
|
+
mp3Bitrate: params.mp3Bitrate,
|
|
78
|
+
normalize: params.normalize !== false,
|
|
79
|
+
latency: params.latency || 'balanced',
|
|
80
|
+
...(params.speed !== undefined || params.volume !== undefined ? {
|
|
81
|
+
prosody: {
|
|
82
|
+
speed: params.speed ?? 1,
|
|
83
|
+
volume: params.volume ?? 0,
|
|
84
|
+
}
|
|
85
|
+
} : {}),
|
|
86
|
+
temperature: params.temperature,
|
|
87
|
+
});
|
|
88
|
+
const headers = { model: this.modelId };
|
|
89
|
+
for await (const chunk of session.tts(request, headers)) {
|
|
90
|
+
const buffer = Buffer.from(chunk);
|
|
91
|
+
totalBytes += buffer.length;
|
|
92
|
+
writeStream.write(buffer);
|
|
93
|
+
}
|
|
94
|
+
writeStream.end();
|
|
95
|
+
return totalBytes;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw this.handleError(error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Generate speech using WebSocket for real-time streaming
|
|
103
|
+
*/
|
|
104
|
+
async *generateSpeechWebSocket(params, textChunks) {
|
|
105
|
+
try {
|
|
106
|
+
const ws = new WebSocketSession(this.apiKey);
|
|
107
|
+
const request = new ExtendedTTSRequest('', {
|
|
108
|
+
referenceId: params.referenceId,
|
|
109
|
+
format: params.format || 'opus', // Opus is better for streaming
|
|
110
|
+
mp3Bitrate: params.mp3Bitrate,
|
|
111
|
+
normalize: params.normalize !== false,
|
|
112
|
+
latency: params.latency || 'balanced',
|
|
113
|
+
...(params.speed !== undefined || params.volume !== undefined ? {
|
|
114
|
+
prosody: {
|
|
115
|
+
speed: params.speed ?? 1,
|
|
116
|
+
volume: params.volume ?? 0,
|
|
117
|
+
}
|
|
118
|
+
} : {}),
|
|
119
|
+
temperature: params.temperature,
|
|
120
|
+
});
|
|
121
|
+
const headers = { model: this.modelId };
|
|
122
|
+
// Convert array to async generator if needed
|
|
123
|
+
const textGenerator = Array.isArray(textChunks)
|
|
124
|
+
? this.arrayToAsyncGenerator(textChunks)
|
|
125
|
+
: textChunks;
|
|
126
|
+
for await (const audioChunk of ws.tts(request, textGenerator)) {
|
|
127
|
+
yield Buffer.from(audioChunk);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw this.handleError(error);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Stream speech to a writable stream (for real-time playback)
|
|
136
|
+
*/
|
|
137
|
+
async streamToPlayer(params, textChunks, playerStream) {
|
|
138
|
+
try {
|
|
139
|
+
let totalBytes = 0;
|
|
140
|
+
const audioStream = this.generateSpeechWebSocket(params, textChunks);
|
|
141
|
+
for await (const chunk of audioStream) {
|
|
142
|
+
totalBytes += chunk.length;
|
|
143
|
+
playerStream.write(chunk);
|
|
144
|
+
}
|
|
145
|
+
playerStream.end();
|
|
146
|
+
return totalBytes;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw this.handleError(error);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Helper to convert array to async generator
|
|
154
|
+
*/
|
|
155
|
+
async *arrayToAsyncGenerator(array) {
|
|
156
|
+
for (const item of array) {
|
|
157
|
+
yield item;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
handleError(error) {
|
|
161
|
+
if (error?.response) {
|
|
162
|
+
const status = error.response.status;
|
|
163
|
+
const data = error.response.data;
|
|
164
|
+
switch (status) {
|
|
165
|
+
case 401:
|
|
166
|
+
return new FishAudioError('Invalid API key', ErrorCode.INVALID_API_KEY, data);
|
|
167
|
+
case 400:
|
|
168
|
+
return new FishAudioError('Invalid request parameters', ErrorCode.INVALID_PARAMS, data);
|
|
169
|
+
case 429:
|
|
170
|
+
return new FishAudioError('API quota exceeded', ErrorCode.QUOTA_EXCEEDED, data);
|
|
171
|
+
case 500:
|
|
172
|
+
case 502:
|
|
173
|
+
case 503:
|
|
174
|
+
return new FishAudioError('Fish Audio server error', ErrorCode.SERVER_ERROR, data);
|
|
175
|
+
default:
|
|
176
|
+
return new FishAudioError(`API error: ${status}`, ErrorCode.UNKNOWN_ERROR, data);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (error?.code === 'ECONNREFUSED' || error?.code === 'ENOTFOUND') {
|
|
180
|
+
return new FishAudioError('Network error: Unable to reach Fish Audio API', ErrorCode.NETWORK_ERROR, { message: error.message });
|
|
181
|
+
}
|
|
182
|
+
return new FishAudioError(error?.message || 'Unknown error occurred', ErrorCode.UNKNOWN_ERROR, { message: error?.message });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=fishAudioSDK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fishAudioSDK.js","sourceRoot":"","sources":["../../src/services/fishAudioSDK.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface ListReferencesResponse {
|
|
2
|
+
success: boolean;
|
|
3
|
+
references?: Array<{
|
|
4
|
+
id: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
tags?: string[];
|
|
7
|
+
isDefault?: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
defaultReference?: string;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class ListReferencesTool {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: "object";
|
|
17
|
+
properties: {};
|
|
18
|
+
};
|
|
19
|
+
run(): Promise<ListReferencesResponse>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=listReferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listReferences.d.ts","sourceRoot":"","sources":["../../src/tools/listReferences.ts"],"names":[],"mappings":"AAGA,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,IAAI,SAAgC;IACpC,WAAW,SAA0C;IAErD,WAAW;;;MAGT;IAEI,GAAG,IAAI,OAAO,CAAC,sBAAsB,CAAC;CA+B7C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { loadConfig } from '../utils/config.js';
|
|
2
|
+
import { ReferenceSelector } from '../utils/referenceSelector.js';
|
|
3
|
+
export class ListReferencesTool {
|
|
4
|
+
name = 'fish_audio_list_references';
|
|
5
|
+
description = 'List all configured voice references';
|
|
6
|
+
inputSchema = {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {}
|
|
9
|
+
};
|
|
10
|
+
async run() {
|
|
11
|
+
try {
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
if (!config.references || config.references.length === 0) {
|
|
14
|
+
return {
|
|
15
|
+
success: true,
|
|
16
|
+
references: [],
|
|
17
|
+
defaultReference: config.defaultReference || config.referenceId,
|
|
18
|
+
error: 'No references configured. Using single reference mode.'
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const selector = new ReferenceSelector(config.references, config.defaultReference);
|
|
22
|
+
const references = selector.getAllReferences();
|
|
23
|
+
return {
|
|
24
|
+
success: true,
|
|
25
|
+
references: references.map(ref => ({
|
|
26
|
+
...ref,
|
|
27
|
+
isDefault: ref.id === config.defaultReference
|
|
28
|
+
})),
|
|
29
|
+
defaultReference: config.defaultReference
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: error instanceof Error ? error.message : 'Unknown error occurred'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=listReferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listReferences.js","sourceRoot":"","sources":["../../src/tools/listReferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAclE,MAAM,OAAO,kBAAkB;IAC7B,IAAI,GAAG,4BAA4B,CAAC;IACpC,WAAW,GAAG,sCAAsC,CAAC;IAErD,WAAW,GAAG;QACZ,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,EAAE;oBACd,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,WAAW;oBAC/D,KAAK,EAAE,wDAAwD;iBAChE,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACnF,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAE/C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACjC,GAAG,GAAG;oBACN,SAAS,EAAE,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC,gBAAgB;iBAC9C,CAAC,CAAC;gBACH,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;aAC1C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;aACzE,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { TTSToolParams, TTSToolResponse } from '../types/index.js';
|
|
2
|
+
export declare class TTSTool {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object";
|
|
7
|
+
properties: {
|
|
8
|
+
text: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
maxLength: number;
|
|
12
|
+
};
|
|
13
|
+
reference_id: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
reference_name: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
reference_tag: {
|
|
22
|
+
type: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
streaming: {
|
|
26
|
+
type: string;
|
|
27
|
+
description: string;
|
|
28
|
+
default: boolean;
|
|
29
|
+
};
|
|
30
|
+
websocket_streaming: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
default: boolean;
|
|
34
|
+
};
|
|
35
|
+
realtime_play: {
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
default: boolean;
|
|
39
|
+
};
|
|
40
|
+
format: {
|
|
41
|
+
type: string;
|
|
42
|
+
enum: string[];
|
|
43
|
+
description: string;
|
|
44
|
+
default: string;
|
|
45
|
+
};
|
|
46
|
+
mp3_bitrate: {
|
|
47
|
+
type: string;
|
|
48
|
+
enum: number[];
|
|
49
|
+
description: string;
|
|
50
|
+
default: number;
|
|
51
|
+
};
|
|
52
|
+
normalize: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
default: boolean;
|
|
56
|
+
};
|
|
57
|
+
latency: {
|
|
58
|
+
type: string;
|
|
59
|
+
enum: string[];
|
|
60
|
+
description: string;
|
|
61
|
+
default: string;
|
|
62
|
+
};
|
|
63
|
+
output_path: {
|
|
64
|
+
type: string;
|
|
65
|
+
description: string;
|
|
66
|
+
};
|
|
67
|
+
auto_play: {
|
|
68
|
+
type: string;
|
|
69
|
+
description: string;
|
|
70
|
+
default: boolean;
|
|
71
|
+
};
|
|
72
|
+
speed: {
|
|
73
|
+
type: string;
|
|
74
|
+
description: string;
|
|
75
|
+
minimum: number;
|
|
76
|
+
maximum: number;
|
|
77
|
+
default: number;
|
|
78
|
+
};
|
|
79
|
+
volume: {
|
|
80
|
+
type: string;
|
|
81
|
+
description: string;
|
|
82
|
+
default: number;
|
|
83
|
+
};
|
|
84
|
+
temperature: {
|
|
85
|
+
type: string;
|
|
86
|
+
description: string;
|
|
87
|
+
minimum: number;
|
|
88
|
+
maximum: number;
|
|
89
|
+
default: number;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
required: string[];
|
|
93
|
+
};
|
|
94
|
+
private service;
|
|
95
|
+
constructor();
|
|
96
|
+
run(input: TTSToolParams): Promise<TTSToolResponse>;
|
|
97
|
+
private handleWebSocketStreaming;
|
|
98
|
+
private splitTextIntoChunks;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=tts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../src/tools/tts.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,eAAe,EAMhB,MAAM,mBAAmB,CAAC;AAQ3B,qBAAa,OAAO;IAClB,IAAI,SAAoB;IACxB,WAAW,SAAwD;IAEnE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwFT;IAEF,OAAO,CAAC,OAAO,CAAsB;;IAM/B,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;YA6I3C,wBAAwB;IAyFtC,OAAO,CAAC,mBAAmB;CAoB5B"}
|