@speech-sdk/core 0.28.0 → 0.29.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 +20 -29
- package/dist/conversation/dispatch.d.ts +1 -4
- package/dist/conversation/dispatch.d.ts.map +1 -1
- package/dist/conversation/dispatch.js +1 -10
- package/dist/conversation/dispatch.js.map +1 -1
- package/dist/conversation/errors.d.ts +0 -3
- package/dist/conversation/errors.d.ts.map +1 -1
- package/dist/conversation/errors.js +0 -6
- package/dist/conversation/errors.js.map +1 -1
- package/dist/errors.d.ts +0 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -7
- package/dist/errors.js.map +1 -1
- package/dist/generate-conversation.d.ts +1 -1
- package/dist/generate-conversation.d.ts.map +1 -1
- package/dist/generate-conversation.js +2 -105
- package/dist/generate-conversation.js.map +1 -1
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +22 -60
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +2 -2
- package/dist/instructions.js.map +1 -1
- package/dist/pronunciations/merge.js +1 -1
- package/dist/pronunciations/merge.js.map +1 -1
- package/dist/provider-utils.d.ts +0 -1
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +6 -12
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/smallest-ai/index.d.ts +2 -1
- package/dist/providers/smallest-ai/index.d.ts.map +1 -1
- package/dist/providers/smallest-ai/index.js +2 -1
- package/dist/providers/smallest-ai/index.js.map +1 -1
- package/dist/providers.d.ts +0 -2
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +0 -1
- package/dist/providers.js.map +1 -1
- package/dist/resolve-provider.d.ts +1 -0
- package/dist/resolve-provider.d.ts.map +1 -1
- package/dist/resolve-provider.js +50 -8
- package/dist/resolve-provider.js.map +1 -1
- package/dist/speech-provider.d.ts +0 -4
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-provider.js +0 -4
- package/dist/speech-provider.js.map +1 -1
- package/dist/stream-speech.d.ts.map +1 -1
- package/dist/stream-speech.js +11 -27
- package/dist/stream-speech.js.map +1 -1
- package/dist/text-preprocessing.d.ts +1 -1
- package/dist/text-preprocessing.d.ts.map +1 -1
- package/dist/text-preprocessing.js +0 -9
- package/dist/text-preprocessing.js.map +1 -1
- package/dist/timestamp-alignment.d.ts.map +1 -1
- package/dist/timestamp-alignment.js +3 -12
- package/dist/timestamp-alignment.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/providers/gateway/index.d.ts +0 -83
- package/dist/providers/gateway/index.d.ts.map +0 -1
- package/dist/providers/gateway/index.js +0 -299
- package/dist/providers/gateway/index.js.map +0 -1
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { GatewayInputError, MissingApiKeyError } from "../../errors.js";
|
|
3
|
-
import { handleErrorResponse, SDK_USER_AGENT } from "../../provider-utils.js";
|
|
4
|
-
export const SPEECH_GATEWAY_PROVIDER_ID = "speech-gateway";
|
|
5
|
-
// audioDurationMs computed client-side via mediabunny for path consistency across gateway + direct providers.
|
|
6
|
-
const wordTimestampSchema = z.object({
|
|
7
|
-
text: z.string(),
|
|
8
|
-
start: z.number(),
|
|
9
|
-
end: z.number(),
|
|
10
|
-
});
|
|
11
|
-
const conversationWordTimestampSchema = wordTimestampSchema.extend({
|
|
12
|
-
turnIndex: z.number(),
|
|
13
|
-
});
|
|
14
|
-
const gatewayJsonResponseSchema = z.object({
|
|
15
|
-
audio: z.string(),
|
|
16
|
-
mediaType: z.string(),
|
|
17
|
-
timestamps: z.array(wordTimestampSchema).default([]),
|
|
18
|
-
warnings: z.array(z.string()).default([]),
|
|
19
|
-
});
|
|
20
|
-
const gatewayConversationJsonResponseSchema = z.object({
|
|
21
|
-
audio: z.string(),
|
|
22
|
-
mediaType: z.string(),
|
|
23
|
-
timestamps: z.array(conversationWordTimestampSchema).default([]),
|
|
24
|
-
warnings: z.array(z.string()).default([]),
|
|
25
|
-
providerMetadata: z.record(z.string(), z.unknown()).optional(),
|
|
26
|
-
});
|
|
27
|
-
const GATEWAY_401_MESSAGE = "Speech Gateway rejected your API key (401). Get a key at https://speechbase.ai/ or verify your SPEECHBASE_API_KEY environment variable.";
|
|
28
|
-
function gatewayErrorTarget(modelId) {
|
|
29
|
-
const separator = modelId.indexOf("/");
|
|
30
|
-
if (separator <= 0 || separator === modelId.length - 1) {
|
|
31
|
-
return { provider: SPEECH_GATEWAY_PROVIDER_ID, model: modelId };
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
provider: modelId.slice(0, separator),
|
|
35
|
-
model: modelId.slice(separator + 1),
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
export class SpeechGatewayProvider {
|
|
39
|
-
id = SPEECH_GATEWAY_PROVIDER_ID;
|
|
40
|
-
defaultModel = "";
|
|
41
|
-
// Gateway server is the source of truth for model capabilities; feature checks deferred to the wire.
|
|
42
|
-
models = [];
|
|
43
|
-
apiKey;
|
|
44
|
-
baseURL;
|
|
45
|
-
fetchFn;
|
|
46
|
-
constructor(config) {
|
|
47
|
-
this.apiKey = config.apiKey;
|
|
48
|
-
this.baseURL = config.baseURL ?? "https://api.speechbase.ai/v1";
|
|
49
|
-
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
50
|
-
}
|
|
51
|
-
resolveKey() {
|
|
52
|
-
// SPEECHBASE_API_KEY is the current name; SPEECH_GATEWAY_API_KEY stays as a legacy fallback.
|
|
53
|
-
// `||` (not `??`) so an empty-string value also falls through to the legacy var.
|
|
54
|
-
const envKey = typeof process === "undefined"
|
|
55
|
-
? undefined
|
|
56
|
-
: process.env?.SPEECHBASE_API_KEY ||
|
|
57
|
-
process.env?.SPEECH_GATEWAY_API_KEY;
|
|
58
|
-
const key = this.apiKey ?? envKey;
|
|
59
|
-
if (!key) {
|
|
60
|
-
const err = new MissingApiKeyError({
|
|
61
|
-
providerName: "Speech Gateway",
|
|
62
|
-
envVar: "SPEECHBASE_API_KEY",
|
|
63
|
-
});
|
|
64
|
-
err.message =
|
|
65
|
-
"To use the Speech Gateway, a Speechbase API key is required. Sign up at https://speechbase.ai/ to get a key, then pass it via the `apiKey` option or set the SPEECHBASE_API_KEY environment variable (the legacy SPEECH_GATEWAY_API_KEY is still honored).";
|
|
66
|
-
throw err;
|
|
67
|
-
}
|
|
68
|
-
return key;
|
|
69
|
-
}
|
|
70
|
-
async generate(options) {
|
|
71
|
-
if (!options.voice) {
|
|
72
|
-
throw new GatewayInputError(`speech-gateway/${options.modelId}: "voice" is required when routing through the speech gateway in inline mode.`);
|
|
73
|
-
}
|
|
74
|
-
const body = {
|
|
75
|
-
model: options.modelId,
|
|
76
|
-
voice: options.voice,
|
|
77
|
-
text: options.text,
|
|
78
|
-
};
|
|
79
|
-
if (options.instructions) {
|
|
80
|
-
body.instructions = options.instructions;
|
|
81
|
-
}
|
|
82
|
-
if (options.volumeDbfs != null) {
|
|
83
|
-
body.volumeDbfs = options.volumeDbfs;
|
|
84
|
-
}
|
|
85
|
-
if (options.providerOptions) {
|
|
86
|
-
body.providerOptions = options.providerOptions;
|
|
87
|
-
}
|
|
88
|
-
if (options.output) {
|
|
89
|
-
body.output = options.output;
|
|
90
|
-
}
|
|
91
|
-
if (options.pronunciations) {
|
|
92
|
-
body.pronunciations = options.pronunciations;
|
|
93
|
-
}
|
|
94
|
-
if (options.speed != null) {
|
|
95
|
-
body.speed = options.speed;
|
|
96
|
-
}
|
|
97
|
-
// Binary vs JSON-with-timestamps lives at separate URLs; no Accept-header content negotiation.
|
|
98
|
-
const url = options.includeTimestamps
|
|
99
|
-
? `${this.baseURL}/audio/speech/with-timestamps`
|
|
100
|
-
: `${this.baseURL}/audio/speech`;
|
|
101
|
-
const response = await this.fetchFn(url, {
|
|
102
|
-
method: "POST",
|
|
103
|
-
headers: {
|
|
104
|
-
...options.headers,
|
|
105
|
-
"Content-Type": "application/json",
|
|
106
|
-
Authorization: `Bearer ${this.resolveKey()}`,
|
|
107
|
-
"X-User-Agent": SDK_USER_AGENT,
|
|
108
|
-
},
|
|
109
|
-
body: JSON.stringify(body),
|
|
110
|
-
signal: options.abortSignal,
|
|
111
|
-
});
|
|
112
|
-
await handleErrorResponse(response, {
|
|
113
|
-
...(response.status === 401
|
|
114
|
-
? {
|
|
115
|
-
provider: SPEECH_GATEWAY_PROVIDER_ID,
|
|
116
|
-
model: options.modelId,
|
|
117
|
-
message: GATEWAY_401_MESSAGE,
|
|
118
|
-
}
|
|
119
|
-
: gatewayErrorTarget(options.modelId)),
|
|
120
|
-
});
|
|
121
|
-
if (options.includeTimestamps) {
|
|
122
|
-
const payload = gatewayJsonResponseSchema.parse(await response.json());
|
|
123
|
-
return {
|
|
124
|
-
audio: decodeBase64(payload.audio),
|
|
125
|
-
mediaType: payload.mediaType,
|
|
126
|
-
timestamps: payload.timestamps,
|
|
127
|
-
warnings: payload.warnings,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
131
|
-
return {
|
|
132
|
-
audio: new Uint8Array(arrayBuffer),
|
|
133
|
-
mediaType: mediaTypeFromHeaders(response.headers),
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
async stream(options) {
|
|
137
|
-
if (!options.voice) {
|
|
138
|
-
throw new GatewayInputError(`speech-gateway/${options.modelId}: "voice" is required when routing through the speech gateway in inline mode.`);
|
|
139
|
-
}
|
|
140
|
-
const body = {
|
|
141
|
-
model: options.modelId,
|
|
142
|
-
voice: options.voice,
|
|
143
|
-
text: options.text,
|
|
144
|
-
};
|
|
145
|
-
if (options.instructions) {
|
|
146
|
-
body.instructions = options.instructions;
|
|
147
|
-
}
|
|
148
|
-
if (options.providerOptions) {
|
|
149
|
-
body.providerOptions = options.providerOptions;
|
|
150
|
-
}
|
|
151
|
-
if (options.pronunciations) {
|
|
152
|
-
body.pronunciations = options.pronunciations;
|
|
153
|
-
}
|
|
154
|
-
// Streaming has its own endpoint; /audio/speech is the buffered path (whole-clip).
|
|
155
|
-
const url = `${this.baseURL}/audio/speech/stream`;
|
|
156
|
-
const response = await this.fetchFn(url, {
|
|
157
|
-
method: "POST",
|
|
158
|
-
headers: {
|
|
159
|
-
...options.headers,
|
|
160
|
-
"Content-Type": "application/json",
|
|
161
|
-
Authorization: `Bearer ${this.resolveKey()}`,
|
|
162
|
-
"X-User-Agent": SDK_USER_AGENT,
|
|
163
|
-
},
|
|
164
|
-
body: JSON.stringify(body),
|
|
165
|
-
signal: options.abortSignal,
|
|
166
|
-
});
|
|
167
|
-
await handleErrorResponse(response, {
|
|
168
|
-
...(response.status === 401
|
|
169
|
-
? {
|
|
170
|
-
provider: SPEECH_GATEWAY_PROVIDER_ID,
|
|
171
|
-
model: options.modelId,
|
|
172
|
-
message: GATEWAY_401_MESSAGE,
|
|
173
|
-
}
|
|
174
|
-
: gatewayErrorTarget(options.modelId)),
|
|
175
|
-
});
|
|
176
|
-
if (!response.body) {
|
|
177
|
-
throw new Error(`speech-gateway/${options.modelId}: response has no body`);
|
|
178
|
-
}
|
|
179
|
-
return {
|
|
180
|
-
stream: response.body,
|
|
181
|
-
mediaType: mediaTypeFromHeaders(response.headers),
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
// Server handles stitching/normalization/alignment so callers never need their own STT key.
|
|
185
|
-
// Pick one of two wire shapes — mutually exclusive at the request level:
|
|
186
|
-
// 1. shared model — `modelId` set, every turn omits `model`
|
|
187
|
-
// 2. per-turn model — every turn declares its own `model`, `modelId` omitted (one conversation across providers)
|
|
188
|
-
async generateConversation(options) {
|
|
189
|
-
if (options.turns.length === 0) {
|
|
190
|
-
throw new GatewayInputError("speech-gateway/conversation: at least one turn is required.");
|
|
191
|
-
}
|
|
192
|
-
if (!options.turns.every((t) => t.voice)) {
|
|
193
|
-
throw new GatewayInputError('speech-gateway/conversation: every turn must specify a "voice" when routing through the speech gateway.');
|
|
194
|
-
}
|
|
195
|
-
const sharedModel = options.modelId;
|
|
196
|
-
const anyTurnModel = options.turns.some((t) => t.model != null);
|
|
197
|
-
if (sharedModel != null && anyTurnModel) {
|
|
198
|
-
throw new GatewayInputError("speech-gateway/conversation: pass either a shared `modelId` or per-turn `model` on every turn — not both.");
|
|
199
|
-
}
|
|
200
|
-
if (sharedModel == null && !options.turns.every((t) => t.model)) {
|
|
201
|
-
throw new GatewayInputError('speech-gateway/conversation: when no shared `modelId` is set, every turn must declare its own "model".');
|
|
202
|
-
}
|
|
203
|
-
// gapMs/volumeDbfs sent explicitly each call (don't rely on server defaults).
|
|
204
|
-
const body = {
|
|
205
|
-
...(sharedModel != null && { model: sharedModel }),
|
|
206
|
-
turns: options.turns.map((t) => ({
|
|
207
|
-
...(t.model != null && { model: t.model }),
|
|
208
|
-
voice: t.voice,
|
|
209
|
-
text: t.text,
|
|
210
|
-
...(t.instructions && { instructions: t.instructions }),
|
|
211
|
-
...(t.providerOptions && { providerOptions: t.providerOptions }),
|
|
212
|
-
...(t.speed != null && { speed: t.speed }),
|
|
213
|
-
})),
|
|
214
|
-
gapMs: options.gapMs ?? 300,
|
|
215
|
-
volumeDbfs: options.volumeDbfs ?? -20,
|
|
216
|
-
};
|
|
217
|
-
if (options.providerOptions) {
|
|
218
|
-
body.providerOptions = options.providerOptions;
|
|
219
|
-
}
|
|
220
|
-
if (options.instructions) {
|
|
221
|
-
body.instructions = options.instructions;
|
|
222
|
-
}
|
|
223
|
-
if (options.output) {
|
|
224
|
-
body.output = options.output;
|
|
225
|
-
}
|
|
226
|
-
if (options.pronunciations) {
|
|
227
|
-
body.pronunciations = options.pronunciations;
|
|
228
|
-
}
|
|
229
|
-
if (options.speed != null) {
|
|
230
|
-
body.speed = options.speed;
|
|
231
|
-
}
|
|
232
|
-
const url = options.includeTimestamps
|
|
233
|
-
? `${this.baseURL}/audio/conversation/with-timestamps`
|
|
234
|
-
: `${this.baseURL}/audio/conversation`;
|
|
235
|
-
const response = await this.fetchFn(url, {
|
|
236
|
-
method: "POST",
|
|
237
|
-
headers: {
|
|
238
|
-
...options.headers,
|
|
239
|
-
"Content-Type": "application/json",
|
|
240
|
-
Authorization: `Bearer ${this.resolveKey()}`,
|
|
241
|
-
"X-User-Agent": SDK_USER_AGENT,
|
|
242
|
-
},
|
|
243
|
-
body: JSON.stringify(body),
|
|
244
|
-
signal: options.abortSignal,
|
|
245
|
-
});
|
|
246
|
-
const conversationErrorTarget = sharedModel
|
|
247
|
-
? gatewayErrorTarget(sharedModel)
|
|
248
|
-
: {
|
|
249
|
-
provider: SPEECH_GATEWAY_PROVIDER_ID,
|
|
250
|
-
model: "conversation",
|
|
251
|
-
};
|
|
252
|
-
const conversationErrorContext = response.status === 401
|
|
253
|
-
? {
|
|
254
|
-
provider: SPEECH_GATEWAY_PROVIDER_ID,
|
|
255
|
-
model: sharedModel ?? "conversation",
|
|
256
|
-
message: GATEWAY_401_MESSAGE,
|
|
257
|
-
}
|
|
258
|
-
: conversationErrorTarget;
|
|
259
|
-
await handleErrorResponse(response, conversationErrorContext);
|
|
260
|
-
if (options.includeTimestamps) {
|
|
261
|
-
const payload = gatewayConversationJsonResponseSchema.parse(await response.json());
|
|
262
|
-
return {
|
|
263
|
-
audio: decodeBase64(payload.audio),
|
|
264
|
-
mediaType: payload.mediaType,
|
|
265
|
-
timestamps: payload.timestamps,
|
|
266
|
-
warnings: payload.warnings,
|
|
267
|
-
...(payload.providerMetadata !== undefined && {
|
|
268
|
-
providerMetadata: payload.providerMetadata,
|
|
269
|
-
}),
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
273
|
-
return {
|
|
274
|
-
audio: new Uint8Array(arrayBuffer),
|
|
275
|
-
mediaType: mediaTypeFromHeaders(response.headers),
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
export function createSpeechGateway(config = {}) {
|
|
280
|
-
const provider = new SpeechGatewayProvider(config);
|
|
281
|
-
return function speechGateway(modelId) {
|
|
282
|
-
if (!modelId) {
|
|
283
|
-
throw new GatewayInputError('Speech Gateway requires a model ID (e.g., "openai/gpt-4o-mini-tts"). The gateway routes to upstream providers and has no default model.');
|
|
284
|
-
}
|
|
285
|
-
return { provider, modelId };
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
function mediaTypeFromHeaders(headers) {
|
|
289
|
-
return headers.get("content-type") ?? "audio/mpeg";
|
|
290
|
-
}
|
|
291
|
-
function decodeBase64(value) {
|
|
292
|
-
const binaryString = atob(value);
|
|
293
|
-
const bytes = new Uint8Array(binaryString.length);
|
|
294
|
-
for (let i = 0; i < binaryString.length; i++) {
|
|
295
|
-
bytes[i] = binaryString.charCodeAt(i);
|
|
296
|
-
}
|
|
297
|
-
return bytes;
|
|
298
|
-
}
|
|
299
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/gateway/index.ts"],"names":[],"mappings":"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"}
|