@speech-sdk/core 0.21.0 → 0.23.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 +69 -17
- package/dist/conversation/stitch.d.ts +2 -0
- package/dist/conversation/stitch.d.ts.map +1 -1
- package/dist/conversation/stitch.js +14 -34
- package/dist/conversation/stitch.js.map +1 -1
- package/dist/conversation/types.d.ts +2 -0
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/derive-timestamps.d.ts.map +1 -1
- package/dist/derive-timestamps.js +2 -2
- package/dist/derive-timestamps.js.map +1 -1
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +125 -1
- package/dist/errors.js.map +1 -1
- package/dist/generate-conversation.d.ts +5 -2
- package/dist/generate-conversation.d.ts.map +1 -1
- package/dist/generate-conversation.js +87 -7
- package/dist/generate-conversation.js.map +1 -1
- package/dist/generate-speech.d.ts +4 -1
- package/dist/generate-speech.d.ts.map +1 -1
- package/dist/generate-speech.js +22 -72
- package/dist/generate-speech.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pronunciations/inverse-align.d.ts.map +1 -1
- package/dist/pronunciations/inverse-align.js +6 -1
- package/dist/pronunciations/inverse-align.js.map +1 -1
- package/dist/provider-utils.d.ts +8 -2
- package/dist/provider-utils.d.ts.map +1 -1
- package/dist/provider-utils.js +69 -19
- package/dist/provider-utils.js.map +1 -1
- package/dist/providers/cartesia/index.d.ts.map +1 -1
- package/dist/providers/cartesia/index.js +16 -4
- package/dist/providers/cartesia/index.js.map +1 -1
- package/dist/providers/deepgram/index.d.ts.map +1 -1
- package/dist/providers/deepgram/index.js +10 -2
- package/dist/providers/deepgram/index.js.map +1 -1
- package/dist/providers/elevenlabs/alignment.d.ts.map +1 -1
- package/dist/providers/elevenlabs/alignment.js +57 -23
- package/dist/providers/elevenlabs/alignment.js.map +1 -1
- package/dist/providers/elevenlabs/forced-alignment.d.ts +23 -0
- package/dist/providers/elevenlabs/forced-alignment.d.ts.map +1 -0
- package/dist/providers/elevenlabs/forced-alignment.js +64 -0
- package/dist/providers/elevenlabs/forced-alignment.js.map +1 -0
- package/dist/providers/elevenlabs/index.d.ts +4 -1
- package/dist/providers/elevenlabs/index.d.ts.map +1 -1
- package/dist/providers/elevenlabs/index.js +28 -13
- package/dist/providers/elevenlabs/index.js.map +1 -1
- package/dist/providers/fal/index.d.ts.map +1 -1
- package/dist/providers/fal/index.js +12 -9
- package/dist/providers/fal/index.js.map +1 -1
- package/dist/providers/fish-audio/index.d.ts.map +1 -1
- package/dist/providers/fish-audio/index.js +17 -5
- package/dist/providers/fish-audio/index.js.map +1 -1
- package/dist/providers/gateway/index.d.ts.map +1 -1
- package/dist/providers/gateway/index.js +43 -13
- package/dist/providers/gateway/index.js.map +1 -1
- package/dist/providers/google/index.d.ts.map +1 -1
- package/dist/providers/google/index.js +15 -3
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/gradium/index.d.ts.map +1 -1
- package/dist/providers/gradium/index.js +6 -2
- package/dist/providers/gradium/index.js.map +1 -1
- package/dist/providers/hume/index.d.ts.map +1 -1
- package/dist/providers/hume/index.js +22 -6
- package/dist/providers/hume/index.js.map +1 -1
- package/dist/providers/inworld/index.d.ts.map +1 -1
- package/dist/providers/inworld/index.js +13 -5
- package/dist/providers/inworld/index.js.map +1 -1
- package/dist/providers/minimax/index.d.ts.map +1 -1
- package/dist/providers/minimax/index.js +8 -4
- package/dist/providers/minimax/index.js.map +1 -1
- package/dist/providers/mistral/index.d.ts.map +1 -1
- package/dist/providers/mistral/index.js +11 -3
- package/dist/providers/mistral/index.js.map +1 -1
- package/dist/providers/murf/index.d.ts.map +1 -1
- package/dist/providers/murf/index.js +10 -2
- package/dist/providers/murf/index.js.map +1 -1
- package/dist/providers/openai/index.d.ts.map +1 -1
- package/dist/providers/openai/index.js +15 -3
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/resemble/index.d.ts.map +1 -1
- package/dist/providers/resemble/index.js +12 -4
- package/dist/providers/resemble/index.js.map +1 -1
- package/dist/providers/smallest-ai/index.d.ts.map +1 -1
- package/dist/providers/smallest-ai/index.js +6 -2
- package/dist/providers/smallest-ai/index.js.map +1 -1
- package/dist/providers/speechify/index.d.ts.map +1 -1
- package/dist/providers/speechify/index.js +5 -1
- package/dist/providers/speechify/index.js.map +1 -1
- package/dist/providers/xai/index.d.ts.map +1 -1
- package/dist/providers/xai/index.js +11 -3
- package/dist/providers/xai/index.js.map +1 -1
- package/dist/speech-result.d.ts +6 -0
- package/dist/speech-result.d.ts.map +1 -1
- package/dist/speech-result.js.map +1 -1
- package/dist/timestamp-alignment.d.ts +34 -0
- package/dist/timestamp-alignment.d.ts.map +1 -0
- package/dist/timestamp-alignment.js +125 -0
- package/dist/timestamp-alignment.js.map +1 -0
- package/dist/timestamp-finalization.d.ts +15 -0
- package/dist/timestamp-finalization.d.ts.map +1 -0
- package/dist/timestamp-finalization.js +111 -0
- package/dist/timestamp-finalization.js.map +1 -0
- package/dist/timestamp-provider.d.ts +10 -0
- package/dist/timestamp-provider.d.ts.map +1 -0
- package/dist/timestamp-provider.js +2 -0
- package/dist/timestamp-provider.js.map +1 -0
- package/dist/types.d.ts +4 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/default-stt-fallback.d.ts +0 -3
- package/dist/default-stt-fallback.d.ts.map +0 -1
- package/dist/default-stt-fallback.js +0 -11
- package/dist/default-stt-fallback.js.map +0 -1
package/README.md
CHANGED
|
@@ -152,7 +152,7 @@ const result = await generateConversation({
|
|
|
152
152
|
});
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
-
Options: `gapMs` (default 300), `volumeDbfs` (default `-20`), `maxConcurrency` (default 6), `maxRetries` (default 2), `timestamps`, `apiKey`, `providerOptions`, `abortSignal`, `headers`. Per-turn overrides: `model`, `providerOptions` (stitch path only — throws `ConversationInputError` on native). Native-dialogue models enforce their own voice-count and character limits; violations throw `DialogueConstraintError`.
|
|
155
|
+
Options: `gapMs` (default 300), `volumeDbfs` (default `-20`), `maxConcurrency` (default 6), `maxRetries` (default 2), `timestamps`, `timestampProvider`, `apiKey`, `providerOptions`, `abortSignal`, `headers`. Per-turn overrides: `model`, `providerOptions` (stitch path only — throws `ConversationInputError` on native). Native-dialogue models enforce their own voice-count and character limits; violations throw `DialogueConstraintError`.
|
|
156
156
|
|
|
157
157
|
## Timestamps
|
|
158
158
|
|
|
@@ -174,14 +174,16 @@ result.timestamps;
|
|
|
174
174
|
// ]
|
|
175
175
|
```
|
|
176
176
|
|
|
177
|
+
Returned timestamps are projected onto the exact text synthesized by the SDK: caller input after unsupported audio tags are removed and pronunciation substitutions are applied. Provider text is used only to prove complete lexical coverage and provide timing boundaries. Before timestamps are accepted, the SDK verifies Unicode-aware transcript coverage, rejects missing or extra lexical content and punctuation-only entries, and validates finite, nonnegative, monotonic timings against the generated audio. Pronunciation substitutions are mapped back to caller text before timestamps are returned.
|
|
178
|
+
|
|
177
179
|
| Value | Behavior |
|
|
178
180
|
|---|---|
|
|
179
|
-
| `true` |
|
|
180
|
-
| `false` *(default)* | Never
|
|
181
|
+
| `true` | Returns validated word timestamps. Native models use their own timestamps. Direct models without native timestamps require `timestampProvider` (or a legacy factory-level `fallbackSTT`). |
|
|
182
|
+
| `false` *(default)* | Never requests, derives, or returns timestamps. |
|
|
181
183
|
|
|
182
|
-
|
|
184
|
+
`timestampProvider` is only used for direct models that do not support native timestamps. It is intentionally a no-op for native models and gateway-routed string models, where the provider or gateway owns timestamp generation. Invalid, empty, or mismatched requested timestamps throw `TimestampValidationError`; the SDK never returns fabricated or partially matched timings.
|
|
183
185
|
|
|
184
|
-
|
|
186
|
+
There is no implicit OpenAI fallback. Existing factory-level `fallbackSTT` configuration remains supported for compatibility, but new integrations should use the narrower `timestampProvider` interface.
|
|
185
187
|
|
|
186
188
|
Configure `fallbackSTT` on the factory to use a different key or STT model (set it once, applies to all calls):
|
|
187
189
|
|
|
@@ -204,7 +206,34 @@ const result = await generateSpeech({
|
|
|
204
206
|
|
|
205
207
|
Whether a given model returns native alignment or transcribes via the STT fallback is a provider detail — both paths produce the same `WordTimestamp[]` shape.
|
|
206
208
|
|
|
207
|
-
|
|
209
|
+
### ElevenLabs Forced Alignment
|
|
210
|
+
|
|
211
|
+
[ElevenLabs Forced Alignment](https://elevenlabs.io/docs/api-reference/forced-alignment/create/) is available as a timestamp provider. It sends the generated audio and exact synthesized text to ElevenLabs; it is never selected as a default.
|
|
212
|
+
|
|
213
|
+
```ts
|
|
214
|
+
import { generateSpeech } from '@speech-sdk/core';
|
|
215
|
+
import { createElevenLabs } from '@speech-sdk/core/providers';
|
|
216
|
+
|
|
217
|
+
const elevenlabs = createElevenLabs({
|
|
218
|
+
apiKey: process.env.ELEVENLABS_API_KEY,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
const result = await generateSpeech({
|
|
222
|
+
model: elevenlabs('eleven_multilingual_v2'),
|
|
223
|
+
voice: 'JBFqnCBsd6RMkjVDRZzb',
|
|
224
|
+
text: 'Dr. Smith paid 12 dollars',
|
|
225
|
+
timestamps: true,
|
|
226
|
+
timestampProvider: elevenlabs.forcedAlignment(),
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
result.timestamps;
|
|
230
|
+
// [{ text: 'Dr.', ... }, { text: 'Smith', ... }, { text: 'paid', ... }, { text: '12', ... }, { text: 'dollars', ... }]
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Any object implementing the exported `TimestampProvider` interface can be passed the same way. It receives generated audio, its media type, the exact synthesized text, and the request's abort signal. Provider, network, and timestamp validation errors throw normally.
|
|
235
|
+
|
|
236
|
+
`generateConversation` retains its boolean `timestamps` option and returns `ConversationWordTimestamp[]` — every word carries a `turnIndex: number` pointing back into the input `turns[]`.
|
|
208
237
|
|
|
209
238
|
```ts
|
|
210
239
|
import { generateConversation, timestampsToTurns } from '@speech-sdk/core';
|
|
@@ -407,6 +436,7 @@ import {
|
|
|
407
436
|
generateConversation,
|
|
408
437
|
timestampsToCaptions,
|
|
409
438
|
ApiError,
|
|
439
|
+
SpeechSdkProviderError,
|
|
410
440
|
} from '@speech-sdk/core';
|
|
411
441
|
```
|
|
412
442
|
|
|
@@ -429,7 +459,10 @@ Public types live under `@speech-sdk/core/types`:
|
|
|
429
459
|
import type {
|
|
430
460
|
GenerateSpeechOptions,
|
|
431
461
|
SpeechResult,
|
|
462
|
+
SpeechResultWithTimestamps,
|
|
432
463
|
ConversationResult,
|
|
464
|
+
ConversationResultWithTimestamps,
|
|
465
|
+
TimestampProvider,
|
|
433
466
|
Voice,
|
|
434
467
|
WordTimestamp,
|
|
435
468
|
} from '@speech-sdk/core/types';
|
|
@@ -444,7 +477,8 @@ generateSpeech({
|
|
|
444
477
|
voice: Voice, // required — string | { url } | { audio }
|
|
445
478
|
providerOptions?: object,
|
|
446
479
|
volumeDbfs?: number, // ≤ 0
|
|
447
|
-
timestamps?: boolean,
|
|
480
|
+
timestamps?: boolean,
|
|
481
|
+
timestampProvider?: TimestampProvider, // used only when the direct model lacks native timestamps
|
|
448
482
|
maxRetries?: number, // default 2
|
|
449
483
|
abortSignal?: AbortSignal,
|
|
450
484
|
headers?: Record<string, string>,
|
|
@@ -458,6 +492,15 @@ interface SpeechResult {
|
|
|
458
492
|
warnings?: string[];
|
|
459
493
|
}
|
|
460
494
|
|
|
495
|
+
interface TimestampProvider {
|
|
496
|
+
align(input: {
|
|
497
|
+
abortSignal?: AbortSignal;
|
|
498
|
+
audio: Uint8Array;
|
|
499
|
+
mediaType: string;
|
|
500
|
+
text: string;
|
|
501
|
+
}): Promise<readonly WordTimestamp[]>;
|
|
502
|
+
}
|
|
503
|
+
|
|
461
504
|
interface WordTimestamp { text: string; start: number; end: number } // seconds
|
|
462
505
|
|
|
463
506
|
// Returned by generateConversation — extends WordTimestamp with turnIndex
|
|
@@ -469,34 +512,43 @@ interface ConversationWordTimestamp extends WordTimestamp {
|
|
|
469
512
|
## Error handling
|
|
470
513
|
|
|
471
514
|
```ts
|
|
472
|
-
import { generateSpeech,
|
|
515
|
+
import { generateSpeech, SpeechSdkProviderError } from '@speech-sdk/core';
|
|
473
516
|
|
|
474
517
|
try {
|
|
475
518
|
await generateSpeech({ /* ... */ });
|
|
476
519
|
} catch (error) {
|
|
477
|
-
if (error instanceof
|
|
478
|
-
error.
|
|
479
|
-
error.
|
|
480
|
-
error.
|
|
481
|
-
error.
|
|
520
|
+
if (error instanceof SpeechSdkProviderError) {
|
|
521
|
+
error.status; // 401, 429, 500, ...
|
|
522
|
+
error.provider; // google
|
|
523
|
+
error.model; // gemini-3.1-flash-tts-preview
|
|
524
|
+
error.code; // INVALID_ARGUMENT (optional)
|
|
525
|
+
error.details; // complete parsed provider response body
|
|
526
|
+
error.rawResponse; // complete response text
|
|
527
|
+
error.requestId; // provider request ID (optional)
|
|
528
|
+
error.retryable;
|
|
529
|
+
error.stage; // synthesis | alignment (optional)
|
|
530
|
+
JSON.stringify(error);
|
|
482
531
|
}
|
|
483
532
|
}
|
|
484
533
|
```
|
|
485
534
|
|
|
486
|
-
`
|
|
535
|
+
`SpeechSdkProviderError` extends `ApiError`, so existing `instanceof ApiError`, `statusCode`, and `responseBody` handling remains compatible. `code` is populated from provider error codes (including Google `error.status`) or the RFC 7807 `code` extension. Match on `code` over `message` text — codes are a stable contract, messages aren't.
|
|
487
536
|
|
|
488
537
|
| Error | When |
|
|
489
538
|
|---|---|
|
|
490
|
-
| `
|
|
539
|
+
| `SpeechSdkProviderError` | Provider returned non-2xx; includes the parsed and raw provider response |
|
|
540
|
+
| `ApiError` | Backward-compatible base class for API failures |
|
|
491
541
|
| `MissingApiKeyError` | No `apiKey` passed and the provider's env var is unset |
|
|
492
542
|
| `NoSpeechGeneratedError` | Empty input (after tag stripping) or empty provider response |
|
|
493
543
|
| `StreamingNotSupportedError` | `streamSpeech()` on a non-streaming model |
|
|
494
544
|
| `VolumeAdjustmentUnsupportedError` | `volumeDbfs` with no decodable output mode |
|
|
495
|
-
| `
|
|
545
|
+
| `TimestampProviderRequiredError` | `timestamps: true` on a direct model without native timestamps or an explicit timestamp provider |
|
|
546
|
+
| `TimestampValidationError` | Requested timestamps are empty, structurally invalid, or do not exactly cover the synthesized text |
|
|
547
|
+
| `TimestampKeyMissingError` | A legacy configured `fallbackSTT` is missing its API key |
|
|
496
548
|
| `ConversationInputError` / `DialogueConstraintError` / `StitchUnsupportedError` | `generateConversation` validation / native caps / stitch incompatibility |
|
|
497
549
|
| `SpeechSDKError` | Base class |
|
|
498
550
|
|
|
499
|
-
Retries 5xx (except 501), 429, and network errors with jittered exponential backoff ([p-retry](https://github.com/sindresorhus/p-retry)); other 4xx and 501 are terminal. When a retriable error carries a `Retry-After` header, the SDK sleeps that long before the next attempt — capped at 60s to avoid pathological waits. The parsed value is surfaced as `
|
|
551
|
+
Retries 5xx (except 501), 429, and network errors with jittered exponential backoff ([p-retry](https://github.com/sindresorhus/p-retry)); other 4xx and 501 are terminal. `SpeechSdkProviderError.retryable` exposes that HTTP classification. When a retriable error carries a `Retry-After` header, the SDK sleeps that long before the next attempt — capped at 60s to avoid pathological waits. The parsed value is surfaced as `retryAfterMs` whenever the header is present, even on terminal errors that aren't retried. Default 2 retries; override via `maxRetries`.
|
|
500
552
|
|
|
501
553
|
## Development
|
|
502
554
|
|
|
@@ -2,6 +2,7 @@ import { type AudioOutput } from "../audio-output.js";
|
|
|
2
2
|
import type { SpeechMetadata } from "../metadata.js";
|
|
3
3
|
import type { PronunciationsInput } from "../pronunciations/types.js";
|
|
4
4
|
import type { ResolvedModel, Voice } from "../speech-provider.js";
|
|
5
|
+
import type { TimestampProvider } from "../timestamp-provider.js";
|
|
5
6
|
import type { ConversationWordTimestamp } from "../timestamps.js";
|
|
6
7
|
import type { ConversationTurn } from "./types.js";
|
|
7
8
|
interface StitchInput<V extends Voice = Voice> {
|
|
@@ -20,6 +21,7 @@ interface StitchInput<V extends Voice = Voice> {
|
|
|
20
21
|
providerOptions: Record<string, unknown>;
|
|
21
22
|
mediaType: string;
|
|
22
23
|
}[];
|
|
24
|
+
readonly timestampProvider?: TimestampProvider;
|
|
23
25
|
readonly timestamps: boolean;
|
|
24
26
|
readonly topLevelProviderOptions?: Record<string, unknown>;
|
|
25
27
|
readonly turns: readonly ConversationTurn<V>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAEjB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"stitch.d.ts","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAEjB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAOlE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,UAAU,WAAW,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,oBAAoB,EAAE,SAAS;QACtC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;IACJ,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,uBAAuB,EAAE,SAAS,CACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,SAAS,CACZ,EAAE,CAAC;IACJ,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,wBAAsB,SAAS,CAAC,CAAC,SAAS,KAAK,EAC7C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,YAAY,CAAC,CAkIvB"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { decodeAudioToPcm16 } from "../audio-decode.js";
|
|
2
2
|
import { applyOptionalOutputConversion, } from "../audio-output.js";
|
|
3
3
|
import { mapWithConcurrency } from "../concurrency.js";
|
|
4
|
-
import { withTurnIndex } from "../errors.js";
|
|
4
|
+
import { TimestampValidationError, withTurnIndex } from "../errors.js";
|
|
5
5
|
import { generateSpeech } from "../generate-speech.js";
|
|
6
6
|
import { debug } from "../logger.js";
|
|
7
7
|
import { concatPcmToWav, dbfsToInt16Rms, normalizeRms, stitchTargetRate, } from "./pcm-concat.js";
|
|
8
|
-
import { fillTurnTimestampsProportional } from "./proportional-fill.js";
|
|
9
|
-
const WHITESPACE_RE = /\s+/;
|
|
10
8
|
export async function runStitch(input) {
|
|
11
9
|
const start = performance.now();
|
|
12
10
|
const perTurn = await mapWithConcurrency(input.turns, input.maxConcurrency, async (turn, i, signal) => {
|
|
@@ -29,6 +27,7 @@ export async function runStitch(input) {
|
|
|
29
27
|
abortSignal: signal,
|
|
30
28
|
headers: input.headers,
|
|
31
29
|
timestamps: input.timestamps,
|
|
30
|
+
timestampProvider: input.timestampProvider,
|
|
32
31
|
pronunciations: input.pronunciations,
|
|
33
32
|
maxInputChars: input.maxInputChars,
|
|
34
33
|
maxConcurrency: input.maxConcurrency,
|
|
@@ -69,46 +68,29 @@ export async function runStitch(input) {
|
|
|
69
68
|
// Use source duration (pre-resample) so offsets match what the per-turn STT/native saw.
|
|
70
69
|
const gapSeconds = input.gapMs / 1000;
|
|
71
70
|
const turnDurations = perTurn.map((p) => p.segment.pcm.length / p.segment.sampleRate);
|
|
72
|
-
const fillWarnings = [];
|
|
73
71
|
let timestamps;
|
|
74
72
|
if (input.timestamps) {
|
|
75
73
|
timestamps = [];
|
|
76
74
|
let offsetSec = 0;
|
|
77
|
-
const filledTurns = [];
|
|
78
75
|
for (let i = 0; i < perTurn.length; i++) {
|
|
79
76
|
const turnTimestamps = perTurn[i]?.result.timestamps;
|
|
80
|
-
if (turnTimestamps
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
end: w.end + offsetSec,
|
|
86
|
-
turnIndex: i,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
77
|
+
if (!turnTimestamps) {
|
|
78
|
+
throw new TimestampValidationError({
|
|
79
|
+
reason: "empty",
|
|
80
|
+
source: `conversation turn ${i}`,
|
|
81
|
+
});
|
|
89
82
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
.
|
|
94
|
-
|
|
95
|
-
const turnSec = turnDurations[i] ?? 0;
|
|
96
|
-
const filled = fillTurnTimestampsProportional({
|
|
83
|
+
for (const w of turnTimestamps) {
|
|
84
|
+
timestamps.push({
|
|
85
|
+
text: w.text,
|
|
86
|
+
start: w.start + offsetSec,
|
|
87
|
+
end: w.end + offsetSec,
|
|
97
88
|
turnIndex: i,
|
|
98
|
-
tokenCount: tokens.length,
|
|
99
|
-
startSec: offsetSec,
|
|
100
|
-
endSec: offsetSec + turnSec,
|
|
101
|
-
texts: tokens,
|
|
102
89
|
});
|
|
103
|
-
timestamps.push(...filled);
|
|
104
|
-
filledTurns.push(i);
|
|
105
90
|
}
|
|
106
91
|
offsetSec += (turnDurations[i] ?? 0) + gapSeconds;
|
|
107
92
|
}
|
|
108
|
-
|
|
109
|
-
fillWarnings.push(`speech-sdk: stitch path filled timestamps for turn(s) [${filledTurns.join(",")}] proportionally — provider returned no per-word alignment for those turns.`);
|
|
110
|
-
}
|
|
111
|
-
debug(`stitch: composed ${timestamps.length} word timestamps across ${perTurn.length} turn(s); ${filledTurns.length} turn(s) filled proportionally.`);
|
|
93
|
+
debug(`stitch: composed ${timestamps.length} word timestamps across ${perTurn.length} turn(s).`);
|
|
112
94
|
}
|
|
113
95
|
return {
|
|
114
96
|
audio: finalAudio,
|
|
@@ -121,9 +103,7 @@ export async function runStitch(input) {
|
|
|
121
103
|
metadataPerTurn,
|
|
122
104
|
providerMetadataPerTurn,
|
|
123
105
|
timestamps,
|
|
124
|
-
warnings
|
|
125
|
-
? [...warnings, ...fillWarnings]
|
|
126
|
-
: warnings,
|
|
106
|
+
warnings,
|
|
127
107
|
};
|
|
128
108
|
}
|
|
129
109
|
//# sourceMappingURL=stitch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,6BAA6B,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stitch.js","sourceRoot":"","sources":["../../src/conversation/stitch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AudioOutput } from "../audio-output.js";
|
|
2
2
|
import type { PronunciationsInput } from "../pronunciations/types.js";
|
|
3
3
|
import type { ResolvedModel, Voice } from "../speech-provider.js";
|
|
4
|
+
import type { TimestampProvider } from "../timestamp-provider.js";
|
|
4
5
|
export interface ConversationTurn<V extends Voice = Voice> {
|
|
5
6
|
readonly model?: string | ResolvedModel<V>;
|
|
6
7
|
readonly providerOptions?: Record<string, unknown>;
|
|
@@ -21,6 +22,7 @@ export interface GenerateConversationOptions<V extends Voice = Voice, M extends
|
|
|
21
22
|
readonly pronunciations?: PronunciationsInput;
|
|
22
23
|
readonly providerOptions?: Record<string, unknown>;
|
|
23
24
|
readonly speed?: number;
|
|
25
|
+
readonly timestampProvider?: TimestampProvider;
|
|
24
26
|
readonly timestamps?: boolean;
|
|
25
27
|
readonly turns: readonly ConversationTurn<V>[];
|
|
26
28
|
readonly volumeDbfs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B,CAC1C,CAAC,SAAS,KAAK,GAAG,KAAK,EACvB,CAAC,SAAS,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,GAC3C,MAAM,GACN,aAAa,CAAC,CAAC,CAAC,GAChB,SAAS;IAEb,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B,CAC1C,CAAC,SAAS,KAAK,GAAG,KAAK,EACvB,CAAC,SAAS,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,GAC3C,MAAM,GACN,aAAa,CAAC,CAAC,CAAC,GAChB,SAAS;IAEb,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-timestamps.d.ts","sourceRoot":"","sources":["../src/derive-timestamps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"derive-timestamps.d.ts","sourceRoot":"","sources":["../src/derive-timestamps.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;CACtC,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAsBpC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MissingApiKeyError, TimestampKeyMissingError } from "./errors.js";
|
|
1
|
+
import { MissingApiKeyError, TimestampKeyMissingError, withProviderErrorStage, } from "./errors.js";
|
|
2
2
|
export async function deriveTimestampsViaSTT(args) {
|
|
3
3
|
const sttModel = args.timestampFallback;
|
|
4
4
|
try {
|
|
@@ -19,7 +19,7 @@ export async function deriveTimestampsViaSTT(args) {
|
|
|
19
19
|
envVar: err.envVar,
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
-
throw err;
|
|
22
|
+
throw withProviderErrorStage(err, "alignment");
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
//# sourceMappingURL=derive-timestamps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-timestamps.js","sourceRoot":"","sources":["../src/derive-timestamps.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"derive-timestamps.js","sourceRoot":"","sources":["../src/derive-timestamps.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAIrB,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAO5C;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxD,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACnD,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;YACtC,MAAM,IAAI,wBAAwB,CAAC;gBACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAC1D,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,sBAAsB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -18,6 +18,33 @@ export declare class ApiError extends SpeechSDKError {
|
|
|
18
18
|
retryAfterMs?: number;
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
+
export type ProviderErrorStage = "alignment" | "synthesis";
|
|
22
|
+
export interface SpeechSdkProviderErrorOptions {
|
|
23
|
+
readonly cause?: unknown;
|
|
24
|
+
readonly code?: string;
|
|
25
|
+
readonly details?: unknown;
|
|
26
|
+
readonly model?: string;
|
|
27
|
+
readonly provider: string;
|
|
28
|
+
readonly rawResponse?: string;
|
|
29
|
+
readonly requestId?: string;
|
|
30
|
+
readonly retryAfterMs?: number;
|
|
31
|
+
readonly retryable: boolean;
|
|
32
|
+
readonly stage?: ProviderErrorStage;
|
|
33
|
+
readonly status: number;
|
|
34
|
+
readonly turnIndex?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class SpeechSdkProviderError extends ApiError {
|
|
37
|
+
readonly status: number;
|
|
38
|
+
readonly provider: string;
|
|
39
|
+
readonly model?: string;
|
|
40
|
+
readonly details?: unknown;
|
|
41
|
+
readonly rawResponse?: string;
|
|
42
|
+
readonly requestId?: string;
|
|
43
|
+
readonly retryable: boolean;
|
|
44
|
+
readonly stage?: ProviderErrorStage;
|
|
45
|
+
constructor(message: string, options: SpeechSdkProviderErrorOptions);
|
|
46
|
+
toJSON(): Record<string, unknown>;
|
|
47
|
+
}
|
|
21
48
|
export declare class NoSpeechGeneratedError extends SpeechSDKError {
|
|
22
49
|
readonly turnIndex?: number;
|
|
23
50
|
constructor(message?: string, options?: {
|
|
@@ -25,6 +52,7 @@ export declare class NoSpeechGeneratedError extends SpeechSDKError {
|
|
|
25
52
|
});
|
|
26
53
|
}
|
|
27
54
|
export declare function withTurnIndex(err: unknown, turnIndex: number): unknown;
|
|
55
|
+
export declare function withProviderErrorStage(err: unknown, stage: ProviderErrorStage): unknown;
|
|
28
56
|
export declare class StreamingNotSupportedError extends SpeechSDKError {
|
|
29
57
|
constructor(model: string);
|
|
30
58
|
}
|
|
@@ -95,4 +123,16 @@ export declare class TimestampKeyMissingError extends SpeechSDKError {
|
|
|
95
123
|
envVar: string;
|
|
96
124
|
});
|
|
97
125
|
}
|
|
126
|
+
export declare class TimestampProviderRequiredError extends SpeechSDKError {
|
|
127
|
+
readonly model: string;
|
|
128
|
+
constructor(model: string);
|
|
129
|
+
}
|
|
130
|
+
export declare class TimestampValidationError extends SpeechSDKError {
|
|
131
|
+
readonly reason: "empty" | "invalid_timing" | "transcript_mismatch";
|
|
132
|
+
readonly source: string;
|
|
133
|
+
constructor(options: {
|
|
134
|
+
reason: "empty" | "invalid_timing" | "transcript_mismatch";
|
|
135
|
+
source: string;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
98
138
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,qBAAa,QAAS,SAAQ,cAAc;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAUJ;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IAExD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAK/D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,qBAAa,QAAS,SAAQ,cAAc;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEhC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAUJ;AAED,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAsCD,qBAAa,sBAAuB,SAAQ,QAAQ;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B;IAoBnE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CA0BlC;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IAExD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAK/D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAkBtE;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAIT;AAyBD,qBAAa,0BAA2B,SAAQ,cAAc;gBAChD,KAAK,EAAE,MAAM;CAM1B;AAED,qBAAa,gCAAiC,SAAQ,cAAc;gBACtD,KAAK,EAAE,MAAM;CAM1B;AAED,qBAAa,0BAA2B,SAAQ,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;gBAE1B,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE;CAU3E;AAED,qBAAa,gCAAiC,SAAQ,cAAc;gBACtD,KAAK,EAAE,MAAM;CAM1B;AAED,qBAAa,4BAA6B,SAAQ,cAAc;gBAClD,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAMjD;AAED,qBAAa,qBAAsB,SAAQ,cAAc;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAQ9D;AAED,qBAAa,4BAA6B,SAAQ,cAAc;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAO9C;AAED,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAS5D;AAED,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAS5E;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM1D;AAED,qBAAa,2BAA4B,SAAQ,cAAc;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAO9C;AAED,qBAAa,uBAAwB,SAAQ,cAAc;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM1D;AAED,qBAAa,wBAAyB,SAAQ,cAAc;gBAC9C,OAAO,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB;CASF;AAED,qBAAa,8BAA+B,SAAQ,cAAc;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;CAO1B;AAED,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE;QACnB,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;QAC3D,MAAM,EAAE,MAAM,CAAC;KAChB;CAQF"}
|
package/dist/errors.js
CHANGED
|
@@ -7,7 +7,7 @@ export class SpeechSDKError extends Error {
|
|
|
7
7
|
export class ApiError extends SpeechSDKError {
|
|
8
8
|
statusCode;
|
|
9
9
|
responseBody;
|
|
10
|
-
// RFC 7807 `code` extension
|
|
10
|
+
// Provider canonical code or RFC 7807 `code` extension.
|
|
11
11
|
code;
|
|
12
12
|
// Set by generateConversation's stitch path; undefined for single-turn calls and single-API-call paths (gateway, native dialogue).
|
|
13
13
|
turnIndex;
|
|
@@ -22,6 +22,88 @@ export class ApiError extends SpeechSDKError {
|
|
|
22
22
|
this.retryAfterMs = options.retryAfterMs;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
+
function jsonSafeDetails(value) {
|
|
26
|
+
const ancestors = [];
|
|
27
|
+
try {
|
|
28
|
+
const serialized = JSON.stringify(value, function replaceNonJsonValues(_key, nestedValue) {
|
|
29
|
+
if (typeof nestedValue === "bigint") {
|
|
30
|
+
return `${nestedValue}n`;
|
|
31
|
+
}
|
|
32
|
+
if (typeof nestedValue !== "object" || nestedValue === null) {
|
|
33
|
+
return nestedValue;
|
|
34
|
+
}
|
|
35
|
+
while (ancestors.length > 0 && ancestors.at(-1) !== this) {
|
|
36
|
+
ancestors.pop();
|
|
37
|
+
}
|
|
38
|
+
if (ancestors.includes(nestedValue)) {
|
|
39
|
+
return "[Circular]";
|
|
40
|
+
}
|
|
41
|
+
ancestors.push(nestedValue);
|
|
42
|
+
return nestedValue;
|
|
43
|
+
});
|
|
44
|
+
return serialized === undefined
|
|
45
|
+
? `[Unserializable ${typeof value}]`
|
|
46
|
+
: JSON.parse(serialized);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return "[Unserializable details]";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class SpeechSdkProviderError extends ApiError {
|
|
53
|
+
status;
|
|
54
|
+
provider;
|
|
55
|
+
model;
|
|
56
|
+
details;
|
|
57
|
+
rawResponse;
|
|
58
|
+
requestId;
|
|
59
|
+
retryable;
|
|
60
|
+
stage;
|
|
61
|
+
constructor(message, options) {
|
|
62
|
+
super(message, {
|
|
63
|
+
statusCode: options.status,
|
|
64
|
+
responseBody: options.rawResponse,
|
|
65
|
+
cause: options.cause,
|
|
66
|
+
code: options.code,
|
|
67
|
+
turnIndex: options.turnIndex,
|
|
68
|
+
retryAfterMs: options.retryAfterMs,
|
|
69
|
+
});
|
|
70
|
+
this.name = "SpeechSdkProviderError";
|
|
71
|
+
this.status = options.status;
|
|
72
|
+
this.provider = options.provider;
|
|
73
|
+
this.model = options.model;
|
|
74
|
+
this.details = options.details;
|
|
75
|
+
this.rawResponse = options.rawResponse;
|
|
76
|
+
this.requestId = options.requestId;
|
|
77
|
+
this.retryable = options.retryable;
|
|
78
|
+
this.stage = options.stage;
|
|
79
|
+
}
|
|
80
|
+
toJSON() {
|
|
81
|
+
return {
|
|
82
|
+
name: this.name,
|
|
83
|
+
message: this.message,
|
|
84
|
+
status: this.status,
|
|
85
|
+
statusCode: this.statusCode,
|
|
86
|
+
provider: this.provider,
|
|
87
|
+
...(this.model !== undefined && { model: this.model }),
|
|
88
|
+
...(this.code !== undefined && { code: this.code }),
|
|
89
|
+
...(this.details !== undefined && {
|
|
90
|
+
details: jsonSafeDetails(this.details),
|
|
91
|
+
}),
|
|
92
|
+
...(this.rawResponse !== undefined && {
|
|
93
|
+
rawResponse: this.rawResponse,
|
|
94
|
+
responseBody: this.responseBody,
|
|
95
|
+
}),
|
|
96
|
+
...(this.requestId !== undefined && { requestId: this.requestId }),
|
|
97
|
+
retryable: this.retryable,
|
|
98
|
+
...(this.stage !== undefined && { stage: this.stage }),
|
|
99
|
+
...(this.turnIndex !== undefined && { turnIndex: this.turnIndex }),
|
|
100
|
+
...(this.retryAfterMs !== undefined && {
|
|
101
|
+
retryAfterMs: this.retryAfterMs,
|
|
102
|
+
}),
|
|
103
|
+
...(this.stack !== undefined && { stack: this.stack }),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
25
107
|
export class NoSpeechGeneratedError extends SpeechSDKError {
|
|
26
108
|
// Set by generateConversation's stitch path; undefined for single-turn calls.
|
|
27
109
|
turnIndex;
|
|
@@ -32,6 +114,9 @@ export class NoSpeechGeneratedError extends SpeechSDKError {
|
|
|
32
114
|
}
|
|
33
115
|
}
|
|
34
116
|
export function withTurnIndex(err, turnIndex) {
|
|
117
|
+
if (err instanceof SpeechSdkProviderError) {
|
|
118
|
+
return copyProviderError(err, { turnIndex });
|
|
119
|
+
}
|
|
35
120
|
if (err instanceof ApiError) {
|
|
36
121
|
return new ApiError(err.message, {
|
|
37
122
|
statusCode: err.statusCode,
|
|
@@ -47,6 +132,27 @@ export function withTurnIndex(err, turnIndex) {
|
|
|
47
132
|
}
|
|
48
133
|
return err;
|
|
49
134
|
}
|
|
135
|
+
export function withProviderErrorStage(err, stage) {
|
|
136
|
+
return err instanceof SpeechSdkProviderError
|
|
137
|
+
? copyProviderError(err, { stage })
|
|
138
|
+
: err;
|
|
139
|
+
}
|
|
140
|
+
function copyProviderError(error, overrides) {
|
|
141
|
+
return new SpeechSdkProviderError(error.message, {
|
|
142
|
+
status: error.status,
|
|
143
|
+
provider: error.provider,
|
|
144
|
+
model: error.model,
|
|
145
|
+
code: error.code,
|
|
146
|
+
details: error.details,
|
|
147
|
+
rawResponse: error.rawResponse,
|
|
148
|
+
requestId: error.requestId,
|
|
149
|
+
retryable: error.retryable,
|
|
150
|
+
stage: overrides.stage ?? error.stage,
|
|
151
|
+
turnIndex: overrides.turnIndex ?? error.turnIndex,
|
|
152
|
+
retryAfterMs: error.retryAfterMs,
|
|
153
|
+
cause: error,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
50
156
|
export class StreamingNotSupportedError extends SpeechSDKError {
|
|
51
157
|
constructor(model) {
|
|
52
158
|
super(`Streaming is not supported by ${model}. Use generateSpeech() instead.`);
|
|
@@ -173,4 +279,22 @@ export class TimestampKeyMissingError extends SpeechSDKError {
|
|
|
173
279
|
this.name = "TimestampKeyMissingError";
|
|
174
280
|
}
|
|
175
281
|
}
|
|
282
|
+
export class TimestampProviderRequiredError extends SpeechSDKError {
|
|
283
|
+
model;
|
|
284
|
+
constructor(model) {
|
|
285
|
+
super(`${model} does not return word timestamps natively. Pass timestampProvider when timestamps is true.`);
|
|
286
|
+
this.name = "TimestampProviderRequiredError";
|
|
287
|
+
this.model = model;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
export class TimestampValidationError extends SpeechSDKError {
|
|
291
|
+
reason;
|
|
292
|
+
source;
|
|
293
|
+
constructor(options) {
|
|
294
|
+
super(`Timestamp alignment from ${options.source} is invalid: ${options.reason}.`);
|
|
295
|
+
this.name = "TimestampValidationError";
|
|
296
|
+
this.reason = options.reason;
|
|
297
|
+
this.source = options.source;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
176
300
|
//# sourceMappingURL=errors.js.map
|