@speech-sdk/core 0.0.3 → 0.0.5
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 +37 -0
- package/dist/audio-tags.d.ts +6 -0
- package/dist/audio-tags.d.ts.map +1 -0
- package/dist/audio-tags.js +17 -0
- package/dist/audio-tags.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +5 -5
- package/dist/errors.js.map +1 -1
- package/dist/generate-speech.d.ts +2 -2
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +29 -6
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +16 -12
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/cartesia/index.d.ts +9 -3
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +159 -15
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts +2 -2
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +16 -9
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/index.d.ts +9 -5
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +166 -33
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts +6 -6
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +52 -17
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts +6 -2
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +24 -10
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/google/index.d.ts +3 -3
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +80 -15
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/hume/index.d.ts +3 -3
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +43 -15
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts +2 -2
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +33 -16
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/index.d.ts +3 -3
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +62 -14
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts +4 -4
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +99 -18
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/index.d.ts +2 -2
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +41 -10
- package/dist/providers/resemble/index.js.map +1 -1
- package/dist/providers/unreal-speech/index.d.ts +2 -2
- package/dist/providers/unreal-speech/index.d.ts.map +1 -1
- package/dist/providers/unreal-speech/index.js +20 -13
- package/dist/providers/unreal-speech/index.js.map +1 -1
- package/dist/resolve-provider.d.ts +1 -1
- package/dist/resolve-provider.d.ts.map +1 -1
- package/dist/resolve-provider.js +34 -34
- package/dist/resolve-provider.js.map +1 -1
- package/dist/speech-provider.d.ts +10 -6
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-result.d.ts +4 -3
- package/dist/speech-result.d.ts.map +1 -1
- package/dist/speech-result.js +9 -7
- package/dist/speech-result.js.map +1 -1
- package/dist/types.d.ts +7 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
|
@@ -1,18 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stripAudioTags } from "../../audio-tags.js";
|
|
2
|
+
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
2
3
|
export class FishAudioSpeechProvider {
|
|
3
|
-
id =
|
|
4
|
-
defaultModel =
|
|
4
|
+
id = "fish-audio";
|
|
5
|
+
defaultModel = "s2-pro";
|
|
5
6
|
models = [
|
|
6
|
-
{
|
|
7
|
+
{
|
|
8
|
+
id: "s2-pro",
|
|
9
|
+
audioTags: true,
|
|
10
|
+
languages: ["ja", "en", "zh", "ko", "es", "pt", "ar", "ru", "fr", "de"],
|
|
11
|
+
releaseDate: "2026-03-09",
|
|
12
|
+
openSource: true,
|
|
13
|
+
inlineVoiceCloning: true,
|
|
14
|
+
},
|
|
7
15
|
];
|
|
8
16
|
apiKey;
|
|
9
17
|
baseURL;
|
|
10
18
|
fetchFn;
|
|
11
19
|
constructor(config) {
|
|
12
20
|
this.apiKey = config.apiKey;
|
|
13
|
-
this.baseURL = config.baseURL ??
|
|
21
|
+
this.baseURL = config.baseURL ?? "https://api.fish.audio";
|
|
14
22
|
this.fetchFn = config.fetch ?? globalThis.fetch;
|
|
15
23
|
}
|
|
24
|
+
processAudioTags(text, modelId) {
|
|
25
|
+
if (this.models.some((m) => m.id === modelId && m.audioTags)) {
|
|
26
|
+
return { text, warnings: [] };
|
|
27
|
+
}
|
|
28
|
+
return stripAudioTags(text, `fish-audio/${modelId}`);
|
|
29
|
+
}
|
|
16
30
|
async generate(options) {
|
|
17
31
|
const url = `${this.baseURL}/v1/tts`;
|
|
18
32
|
const body = {
|
|
@@ -23,11 +37,11 @@ export class FishAudioSpeechProvider {
|
|
|
23
37
|
body.reference_id = options.voice;
|
|
24
38
|
}
|
|
25
39
|
const response = await this.fetchFn(url, {
|
|
26
|
-
method:
|
|
40
|
+
method: "POST",
|
|
27
41
|
headers: {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
42
|
+
"Content-Type": "application/json",
|
|
43
|
+
Authorization: `Bearer ${resolveApiKey(this.apiKey, "FISH_AUDIO_API_KEY", "Fish Audio")}`,
|
|
44
|
+
model: options.modelId,
|
|
31
45
|
...options.headers,
|
|
32
46
|
},
|
|
33
47
|
body: JSON.stringify(body),
|
|
@@ -35,7 +49,7 @@ export class FishAudioSpeechProvider {
|
|
|
35
49
|
});
|
|
36
50
|
await handleErrorResponse(response, `fish-audio/${options.modelId}`);
|
|
37
51
|
const arrayBuffer = await response.arrayBuffer();
|
|
38
|
-
const mediaType = response.headers.get(
|
|
52
|
+
const mediaType = response.headers.get("content-type") ?? "audio/mpeg";
|
|
39
53
|
return {
|
|
40
54
|
audio: new Uint8Array(arrayBuffer),
|
|
41
55
|
mediaType,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/fish-audio/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/fish-audio/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResolvedModel, SpeechProvider } from "../../speech-provider.js";
|
|
2
2
|
export interface GoogleSpeechProviderConfig {
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
baseURL?: string;
|
|
@@ -11,16 +11,16 @@ export declare class GoogleSpeechProvider implements SpeechProvider<string, stri
|
|
|
11
11
|
readonly id: "gemini-2.5-flash-preview-tts";
|
|
12
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
13
|
readonly releaseDate: "2025-05-01";
|
|
14
|
+
readonly audioTags: false;
|
|
14
15
|
readonly openSource: false;
|
|
15
16
|
readonly inlineVoiceCloning: false;
|
|
16
|
-
readonly zeroDataRetention: false;
|
|
17
17
|
}, {
|
|
18
18
|
readonly id: "gemini-2.5-pro-preview-tts";
|
|
19
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
20
|
readonly releaseDate: "2025-05-01";
|
|
21
|
+
readonly audioTags: false;
|
|
21
22
|
readonly openSource: false;
|
|
22
23
|
readonly inlineVoiceCloning: false;
|
|
23
|
-
readonly zeroDataRetention: false;
|
|
24
24
|
}];
|
|
25
25
|
private readonly apiKey;
|
|
26
26
|
private readonly baseURL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"
|
|
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;AAE9E,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;;;;;;;;;;;;;;OAmEJ;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;CA8DH;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,0BAA+B,IAG3C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMhE"}
|
|
@@ -1,22 +1,87 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
2
2
|
export class GoogleSpeechProvider {
|
|
3
|
-
id =
|
|
4
|
-
defaultModel =
|
|
3
|
+
id = "google";
|
|
4
|
+
defaultModel = "gemini-2.5-flash-preview-tts";
|
|
5
5
|
models = [
|
|
6
|
-
{
|
|
7
|
-
|
|
6
|
+
{
|
|
7
|
+
id: "gemini-2.5-flash-preview-tts",
|
|
8
|
+
languages: [
|
|
9
|
+
"en",
|
|
10
|
+
"fr",
|
|
11
|
+
"de",
|
|
12
|
+
"es",
|
|
13
|
+
"pt",
|
|
14
|
+
"zh",
|
|
15
|
+
"ja",
|
|
16
|
+
"ko",
|
|
17
|
+
"hi",
|
|
18
|
+
"it",
|
|
19
|
+
"nl",
|
|
20
|
+
"pl",
|
|
21
|
+
"ru",
|
|
22
|
+
"sv",
|
|
23
|
+
"tr",
|
|
24
|
+
"id",
|
|
25
|
+
"ar",
|
|
26
|
+
"cs",
|
|
27
|
+
"da",
|
|
28
|
+
"fi",
|
|
29
|
+
"el",
|
|
30
|
+
"hu",
|
|
31
|
+
"ro",
|
|
32
|
+
"uk",
|
|
33
|
+
],
|
|
34
|
+
releaseDate: "2025-05-01",
|
|
35
|
+
audioTags: false,
|
|
36
|
+
openSource: false,
|
|
37
|
+
inlineVoiceCloning: false,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "gemini-2.5-pro-preview-tts",
|
|
41
|
+
languages: [
|
|
42
|
+
"en",
|
|
43
|
+
"fr",
|
|
44
|
+
"de",
|
|
45
|
+
"es",
|
|
46
|
+
"pt",
|
|
47
|
+
"zh",
|
|
48
|
+
"ja",
|
|
49
|
+
"ko",
|
|
50
|
+
"hi",
|
|
51
|
+
"it",
|
|
52
|
+
"nl",
|
|
53
|
+
"pl",
|
|
54
|
+
"ru",
|
|
55
|
+
"sv",
|
|
56
|
+
"tr",
|
|
57
|
+
"id",
|
|
58
|
+
"ar",
|
|
59
|
+
"cs",
|
|
60
|
+
"da",
|
|
61
|
+
"fi",
|
|
62
|
+
"el",
|
|
63
|
+
"hu",
|
|
64
|
+
"ro",
|
|
65
|
+
"uk",
|
|
66
|
+
],
|
|
67
|
+
releaseDate: "2025-05-01",
|
|
68
|
+
audioTags: false,
|
|
69
|
+
openSource: false,
|
|
70
|
+
inlineVoiceCloning: false,
|
|
71
|
+
},
|
|
8
72
|
];
|
|
9
73
|
apiKey;
|
|
10
74
|
baseURL;
|
|
11
75
|
fetchFn;
|
|
12
76
|
constructor(config) {
|
|
13
77
|
this.apiKey = config.apiKey;
|
|
14
|
-
this.baseURL =
|
|
78
|
+
this.baseURL =
|
|
79
|
+
config.baseURL ?? "https://generativelanguage.googleapis.com/v1beta";
|
|
15
80
|
this.fetchFn = config.fetch ?? globalThis.fetch;
|
|
16
81
|
}
|
|
17
82
|
async generate(options) {
|
|
18
|
-
const apiKey = resolveApiKey(this.apiKey,
|
|
19
|
-
const voiceName = options.voice ??
|
|
83
|
+
const apiKey = resolveApiKey(this.apiKey, "GOOGLE_API_KEY", "Google");
|
|
84
|
+
const voiceName = options.voice ?? "Kore";
|
|
20
85
|
const speechConfig = {
|
|
21
86
|
voice_config: {
|
|
22
87
|
prebuilt_voice_config: {
|
|
@@ -27,35 +92,35 @@ export class GoogleSpeechProvider {
|
|
|
27
92
|
const body = {
|
|
28
93
|
contents: [
|
|
29
94
|
{
|
|
30
|
-
role:
|
|
95
|
+
role: "user",
|
|
31
96
|
parts: [{ text: options.text }],
|
|
32
97
|
},
|
|
33
98
|
],
|
|
34
99
|
generationConfig: {
|
|
35
|
-
responseModalities: [
|
|
100
|
+
responseModalities: ["audio"],
|
|
36
101
|
speech_config: speechConfig,
|
|
37
102
|
...options.providerOptions,
|
|
38
103
|
},
|
|
39
104
|
};
|
|
40
105
|
const url = `${this.baseURL}/models/${options.modelId}:generateContent?key=${apiKey}`;
|
|
41
106
|
const response = await this.fetchFn(url, {
|
|
42
|
-
method:
|
|
107
|
+
method: "POST",
|
|
43
108
|
headers: {
|
|
44
|
-
|
|
109
|
+
"Content-Type": "application/json",
|
|
45
110
|
...options.headers,
|
|
46
111
|
},
|
|
47
112
|
body: JSON.stringify(body),
|
|
48
113
|
signal: options.abortSignal,
|
|
49
114
|
});
|
|
50
115
|
await handleErrorResponse(response, `google/${options.modelId}`);
|
|
51
|
-
const json = await response.json();
|
|
116
|
+
const json = (await response.json());
|
|
52
117
|
const part = json.candidates?.[0]?.content?.parts?.find((p) => p.inlineData != null);
|
|
53
118
|
if (!part?.inlineData) {
|
|
54
|
-
throw new Error(
|
|
119
|
+
throw new Error("No audio data in Gemini TTS response");
|
|
55
120
|
}
|
|
56
121
|
return {
|
|
57
122
|
audio: part.inlineData.data,
|
|
58
|
-
mediaType: part.inlineData.mimeType ??
|
|
123
|
+
mediaType: part.inlineData.mimeType ?? "audio/mp3",
|
|
59
124
|
};
|
|
60
125
|
}
|
|
61
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResolvedModel, SpeechProvider } from "../../speech-provider.js";
|
|
2
2
|
export interface HumeSpeechProviderConfig {
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
baseURL?: string;
|
|
@@ -9,18 +9,18 @@ export declare class HumeSpeechProvider implements SpeechProvider<string, string
|
|
|
9
9
|
readonly defaultModel = "octave-2";
|
|
10
10
|
readonly models: readonly [{
|
|
11
11
|
readonly id: "octave-2";
|
|
12
|
+
readonly audioTags: false;
|
|
12
13
|
readonly languages: readonly ["en", "fr", "de", "es", "pt", "ja", "ko", "hi", "it", "ar", "ru"];
|
|
13
14
|
readonly releaseDate: "2025-10-01";
|
|
14
15
|
readonly openSource: false;
|
|
15
16
|
readonly inlineVoiceCloning: true;
|
|
16
|
-
readonly zeroDataRetention: false;
|
|
17
17
|
}, {
|
|
18
18
|
readonly id: "octave-1";
|
|
19
|
+
readonly audioTags: false;
|
|
19
20
|
readonly languages: readonly ["en"];
|
|
20
21
|
readonly releaseDate: "2025-03-01";
|
|
21
22
|
readonly openSource: false;
|
|
22
23
|
readonly inlineVoiceCloning: false;
|
|
23
|
-
readonly zeroDataRetention: false;
|
|
24
24
|
}];
|
|
25
25
|
private readonly apiKey;
|
|
26
26
|
private readonly baseURL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/hume/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/hume/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,kBAAmB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IACvE,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,YAAY,cAAc;IAEnC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;OA6BJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,wBAAwB;IAM5C,OAAO,CAAC,cAAc;IAUhB,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;CAwCH;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,wBAA6B,IAGzC,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAM9D"}
|
|
@@ -1,30 +1,58 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
2
2
|
export class HumeSpeechProvider {
|
|
3
|
-
id =
|
|
4
|
-
defaultModel =
|
|
3
|
+
id = "hume";
|
|
4
|
+
defaultModel = "octave-2";
|
|
5
5
|
models = [
|
|
6
|
-
{
|
|
7
|
-
|
|
6
|
+
{
|
|
7
|
+
id: "octave-2",
|
|
8
|
+
audioTags: false,
|
|
9
|
+
languages: [
|
|
10
|
+
"en",
|
|
11
|
+
"fr",
|
|
12
|
+
"de",
|
|
13
|
+
"es",
|
|
14
|
+
"pt",
|
|
15
|
+
"ja",
|
|
16
|
+
"ko",
|
|
17
|
+
"hi",
|
|
18
|
+
"it",
|
|
19
|
+
"ar",
|
|
20
|
+
"ru",
|
|
21
|
+
],
|
|
22
|
+
releaseDate: "2025-10-01",
|
|
23
|
+
openSource: false,
|
|
24
|
+
inlineVoiceCloning: true,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "octave-1",
|
|
28
|
+
audioTags: false,
|
|
29
|
+
languages: ["en"],
|
|
30
|
+
releaseDate: "2025-03-01",
|
|
31
|
+
openSource: false,
|
|
32
|
+
inlineVoiceCloning: false,
|
|
33
|
+
},
|
|
8
34
|
];
|
|
9
35
|
apiKey;
|
|
10
36
|
baseURL;
|
|
11
37
|
fetchFn;
|
|
12
38
|
constructor(config) {
|
|
13
39
|
this.apiKey = config.apiKey;
|
|
14
|
-
this.baseURL = config.baseURL ??
|
|
40
|
+
this.baseURL = config.baseURL ?? "https://api.hume.ai/v0";
|
|
15
41
|
this.fetchFn = config.fetch ?? globalThis.fetch;
|
|
16
42
|
}
|
|
17
43
|
resolveVersion(modelId) {
|
|
18
|
-
if (modelId ===
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
44
|
+
if (modelId === "octave-2") {
|
|
45
|
+
return "2";
|
|
46
|
+
}
|
|
47
|
+
if (modelId === "octave-1") {
|
|
48
|
+
return "1";
|
|
49
|
+
}
|
|
22
50
|
return undefined;
|
|
23
51
|
}
|
|
24
52
|
async generate(options) {
|
|
25
53
|
const utterance = { text: options.text };
|
|
26
54
|
if (options.voice) {
|
|
27
|
-
utterance.voice = { name: options.voice, provider:
|
|
55
|
+
utterance.voice = { name: options.voice, provider: "HUME_AI" };
|
|
28
56
|
}
|
|
29
57
|
const version = this.resolveVersion(options.modelId);
|
|
30
58
|
const body = {
|
|
@@ -36,10 +64,10 @@ export class HumeSpeechProvider {
|
|
|
36
64
|
}
|
|
37
65
|
const url = `${this.baseURL}/tts/file`;
|
|
38
66
|
const response = await this.fetchFn(url, {
|
|
39
|
-
method:
|
|
67
|
+
method: "POST",
|
|
40
68
|
headers: {
|
|
41
|
-
|
|
42
|
-
|
|
69
|
+
"Content-Type": "application/json",
|
|
70
|
+
"X-Hume-Api-Key": resolveApiKey(this.apiKey, "HUME_API_KEY", "Hume"),
|
|
43
71
|
...options.headers,
|
|
44
72
|
},
|
|
45
73
|
body: JSON.stringify(body),
|
|
@@ -47,7 +75,7 @@ export class HumeSpeechProvider {
|
|
|
47
75
|
});
|
|
48
76
|
await handleErrorResponse(response, `hume/${options.modelId}`);
|
|
49
77
|
const arrayBuffer = await response.arrayBuffer();
|
|
50
|
-
const mediaType = response.headers.get(
|
|
78
|
+
const mediaType = response.headers.get("content-type") ?? "audio/mpeg";
|
|
51
79
|
return {
|
|
52
80
|
audio: new Uint8Array(arrayBuffer),
|
|
53
81
|
mediaType,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/hume/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/hume/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResolvedModel, SpeechProvider } from "../../speech-provider.js";
|
|
2
2
|
export interface MistralSpeechProviderConfig {
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
baseURL?: string;
|
|
@@ -11,11 +11,11 @@ export declare class MistralSpeechProvider implements SpeechProvider<string, str
|
|
|
11
11
|
readonly defaultModel = "voxtral-mini-tts-2603";
|
|
12
12
|
readonly models: readonly [{
|
|
13
13
|
readonly id: "voxtral-mini-tts-2603";
|
|
14
|
+
readonly audioTags: false;
|
|
14
15
|
readonly languages: readonly ["en", "fr", "de", "es", "nl", "pt", "it", "hi", "ar"];
|
|
15
16
|
readonly releaseDate: "2026-03-23";
|
|
16
17
|
readonly openSource: true;
|
|
17
18
|
readonly inlineVoiceCloning: true;
|
|
18
|
-
readonly zeroDataRetention: false;
|
|
19
19
|
}];
|
|
20
20
|
private readonly apiKey;
|
|
21
21
|
private readonly baseURL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/mistral/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,qBACX,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC;IAE1E,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,YAAY,2BAA2B;IAChD,QAAQ,CAAC,MAAM;;;;;;;OAmBJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,2BAA2B;IAMzC,QAAQ,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;SAAE,CAAC;QAChD,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;KACnB,CAAC;CA+CH;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,2BAAgC,IAGlE,UAAU,MAAM,KACf,aAAa,CAAC,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC,CAG1D"}
|
|
@@ -1,35 +1,52 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
|
|
2
2
|
export class MistralSpeechProvider {
|
|
3
|
-
id =
|
|
4
|
-
defaultModel =
|
|
3
|
+
id = "mistral";
|
|
4
|
+
defaultModel = "voxtral-mini-tts-2603";
|
|
5
5
|
models = [
|
|
6
|
-
{
|
|
6
|
+
{
|
|
7
|
+
id: "voxtral-mini-tts-2603",
|
|
8
|
+
audioTags: false,
|
|
9
|
+
languages: [
|
|
10
|
+
"en",
|
|
11
|
+
"fr",
|
|
12
|
+
"de",
|
|
13
|
+
"es",
|
|
14
|
+
"nl",
|
|
15
|
+
"pt",
|
|
16
|
+
"it",
|
|
17
|
+
"hi",
|
|
18
|
+
"ar",
|
|
19
|
+
],
|
|
20
|
+
releaseDate: "2026-03-23",
|
|
21
|
+
openSource: true,
|
|
22
|
+
inlineVoiceCloning: true,
|
|
23
|
+
},
|
|
7
24
|
];
|
|
8
25
|
apiKey;
|
|
9
26
|
baseURL;
|
|
10
27
|
fetchFn;
|
|
11
28
|
constructor(config) {
|
|
12
29
|
this.apiKey = config.apiKey;
|
|
13
|
-
this.baseURL = config.baseURL ??
|
|
30
|
+
this.baseURL = config.baseURL ?? "https://api.mistral.ai/v1";
|
|
14
31
|
this.fetchFn = config.fetch ?? globalThis.fetch;
|
|
15
32
|
}
|
|
16
33
|
async generate(options) {
|
|
17
34
|
const body = {
|
|
18
|
-
response_format:
|
|
35
|
+
response_format: "mp3",
|
|
19
36
|
...options.providerOptions,
|
|
20
37
|
model: options.modelId,
|
|
21
38
|
input: options.text,
|
|
22
39
|
};
|
|
23
40
|
if (options.voice != null) {
|
|
24
|
-
if (typeof options.voice ===
|
|
41
|
+
if (typeof options.voice === "string") {
|
|
25
42
|
body.voice_id = options.voice;
|
|
26
43
|
}
|
|
27
|
-
else if (
|
|
44
|
+
else if ("audio" in options.voice) {
|
|
28
45
|
const audio = options.voice.audio;
|
|
29
46
|
if (audio instanceof Uint8Array) {
|
|
30
|
-
let binaryString =
|
|
31
|
-
for (
|
|
32
|
-
binaryString += String.fromCharCode(
|
|
47
|
+
let binaryString = "";
|
|
48
|
+
for (const byte of audio) {
|
|
49
|
+
binaryString += String.fromCharCode(byte);
|
|
33
50
|
}
|
|
34
51
|
body.ref_audio = btoa(binaryString);
|
|
35
52
|
}
|
|
@@ -40,20 +57,20 @@ export class MistralSpeechProvider {
|
|
|
40
57
|
}
|
|
41
58
|
const url = `${this.baseURL}/audio/speech`;
|
|
42
59
|
const response = await this.fetchFn(url, {
|
|
43
|
-
method:
|
|
60
|
+
method: "POST",
|
|
44
61
|
headers: {
|
|
45
|
-
|
|
46
|
-
|
|
62
|
+
"Content-Type": "application/json",
|
|
63
|
+
Authorization: `Bearer ${resolveApiKey(this.apiKey, "MISTRAL_API_KEY", "Mistral")}`,
|
|
47
64
|
...options.headers,
|
|
48
65
|
},
|
|
49
66
|
body: JSON.stringify(body),
|
|
50
67
|
signal: options.abortSignal,
|
|
51
68
|
});
|
|
52
69
|
await handleErrorResponse(response, `mistral/${options.modelId}`);
|
|
53
|
-
const json = await response.json();
|
|
70
|
+
const json = (await response.json());
|
|
54
71
|
return {
|
|
55
72
|
audio: json.audio_data,
|
|
56
|
-
mediaType:
|
|
73
|
+
mediaType: "audio/mpeg",
|
|
57
74
|
};
|
|
58
75
|
}
|
|
59
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/mistral/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/mistral/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResolvedModel, SpeechProvider } from "../../speech-provider.js";
|
|
2
2
|
export interface MurfSpeechProviderConfig {
|
|
3
3
|
apiKey?: string;
|
|
4
4
|
baseURL?: string;
|
|
@@ -9,18 +9,18 @@ export declare class MurfSpeechProvider implements SpeechProvider<string, string
|
|
|
9
9
|
readonly defaultModel = "GEN2";
|
|
10
10
|
readonly models: readonly [{
|
|
11
11
|
readonly id: "GEN2";
|
|
12
|
+
readonly audioTags: false;
|
|
12
13
|
readonly languages: readonly ["en", "de", "es", "fr", "zh", "ar", "hi", "bn", "ta", "pt", "it", "ja", "ko", "nl", "pl", "ru", "sv", "tr", "id", "ms", "tl", "cs", "fi", "th", "vi", "da", "no", "ro", "el", "hu", "uk", "sk", "bg"];
|
|
13
14
|
readonly releaseDate: "2025-01-01";
|
|
14
15
|
readonly openSource: false;
|
|
15
16
|
readonly inlineVoiceCloning: false;
|
|
16
|
-
readonly zeroDataRetention: false;
|
|
17
17
|
}, {
|
|
18
18
|
readonly id: "FALCON";
|
|
19
|
+
readonly audioTags: false;
|
|
19
20
|
readonly languages: readonly ["en"];
|
|
20
21
|
readonly releaseDate: "2025-01-01";
|
|
21
22
|
readonly openSource: false;
|
|
22
23
|
readonly inlineVoiceCloning: false;
|
|
23
|
-
readonly zeroDataRetention: false;
|
|
24
24
|
}];
|
|
25
25
|
private readonly apiKey;
|
|
26
26
|
private readonly baseURL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/murf/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/murf/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,kBAAmB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IACvE,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,YAAY,UAAU;IAE/B,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;OAmDJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,wBAAwB;IAMtC,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,GAAG,UAAU,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;CA8CH;AAED,wBAAgB,UAAU,CAAC,MAAM,GAAE,wBAA6B,IAGzC,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAM9D"}
|