@speech-sdk/core 0.6.2 → 0.8.0-alpha
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 +202 -21
- package/README.md +267 -264
- package/dist/__tests__/e2e/_save-audio.d.ts +5 -24
- package/dist/__tests__/e2e/_save-audio.d.ts.map +1 -1
- package/dist/__tests__/e2e/_save-audio.js +19 -42
- package/dist/__tests__/e2e/_save-audio.js.map +1 -1
- package/dist/audio-duration.d.ts +0 -5
- package/dist/audio-duration.d.ts.map +1 -1
- package/dist/audio-duration.js +3 -10
- package/dist/audio-duration.js.map +1 -1
- package/dist/audio-utils.d.ts +1 -9
- package/dist/audio-utils.d.ts.map +1 -1
- package/dist/audio-utils.js +10 -13
- package/dist/audio-utils.js.map +1 -1
- package/dist/captions.d.ts +29 -0
- package/dist/captions.d.ts.map +1 -0
- package/dist/captions.js +193 -0
- package/dist/captions.js.map +1 -0
- package/dist/conversation/attribute-timestamps.d.ts +26 -0
- package/dist/conversation/attribute-timestamps.d.ts.map +1 -0
- package/dist/conversation/attribute-timestamps.js +276 -0
- package/dist/conversation/attribute-timestamps.js.map +1 -0
- package/dist/conversation/dispatch.d.ts +5 -5
- package/dist/conversation/dispatch.d.ts.map +1 -1
- package/dist/conversation/dispatch.js +18 -8
- package/dist/conversation/dispatch.js.map +1 -1
- package/dist/conversation/errors.d.ts +3 -0
- package/dist/conversation/errors.d.ts.map +1 -1
- package/dist/conversation/errors.js +6 -0
- package/dist/conversation/errors.js.map +1 -1
- package/dist/conversation/pcm-concat.d.ts +0 -23
- package/dist/conversation/pcm-concat.d.ts.map +1 -1
- package/dist/conversation/pcm-concat.js +5 -43
- package/dist/conversation/pcm-concat.js.map +1 -1
- package/dist/conversation/proportional-fill.d.ts +10 -0
- package/dist/conversation/proportional-fill.d.ts.map +1 -0
- package/dist/conversation/proportional-fill.js +64 -0
- package/dist/conversation/proportional-fill.js.map +1 -0
- package/dist/conversation/silence-detection.d.ts +14 -0
- package/dist/conversation/silence-detection.d.ts.map +1 -0
- package/dist/conversation/silence-detection.js +52 -0
- package/dist/conversation/silence-detection.js.map +1 -0
- package/dist/conversation/stitch.d.ts +3 -1
- package/dist/conversation/stitch.d.ts.map +1 -1
- package/dist/conversation/stitch.js +54 -13
- package/dist/conversation/stitch.js.map +1 -1
- package/dist/conversation/types.d.ts +1 -19
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/conversation/validate.d.ts +1 -16
- package/dist/conversation/validate.d.ts.map +1 -1
- package/dist/conversation/validate.js +29 -29
- package/dist/conversation/validate.js.map +1 -1
- package/dist/default-stt-fallback.d.ts +3 -0
- package/dist/default-stt-fallback.d.ts.map +1 -0
- package/dist/default-stt-fallback.js +11 -0
- package/dist/default-stt-fallback.js.map +1 -0
- package/dist/derive-timestamps.d.ts +10 -0
- package/dist/derive-timestamps.d.ts.map +1 -0
- package/dist/derive-timestamps.js +24 -0
- package/dist/derive-timestamps.js.map +1 -0
- package/dist/errors.d.ts +20 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +28 -2
- package/dist/errors.js.map +1 -1
- package/dist/generate-conversation.d.ts +5 -4
- package/dist/generate-conversation.d.ts.map +1 -1
- package/dist/generate-conversation.js +191 -38
- package/dist/generate-conversation.js.map +1 -1
- package/dist/generate-speech.d.ts +2 -10
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +111 -33
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +5 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +29 -0
- package/dist/logger.js.map +1 -0
- package/dist/metadata.d.ts +0 -22
- package/dist/metadata.d.ts.map +1 -1
- package/dist/provider-utils.d.ts +3 -1
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +36 -39
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/cartesia/alignment.d.ts +8 -0
- package/dist/providers/cartesia/alignment.d.ts.map +1 -0
- package/dist/providers/cartesia/alignment.js +18 -0
- package/dist/providers/cartesia/alignment.js.map +1 -0
- package/dist/providers/cartesia/index.d.ts +11 -13
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +184 -61
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts +7 -8
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +17 -18
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/alignment.d.ts +10 -0
- package/dist/providers/elevenlabs/alignment.d.ts.map +1 -0
- package/dist/providers/elevenlabs/alignment.js +47 -0
- package/dist/providers/elevenlabs/alignment.js.map +1 -0
- package/dist/providers/elevenlabs/index.d.ts +10 -26
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +216 -154
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts +7 -43
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +37 -86
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts +7 -8
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +23 -19
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/gateway/index.d.ts +68 -0
- package/dist/providers/gateway/index.d.ts.map +1 -0
- package/dist/providers/gateway/index.js +236 -0
- package/dist/providers/gateway/index.js.map +1 -0
- package/dist/providers/google/index.d.ts +7 -20
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +161 -151
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/hume/alignment.d.ts +33 -0
- package/dist/providers/hume/alignment.d.ts.map +1 -0
- package/dist/providers/hume/alignment.js +37 -0
- package/dist/providers/hume/alignment.js.map +1 -0
- package/dist/providers/hume/index.d.ts +11 -13
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +105 -41
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/inworld/alignment.d.ts +11 -0
- package/dist/providers/inworld/alignment.d.ts.map +1 -0
- package/dist/providers/inworld/alignment.js +24 -0
- package/dist/providers/inworld/alignment.js.map +1 -0
- package/dist/providers/inworld/index.d.ts +10 -14
- package/dist/providers/inworld/index.d.ts.map +1 -1
- package/dist/providers/inworld/index.js +55 -38
- package/dist/providers/inworld/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts +7 -8
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +39 -38
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/alignment.d.ts +13 -0
- package/dist/providers/murf/alignment.d.ts.map +1 -0
- package/dist/providers/murf/alignment.js +22 -0
- package/dist/providers/murf/alignment.js.map +1 -0
- package/dist/providers/murf/index.d.ts +11 -13
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +73 -56
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts +36 -20
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +270 -102
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/alignment.d.ts +11 -0
- package/dist/providers/resemble/alignment.d.ts.map +1 -0
- package/dist/providers/resemble/alignment.js +54 -0
- package/dist/providers/resemble/alignment.js.map +1 -0
- package/dist/providers/resemble/index.d.ts +10 -8
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +58 -40
- package/dist/providers/resemble/index.js.map +1 -1
- package/dist/providers/xai/index.d.ts +7 -9
- package/dist/providers/xai/index.d.ts.map +1 -1
- package/dist/providers/xai/index.js +37 -40
- package/dist/providers/xai/index.js.map +1 -1
- package/dist/providers.d.ts +29 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +15 -0
- package/dist/providers.js.map +1 -0
- package/dist/resolve-provider.d.ts.map +1 -1
- package/dist/resolve-provider.js +7 -59
- package/dist/resolve-provider.js.map +1 -1
- package/dist/speech-provider.d.ts +19 -15
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-provider.js +9 -14
- package/dist/speech-provider.js.map +1 -1
- package/dist/speech-result.d.ts +5 -0
- package/dist/speech-result.d.ts.map +1 -1
- package/dist/speech-result.js.map +1 -1
- package/dist/speech-to-text-provider.d.ts +28 -0
- package/dist/speech-to-text-provider.d.ts.map +1 -0
- package/dist/speech-to-text-provider.js +2 -0
- package/dist/speech-to-text-provider.js.map +1 -0
- package/dist/stream-speech.d.ts.map +1 -1
- package/dist/stream-speech.js +2 -3
- package/dist/stream-speech.js.map +1 -1
- package/dist/timestamps.d.ts +9 -0
- package/dist/timestamps.d.ts.map +1 -0
- package/dist/timestamps.js +2 -0
- package/dist/timestamps.js.map +1 -0
- package/dist/turns.d.ts +9 -0
- package/dist/turns.d.ts.map +1 -0
- package/dist/turns.js +21 -0
- package/dist/turns.js.map +1 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/volume-adjust.d.ts +0 -6
- package/dist/volume-adjust.d.ts.map +1 -1
- package/dist/volume-adjust.js +0 -6
- package/dist/volume-adjust.js.map +1 -1
- package/package.json +12 -63
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,cAAc;IACjC,UAAU,CAAS;IACnB,YAAY,CAAW;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,cAAc;IACjC,UAAU,CAAS;IACnB,YAAY,CAAW;IAChC,qEAAqE;IAC5D,IAAI,CAAU;IAEvB,YACE,OAAe,EACf,OAKC;QAED,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,IAAI,gCAAgC,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,cAAc;IAC5D,YAAY,KAAa;QACvB,KAAK,CACH,iCAAiC,KAAK,iCAAiC,CACxE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,gCAAiC,SAAQ,cAAc;IAClE,YAAY,KAAa;QACvB,KAAK,CACH,kCAAkC,KAAK,gEAAgE,CACxG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;IACjD,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,cAAc;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IAC3C,YAAY,CAAS;IACrB,MAAM,CAAS;IAExB,YAAY,OAAiD;QAC3D,KAAK,CACH,GAAG,OAAO,CAAC,YAAY,8DAA8D,OAAO,CAAC,MAAM,wBAAwB,CAC5H,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,cAAc;IAC1D,YAAY,OAIX;QACC,KAAK,CACH,GAAG,OAAO,CAAC,QAAQ,6CAA6C;YAC9D,OAAO,OAAO,CAAC,MAAM,uBAAuB,OAAO,CAAC,WAAW,aAAa;YAC5E,2DAA2D;YAC3D,qGAAqG,CACxG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { GenerateConversationOptions } from "./conversation/types.js";
|
|
2
|
-
import type
|
|
3
|
-
import type {
|
|
4
|
-
export { ConversationInputError, DialogueConstraintError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
2
|
+
import { type Voice } from "./speech-provider.js";
|
|
3
|
+
import type { ConversationResult } from "./speech-result.js";
|
|
4
|
+
export { ConversationInputError, DialogueConstraintError, MixedDispatchError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
5
5
|
export type { ConversationTurn, GenerateConversationOptions, } from "./conversation/types.js";
|
|
6
|
-
export
|
|
6
|
+
export type { ConversationResult } from "./speech-result.js";
|
|
7
|
+
export declare function generateConversation<V extends Voice = Voice>(options: GenerateConversationOptions<V>): Promise<ConversationResult>;
|
|
7
8
|
//# sourceMappingURL=generate-conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-conversation.d.ts","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"generate-conversation.d.ts","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,yBAAyB,CAAC;AAUjC,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAK7D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAM7D,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAChE,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAwG7B"}
|
|
@@ -3,34 +3,63 @@ import { computeAudioDuration } from "./audio-duration.js";
|
|
|
3
3
|
import { chooseConversationPath } from "./conversation/dispatch.js";
|
|
4
4
|
import { ConversationInputError } from "./conversation/errors.js";
|
|
5
5
|
import { validateConversationInput } from "./conversation/validate.js";
|
|
6
|
+
import { getDefaultSTTFallback } from "./default-stt-fallback.js";
|
|
7
|
+
import { deriveTimestampsViaSTT } from "./derive-timestamps.js";
|
|
6
8
|
import { ApiError, NoSpeechGeneratedError } from "./errors.js";
|
|
9
|
+
import { debug } from "./logger.js";
|
|
10
|
+
import { isRetriableApiError } from "./provider-utils.js";
|
|
7
11
|
import { resolveModel } from "./resolve-provider.js";
|
|
12
|
+
import { modelDeclaresNativeTimestamps, } from "./speech-provider.js";
|
|
8
13
|
import { DefaultGeneratedAudioFile } from "./speech-result.js";
|
|
9
14
|
// biome-ignore lint/performance/noBarrelFile: public entry point — re-export error classes so callers get fn + types + errors from one import
|
|
10
|
-
export { ConversationInputError, DialogueConstraintError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
15
|
+
export { ConversationInputError, DialogueConstraintError, MixedDispatchError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
11
16
|
const DEFAULT_GAP_MS = 300;
|
|
12
17
|
const DEFAULT_MAX_CONCURRENCY = 6;
|
|
13
18
|
const DEFAULT_MAX_RETRIES = 2;
|
|
14
19
|
export async function generateConversation(options) {
|
|
15
20
|
validateConversationInput(options);
|
|
21
|
+
// Cache string-model resolutions so turns share one provider instance — dispatch compares by reference.
|
|
22
|
+
const stringResolutionCache = new Map();
|
|
23
|
+
const resolveOnce = (model) => {
|
|
24
|
+
if (typeof model !== "string") {
|
|
25
|
+
return resolveModel(model, {
|
|
26
|
+
apiKey: options.apiKey,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const cached = stringResolutionCache.get(model);
|
|
30
|
+
if (cached) {
|
|
31
|
+
return cached;
|
|
32
|
+
}
|
|
33
|
+
const fresh = resolveModel(model, {
|
|
34
|
+
apiKey: options.apiKey,
|
|
35
|
+
});
|
|
36
|
+
stringResolutionCache.set(model, fresh);
|
|
37
|
+
return fresh;
|
|
38
|
+
};
|
|
39
|
+
const topLevelResolved = options.model == null ? undefined : resolveOnce(options.model);
|
|
16
40
|
const resolvedPerTurn = options.turns.map((turn) => {
|
|
17
|
-
|
|
41
|
+
if (turn.model == null && topLevelResolved) {
|
|
42
|
+
return topLevelResolved;
|
|
43
|
+
}
|
|
44
|
+
const model = turn.model;
|
|
18
45
|
if (!model) {
|
|
19
46
|
throw new Error("generateConversation: model is required");
|
|
20
47
|
}
|
|
21
|
-
return
|
|
48
|
+
return resolveOnce(model);
|
|
22
49
|
});
|
|
23
50
|
const path = chooseConversationPath({
|
|
24
51
|
resolvedPerTurn,
|
|
25
52
|
turns: options.turns,
|
|
26
53
|
});
|
|
54
|
+
if (path.kind === "gateway") {
|
|
55
|
+
return await runGateway({
|
|
56
|
+
options,
|
|
57
|
+
resolvedPerTurn: path.resolvedPerTurn,
|
|
58
|
+
maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
27
61
|
if (path.kind === "native") {
|
|
28
|
-
//
|
|
29
|
-
// API call, so per-turn providerOptions have no well-defined meaning —
|
|
30
|
-
// silently collapsing them to a single blob would lie to the caller. Fail
|
|
31
|
-
// loudly and let them move providerOptions to the top level (where it's
|
|
32
|
-
// forwarded once to the dialogue call) or pick a model that routes
|
|
33
|
-
// through the stitch path.
|
|
62
|
+
// Native-dialogue is one API call; per-turn providerOptions can't be honored — fail loudly.
|
|
34
63
|
const turnWithOpts = options.turns.findIndex((t) => t.providerOptions !== undefined);
|
|
35
64
|
if (turnWithOpts !== -1) {
|
|
36
65
|
throw new ConversationInputError(`turns[${turnWithOpts}].providerOptions is set, but ${path.resolved.provider.id}/${path.resolved.modelId} dispatched to the native dialogue path, which renders all turns in one API call. Per-turn providerOptions are not supported on this path; move them to the top-level providerOptions instead.`);
|
|
@@ -41,9 +70,7 @@ export async function generateConversation(options) {
|
|
|
41
70
|
maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
|
|
42
71
|
});
|
|
43
72
|
}
|
|
44
|
-
// Lazy-load
|
|
45
|
-
// native (e.g. a Jellypod gateway provider that handles concatenation
|
|
46
|
-
// server-side) never bundle pcm-concat / audio-utils / mediabunny WAV mux.
|
|
73
|
+
// Lazy-load so native-only callers don't bundle pcm-concat / mediabunny.
|
|
47
74
|
const { runStitch } = await import("./conversation/stitch.js");
|
|
48
75
|
const stitched = await runStitch({
|
|
49
76
|
resolvedPerTurn,
|
|
@@ -54,21 +81,17 @@ export async function generateConversation(options) {
|
|
|
54
81
|
gapMs: options.gapMs ?? DEFAULT_GAP_MS,
|
|
55
82
|
maxConcurrency: options.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY,
|
|
56
83
|
maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
|
|
57
|
-
normalizeVolume: options.normalizeVolume ?? true,
|
|
58
84
|
volumeDbfs: options.volumeDbfs,
|
|
59
85
|
abortSignal: options.abortSignal,
|
|
60
86
|
headers: options.headers,
|
|
87
|
+
timestamps: options.timestamps ?? false,
|
|
61
88
|
});
|
|
62
89
|
if (stitched.audio.length === 0) {
|
|
63
90
|
throw new NoSpeechGeneratedError();
|
|
64
91
|
}
|
|
65
|
-
const providers = Array.from(new Set(resolvedPerTurn.map((r) => r.provider.id)));
|
|
66
|
-
const models = Array.from(new Set(resolvedPerTurn.map((r) => r.modelId)));
|
|
67
92
|
const metadata = {
|
|
68
93
|
latencyMs: stitched.metadata.latencyMs,
|
|
69
94
|
inputChars: stitched.metadata.inputChars,
|
|
70
|
-
provider: providers.length === 1 ? providers[0] : providers.join(","),
|
|
71
|
-
model: models.length === 1 ? models[0] : models.join(","),
|
|
72
95
|
...(stitched.metadata.audioDurationMs != null && {
|
|
73
96
|
audioDurationMs: stitched.metadata.audioDurationMs,
|
|
74
97
|
}),
|
|
@@ -81,6 +104,76 @@ export async function generateConversation(options) {
|
|
|
81
104
|
metadata,
|
|
82
105
|
providerMetadata: { turns: stitched.providerMetadataPerTurn },
|
|
83
106
|
warnings: stitched.warnings.length > 0 ? [...stitched.warnings] : undefined,
|
|
107
|
+
timestamps: stitched.timestamps,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async function runGateway(args) {
|
|
111
|
+
const { options, resolvedPerTurn, maxRetries } = args;
|
|
112
|
+
const start = performance.now();
|
|
113
|
+
const provider = resolvedPerTurn[0]
|
|
114
|
+
.provider;
|
|
115
|
+
const includeTimestamps = options.timestamps ?? false;
|
|
116
|
+
// Pick wire shape: shared model when every turn resolved to the same modelId
|
|
117
|
+
// (covers both `options.model` and the case where every turn happened to
|
|
118
|
+
// resolve identically); per-turn model when they diverge.
|
|
119
|
+
const firstModelId = resolvedPerTurn[0].modelId;
|
|
120
|
+
const allSameModel = resolvedPerTurn.every((r) => r.modelId === firstModelId);
|
|
121
|
+
// Object-shaped voices aren't supported on the gateway conversation path.
|
|
122
|
+
const wireTurns = options.turns.map((t, i) => {
|
|
123
|
+
if (typeof t.voice !== "string") {
|
|
124
|
+
throw new Error(`speech-gateway/conversation: gateway conversation path requires string voices; turns[${i}].voice is an object.`);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
...(allSameModel ? {} : { model: resolvedPerTurn[i].modelId }),
|
|
128
|
+
voice: t.voice,
|
|
129
|
+
text: t.text,
|
|
130
|
+
...(t.providerOptions && { providerOptions: t.providerOptions }),
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
const result = await pRetry(() => provider.generateConversation({
|
|
134
|
+
...(allSameModel && { modelId: firstModelId }),
|
|
135
|
+
turns: wireTurns,
|
|
136
|
+
gapMs: options.gapMs ?? DEFAULT_GAP_MS,
|
|
137
|
+
volumeDbfs: options.volumeDbfs,
|
|
138
|
+
providerOptions: options.providerOptions,
|
|
139
|
+
abortSignal: options.abortSignal,
|
|
140
|
+
headers: options.headers,
|
|
141
|
+
includeTimestamps,
|
|
142
|
+
}), {
|
|
143
|
+
retries: maxRetries,
|
|
144
|
+
signal: options.abortSignal,
|
|
145
|
+
shouldRetry: ({ error }) => {
|
|
146
|
+
if (error instanceof ApiError && !isRetriableApiError(error)) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
const latencyMs = Math.round(performance.now() - start);
|
|
153
|
+
if (result.audio.length === 0) {
|
|
154
|
+
throw new NoSpeechGeneratedError();
|
|
155
|
+
}
|
|
156
|
+
const audio = new DefaultGeneratedAudioFile({
|
|
157
|
+
data: result.audio,
|
|
158
|
+
mediaType: result.mediaType,
|
|
159
|
+
});
|
|
160
|
+
const audioDurationMs = await computeAudioDuration(audio.uint8Array, result.mediaType);
|
|
161
|
+
const timestamps = includeTimestamps ? (result.timestamps ?? []) : undefined;
|
|
162
|
+
const warnings = result.warnings;
|
|
163
|
+
const inputChars = options.turns.reduce((n, t) => n + t.text.length, 0);
|
|
164
|
+
const metadata = {
|
|
165
|
+
latencyMs,
|
|
166
|
+
inputChars,
|
|
167
|
+
...(audioDurationMs != null && { audioDurationMs }),
|
|
168
|
+
};
|
|
169
|
+
return {
|
|
170
|
+
audio,
|
|
171
|
+
metadata,
|
|
172
|
+
...(result.providerMetadata !== undefined && {
|
|
173
|
+
providerMetadata: result.providerMetadata,
|
|
174
|
+
}),
|
|
175
|
+
timestamps,
|
|
176
|
+
warnings: warnings && warnings.length > 0 ? warnings : undefined,
|
|
84
177
|
};
|
|
85
178
|
}
|
|
86
179
|
async function runNative(args) {
|
|
@@ -90,37 +183,41 @@ async function runNative(args) {
|
|
|
90
183
|
throw new Error(`generateConversation: ${resolved.provider.id}/${resolved.modelId} dispatched to native but generateDialogue missing`);
|
|
91
184
|
}
|
|
92
185
|
const generateDialogue = resolved.provider.generateDialogue.bind(resolved.provider);
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
// mode so we can re-RMS-level the output. Otherwise the dialogue runs
|
|
96
|
-
// unchanged and emerges in whatever format the provider mixes natively
|
|
97
|
-
// (often MP3) — we surface that via a warning.
|
|
98
|
-
const normalize = options.normalizeVolume ?? true;
|
|
99
|
-
const stitchOpts = normalize
|
|
100
|
-
? resolved.provider.getStitchOptions?.(resolved.modelId)
|
|
101
|
-
: undefined;
|
|
186
|
+
// Force decodable PCM/WAV via getStitchOptions for normalization; if unavailable, emit the provider's mixed audio and warn.
|
|
187
|
+
const stitchOpts = resolved.provider.getStitchOptions?.(resolved.modelId);
|
|
102
188
|
const warnings = [];
|
|
103
|
-
if (
|
|
104
|
-
warnings.push(`${resolved.provider.id}/${resolved.modelId}: native dialogue path returns the provider's mixed audio without volume normalization
|
|
189
|
+
if (!stitchOpts) {
|
|
190
|
+
warnings.push(`${resolved.provider.id}/${resolved.modelId}: native dialogue path returns the provider's mixed audio without volume normalization (no decodable PCM/WAV mode).`);
|
|
105
191
|
}
|
|
106
|
-
// Stitch
|
|
107
|
-
// providerOptions that would otherwise break the decoder (e.g. a caller
|
|
108
|
-
// requesting `response_format: "mp3"` while normalization is on). Same
|
|
109
|
-
// precedence as the stitch path's per-turn merge.
|
|
192
|
+
// Stitch options must win — caller-supplied response_format would break the decoder.
|
|
110
193
|
const dialogueProviderOptions = stitchOpts
|
|
111
194
|
? { ...options.providerOptions, ...stitchOpts.providerOptions }
|
|
112
195
|
: options.providerOptions;
|
|
196
|
+
const requestTimestamps = options.timestamps ?? false;
|
|
197
|
+
const hasNativeDialogueTimestamps = modelDeclaresNativeTimestamps(resolved);
|
|
198
|
+
const shouldRequestNative = requestTimestamps && hasNativeDialogueTimestamps;
|
|
199
|
+
const dialogueId = `${resolved.provider.id}/${resolved.modelId}`;
|
|
200
|
+
if (!requestTimestamps) {
|
|
201
|
+
debug(`${dialogueId} (dialogue): timestamps: false — skipping alignment.`);
|
|
202
|
+
}
|
|
203
|
+
else if (shouldRequestNative) {
|
|
204
|
+
debug(`${dialogueId} (dialogue): timestamps: true — requesting native dialogue alignment.`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
debug(`${dialogueId} (dialogue): timestamps: true but no native dialogue alignment — will transcribe mixed audio via STT after rendering (adds a round-trip).`);
|
|
208
|
+
}
|
|
113
209
|
const result = await pRetry(() => generateDialogue({
|
|
114
210
|
modelId: resolved.modelId,
|
|
115
211
|
turns: options.turns.map((t) => ({ voice: t.voice, text: t.text })),
|
|
116
212
|
providerOptions: dialogueProviderOptions,
|
|
117
213
|
abortSignal: options.abortSignal,
|
|
118
214
|
headers: options.headers,
|
|
215
|
+
includeTimestamps: shouldRequestNative,
|
|
119
216
|
}), {
|
|
120
217
|
retries: maxRetries,
|
|
121
218
|
signal: options.abortSignal,
|
|
122
219
|
shouldRetry: ({ error }) => {
|
|
123
|
-
if (error instanceof ApiError && error
|
|
220
|
+
if (error instanceof ApiError && !isRetriableApiError(error)) {
|
|
124
221
|
return false;
|
|
125
222
|
}
|
|
126
223
|
return true;
|
|
@@ -131,8 +228,7 @@ async function runNative(args) {
|
|
|
131
228
|
throw new NoSpeechGeneratedError();
|
|
132
229
|
}
|
|
133
230
|
let audioBytes = result.audio;
|
|
134
|
-
//
|
|
135
|
-
// some providers (e.g. Hume) omit the sample rate from content-type.
|
|
231
|
+
// Hume and others omit sample rate from content-type; prefer stitch mediaType.
|
|
136
232
|
let outputMediaType = stitchOpts?.mediaType ?? result.mediaType;
|
|
137
233
|
if (stitchOpts) {
|
|
138
234
|
const { adjustVolume } = await import("./volume-adjust.js");
|
|
@@ -149,19 +245,76 @@ async function runNative(args) {
|
|
|
149
245
|
});
|
|
150
246
|
const computedDuration = await computeAudioDuration(audio.uint8Array, outputMediaType);
|
|
151
247
|
const audioDurationMs = computedDuration ?? result.audioDurationMs;
|
|
248
|
+
const { timestamps, warnings: attributionWarnings } = await resolveNativeDialogueTimestamps({
|
|
249
|
+
requestTimestamps,
|
|
250
|
+
nativeTimestamps: result.timestamps,
|
|
251
|
+
audio: audio.uint8Array,
|
|
252
|
+
mediaType: outputMediaType,
|
|
253
|
+
ttsModel: `${resolved.provider.id}/${resolved.modelId}`,
|
|
254
|
+
resolved,
|
|
255
|
+
abortSignal: options.abortSignal,
|
|
256
|
+
turns: options.turns,
|
|
257
|
+
});
|
|
152
258
|
const inputChars = options.turns.reduce((n, t) => n + t.text.length, 0);
|
|
153
259
|
const metadata = {
|
|
154
260
|
latencyMs,
|
|
155
261
|
inputChars,
|
|
156
|
-
provider: resolved.provider.id,
|
|
157
|
-
model: resolved.modelId,
|
|
158
262
|
...(audioDurationMs != null && { audioDurationMs }),
|
|
159
263
|
};
|
|
264
|
+
const mergedWarnings = warnings.length > 0 || attributionWarnings.length > 0
|
|
265
|
+
? [...warnings, ...attributionWarnings]
|
|
266
|
+
: undefined;
|
|
160
267
|
return {
|
|
161
268
|
audio,
|
|
162
269
|
metadata,
|
|
163
270
|
providerMetadata: result.providerMetadata,
|
|
164
|
-
warnings:
|
|
271
|
+
warnings: mergedWarnings,
|
|
272
|
+
timestamps,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
async function resolveNativeDialogueTimestamps(args) {
|
|
276
|
+
if (!args.requestTimestamps) {
|
|
277
|
+
return { timestamps: undefined, warnings: [] };
|
|
278
|
+
}
|
|
279
|
+
// Either use native flat timestamps, or derive via STT fallback.
|
|
280
|
+
let flatTimestamps;
|
|
281
|
+
if (args.nativeTimestamps && args.nativeTimestamps.length > 0) {
|
|
282
|
+
flatTimestamps = args.nativeTimestamps;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
const fallback = args.resolved.fallbackSTT ?? (await getDefaultSTTFallback());
|
|
286
|
+
flatTimestamps = await deriveTimestampsViaSTT({
|
|
287
|
+
ttsModel: args.ttsModel,
|
|
288
|
+
audio: args.audio,
|
|
289
|
+
mediaType: args.mediaType,
|
|
290
|
+
timestampFallback: fallback,
|
|
291
|
+
abortSignal: args.abortSignal,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
const { decodeToPcm16 } = await import("./conversation/pcm-concat.js");
|
|
295
|
+
const { detectSilenceGaps } = await import("./conversation/silence-detection.js");
|
|
296
|
+
const { attributeTimestamps } = await import("./conversation/attribute-timestamps.js");
|
|
297
|
+
let silenceGaps = [];
|
|
298
|
+
try {
|
|
299
|
+
const segment = decodeToPcm16(args.audio, args.mediaType);
|
|
300
|
+
const gaps = detectSilenceGaps(segment.pcm, {
|
|
301
|
+
sampleRate: segment.sampleRate,
|
|
302
|
+
minDurationMs: 150,
|
|
303
|
+
});
|
|
304
|
+
silenceGaps = gaps;
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// Decoder couldn't read the audio (e.g., compressed format we can't decode locally).
|
|
308
|
+
// Tier 1 will be skipped; dispatcher falls through to Tier 2/3.
|
|
309
|
+
}
|
|
310
|
+
const result = attributeTimestamps({
|
|
311
|
+
timestamps: flatTimestamps,
|
|
312
|
+
turnTexts: args.turns.map((t) => t.text),
|
|
313
|
+
silenceGaps,
|
|
314
|
+
});
|
|
315
|
+
return {
|
|
316
|
+
timestamps: result.timestamps,
|
|
317
|
+
warnings: result.warnings,
|
|
165
318
|
};
|
|
166
319
|
}
|
|
167
320
|
//# sourceMappingURL=generate-conversation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-conversation.js","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-conversation.js","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,6BAA6B,GAG9B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,8IAA8I;AAC9I,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAOlC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAuC;IAEvC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEnC,wGAAwG;IACxG,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClE,MAAM,WAAW,GAAG,CAAC,KAAgC,EAAoB,EAAE;QACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC,KAAK,EAAE;gBACzB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAqB,CAAC;QACzB,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAqB,CAAC;QACvB,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,gBAAgB,GACpB,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,eAAe,GAAuB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACrE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,gBAAgB,EAAE,CAAC;YAC3C,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,sBAAsB,CAAC;QAClC,eAAe;QACf,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,MAAM,UAAU,CAAC;YACtB,OAAO;YACP,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB;SACtD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,4FAA4F;QAC5F,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,SAAS,CACvC,CAAC;QACF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAsB,CAC9B,SAAS,YAAY,iCAAiC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,gMAAgM,CACzS,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,SAAS,CAAC;YACrB,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB;SACtD,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;QAC/B,eAAe;QACf,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,uBAAuB,EAAE,OAAO,CAAC,eAAe;QAChD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,uBAAuB;QACjE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB;QACrD,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;KACxC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAmB;QAC/B,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;QACtC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU;QACxC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,IAAI;YAC/C,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,eAAe;SACnD,CAAC;KACH,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,IAAI,yBAAyB,CAAC;YACnC,IAAI,EAAE,QAAQ,CAAC,KAAK;YACpB,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC;QACF,QAAQ;QACR,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,uBAAuB,EAAE;QAC7D,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAkB,IAI1C;IACC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC;SAChC,QAA4C,CAAC;IAEhD,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;IAEtD,6EAA6E;IAC7E,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;IAE9E,0EAA0E;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,wFAAwF,CAAC,uBAAuB,CACjH,CAAC;QACJ,CAAC;QACD,OAAO;YACL,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAC9D,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,GAAG,EAAE,CACH,QAAQ,CAAC,oBAAoB,CAAC;QAC5B,GAAG,CAAC,YAAY,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC9C,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,cAAc;QACtC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,iBAAiB;KAClB,CAAC,EACJ;QACE,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,OAAO,CAAC,WAAW;QAC3B,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,IAAI,KAAK,YAAY,QAAQ,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAExD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,yBAAyB,CAAC;QAC1C,IAAI,EAAE,MAAM,CAAC,KAAK;QAClB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAChD,KAAK,CAAC,UAAU,EAChB,MAAM,CAAC,SAAS,CACjB,CAAC;IAEF,MAAM,UAAU,GACd,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,QAAQ,GAAmB;QAC/B,SAAS;QACT,UAAU;QACV,GAAG,CAAC,eAAe,IAAI,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC;KACpD,CAAC;IAEF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,GAAG,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,IAAI;YAC3C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;SAC1C,CAAC;QACF,UAAU;QACV,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACjE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAkB,IAIzC;IACC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEhC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,oDAAoD,CACtH,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAC9D,QAAQ,CAAC,QAAQ,CAClB,CAAC;IAEF,4HAA4H;IAC5H,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CACX,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,qHAAqH,CACjK,CAAC;IACJ,CAAC;IAED,qFAAqF;IACrF,MAAM,uBAAuB,GAAG,UAAU;QACxC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,UAAU,CAAC,eAAe,EAAE;QAC/D,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAE5B,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;IACtD,MAAM,2BAA2B,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IAC5E,MAAM,mBAAmB,GAAG,iBAAiB,IAAI,2BAA2B,CAAC;IAE7E,MAAM,UAAU,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;IACjE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,UAAU,sDAAsD,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,mBAAmB,EAAE,CAAC;QAC/B,KAAK,CACH,GAAG,UAAU,uEAAuE,CACrF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CACH,GAAG,UAAU,2IAA2I,CACzJ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,GAAG,EAAE,CACH,gBAAgB,CAAC;QACf,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,eAAe,EAAE,uBAAuB;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,iBAAiB,EAAE,mBAAmB;KACvC,CAAC,EACJ;QACE,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,OAAO,CAAC,WAAW;QAC3B,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,IAAI,KAAK,YAAY,QAAQ,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAExD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,UAAU,GAAwB,MAAM,CAAC,KAAK,CAAC;IACnD,+EAA+E;IAC/E,IAAI,eAAe,GAAG,UAAU,EAAE,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAEhE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,UAAU,GAAG,MAAM,YAAY,CAAC;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE;SACtC,CAAC,CAAC;QACH,eAAe,GAAG,WAAW,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,yBAAyB,CAAC;QAC1C,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,MAAM,oBAAoB,CACjD,KAAK,CAAC,UAAU,EAChB,eAAe,CAChB,CAAC;IACF,MAAM,eAAe,GAAG,gBAAgB,IAAI,MAAM,CAAC,eAAe,CAAC;IAEnE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GACjD,MAAM,+BAA+B,CAAC;QACpC,iBAAiB;QACjB,gBAAgB,EAAE,MAAM,CAAC,UAAU;QACnC,KAAK,EAAE,KAAK,CAAC,UAAU;QACvB,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE;QACvD,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEL,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAExE,MAAM,QAAQ,GAAmB;QAC/B,SAAS;QACT,UAAU;QACV,GAAG,CAAC,eAAe,IAAI,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC;KACpD,CAAC;IAEF,MAAM,cAAc,GAClB,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC;QACnD,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,mBAAmB,CAAC;QACvC,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,KAAK;QACL,QAAQ;QACR,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,QAAQ,EAAE,cAAc;QACxB,UAAU;KACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,+BAA+B,CAAkB,IAS/D;IAIC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IAED,iEAAiE;IACjE,IAAI,cAAwC,CAAC;IAC7C,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC,CAAC;QAC/D,cAAc,GAAG,MAAM,sBAAsB,CAAC;YAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,iBAAiB,EAAE,QAAQ;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACvE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CACxC,qCAAqC,CACtC,CAAC;IACF,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAC1C,wCAAwC,CACzC,CAAC;IAEF,IAAI,WAAW,GACb,EAAE,CAAC;IACL,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QACH,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,qFAAqF;QACrF,gEAAgE;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC;QACjC,UAAU,EAAE,cAAc;QAC1B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ResolvedModel, type Voice } from "./speech-provider.js";
|
|
2
2
|
import type { SpeechResult } from "./speech-result.js";
|
|
3
3
|
export declare function generateSpeech<V extends Voice = Voice>(options: {
|
|
4
4
|
model: string | ResolvedModel<V>;
|
|
@@ -9,15 +9,7 @@ export declare function generateSpeech<V extends Voice = Voice>(options: {
|
|
|
9
9
|
maxRetries?: number;
|
|
10
10
|
abortSignal?: AbortSignal;
|
|
11
11
|
headers?: Record<string, string>;
|
|
12
|
-
/**
|
|
13
|
-
* RMS-normalize the returned audio to this dBFS level. Must be ≤ 0.
|
|
14
|
-
* When set, generateSpeech requests the provider's decodable PCM/WAV
|
|
15
|
-
* output mode (via `getStitchOptions`), normalizes the samples to the
|
|
16
|
-
* target loudness, and re-encodes the result as 16-bit mono WAV — so
|
|
17
|
-
* the response `mediaType` will be `audio/wav` regardless of the
|
|
18
|
-
* provider's native default. Throws `VolumeAdjustmentUnsupportedError`
|
|
19
|
-
* if the provider doesn't expose a decodable output mode.
|
|
20
|
-
*/
|
|
21
12
|
volumeDbfs?: number;
|
|
13
|
+
timestamps?: boolean;
|
|
22
14
|
}): Promise<SpeechResult>;
|
|
23
15
|
//# sourceMappingURL=generate-speech.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-speech.d.ts","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-speech.d.ts","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"AAcA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,KAAK,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,wBAAsB,cAAc,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE;IACrE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoJxB"}
|
package/dist/generate-speech.js
CHANGED
|
@@ -1,61 +1,76 @@
|
|
|
1
1
|
import pRetry from "p-retry";
|
|
2
2
|
import { computeAudioDuration } from "./audio-duration.js";
|
|
3
3
|
import { detectAudioTags, stripAudioTags } from "./audio-tags.js";
|
|
4
|
+
import { getDefaultSTTFallback } from "./default-stt-fallback.js";
|
|
5
|
+
import { deriveTimestampsViaSTT } from "./derive-timestamps.js";
|
|
4
6
|
import { ApiError, NoSpeechGeneratedError, VolumeAdjustmentUnsupportedError, } from "./errors.js";
|
|
7
|
+
import { debug } from "./logger.js";
|
|
8
|
+
import { isRetriableApiError } from "./provider-utils.js";
|
|
5
9
|
import { resolveModel } from "./resolve-provider.js";
|
|
10
|
+
import { isSpeechGatewayModel, modelDeclaresNativeTimestamps, } from "./speech-provider.js";
|
|
6
11
|
import { DefaultGeneratedAudioFile } from "./speech-result.js";
|
|
7
12
|
export async function generateSpeech(options) {
|
|
8
|
-
const { model, voice, abortSignal, headers, volumeDbfs } = options;
|
|
13
|
+
const { model, voice, abortSignal, headers, volumeDbfs, timestamps = false, } = options;
|
|
9
14
|
const maxRetries = options.maxRetries ?? 2;
|
|
10
15
|
const resolved = resolveModel(model, { apiKey: options.apiKey });
|
|
11
16
|
const modelIdentifier = `${resolved.provider.id}/${resolved.modelId}`;
|
|
17
|
+
const isGateway = isSpeechGatewayModel(resolved);
|
|
12
18
|
let providerOptions = options.providerOptions;
|
|
13
|
-
if (volumeDbfs != null) {
|
|
19
|
+
if (volumeDbfs != null && !isGateway) {
|
|
14
20
|
const stitchOpts = resolved.provider.getStitchOptions?.(resolved.modelId);
|
|
15
21
|
if (!stitchOpts) {
|
|
16
22
|
throw new VolumeAdjustmentUnsupportedError(modelIdentifier);
|
|
17
23
|
}
|
|
18
|
-
// Stitch
|
|
19
|
-
// providerOptions — otherwise a caller could silently break the decoder
|
|
20
|
-
// by e.g. passing `response_format: "mp3"` alongside `volumeDbfs`.
|
|
24
|
+
// Stitch options must win — caller-supplied response_format would break the decoder.
|
|
21
25
|
providerOptions = {
|
|
22
26
|
...options.providerOptions,
|
|
23
27
|
...stitchOpts.providerOptions,
|
|
24
28
|
};
|
|
25
29
|
}
|
|
26
|
-
|
|
27
|
-
let warnings;
|
|
28
|
-
if (resolved.provider.processAudioTags) {
|
|
29
|
-
({ text: processedText, warnings } = resolved.provider.processAudioTags(options.text, resolved.modelId));
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
const tags = detectAudioTags(options.text);
|
|
33
|
-
if (tags.length > 0) {
|
|
34
|
-
({ text: processedText, warnings } = stripAudioTags(options.text, modelIdentifier));
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
processedText = options.text;
|
|
38
|
-
warnings = [];
|
|
39
|
-
}
|
|
40
|
-
}
|
|
30
|
+
const { text: processedText, warnings } = preprocessText(resolved, options.text, modelIdentifier);
|
|
41
31
|
if (processedText.trim().length === 0) {
|
|
42
32
|
throw new NoSpeechGeneratedError(warnings.length > 0
|
|
43
33
|
? `Text is empty after removing unsupported audio tags for ${modelIdentifier}.`
|
|
44
34
|
: "Text must not be empty.");
|
|
45
35
|
}
|
|
36
|
+
const hasNativeTimestamps = modelDeclaresNativeTimestamps(resolved);
|
|
37
|
+
const shouldRequestNative = timestamps && (hasNativeTimestamps || isGateway);
|
|
38
|
+
const effectiveFallback = !timestamps || shouldRequestNative
|
|
39
|
+
? undefined
|
|
40
|
+
: (resolved.fallbackSTT ?? (await getDefaultSTTFallback()));
|
|
41
|
+
logTimestampDecision({
|
|
42
|
+
modelIdentifier,
|
|
43
|
+
enabled: timestamps,
|
|
44
|
+
hasNative: hasNativeTimestamps,
|
|
45
|
+
willRequestNative: shouldRequestNative,
|
|
46
|
+
effectiveFallback,
|
|
47
|
+
});
|
|
46
48
|
const startTime = performance.now();
|
|
47
|
-
const result = await pRetry(() => resolved
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
const result = await pRetry(() => isSpeechGatewayModel(resolved)
|
|
50
|
+
? resolved.provider.generate({
|
|
51
|
+
modelId: resolved.modelId,
|
|
52
|
+
text: processedText,
|
|
53
|
+
// Gateway inline mode only accepts string voice IDs.
|
|
54
|
+
voice: voice,
|
|
55
|
+
providerOptions,
|
|
56
|
+
abortSignal,
|
|
57
|
+
headers,
|
|
58
|
+
includeTimestamps: shouldRequestNative,
|
|
59
|
+
volumeDbfs,
|
|
60
|
+
})
|
|
61
|
+
: resolved.provider.generate({
|
|
62
|
+
modelId: resolved.modelId,
|
|
63
|
+
text: processedText,
|
|
64
|
+
voice,
|
|
65
|
+
providerOptions,
|
|
66
|
+
abortSignal,
|
|
67
|
+
headers,
|
|
68
|
+
includeTimestamps: shouldRequestNative,
|
|
69
|
+
}), {
|
|
55
70
|
retries: maxRetries,
|
|
56
71
|
signal: abortSignal,
|
|
57
72
|
shouldRetry: ({ error }) => {
|
|
58
|
-
if (error instanceof ApiError && error
|
|
73
|
+
if (error instanceof ApiError && !isRetriableApiError(error)) {
|
|
59
74
|
return false;
|
|
60
75
|
}
|
|
61
76
|
return true;
|
|
@@ -68,7 +83,7 @@ export async function generateSpeech(options) {
|
|
|
68
83
|
}
|
|
69
84
|
let outputBytes = audioData;
|
|
70
85
|
let outputMediaType = result.mediaType;
|
|
71
|
-
if (volumeDbfs != null) {
|
|
86
|
+
if (volumeDbfs != null && !isGateway) {
|
|
72
87
|
const { adjustVolume } = await import("./volume-adjust.js");
|
|
73
88
|
outputBytes = await adjustVolume({
|
|
74
89
|
audio: audioData,
|
|
@@ -83,18 +98,81 @@ export async function generateSpeech(options) {
|
|
|
83
98
|
});
|
|
84
99
|
const audioDurationMs = (await computeAudioDuration(audio.uint8Array, outputMediaType)) ??
|
|
85
100
|
result.audioDurationMs;
|
|
101
|
+
const resolvedTimestamps = await resolveTimestamps({
|
|
102
|
+
timestamps,
|
|
103
|
+
modelIdentifier,
|
|
104
|
+
resolved,
|
|
105
|
+
resultTimestamps: result.timestamps,
|
|
106
|
+
audio: audio.uint8Array,
|
|
107
|
+
mediaType: outputMediaType,
|
|
108
|
+
abortSignal,
|
|
109
|
+
});
|
|
86
110
|
const metadata = {
|
|
87
111
|
latencyMs,
|
|
88
112
|
inputChars: processedText.length,
|
|
89
|
-
provider: resolved.provider.id,
|
|
90
|
-
model: resolved.modelId,
|
|
91
113
|
...(audioDurationMs != null && { audioDurationMs }),
|
|
92
114
|
};
|
|
93
115
|
return {
|
|
94
116
|
audio,
|
|
95
117
|
metadata,
|
|
96
118
|
providerMetadata: result.providerMetadata,
|
|
97
|
-
warnings: warnings.
|
|
119
|
+
warnings: mergeWarnings(warnings, result.warnings),
|
|
120
|
+
timestamps: resolvedTimestamps,
|
|
98
121
|
};
|
|
99
122
|
}
|
|
123
|
+
function mergeWarnings(preprocessingWarnings, providerWarnings) {
|
|
124
|
+
const merged = [...preprocessingWarnings, ...(providerWarnings ?? [])];
|
|
125
|
+
return merged.length > 0 ? merged : undefined;
|
|
126
|
+
}
|
|
127
|
+
async function resolveTimestamps(args) {
|
|
128
|
+
if (!args.timestamps) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (args.resultTimestamps?.length) {
|
|
132
|
+
debug(`${args.modelIdentifier}: returned ${args.resultTimestamps.length} native word timestamps.`);
|
|
133
|
+
return args.resultTimestamps;
|
|
134
|
+
}
|
|
135
|
+
if (isSpeechGatewayModel(args.resolved)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const fallback = args.resolved.fallbackSTT ?? (await getDefaultSTTFallback());
|
|
139
|
+
const timestamps = await deriveTimestampsViaSTT({
|
|
140
|
+
ttsModel: args.modelIdentifier,
|
|
141
|
+
audio: args.audio,
|
|
142
|
+
mediaType: args.mediaType,
|
|
143
|
+
timestampFallback: fallback,
|
|
144
|
+
abortSignal: args.abortSignal,
|
|
145
|
+
});
|
|
146
|
+
debug(`${args.modelIdentifier}: derived ${timestamps.length} word timestamps via STT fallback.`);
|
|
147
|
+
return timestamps;
|
|
148
|
+
}
|
|
149
|
+
function preprocessText(resolved, rawText, modelIdentifier) {
|
|
150
|
+
// Gateway server handles audio-tag normalization itself — pass raw text through.
|
|
151
|
+
if (isSpeechGatewayModel(resolved)) {
|
|
152
|
+
return { text: rawText, warnings: [] };
|
|
153
|
+
}
|
|
154
|
+
if (resolved.provider.processAudioTags) {
|
|
155
|
+
return resolved.provider.processAudioTags(rawText, resolved.modelId);
|
|
156
|
+
}
|
|
157
|
+
const tags = detectAudioTags(rawText);
|
|
158
|
+
if (tags.length > 0) {
|
|
159
|
+
return stripAudioTags(rawText, modelIdentifier);
|
|
160
|
+
}
|
|
161
|
+
return { text: rawText, warnings: [] };
|
|
162
|
+
}
|
|
163
|
+
function logTimestampDecision(args) {
|
|
164
|
+
const { modelIdentifier, enabled, willRequestNative } = args;
|
|
165
|
+
if (!enabled) {
|
|
166
|
+
debug(`${modelIdentifier}: timestamps: false — skipping alignment.`);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (willRequestNative) {
|
|
170
|
+
debug(`${modelIdentifier}: timestamps: true — requesting native alignment from the provider.`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const target = args.effectiveFallback
|
|
174
|
+
? `${args.effectiveFallback.provider.id}/${args.effectiveFallback.modelId}`
|
|
175
|
+
: "unconfigured STT fallback";
|
|
176
|
+
debug(`${modelIdentifier}: timestamps: true but no native alignment available — will pipe synthesized audio through ${target} for word timestamps (adds a round-trip).`);
|
|
177
|
+
}
|
|
100
178
|
//# sourceMappingURL=generate-speech.js.map
|