@speech-sdk/core 0.2.0 → 0.4.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 +76 -0
- package/dist/__tests__/e2e/_collect-stream.d.ts +2 -0
- package/dist/__tests__/e2e/_collect-stream.d.ts.map +1 -0
- package/dist/__tests__/e2e/_collect-stream.js +22 -0
- package/dist/__tests__/e2e/_collect-stream.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/cartesia/index.d.ts +17 -9
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +39 -9
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts +14 -4
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +30 -4
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/index.d.ts +22 -17
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +57 -31
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts +13 -20
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +14 -21
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts +15 -5
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +38 -5
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/google/index.d.ts +16 -8
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +68 -8
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/hume/index.d.ts +16 -8
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +37 -8
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts +16 -4
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +83 -4
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/index.d.ts +16 -8
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +31 -8
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts +19 -13
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +39 -13
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/index.d.ts +14 -4
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +28 -4
- package/dist/providers/resemble/index.js.map +1 -1
- package/dist/providers/unreal-speech/index.d.ts +14 -4
- package/dist/providers/unreal-speech/index.d.ts.map +1 -1
- package/dist/providers/unreal-speech/index.js +29 -4
- package/dist/providers/unreal-speech/index.js.map +1 -1
- package/dist/providers/xai/index.d.ts +52 -0
- package/dist/providers/xai/index.d.ts.map +1 -0
- package/dist/providers/xai/index.js +136 -0
- package/dist/providers/xai/index.js.map +1 -0
- package/dist/resolve-provider.d.ts.map +1 -1
- package/dist/resolve-provider.js +3 -0
- package/dist/resolve-provider.js.map +1 -1
- package/dist/speech-provider.d.ts +37 -6
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-provider.js +23 -1
- package/dist/speech-provider.js.map +1 -1
- package/dist/sse-stream.d.ts +10 -0
- package/dist/sse-stream.d.ts.map +1 -0
- package/dist/sse-stream.js +101 -0
- package/dist/sse-stream.js.map +1 -0
- package/dist/stream-speech-result.d.ts +7 -0
- package/dist/stream-speech-result.d.ts.map +1 -0
- package/dist/stream-speech-result.js +2 -0
- package/dist/stream-speech-result.js.map +1 -0
- package/dist/stream-speech.d.ts +12 -0
- package/dist/stream-speech.d.ts.map +1 -0
- package/dist/stream-speech.js +63 -0
- package/dist/stream-speech.js.map +1 -0
- package/package.json +5 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { stripAudioTags } from "../../audio-tags.js";
|
|
2
2
|
import { SpeechSDKError } from "../../errors.js";
|
|
3
3
|
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
4
|
+
import { hasFeature, } from "../../speech-provider.js";
|
|
4
5
|
export class ElevenLabsSpeechProvider {
|
|
5
6
|
id = "elevenlabs";
|
|
6
7
|
defaultModel = "eleven_multilingual_v2";
|
|
@@ -120,35 +121,27 @@ export class ElevenLabsSpeechProvider {
|
|
|
120
121
|
models = [
|
|
121
122
|
{
|
|
122
123
|
id: "eleven_v3",
|
|
123
|
-
audioTags: true,
|
|
124
|
-
languages: ElevenLabsSpeechProvider.V3_LANGUAGES,
|
|
125
124
|
releaseDate: "2025-06-08",
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
languages: ElevenLabsSpeechProvider.V3_LANGUAGES,
|
|
126
|
+
features: ["streaming", "audio-tags"],
|
|
128
127
|
},
|
|
129
128
|
{
|
|
130
129
|
id: "eleven_multilingual_v2",
|
|
131
|
-
audioTags: false,
|
|
132
|
-
languages: ElevenLabsSpeechProvider.V2_LANGUAGES,
|
|
133
130
|
releaseDate: "2023-08-22",
|
|
134
|
-
|
|
135
|
-
|
|
131
|
+
languages: ElevenLabsSpeechProvider.V2_LANGUAGES,
|
|
132
|
+
features: ["streaming"],
|
|
136
133
|
},
|
|
137
134
|
{
|
|
138
135
|
id: "eleven_flash_v2_5",
|
|
139
|
-
audioTags: false,
|
|
140
|
-
languages: ElevenLabsSpeechProvider.FLASH_V2_5_LANGUAGES,
|
|
141
136
|
releaseDate: "2024-12-01",
|
|
142
|
-
|
|
143
|
-
|
|
137
|
+
languages: ElevenLabsSpeechProvider.FLASH_V2_5_LANGUAGES,
|
|
138
|
+
features: ["streaming"],
|
|
144
139
|
},
|
|
145
140
|
{
|
|
146
141
|
id: "eleven_flash_v2",
|
|
147
|
-
audioTags: false,
|
|
148
|
-
languages: ["en"],
|
|
149
142
|
releaseDate: "2024-12-01",
|
|
150
|
-
|
|
151
|
-
|
|
143
|
+
languages: ["en"],
|
|
144
|
+
features: ["streaming"],
|
|
152
145
|
},
|
|
153
146
|
];
|
|
154
147
|
apiKey;
|
|
@@ -159,22 +152,13 @@ export class ElevenLabsSpeechProvider {
|
|
|
159
152
|
this.baseURL = config.baseURL ?? "https://api.elevenlabs.io";
|
|
160
153
|
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
161
154
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
return stripAudioTags(text, `elevenlabs/${modelId}`);
|
|
167
|
-
}
|
|
168
|
-
async generate(options) {
|
|
169
|
-
if (!options.voice) {
|
|
170
|
-
throw new SpeechSDKError("ElevenLabs requires a voice ID. Pass it via the voice option.");
|
|
171
|
-
}
|
|
172
|
-
const providerOptions = options.providerOptions ?? {};
|
|
173
|
-
const { output_format, enable_logging, optimize_streaming_latency, ...bodyOptions } = providerOptions;
|
|
155
|
+
buildRequest(text, modelId, providerOptions) {
|
|
156
|
+
const opts = providerOptions ?? {};
|
|
157
|
+
const { output_format, enable_logging, optimize_streaming_latency, ...bodyOptions } = opts;
|
|
174
158
|
const body = {
|
|
175
159
|
...bodyOptions,
|
|
176
|
-
text
|
|
177
|
-
model_id:
|
|
160
|
+
text,
|
|
161
|
+
model_id: modelId,
|
|
178
162
|
};
|
|
179
163
|
const queryParams = new URLSearchParams();
|
|
180
164
|
if (output_format != null) {
|
|
@@ -186,8 +170,20 @@ export class ElevenLabsSpeechProvider {
|
|
|
186
170
|
if (optimize_streaming_latency != null) {
|
|
187
171
|
queryParams.set("optimize_streaming_latency", String(optimize_streaming_latency));
|
|
188
172
|
}
|
|
173
|
+
return { body, queryString: queryParams.toString() };
|
|
174
|
+
}
|
|
175
|
+
processAudioTags(text, modelId) {
|
|
176
|
+
if (this.models.some((m) => m.id === modelId && hasFeature(m, "audio-tags"))) {
|
|
177
|
+
return { text, warnings: [] };
|
|
178
|
+
}
|
|
179
|
+
return stripAudioTags(text, `elevenlabs/${modelId}`);
|
|
180
|
+
}
|
|
181
|
+
async generate(options) {
|
|
182
|
+
if (!options.voice) {
|
|
183
|
+
throw new SpeechSDKError("ElevenLabs requires a voice ID. Pass it via the voice option.");
|
|
184
|
+
}
|
|
185
|
+
const { body, queryString } = this.buildRequest(options.text, options.modelId, options.providerOptions);
|
|
189
186
|
let url = `${this.baseURL}/v1/text-to-speech/${options.voice}`;
|
|
190
|
-
const queryString = queryParams.toString();
|
|
191
187
|
if (queryString) {
|
|
192
188
|
url += `?${queryString}`;
|
|
193
189
|
}
|
|
@@ -211,6 +207,36 @@ export class ElevenLabsSpeechProvider {
|
|
|
211
207
|
providerMetadata: requestId ? { requestId } : undefined,
|
|
212
208
|
};
|
|
213
209
|
}
|
|
210
|
+
async stream(options) {
|
|
211
|
+
if (!options.voice) {
|
|
212
|
+
throw new SpeechSDKError("ElevenLabs requires a voice ID. Pass it via the voice option.");
|
|
213
|
+
}
|
|
214
|
+
const { body, queryString } = this.buildRequest(options.text, options.modelId, options.providerOptions);
|
|
215
|
+
let url = `${this.baseURL}/v1/text-to-speech/${options.voice}/stream`;
|
|
216
|
+
if (queryString) {
|
|
217
|
+
url += `?${queryString}`;
|
|
218
|
+
}
|
|
219
|
+
const response = await this.fetchFn(url, {
|
|
220
|
+
method: "POST",
|
|
221
|
+
headers: {
|
|
222
|
+
"Content-Type": "application/json",
|
|
223
|
+
"xi-api-key": resolveApiKey(this.apiKey, "ELEVENLABS_API_KEY", "ElevenLabs"),
|
|
224
|
+
...options.headers,
|
|
225
|
+
},
|
|
226
|
+
body: JSON.stringify(body),
|
|
227
|
+
signal: options.abortSignal,
|
|
228
|
+
});
|
|
229
|
+
await handleErrorResponse(response, `elevenlabs/${options.modelId}`);
|
|
230
|
+
if (!response.body) {
|
|
231
|
+
throw new Error(`elevenlabs/${options.modelId}: response has no body`);
|
|
232
|
+
}
|
|
233
|
+
const requestId = response.headers.get("request-id");
|
|
234
|
+
return {
|
|
235
|
+
stream: response.body,
|
|
236
|
+
mediaType: response.headers.get("content-type") ?? "audio/mpeg",
|
|
237
|
+
providerMetadata: requestId ? { requestId } : undefined,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
214
240
|
}
|
|
215
241
|
export function createElevenLabs(config = {}) {
|
|
216
242
|
const provider = new ElevenLabsSpeechProvider(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/elevenlabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/elevenlabs/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,39 +11,29 @@ export declare class FalSpeechProvider implements SpeechProvider<string, string
|
|
|
11
11
|
readonly defaultModel = "";
|
|
12
12
|
readonly models: readonly [{
|
|
13
13
|
readonly id: "f5-tts";
|
|
14
|
-
readonly audioTags: false;
|
|
15
|
-
readonly languages: readonly ["en", "zh", "fr", "it", "hi", "ja", "ru", "es", "fi"];
|
|
16
14
|
readonly releaseDate: "2024-10-08";
|
|
17
|
-
readonly
|
|
18
|
-
readonly
|
|
15
|
+
readonly languages: readonly ["en", "zh", "fr", "it", "hi", "ja", "ru", "es", "fi"];
|
|
16
|
+
readonly features: readonly ["open-source", "inline-voice-cloning"];
|
|
19
17
|
}, {
|
|
20
18
|
readonly id: "kokoro";
|
|
21
|
-
readonly audioTags: false;
|
|
22
|
-
readonly languages: readonly ["en", "fr", "ko", "ja", "zh"];
|
|
23
19
|
readonly releaseDate: "2025-01-27";
|
|
24
|
-
readonly
|
|
25
|
-
readonly
|
|
20
|
+
readonly languages: readonly ["en", "fr", "ko", "ja", "zh"];
|
|
21
|
+
readonly features: readonly ["open-source"];
|
|
26
22
|
}, {
|
|
27
23
|
readonly id: "dia-tts";
|
|
28
|
-
readonly audioTags: false;
|
|
29
|
-
readonly languages: readonly ["en"];
|
|
30
24
|
readonly releaseDate: "2025-04-21";
|
|
31
|
-
readonly
|
|
32
|
-
readonly
|
|
25
|
+
readonly languages: readonly ["en"];
|
|
26
|
+
readonly features: readonly ["open-source", "inline-voice-cloning"];
|
|
33
27
|
}, {
|
|
34
28
|
readonly id: "orpheus-tts";
|
|
35
|
-
readonly audioTags: false;
|
|
36
|
-
readonly languages: readonly ["en", "es", "fr", "de", "it", "pt", "zh"];
|
|
37
29
|
readonly releaseDate: "2025-03-18";
|
|
38
|
-
readonly
|
|
39
|
-
readonly
|
|
30
|
+
readonly languages: readonly ["en", "es", "fr", "de", "it", "pt", "zh"];
|
|
31
|
+
readonly features: readonly ["open-source"];
|
|
40
32
|
}, {
|
|
41
33
|
readonly id: "index-tts-2";
|
|
42
|
-
readonly audioTags: false;
|
|
43
|
-
readonly languages: readonly ["en", "zh"];
|
|
44
34
|
readonly releaseDate: "2025-09-08";
|
|
45
|
-
readonly
|
|
46
|
-
readonly
|
|
35
|
+
readonly languages: readonly ["en", "zh"];
|
|
36
|
+
readonly features: readonly ["open-source", "inline-voice-cloning"];
|
|
47
37
|
}];
|
|
48
38
|
private readonly apiKey;
|
|
49
39
|
private readonly baseURL;
|
|
@@ -63,6 +53,9 @@ export declare class FalSpeechProvider implements SpeechProvider<string, string
|
|
|
63
53
|
mediaType: string;
|
|
64
54
|
providerMetadata?: Record<string, unknown>;
|
|
65
55
|
}>;
|
|
56
|
+
stream(options: {
|
|
57
|
+
modelId: string;
|
|
58
|
+
}): Promise<never>;
|
|
66
59
|
}
|
|
67
60
|
export declare function createFal(config?: FalSpeechProviderConfig): (modelId?: string) => ResolvedModel<string | {
|
|
68
61
|
url: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/fal/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,iBACX,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;IAE3D,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,YAAY,MAAM;IAE3B,QAAQ,CAAC,MAAM
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/fal/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,iBACX,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;IAE3D,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,YAAY,MAAM;IAE3B,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;OA+BJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,uBAAuB;IAMrC,QAAQ,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACjC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,UAAU,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;IAyDF,MAAM,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;CAKrD;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,uBAA4B,IAI1D,UAAU,MAAM,KACf,aAAa,CAAC,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAM3C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ApiError } from "../../errors.js";
|
|
1
|
+
import { ApiError, StreamingNotSupportedError } from "../../errors.js";
|
|
2
2
|
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
3
3
|
export class FalSpeechProvider {
|
|
4
4
|
id = "fal-ai";
|
|
@@ -6,43 +6,33 @@ export class FalSpeechProvider {
|
|
|
6
6
|
models = [
|
|
7
7
|
{
|
|
8
8
|
id: "f5-tts",
|
|
9
|
-
audioTags: false,
|
|
10
|
-
languages: ["en", "zh", "fr", "it", "hi", "ja", "ru", "es", "fi"],
|
|
11
9
|
releaseDate: "2024-10-08",
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
languages: ["en", "zh", "fr", "it", "hi", "ja", "ru", "es", "fi"],
|
|
11
|
+
features: ["open-source", "inline-voice-cloning"],
|
|
14
12
|
},
|
|
15
13
|
{
|
|
16
14
|
id: "kokoro",
|
|
17
|
-
audioTags: false,
|
|
18
|
-
languages: ["en", "fr", "ko", "ja", "zh"],
|
|
19
15
|
releaseDate: "2025-01-27",
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
languages: ["en", "fr", "ko", "ja", "zh"],
|
|
17
|
+
features: ["open-source"],
|
|
22
18
|
},
|
|
23
19
|
{
|
|
24
20
|
id: "dia-tts",
|
|
25
|
-
audioTags: false,
|
|
26
|
-
languages: ["en"],
|
|
27
21
|
releaseDate: "2025-04-21",
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
languages: ["en"],
|
|
23
|
+
features: ["open-source", "inline-voice-cloning"],
|
|
30
24
|
},
|
|
31
25
|
{
|
|
32
26
|
id: "orpheus-tts",
|
|
33
|
-
audioTags: false,
|
|
34
|
-
languages: ["en", "es", "fr", "de", "it", "pt", "zh"],
|
|
35
27
|
releaseDate: "2025-03-18",
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
languages: ["en", "es", "fr", "de", "it", "pt", "zh"],
|
|
29
|
+
features: ["open-source"],
|
|
38
30
|
},
|
|
39
31
|
{
|
|
40
32
|
id: "index-tts-2",
|
|
41
|
-
audioTags: false,
|
|
42
|
-
languages: ["en", "zh"],
|
|
43
33
|
releaseDate: "2025-09-08",
|
|
44
|
-
|
|
45
|
-
|
|
34
|
+
languages: ["en", "zh"],
|
|
35
|
+
features: ["open-source", "inline-voice-cloning"],
|
|
46
36
|
},
|
|
47
37
|
];
|
|
48
38
|
apiKey;
|
|
@@ -98,6 +88,9 @@ export class FalSpeechProvider {
|
|
|
98
88
|
mediaType: "audio/mpeg",
|
|
99
89
|
};
|
|
100
90
|
}
|
|
91
|
+
stream(options) {
|
|
92
|
+
return Promise.reject(new StreamingNotSupportedError(`fal-ai/${options.modelId}`));
|
|
93
|
+
}
|
|
101
94
|
}
|
|
102
95
|
export function createFal(config = {}) {
|
|
103
96
|
const provider = new FalSpeechProvider(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/fal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/fal/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ResolvedModel, type SpeechProvider } from "../../speech-provider.js";
|
|
2
2
|
export interface FishAudioSpeechProviderConfig {
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
baseURL?: string;
|
|
@@ -9,11 +9,9 @@ export declare class FishAudioSpeechProvider implements SpeechProvider<string, s
|
|
|
9
9
|
readonly defaultModel = "s2-pro";
|
|
10
10
|
readonly models: readonly [{
|
|
11
11
|
readonly id: "s2-pro";
|
|
12
|
-
readonly audioTags: true;
|
|
13
|
-
readonly languages: readonly ["ja", "en", "zh", "ko", "es", "pt", "ar", "ru", "fr", "de"];
|
|
14
12
|
readonly releaseDate: "2026-03-09";
|
|
15
|
-
readonly
|
|
16
|
-
readonly
|
|
13
|
+
readonly languages: readonly ["ja", "en", "zh", "ko", "es", "pt", "ar", "ru", "fr", "de"];
|
|
14
|
+
readonly features: readonly ["streaming", "audio-tags", "open-source", "inline-voice-cloning"];
|
|
17
15
|
}];
|
|
18
16
|
private readonly apiKey;
|
|
19
17
|
private readonly baseURL;
|
|
@@ -35,6 +33,18 @@ export declare class FishAudioSpeechProvider implements SpeechProvider<string, s
|
|
|
35
33
|
mediaType: string;
|
|
36
34
|
providerMetadata?: Record<string, unknown>;
|
|
37
35
|
}>;
|
|
36
|
+
stream(options: {
|
|
37
|
+
modelId: string;
|
|
38
|
+
text: string;
|
|
39
|
+
voice?: string;
|
|
40
|
+
providerOptions?: Record<string, unknown>;
|
|
41
|
+
abortSignal?: AbortSignal;
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
stream: ReadableStream<Uint8Array>;
|
|
45
|
+
mediaType: string;
|
|
46
|
+
providerMetadata?: Record<string, unknown>;
|
|
47
|
+
}>;
|
|
38
48
|
}
|
|
39
49
|
export declare function createFishAudio(config?: FishAudioSpeechProviderConfig): (modelId?: string) => ResolvedModel<string>;
|
|
40
50
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/fish-audio/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/fish-audio/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,uBAAwB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IAC5E,QAAQ,CAAC,EAAE,gBAAgB;IAC3B,QAAQ,CAAC,YAAY,YAAY;IAEjC,QAAQ,CAAC,MAAM;;;;;OAYJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,6BAA6B;IAMjD,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IASjC,QAAQ,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,UAAU,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;IAmCI,MAAM,CAAC,OAAO,EAAE;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;CAkCH;AAED,wBAAgB,eAAe,CAAC,MAAM,GAAE,6BAAkC,IAG9C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMnE"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { stripAudioTags } from "../../audio-tags.js";
|
|
2
2
|
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
3
|
+
import { hasFeature, } from "../../speech-provider.js";
|
|
3
4
|
export class FishAudioSpeechProvider {
|
|
4
5
|
id = "fish-audio";
|
|
5
6
|
defaultModel = "s2-pro";
|
|
6
7
|
models = [
|
|
7
8
|
{
|
|
8
9
|
id: "s2-pro",
|
|
9
|
-
audioTags: true,
|
|
10
|
-
languages: ["ja", "en", "zh", "ko", "es", "pt", "ar", "ru", "fr", "de"],
|
|
11
10
|
releaseDate: "2026-03-09",
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
languages: ["ja", "en", "zh", "ko", "es", "pt", "ar", "ru", "fr", "de"],
|
|
12
|
+
features: [
|
|
13
|
+
"streaming",
|
|
14
|
+
"audio-tags",
|
|
15
|
+
"open-source",
|
|
16
|
+
"inline-voice-cloning",
|
|
17
|
+
],
|
|
14
18
|
},
|
|
15
19
|
];
|
|
16
20
|
apiKey;
|
|
@@ -22,7 +26,7 @@ export class FishAudioSpeechProvider {
|
|
|
22
26
|
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
23
27
|
}
|
|
24
28
|
processAudioTags(text, modelId) {
|
|
25
|
-
if (this.models.some((m) => m.id === modelId && m
|
|
29
|
+
if (this.models.some((m) => m.id === modelId && hasFeature(m, "audio-tags"))) {
|
|
26
30
|
return { text, warnings: [] };
|
|
27
31
|
}
|
|
28
32
|
return stripAudioTags(text, `fish-audio/${modelId}`);
|
|
@@ -55,6 +59,35 @@ export class FishAudioSpeechProvider {
|
|
|
55
59
|
mediaType,
|
|
56
60
|
};
|
|
57
61
|
}
|
|
62
|
+
async stream(options) {
|
|
63
|
+
const url = `${this.baseURL}/v1/tts`;
|
|
64
|
+
const body = {
|
|
65
|
+
...options.providerOptions,
|
|
66
|
+
text: options.text,
|
|
67
|
+
};
|
|
68
|
+
if (options.voice) {
|
|
69
|
+
body.reference_id = options.voice;
|
|
70
|
+
}
|
|
71
|
+
const response = await this.fetchFn(url, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"Content-Type": "application/json",
|
|
75
|
+
Authorization: `Bearer ${resolveApiKey(this.apiKey, "FISH_AUDIO_API_KEY", "Fish Audio")}`,
|
|
76
|
+
model: options.modelId,
|
|
77
|
+
...options.headers,
|
|
78
|
+
},
|
|
79
|
+
body: JSON.stringify(body),
|
|
80
|
+
signal: options.abortSignal,
|
|
81
|
+
});
|
|
82
|
+
await handleErrorResponse(response, `fish-audio/${options.modelId}`);
|
|
83
|
+
if (!response.body) {
|
|
84
|
+
throw new Error(`fish-audio/${options.modelId}: response has no body`);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
stream: response.body,
|
|
88
|
+
mediaType: response.headers.get("content-type") ?? "audio/mpeg",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
58
91
|
}
|
|
59
92
|
export function createFishAudio(config = {}) {
|
|
60
93
|
const provider = new FishAudioSpeechProvider(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/fish-audio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/fish-audio/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,18 +9,14 @@ export declare class GoogleSpeechProvider implements SpeechProvider<string, stri
|
|
|
9
9
|
readonly defaultModel = "gemini-2.5-flash-preview-tts";
|
|
10
10
|
readonly models: readonly [{
|
|
11
11
|
readonly id: "gemini-2.5-flash-preview-tts";
|
|
12
|
-
readonly languages: readonly ["en", "fr", "de", "es", "pt", "zh", "ja", "ko", "hi", "it", "nl", "pl", "ru", "sv", "tr", "id", "ar", "cs", "da", "fi", "el", "hu", "ro", "uk"];
|
|
13
12
|
readonly releaseDate: "2025-05-01";
|
|
14
|
-
readonly
|
|
15
|
-
readonly
|
|
16
|
-
readonly inlineVoiceCloning: false;
|
|
13
|
+
readonly languages: readonly ["en", "fr", "de", "es", "pt", "zh", "ja", "ko", "hi", "it", "nl", "pl", "ru", "sv", "tr", "id", "ar", "cs", "da", "fi", "el", "hu", "ro", "uk"];
|
|
14
|
+
readonly features: readonly ["streaming"];
|
|
17
15
|
}, {
|
|
18
16
|
readonly id: "gemini-2.5-pro-preview-tts";
|
|
19
|
-
readonly languages: readonly ["en", "fr", "de", "es", "pt", "zh", "ja", "ko", "hi", "it", "nl", "pl", "ru", "sv", "tr", "id", "ar", "cs", "da", "fi", "el", "hu", "ro", "uk"];
|
|
20
17
|
readonly releaseDate: "2025-05-01";
|
|
21
|
-
readonly
|
|
22
|
-
readonly
|
|
23
|
-
readonly inlineVoiceCloning: false;
|
|
18
|
+
readonly languages: readonly ["en", "fr", "de", "es", "pt", "zh", "ja", "ko", "hi", "it", "nl", "pl", "ru", "sv", "tr", "id", "ar", "cs", "da", "fi", "el", "hu", "ro", "uk"];
|
|
19
|
+
readonly features: readonly ["streaming"];
|
|
24
20
|
}];
|
|
25
21
|
private readonly apiKey;
|
|
26
22
|
private readonly baseURL;
|
|
@@ -38,6 +34,18 @@ export declare class GoogleSpeechProvider implements SpeechProvider<string, stri
|
|
|
38
34
|
mediaType: string;
|
|
39
35
|
providerMetadata?: Record<string, unknown>;
|
|
40
36
|
}>;
|
|
37
|
+
stream(options: {
|
|
38
|
+
modelId: string;
|
|
39
|
+
text: string;
|
|
40
|
+
voice?: string;
|
|
41
|
+
providerOptions?: Record<string, unknown>;
|
|
42
|
+
abortSignal?: AbortSignal;
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
stream: ReadableStream<Uint8Array>;
|
|
46
|
+
mediaType: string;
|
|
47
|
+
providerMetadata?: Record<string, unknown>;
|
|
48
|
+
}>;
|
|
41
49
|
}
|
|
42
50
|
export declare function createGoogle(config?: GoogleSpeechProviderConfig): (modelId?: string) => ResolvedModel<string>;
|
|
43
51
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAW9E,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,oBAAqB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IACzE,QAAQ,CAAC,EAAE,YAAY;IACvB,QAAQ,CAAC,YAAY,kCAAkC;IAEvD,QAAQ,CAAC,MAAM;;;;;;;;;;OA+DJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,0BAA0B;IAOxC,QAAQ,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;IAsEI,MAAM,CAAC,OAAO,EAAE;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;CAmEH;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,0BAA+B,IAG3C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMhE"}
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
2
|
+
import { parseSseBase64Stream } from "../../sse-stream.js";
|
|
3
|
+
function safeParseJson(input) {
|
|
4
|
+
try {
|
|
5
|
+
return JSON.parse(input);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
2
11
|
export class GoogleSpeechProvider {
|
|
3
12
|
id = "google";
|
|
4
13
|
defaultModel = "gemini-2.5-flash-preview-tts";
|
|
5
14
|
models = [
|
|
6
15
|
{
|
|
7
16
|
id: "gemini-2.5-flash-preview-tts",
|
|
17
|
+
releaseDate: "2025-05-01",
|
|
8
18
|
languages: [
|
|
9
19
|
"en",
|
|
10
20
|
"fr",
|
|
@@ -31,13 +41,11 @@ export class GoogleSpeechProvider {
|
|
|
31
41
|
"ro",
|
|
32
42
|
"uk",
|
|
33
43
|
],
|
|
34
|
-
|
|
35
|
-
audioTags: false,
|
|
36
|
-
openSource: false,
|
|
37
|
-
inlineVoiceCloning: false,
|
|
44
|
+
features: ["streaming"],
|
|
38
45
|
},
|
|
39
46
|
{
|
|
40
47
|
id: "gemini-2.5-pro-preview-tts",
|
|
48
|
+
releaseDate: "2025-05-01",
|
|
41
49
|
languages: [
|
|
42
50
|
"en",
|
|
43
51
|
"fr",
|
|
@@ -64,10 +72,7 @@ export class GoogleSpeechProvider {
|
|
|
64
72
|
"ro",
|
|
65
73
|
"uk",
|
|
66
74
|
],
|
|
67
|
-
|
|
68
|
-
audioTags: false,
|
|
69
|
-
openSource: false,
|
|
70
|
-
inlineVoiceCloning: false,
|
|
75
|
+
features: ["streaming"],
|
|
71
76
|
},
|
|
72
77
|
];
|
|
73
78
|
apiKey;
|
|
@@ -123,6 +128,61 @@ export class GoogleSpeechProvider {
|
|
|
123
128
|
mediaType: part.inlineData.mimeType ?? "audio/mp3",
|
|
124
129
|
};
|
|
125
130
|
}
|
|
131
|
+
// NOTE: Gemini TTS on the Generative Language API (`streamGenerateContent`)
|
|
132
|
+
// buffers the full synthesis server-side and flushes in a single burst. This
|
|
133
|
+
// method returns a valid ReadableStream, but first-byte latency matches
|
|
134
|
+
// generateSpeech(). True progressive Google TTS is only available via:
|
|
135
|
+
// - Live API (`bidiGenerateContent`, WebSocket) on native-audio models
|
|
136
|
+
// - Cloud TTS `streamingSynthesize` (gRPC only; no REST binding)
|
|
137
|
+
// Neither is wired up in this SDK today.
|
|
138
|
+
async stream(options) {
|
|
139
|
+
const apiKey = resolveApiKey(this.apiKey, "GOOGLE_API_KEY", "Google");
|
|
140
|
+
const voiceName = options.voice ?? "Kore";
|
|
141
|
+
const speechConfig = {
|
|
142
|
+
voice_config: {
|
|
143
|
+
prebuilt_voice_config: { voice_name: voiceName },
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
const body = {
|
|
147
|
+
contents: [
|
|
148
|
+
{
|
|
149
|
+
role: "user",
|
|
150
|
+
parts: [{ text: options.text }],
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
generationConfig: {
|
|
154
|
+
responseModalities: ["audio"],
|
|
155
|
+
speech_config: speechConfig,
|
|
156
|
+
...options.providerOptions,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
const url = `${this.baseURL}/models/${options.modelId}:streamGenerateContent?alt=sse&key=${apiKey}`;
|
|
160
|
+
const response = await this.fetchFn(url, {
|
|
161
|
+
method: "POST",
|
|
162
|
+
headers: {
|
|
163
|
+
"Content-Type": "application/json",
|
|
164
|
+
Accept: "text/event-stream",
|
|
165
|
+
...options.headers,
|
|
166
|
+
},
|
|
167
|
+
body: JSON.stringify(body),
|
|
168
|
+
signal: options.abortSignal,
|
|
169
|
+
});
|
|
170
|
+
await handleErrorResponse(response, `google/${options.modelId}`);
|
|
171
|
+
if (!response.body) {
|
|
172
|
+
throw new Error(`google/${options.modelId}: response has no body`);
|
|
173
|
+
}
|
|
174
|
+
const { stream } = parseSseBase64Stream(response.body, {
|
|
175
|
+
extractBase64(eventData) {
|
|
176
|
+
const json = safeParseJson(eventData);
|
|
177
|
+
const part = json?.candidates?.[0]?.content?.parts?.find((p) => p.inlineData?.data);
|
|
178
|
+
return part?.inlineData?.data ?? null;
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
stream,
|
|
183
|
+
mediaType: "audio/L16;rate=24000",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
126
186
|
}
|
|
127
187
|
export function createGoogle(config = {}) {
|
|
128
188
|
const provider = new GoogleSpeechProvider(config);
|