@speech-sdk/core 0.7.0 → 0.8.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 +227 -108
- package/dist/__tests__/e2e/_save-audio.d.ts +0 -42
- package/dist/__tests__/e2e/_save-audio.d.ts.map +1 -1
- package/dist/__tests__/e2e/_save-audio.js +0 -59
- package/dist/__tests__/e2e/_save-audio.js.map +1 -1
- package/dist/audio-decode.d.ts +7 -0
- package/dist/audio-decode.d.ts.map +1 -0
- package/dist/audio-decode.js +109 -0
- package/dist/audio-decode.js.map +1 -0
- package/dist/audio-duration.d.ts +0 -5
- package/dist/audio-duration.d.ts.map +1 -1
- package/dist/audio-duration.js +5 -21
- package/dist/audio-duration.js.map +1 -1
- package/dist/audio-output.d.ts +39 -0
- package/dist/audio-output.d.ts.map +1 -0
- package/dist/audio-output.js +111 -0
- package/dist/audio-output.js.map +1 -0
- package/dist/audio-utils.d.ts +2 -10
- package/dist/audio-utils.d.ts.map +1 -1
- package/dist/audio-utils.js +57 -15
- package/dist/audio-utils.js.map +1 -1
- package/dist/captions.d.ts +0 -108
- package/dist/captions.d.ts.map +1 -1
- package/dist/captions.js +8 -98
- package/dist/captions.js.map +1 -1
- 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 -24
- package/dist/conversation/pcm-concat.d.ts.map +1 -1
- package/dist/conversation/pcm-concat.js +8 -183
- 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 +9 -6
- package/dist/conversation/stitch.d.ts.map +1 -1
- package/dist/conversation/stitch.js +72 -51
- package/dist/conversation/stitch.js.map +1 -1
- package/dist/conversation/types.d.ts +7 -37
- 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 +1 -5
- package/dist/derive-timestamps.d.ts.map +1 -1
- package/dist/derive-timestamps.js +1 -15
- package/dist/derive-timestamps.js.map +1 -1
- package/dist/encoders/mp3.d.ts +6 -0
- package/dist/encoders/mp3.d.ts.map +1 -0
- package/dist/encoders/mp3.js +54 -0
- package/dist/encoders/mp3.js.map +1 -0
- package/dist/errors.d.ts +20 -13
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +49 -15
- 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 +250 -93
- package/dist/generate-conversation.js.map +1 -1
- package/dist/generate-speech.d.ts +7 -28
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +185 -94
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +7 -11
- 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.map +1 -1
- package/dist/logger.js +2 -13
- package/dist/logger.js.map +1 -1
- package/dist/metadata.d.ts +0 -22
- package/dist/metadata.d.ts.map +1 -1
- package/dist/pronunciations/errors.d.ts +5 -0
- package/dist/pronunciations/errors.d.ts.map +1 -0
- package/dist/pronunciations/errors.js +8 -0
- package/dist/pronunciations/errors.js.map +1 -0
- package/dist/pronunciations/inverse-align.d.ts +4 -0
- package/dist/pronunciations/inverse-align.d.ts.map +1 -0
- package/dist/pronunciations/inverse-align.js +54 -0
- package/dist/pronunciations/inverse-align.js.map +1 -0
- package/dist/pronunciations/merge.d.ts +4 -0
- package/dist/pronunciations/merge.d.ts.map +1 -0
- package/dist/pronunciations/merge.js +13 -0
- package/dist/pronunciations/merge.js.map +1 -0
- package/dist/pronunciations/substitute.d.ts +6 -0
- package/dist/pronunciations/substitute.d.ts.map +1 -0
- package/dist/pronunciations/substitute.js +67 -0
- package/dist/pronunciations/substitute.js.map +1 -0
- package/dist/pronunciations/types.d.ts +18 -0
- package/dist/pronunciations/types.d.ts.map +1 -0
- package/dist/pronunciations/types.js +2 -0
- package/dist/pronunciations/types.js.map +1 -0
- package/dist/pronunciations/validate.d.ts +3 -0
- package/dist/pronunciations/validate.d.ts.map +1 -0
- package/dist/pronunciations/validate.js +26 -0
- package/dist/pronunciations/validate.js.map +1 -0
- package/dist/provider-utils.d.ts +4 -9
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +60 -51
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/cartesia/alignment.d.ts +0 -16
- package/dist/providers/cartesia/alignment.d.ts.map +1 -1
- package/dist/providers/cartesia/alignment.js +1 -6
- package/dist/providers/cartesia/alignment.js.map +1 -1
- package/dist/providers/cartesia/index.d.ts +29 -19
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +116 -80
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts +23 -8
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +51 -18
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/alignment.d.ts +7 -21
- package/dist/providers/elevenlabs/alignment.d.ts.map +1 -1
- package/dist/providers/elevenlabs/alignment.js +8 -9
- package/dist/providers/elevenlabs/alignment.js.map +1 -1
- package/dist/providers/elevenlabs/index.d.ts +14 -38
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +186 -169
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts +11 -20
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +49 -37
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts +14 -8
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +47 -19
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/gateway/index.d.ts +76 -0
- package/dist/providers/gateway/index.d.ts.map +1 -0
- package/dist/providers/gateway/index.js +251 -0
- package/dist/providers/gateway/index.js.map +1 -0
- package/dist/providers/google/index.d.ts +12 -20
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +180 -162
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/hume/alignment.d.ts +30 -35
- package/dist/providers/hume/alignment.d.ts.map +1 -1
- package/dist/providers/hume/alignment.js +14 -8
- package/dist/providers/hume/alignment.js.map +1 -1
- package/dist/providers/hume/index.d.ts +16 -16
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +79 -65
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/inworld/alignment.d.ts +8 -22
- package/dist/providers/inworld/alignment.d.ts.map +1 -1
- package/dist/providers/inworld/alignment.js +9 -8
- package/dist/providers/inworld/alignment.js.map +1 -1
- package/dist/providers/inworld/index.d.ts +17 -20
- package/dist/providers/inworld/index.d.ts.map +1 -1
- package/dist/providers/inworld/index.js +79 -47
- package/dist/providers/inworld/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts +14 -8
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +63 -48
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/alignment.d.ts +10 -19
- package/dist/providers/murf/alignment.d.ts.map +1 -1
- package/dist/providers/murf/alignment.js +10 -5
- package/dist/providers/murf/alignment.js.map +1 -1
- package/dist/providers/murf/index.d.ts +15 -16
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +105 -58
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts +43 -29
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +294 -106
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/alignment.d.ts +8 -29
- package/dist/providers/resemble/alignment.d.ts.map +1 -1
- package/dist/providers/resemble/alignment.js +9 -12
- package/dist/providers/resemble/alignment.js.map +1 -1
- package/dist/providers/resemble/index.d.ts +21 -11
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +89 -49
- package/dist/providers/resemble/index.js.map +1 -1
- package/dist/providers/smallest-ai/index.d.ts +47 -0
- package/dist/providers/smallest-ai/index.d.ts.map +1 -0
- package/dist/providers/smallest-ai/index.js +107 -0
- package/dist/providers/smallest-ai/index.js.map +1 -0
- package/dist/providers/xai/index.d.ts +25 -9
- package/dist/providers/xai/index.d.ts.map +1 -1
- package/dist/providers/xai/index.js +63 -40
- package/dist/providers/xai/index.js.map +1 -1
- package/dist/providers.d.ts +31 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +16 -0
- package/dist/providers.js.map +1 -0
- package/dist/resolve-provider.d.ts.map +1 -1
- package/dist/resolve-provider.js +8 -51
- package/dist/resolve-provider.js.map +1 -1
- package/dist/retry-options.d.ts +6 -0
- package/dist/retry-options.d.ts.map +1 -0
- package/dist/retry-options.js +48 -0
- package/dist/retry-options.js.map +1 -0
- package/dist/speech-provider.d.ts +28 -53
- package/dist/speech-provider.d.ts.map +1 -1
- package/dist/speech-provider.js +5 -26
- package/dist/speech-provider.js.map +1 -1
- package/dist/speech-result.d.ts +8 -9
- 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 +0 -12
- package/dist/speech-to-text-provider.d.ts.map +1 -1
- package/dist/stream-speech.d.ts +4 -2
- package/dist/stream-speech.d.ts.map +1 -1
- package/dist/stream-speech.js +36 -22
- package/dist/stream-speech.js.map +1 -1
- package/dist/timestamps.d.ts +3 -17
- package/dist/timestamps.d.ts.map +1 -1
- 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 +31 -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 +4 -16
- package/dist/volume-adjust.js.map +1 -1
- package/package.json +13 -66
- package/dist/stt-providers/openai/index.d.ts +0 -42
- package/dist/stt-providers/openai/index.d.ts.map +0 -1
- package/dist/stt-providers/openai/index.js +0 -184
- package/dist/stt-providers/openai/index.js.map +0 -1
package/dist/generate-speech.js
CHANGED
|
@@ -1,122 +1,226 @@
|
|
|
1
1
|
import pRetry from "p-retry";
|
|
2
2
|
import { computeAudioDuration } from "./audio-duration.js";
|
|
3
|
+
import { applyOptionalOutputConversion, validateOutput, } from "./audio-output.js";
|
|
3
4
|
import { detectAudioTags, stripAudioTags } from "./audio-tags.js";
|
|
5
|
+
import { getDefaultSTTFallback } from "./default-stt-fallback.js";
|
|
4
6
|
import { deriveTimestampsViaSTT } from "./derive-timestamps.js";
|
|
5
|
-
import {
|
|
7
|
+
import { NoSpeechGeneratedError, OutputConversionUnsupportedError, VolumeAdjustmentUnsupportedError, } from "./errors.js";
|
|
6
8
|
import { debug } from "./logger.js";
|
|
9
|
+
import { inverseAlign } from "./pronunciations/inverse-align.js";
|
|
10
|
+
import { mergeRules } from "./pronunciations/merge.js";
|
|
11
|
+
import { substitute } from "./pronunciations/substitute.js";
|
|
12
|
+
import { validatePronunciationsInput } from "./pronunciations/validate.js";
|
|
7
13
|
import { resolveModel } from "./resolve-provider.js";
|
|
8
|
-
import {
|
|
14
|
+
import { buildRetryOptions } from "./retry-options.js";
|
|
15
|
+
import { isSpeechGatewayModel, modelDeclaresNativeTimestamps, } from "./speech-provider.js";
|
|
9
16
|
import { DefaultGeneratedAudioFile } from "./speech-result.js";
|
|
10
17
|
export async function generateSpeech(options) {
|
|
11
|
-
const { model, voice, abortSignal, headers, volumeDbfs, timestamps
|
|
18
|
+
const { model, voice, abortSignal, headers, volumeDbfs, timestamps = false, } = options;
|
|
12
19
|
const maxRetries = options.maxRetries ?? 2;
|
|
20
|
+
validateOutput(options.output);
|
|
13
21
|
const resolved = resolveModel(model, { apiKey: options.apiKey });
|
|
14
22
|
const modelIdentifier = `${resolved.provider.id}/${resolved.modelId}`;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
throw new VolumeAdjustmentUnsupportedError(modelIdentifier);
|
|
20
|
-
}
|
|
21
|
-
// Stitch-mode options are applied last so they win over user-supplied
|
|
22
|
-
// providerOptions — otherwise a caller could silently break the decoder
|
|
23
|
-
// by e.g. passing `response_format: "mp3"` alongside `volumeDbfs`.
|
|
24
|
-
providerOptions = {
|
|
25
|
-
...options.providerOptions,
|
|
26
|
-
...stitchOpts.providerOptions,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
const { text: processedText, warnings } = preprocessText(resolved, options.text, modelIdentifier);
|
|
30
|
-
if (processedText.trim().length === 0) {
|
|
23
|
+
const isGateway = isSpeechGatewayModel(resolved);
|
|
24
|
+
validatePronunciationsInput(options.pronunciations, isGateway);
|
|
25
|
+
const { text: strippedText, warnings } = preprocessText(resolved, options.text, modelIdentifier);
|
|
26
|
+
if (strippedText.trim().length === 0) {
|
|
31
27
|
throw new NoSpeechGeneratedError(warnings.length > 0
|
|
32
28
|
? `Text is empty after removing unsupported audio tags for ${modelIdentifier}.`
|
|
33
29
|
: "Text must not be empty.");
|
|
34
30
|
}
|
|
31
|
+
let textToSend = strippedText;
|
|
32
|
+
let pronunciationEdits = [];
|
|
33
|
+
if (!isGateway && options.pronunciations?.rules?.length) {
|
|
34
|
+
const ruleMap = mergeRules(options.pronunciations.rules);
|
|
35
|
+
const subbed = substitute(strippedText, ruleMap);
|
|
36
|
+
textToSend = subbed.text;
|
|
37
|
+
pronunciationEdits = subbed.edits;
|
|
38
|
+
}
|
|
39
|
+
const providerOptions = resolveProviderOptionsForLocalDecoding({
|
|
40
|
+
resolved,
|
|
41
|
+
isGateway,
|
|
42
|
+
modelIdentifier,
|
|
43
|
+
volumeDbfs,
|
|
44
|
+
output: options.output,
|
|
45
|
+
callerOptions: options.providerOptions,
|
|
46
|
+
});
|
|
35
47
|
const hasNativeTimestamps = modelDeclaresNativeTimestamps(resolved);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
const shouldRequestNative = timestamps && (hasNativeTimestamps || isGateway);
|
|
49
|
+
const effectiveFallback = !timestamps || shouldRequestNative
|
|
50
|
+
? undefined
|
|
51
|
+
: (resolved.fallbackSTT ?? (await getDefaultSTTFallback()));
|
|
39
52
|
logTimestampDecision({
|
|
40
53
|
modelIdentifier,
|
|
41
|
-
|
|
54
|
+
enabled: timestamps,
|
|
42
55
|
hasNative: hasNativeTimestamps,
|
|
43
56
|
willRequestNative: shouldRequestNative,
|
|
44
|
-
|
|
57
|
+
effectiveFallback,
|
|
45
58
|
});
|
|
46
59
|
const startTime = performance.now();
|
|
47
|
-
const result = await pRetry(() =>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
const result = await pRetry(() => {
|
|
61
|
+
if (isGateway) {
|
|
62
|
+
const gatewayProvider = resolved.provider;
|
|
63
|
+
return gatewayProvider.generate({
|
|
64
|
+
modelId: resolved.modelId,
|
|
65
|
+
text: textToSend,
|
|
66
|
+
voice: voice,
|
|
67
|
+
providerOptions,
|
|
68
|
+
abortSignal,
|
|
69
|
+
headers,
|
|
70
|
+
includeTimestamps: shouldRequestNative,
|
|
71
|
+
volumeDbfs,
|
|
72
|
+
output: options.output,
|
|
73
|
+
pronunciations: options.pronunciations,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return resolved.provider.generate({
|
|
77
|
+
modelId: resolved.modelId,
|
|
78
|
+
text: textToSend,
|
|
79
|
+
voice,
|
|
80
|
+
providerOptions,
|
|
81
|
+
abortSignal,
|
|
82
|
+
headers,
|
|
83
|
+
includeTimestamps: shouldRequestNative,
|
|
84
|
+
});
|
|
85
|
+
}, buildRetryOptions({ maxRetries, abortSignal }));
|
|
65
86
|
const latencyMs = Math.round(performance.now() - startTime);
|
|
66
87
|
const audioData = result.audio;
|
|
67
88
|
if (audioData.length === 0) {
|
|
68
89
|
throw new NoSpeechGeneratedError();
|
|
69
90
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const { adjustVolume } = await import("./volume-adjust.js");
|
|
74
|
-
outputBytes = await adjustVolume({
|
|
91
|
+
const { bytes: outputBytes, mediaType: outputMediaType } = isGateway
|
|
92
|
+
? { bytes: audioData, mediaType: result.mediaType }
|
|
93
|
+
: await applyLocalAudioPostProcessing({
|
|
75
94
|
audio: audioData,
|
|
76
95
|
mediaType: result.mediaType,
|
|
77
96
|
volumeDbfs,
|
|
97
|
+
output: options.output,
|
|
78
98
|
});
|
|
79
|
-
outputMediaType = "audio/wav";
|
|
80
|
-
}
|
|
81
99
|
const audio = new DefaultGeneratedAudioFile({
|
|
82
100
|
data: outputBytes,
|
|
83
101
|
mediaType: outputMediaType,
|
|
84
102
|
});
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
debug(`${modelIdentifier}: derived ${timestamps.length} word timestamps via STT fallback.`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
103
|
+
const [computedDuration, resolvedTimestamps] = await Promise.all([
|
|
104
|
+
computeAudioDuration(audio.uint8Array, outputMediaType),
|
|
105
|
+
resolveTimestamps({
|
|
106
|
+
timestamps,
|
|
107
|
+
modelIdentifier,
|
|
108
|
+
resolved,
|
|
109
|
+
resultTimestamps: result.timestamps,
|
|
110
|
+
audio: audio.uint8Array,
|
|
111
|
+
mediaType: outputMediaType,
|
|
112
|
+
abortSignal,
|
|
113
|
+
}),
|
|
114
|
+
]);
|
|
115
|
+
const audioDurationMs = computedDuration ?? result.audioDurationMs;
|
|
116
|
+
const finalTimestamps = resolvedTimestamps && pronunciationEdits.length > 0
|
|
117
|
+
? inverseAlign(resolvedTimestamps, textToSend, pronunciationEdits)
|
|
118
|
+
: resolvedTimestamps;
|
|
104
119
|
const metadata = {
|
|
105
120
|
latencyMs,
|
|
106
|
-
inputChars:
|
|
107
|
-
provider: resolved.provider.id,
|
|
108
|
-
model: resolved.modelId,
|
|
121
|
+
inputChars: options.text.length,
|
|
109
122
|
...(audioDurationMs != null && { audioDurationMs }),
|
|
110
123
|
};
|
|
111
124
|
return {
|
|
112
125
|
audio,
|
|
113
126
|
metadata,
|
|
114
127
|
providerMetadata: result.providerMetadata,
|
|
115
|
-
warnings: warnings.
|
|
116
|
-
timestamps,
|
|
128
|
+
warnings: mergeWarnings(warnings, result.warnings),
|
|
129
|
+
timestamps: finalTimestamps,
|
|
117
130
|
};
|
|
118
131
|
}
|
|
132
|
+
function mergeWarnings(preprocessingWarnings, providerWarnings) {
|
|
133
|
+
const merged = [...preprocessingWarnings, ...(providerWarnings ?? [])];
|
|
134
|
+
return merged.length > 0 ? merged : undefined;
|
|
135
|
+
}
|
|
136
|
+
async function resolveTimestamps(args) {
|
|
137
|
+
if (!args.timestamps) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (args.resultTimestamps?.length) {
|
|
141
|
+
debug(`${args.modelIdentifier}: returned ${args.resultTimestamps.length} native word timestamps.`);
|
|
142
|
+
return args.resultTimestamps;
|
|
143
|
+
}
|
|
144
|
+
if (isSpeechGatewayModel(args.resolved)) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const fallback = args.resolved.fallbackSTT ?? (await getDefaultSTTFallback());
|
|
148
|
+
const timestamps = await deriveTimestampsViaSTT({
|
|
149
|
+
ttsModel: args.modelIdentifier,
|
|
150
|
+
audio: args.audio,
|
|
151
|
+
mediaType: args.mediaType,
|
|
152
|
+
timestampFallback: fallback,
|
|
153
|
+
abortSignal: args.abortSignal,
|
|
154
|
+
});
|
|
155
|
+
debug(`${args.modelIdentifier}: derived ${timestamps.length} word timestamps via STT fallback.`);
|
|
156
|
+
return timestamps;
|
|
157
|
+
}
|
|
158
|
+
function resolveProviderOptionsForLocalDecoding(args) {
|
|
159
|
+
if (args.isGateway) {
|
|
160
|
+
return args.callerOptions;
|
|
161
|
+
}
|
|
162
|
+
// volumeDbfs needs a known-decodable wire format to decode→re-level→re-encode,
|
|
163
|
+
// so SDK-required keys win over caller overrides — otherwise a stray
|
|
164
|
+
// override would silently violate the normalization contract.
|
|
165
|
+
if (args.volumeDbfs != null) {
|
|
166
|
+
const stitchOpts = args.resolved.provider.getStitchOptions?.(args.resolved.modelId);
|
|
167
|
+
if (!stitchOpts) {
|
|
168
|
+
throw new VolumeAdjustmentUnsupportedError(args.modelIdentifier);
|
|
169
|
+
}
|
|
170
|
+
return { ...args.callerOptions, ...stitchOpts.providerOptions };
|
|
171
|
+
}
|
|
172
|
+
if (args.output != null) {
|
|
173
|
+
// Native path: provider produces the requested format directly, so caller's
|
|
174
|
+
// providerOptions are an explicit escape hatch and win over our defaults
|
|
175
|
+
// (e.g. tweaking bitrate/sample_rate). Post-processing reads the actual
|
|
176
|
+
// response mediaType and adapts.
|
|
177
|
+
const native = args.resolved.provider.resolveOutputFormat?.(args.resolved.modelId, args.output);
|
|
178
|
+
if (native) {
|
|
179
|
+
return { ...native.providerOptions, ...args.callerOptions };
|
|
180
|
+
}
|
|
181
|
+
// Stitch fallback: the SDK MUST decode locally to convert into the
|
|
182
|
+
// requested format, so SDK-required keys win — same rationale as the
|
|
183
|
+
// volumeDbfs path above.
|
|
184
|
+
const stitchOpts = args.resolved.provider.getStitchOptions?.(args.resolved.modelId);
|
|
185
|
+
if (!stitchOpts) {
|
|
186
|
+
throw new OutputConversionUnsupportedError(args.modelIdentifier);
|
|
187
|
+
}
|
|
188
|
+
return { ...args.callerOptions, ...stitchOpts.providerOptions };
|
|
189
|
+
}
|
|
190
|
+
return args.callerOptions;
|
|
191
|
+
}
|
|
192
|
+
async function applyLocalAudioPostProcessing(args) {
|
|
193
|
+
let bytes = args.audio;
|
|
194
|
+
let mediaType = args.mediaType;
|
|
195
|
+
if (args.volumeDbfs != null) {
|
|
196
|
+
const { adjustVolume } = await import("./volume-adjust.js");
|
|
197
|
+
bytes = await adjustVolume({
|
|
198
|
+
audio: args.audio,
|
|
199
|
+
mediaType: args.mediaType,
|
|
200
|
+
volumeDbfs: args.volumeDbfs,
|
|
201
|
+
});
|
|
202
|
+
mediaType = "audio/wav";
|
|
203
|
+
}
|
|
204
|
+
if (args.output != null) {
|
|
205
|
+
const decoded = new DefaultGeneratedAudioFile({
|
|
206
|
+
data: bytes,
|
|
207
|
+
mediaType,
|
|
208
|
+
}).uint8Array;
|
|
209
|
+
const converted = await applyOptionalOutputConversion({
|
|
210
|
+
audio: decoded,
|
|
211
|
+
mediaType,
|
|
212
|
+
output: args.output,
|
|
213
|
+
});
|
|
214
|
+
bytes = converted.audio;
|
|
215
|
+
mediaType = converted.mediaType;
|
|
216
|
+
}
|
|
217
|
+
return { bytes, mediaType };
|
|
218
|
+
}
|
|
119
219
|
function preprocessText(resolved, rawText, modelIdentifier) {
|
|
220
|
+
// Gateway server handles audio-tag normalization itself — pass raw text through.
|
|
221
|
+
if (isSpeechGatewayModel(resolved)) {
|
|
222
|
+
return { text: rawText, warnings: [] };
|
|
223
|
+
}
|
|
120
224
|
if (resolved.provider.processAudioTags) {
|
|
121
225
|
return resolved.provider.processAudioTags(rawText, resolved.modelId);
|
|
122
226
|
}
|
|
@@ -126,32 +230,19 @@ function preprocessText(resolved, rawText, modelIdentifier) {
|
|
|
126
230
|
}
|
|
127
231
|
return { text: rawText, warnings: [] };
|
|
128
232
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Logs the timestamp routing decision at debug level so developers can see
|
|
131
|
-
* why they are / aren't getting alignment data. Silent unless `DEBUG`
|
|
132
|
-
* includes `speech-sdk` (or `*`).
|
|
133
|
-
*/
|
|
134
233
|
function logTimestampDecision(args) {
|
|
135
|
-
const { modelIdentifier,
|
|
136
|
-
if (
|
|
137
|
-
debug(`${modelIdentifier}: timestamps:
|
|
234
|
+
const { modelIdentifier, enabled, willRequestNative } = args;
|
|
235
|
+
if (!enabled) {
|
|
236
|
+
debug(`${modelIdentifier}: timestamps: false — skipping alignment.`);
|
|
138
237
|
return;
|
|
139
238
|
}
|
|
140
239
|
if (willRequestNative) {
|
|
141
|
-
debug(`${modelIdentifier}: timestamps:
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
if (mode === "auto") {
|
|
145
|
-
debug(`${modelIdentifier}: timestamps: "auto" — model has no native alignment; skipping. Pass timestamps: "on" to derive via STT (adds a round-trip of the synthesized audio through Whisper by default).`);
|
|
240
|
+
debug(`${modelIdentifier}: timestamps: true — requesting native alignment from the provider.`);
|
|
146
241
|
return;
|
|
147
242
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (provider) {
|
|
153
|
-
return `${provider.provider.id}/${provider.modelId}`;
|
|
154
|
-
}
|
|
155
|
-
return "openai/whisper-1 (default)";
|
|
243
|
+
const target = args.effectiveFallback
|
|
244
|
+
? `${args.effectiveFallback.provider.id}/${args.effectiveFallback.modelId}`
|
|
245
|
+
: "unconfigured STT fallback";
|
|
246
|
+
debug(`${modelIdentifier}: timestamps: true but no native alignment available — will pipe synthesized audio through ${target} for word timestamps (adds a round-trip).`);
|
|
156
247
|
}
|
|
157
248
|
//# sourceMappingURL=generate-speech.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-speech.js","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"generate-speech.js","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export type { CaptionFormat, CaptionsOptions } from "./captions.js";
|
|
1
|
+
export type { AudioOutput, AudioOutputFormat } from "./audio-output.js";
|
|
3
2
|
export { timestampsToCaptions } from "./captions.js";
|
|
4
|
-
export {
|
|
3
|
+
export { ConversationInputError, DialogueConstraintError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
4
|
+
export { ApiError, AudioOutputInputError, GatewayInputError, MissingApiKeyError, NoSpeechGeneratedError, OutputConversionUnsupportedError, SpeechSDKError, StreamingNotSupportedError, TimestampKeyMissingError, VolumeAdjustmentUnsupportedError, } from "./errors.js";
|
|
5
|
+
export { generateConversation } from "./generate-conversation.js";
|
|
5
6
|
export { generateSpeech } from "./generate-speech.js";
|
|
6
|
-
export
|
|
7
|
-
export type {
|
|
8
|
-
export { FEATURES, getFeature, hasFeature, } from "./speech-provider.js";
|
|
9
|
-
export type { GeneratedAudioFile, SpeechResult } from "./speech-result.js";
|
|
10
|
-
export type { ResolvedSTTModel, SpeechToTextProvider, STTModelInfo, } from "./speech-to-text-provider.js";
|
|
7
|
+
export { DictionaryIdsRequireGatewayError } from "./pronunciations/errors.js";
|
|
8
|
+
export type { Pronunciation, PronunciationsInput, } from "./pronunciations/types.js";
|
|
11
9
|
export { streamSpeech } from "./stream-speech.js";
|
|
12
|
-
export
|
|
13
|
-
export type { TimestampMode, WordTimestamp } from "./timestamps.js";
|
|
14
|
-
export type { GenerateSpeechOptions } from "./types.js";
|
|
10
|
+
export { timestampsToTurns } from "./turns.js";
|
|
15
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gCAAgC,EAChC,cAAc,EACd,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,YAAY,EACV,aAAa,EACb,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
// biome-ignore lint/performance/noBarrelFile:
|
|
2
|
-
export { detectAudioTags, stripAudioTags } from "./audio-tags.js";
|
|
1
|
+
// biome-ignore lint/performance/noBarrelFile: public API entry point
|
|
3
2
|
export { timestampsToCaptions } from "./captions.js";
|
|
4
|
-
export {
|
|
3
|
+
export { ConversationInputError, DialogueConstraintError, StitchUnsupportedError, } from "./conversation/errors.js";
|
|
4
|
+
export { ApiError, AudioOutputInputError, GatewayInputError, MissingApiKeyError, NoSpeechGeneratedError, OutputConversionUnsupportedError, SpeechSDKError, StreamingNotSupportedError, TimestampKeyMissingError, VolumeAdjustmentUnsupportedError, } from "./errors.js";
|
|
5
|
+
export { generateConversation } from "./generate-conversation.js";
|
|
5
6
|
export { generateSpeech } from "./generate-speech.js";
|
|
6
|
-
export {
|
|
7
|
+
export { DictionaryIdsRequireGatewayError } from "./pronunciations/errors.js";
|
|
7
8
|
export { streamSpeech } from "./stream-speech.js";
|
|
9
|
+
export { timestampsToTurns } from "./turns.js";
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,qEAAqE;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gCAAgC,EAChC,cAAc,EACd,0BAA0B,EAC1B,wBAAwB,EACxB,gCAAgC,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAK9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AA2BA,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAK3C"}
|
package/dist/logger.js
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Minimal debug-level logger. Emits a namespaced message only when the
|
|
3
|
-
* `DEBUG` env var opts in (convention borrowed from the `debug` npm
|
|
4
|
-
* package, without the dependency). Matches any of:
|
|
5
|
-
* DEBUG=* enables everything
|
|
6
|
-
* DEBUG=speech-sdk enables the SDK
|
|
7
|
-
* DEBUG=speech-sdk:* same (wildcard namespace)
|
|
8
|
-
* DEBUG=foo,speech-sdk comma list
|
|
9
|
-
*/
|
|
1
|
+
// Honors DEBUG env var: "*", "speech-sdk", "speech-sdk:*", or comma list.
|
|
10
2
|
const NAMESPACE = "speech-sdk";
|
|
11
3
|
function debugEnabled() {
|
|
12
4
|
if (typeof process === "undefined" || !process.env?.DEBUG) {
|
|
@@ -26,10 +18,7 @@ function debugEnabled() {
|
|
|
26
18
|
}
|
|
27
19
|
return false;
|
|
28
20
|
}
|
|
29
|
-
// Evaluated once
|
|
30
|
-
// paths. Developers toggling DEBUG mid-process would need to re-import —
|
|
31
|
-
// acceptable trade-off since debug logging is an operator concern set at
|
|
32
|
-
// startup, not a runtime setting.
|
|
21
|
+
// Evaluated once — toggling DEBUG mid-process requires a re-import.
|
|
33
22
|
const ENABLED = debugEnabled();
|
|
34
23
|
export function debug(message) {
|
|
35
24
|
if (!ENABLED) {
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,SAAS,YAAY;IACnB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IACE,OAAO,KAAK,SAAS;YACrB,OAAO,KAAK,GAAG,SAAS,IAAI;YAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,EACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oEAAoE;AACpE,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;AAE/B,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/metadata.d.ts
CHANGED
|
@@ -1,29 +1,7 @@
|
|
|
1
1
|
export interface SpeechMetadata {
|
|
2
|
-
/**
|
|
3
|
-
* Duration of the generated audio in milliseconds.
|
|
4
|
-
*
|
|
5
|
-
* For `generateSpeech()`, this is computed from the audio bytes via
|
|
6
|
-
* mediabunny, falling back to the provider-reported value if parsing
|
|
7
|
-
* fails. For `streamSpeech()`, it is only the provider-reported value
|
|
8
|
-
* (since the full audio isn't available until the stream is consumed),
|
|
9
|
-
* and is undefined when the provider does not report it.
|
|
10
|
-
*/
|
|
11
2
|
readonly audioDurationMs?: number;
|
|
12
|
-
/** Number of characters in the input text (after audio tag processing). */
|
|
13
3
|
readonly inputChars: number;
|
|
14
|
-
/**
|
|
15
|
-
* Time from request start to the response being ready, in milliseconds.
|
|
16
|
-
*
|
|
17
|
-
* For `generateSpeech()`, this is the full round-trip latency (request
|
|
18
|
-
* sent → full response received). For `streamSpeech()`, the SDK returns
|
|
19
|
-
* as soon as the stream response is ready, so this equals `ttfbMs`.
|
|
20
|
-
*/
|
|
21
4
|
readonly latencyMs: number;
|
|
22
|
-
/** Model identifier (e.g. "tts-1", "eleven_multilingual_v2"). */
|
|
23
|
-
readonly model: string;
|
|
24
|
-
/** Provider identifier (e.g. "openai", "elevenlabs"). */
|
|
25
|
-
readonly provider: string;
|
|
26
|
-
/** Time from request start to first byte received, in milliseconds. Only set for streaming. */
|
|
27
5
|
readonly ttfbMs?: number;
|
|
28
6
|
}
|
|
29
7
|
//# sourceMappingURL=metadata.d.ts.map
|
package/dist/metadata.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAE7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pronunciations/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,qBAAa,gCAAiC,SAAQ,cAAc;;CAOnE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SpeechSDKError } from "../errors.js";
|
|
2
|
+
export class DictionaryIdsRequireGatewayError extends SpeechSDKError {
|
|
3
|
+
constructor() {
|
|
4
|
+
super("dictionaryIds require the gateway path. Use the gateway model string (e.g., 'openai/tts-1') or pass inline rules with { rules: [...] }.");
|
|
5
|
+
this.name = "DictionaryIdsRequireGatewayError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pronunciations/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,OAAO,gCAAiC,SAAQ,cAAc;IAClE;QACE,KAAK,CACH,yIAAyI,CAC1I,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WordTimestamp } from "../timestamps.js";
|
|
2
|
+
import type { Edit } from "./types.js";
|
|
3
|
+
export declare function inverseAlign<T extends WordTimestamp>(timestamps: readonly T[], substitutedText: string, edits: readonly Edit[]): T[];
|
|
4
|
+
//# sourceMappingURL=inverse-align.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inverse-align.d.ts","sourceRoot":"","sources":["../../src/pronunciations/inverse-align.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAmBvC,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,UAAU,EAAE,SAAS,CAAC,EAAE,EACxB,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,SAAS,IAAI,EAAE,GACrB,CAAC,EAAE,CAiDL"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
function findEditAt(position, edits) {
|
|
2
|
+
return edits.find((e) => position >= e.replacementRange[0] && position < e.replacementRange[1]);
|
|
3
|
+
}
|
|
4
|
+
function findTokenStart(haystack, searchFrom, token) {
|
|
5
|
+
return haystack.indexOf(token.toLowerCase(), searchFrom);
|
|
6
|
+
}
|
|
7
|
+
export function inverseAlign(timestamps, substitutedText, edits) {
|
|
8
|
+
if (edits.length === 0) {
|
|
9
|
+
return [...timestamps];
|
|
10
|
+
}
|
|
11
|
+
const out = [];
|
|
12
|
+
let cursor = 0;
|
|
13
|
+
let pendingGroup = null;
|
|
14
|
+
const haystack = substitutedText.toLowerCase();
|
|
15
|
+
const flushPending = () => {
|
|
16
|
+
if (!pendingGroup) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const merged = {
|
|
20
|
+
...pendingGroup.first,
|
|
21
|
+
text: pendingGroup.edit.originalWord,
|
|
22
|
+
start: pendingGroup.first.start,
|
|
23
|
+
end: pendingGroup.last.end,
|
|
24
|
+
};
|
|
25
|
+
out.push(merged);
|
|
26
|
+
pendingGroup = null;
|
|
27
|
+
};
|
|
28
|
+
for (const ts of timestamps) {
|
|
29
|
+
const pos = findTokenStart(haystack, cursor, ts.text);
|
|
30
|
+
if (pos === -1) {
|
|
31
|
+
flushPending();
|
|
32
|
+
out.push(ts);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
cursor = pos + ts.text.length;
|
|
36
|
+
const edit = findEditAt(pos, edits);
|
|
37
|
+
if (edit) {
|
|
38
|
+
if (pendingGroup && pendingGroup.edit === edit) {
|
|
39
|
+
pendingGroup.last = ts;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
flushPending();
|
|
43
|
+
pendingGroup = { edit, first: ts, last: ts };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
flushPending();
|
|
48
|
+
out.push(ts);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
flushPending();
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=inverse-align.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inverse-align.js","sourceRoot":"","sources":["../../src/pronunciations/inverse-align.ts"],"names":[],"mappings":"AAGA,SAAS,UAAU,CACjB,QAAgB,EAChB,KAAsB;IAEtB,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,UAAkB,EAClB,KAAa;IAEb,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAwB,EACxB,eAAuB,EACvB,KAAsB;IAEtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,YAAY,GAA6C,IAAI,CAAC;IAClE,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAE/C,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG;YACb,GAAG,YAAY,CAAC,KAAK;YACrB,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,YAAY;YACpC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK;YAC/B,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG;SACtB,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjB,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEpC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC/C,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,YAAY,EAAE,CAAC;gBACf,YAAY,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,YAAY,EAAE,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/pronunciations/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM,CAEvE;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAO5B"}
|