@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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +430 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +72 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/services/fishAudioSDK.d.ts +29 -0
  8. package/dist/services/fishAudioSDK.d.ts.map +1 -0
  9. package/dist/services/fishAudioSDK.js +185 -0
  10. package/dist/services/fishAudioSDK.js.map +1 -0
  11. package/dist/tools/listReferences.d.ts +22 -0
  12. package/dist/tools/listReferences.d.ts.map +1 -0
  13. package/dist/tools/listReferences.js +40 -0
  14. package/dist/tools/listReferences.js.map +1 -0
  15. package/dist/tools/tts.d.ts +100 -0
  16. package/dist/tools/tts.d.ts.map +1 -0
  17. package/dist/tools/tts.js +328 -0
  18. package/dist/tools/tts.js.map +1 -0
  19. package/dist/types/index.d.ts +98 -0
  20. package/dist/types/index.d.ts.map +1 -0
  21. package/dist/types/index.js +20 -0
  22. package/dist/types/index.js.map +1 -0
  23. package/dist/utils/audioPlayer.d.ts +3 -0
  24. package/dist/utils/audioPlayer.d.ts.map +1 -0
  25. package/dist/utils/audioPlayer.js +35 -0
  26. package/dist/utils/audioPlayer.js.map +1 -0
  27. package/dist/utils/config.d.ts +4 -0
  28. package/dist/utils/config.d.ts.map +1 -0
  29. package/dist/utils/config.js +119 -0
  30. package/dist/utils/config.js.map +1 -0
  31. package/dist/utils/logger.d.ts +11 -0
  32. package/dist/utils/logger.d.ts.map +1 -0
  33. package/dist/utils/logger.js +27 -0
  34. package/dist/utils/logger.js.map +1 -0
  35. package/dist/utils/realTimePlayer.d.ts +13 -0
  36. package/dist/utils/realTimePlayer.d.ts.map +1 -0
  37. package/dist/utils/realTimePlayer.js +92 -0
  38. package/dist/utils/realTimePlayer.js.map +1 -0
  39. package/dist/utils/referenceSelector.d.ts +35 -0
  40. package/dist/utils/referenceSelector.d.ts.map +1 -0
  41. package/dist/utils/referenceSelector.js +72 -0
  42. package/dist/utils/referenceSelector.js.map +1 -0
  43. 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"}