@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.
Files changed (117) hide show
  1. package/README.md +69 -17
  2. package/dist/conversation/stitch.d.ts +2 -0
  3. package/dist/conversation/stitch.d.ts.map +1 -1
  4. package/dist/conversation/stitch.js +14 -34
  5. package/dist/conversation/stitch.js.map +1 -1
  6. package/dist/conversation/types.d.ts +2 -0
  7. package/dist/conversation/types.d.ts.map +1 -1
  8. package/dist/derive-timestamps.d.ts.map +1 -1
  9. package/dist/derive-timestamps.js +2 -2
  10. package/dist/derive-timestamps.js.map +1 -1
  11. package/dist/errors.d.ts +40 -0
  12. package/dist/errors.d.ts.map +1 -1
  13. package/dist/errors.js +125 -1
  14. package/dist/errors.js.map +1 -1
  15. package/dist/generate-conversation.d.ts +5 -2
  16. package/dist/generate-conversation.d.ts.map +1 -1
  17. package/dist/generate-conversation.js +87 -7
  18. package/dist/generate-conversation.js.map +1 -1
  19. package/dist/generate-speech.d.ts +4 -1
  20. package/dist/generate-speech.d.ts.map +1 -1
  21. package/dist/generate-speech.js +22 -72
  22. package/dist/generate-speech.js.map +1 -1
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/pronunciations/inverse-align.d.ts.map +1 -1
  28. package/dist/pronunciations/inverse-align.js +6 -1
  29. package/dist/pronunciations/inverse-align.js.map +1 -1
  30. package/dist/provider-utils.d.ts +8 -2
  31. package/dist/provider-utils.d.ts.map +1 -1
  32. package/dist/provider-utils.js +69 -19
  33. package/dist/provider-utils.js.map +1 -1
  34. package/dist/providers/cartesia/index.d.ts.map +1 -1
  35. package/dist/providers/cartesia/index.js +16 -4
  36. package/dist/providers/cartesia/index.js.map +1 -1
  37. package/dist/providers/deepgram/index.d.ts.map +1 -1
  38. package/dist/providers/deepgram/index.js +10 -2
  39. package/dist/providers/deepgram/index.js.map +1 -1
  40. package/dist/providers/elevenlabs/alignment.d.ts.map +1 -1
  41. package/dist/providers/elevenlabs/alignment.js +57 -23
  42. package/dist/providers/elevenlabs/alignment.js.map +1 -1
  43. package/dist/providers/elevenlabs/forced-alignment.d.ts +23 -0
  44. package/dist/providers/elevenlabs/forced-alignment.d.ts.map +1 -0
  45. package/dist/providers/elevenlabs/forced-alignment.js +64 -0
  46. package/dist/providers/elevenlabs/forced-alignment.js.map +1 -0
  47. package/dist/providers/elevenlabs/index.d.ts +4 -1
  48. package/dist/providers/elevenlabs/index.d.ts.map +1 -1
  49. package/dist/providers/elevenlabs/index.js +28 -13
  50. package/dist/providers/elevenlabs/index.js.map +1 -1
  51. package/dist/providers/fal/index.d.ts.map +1 -1
  52. package/dist/providers/fal/index.js +12 -9
  53. package/dist/providers/fal/index.js.map +1 -1
  54. package/dist/providers/fish-audio/index.d.ts.map +1 -1
  55. package/dist/providers/fish-audio/index.js +17 -5
  56. package/dist/providers/fish-audio/index.js.map +1 -1
  57. package/dist/providers/gateway/index.d.ts.map +1 -1
  58. package/dist/providers/gateway/index.js +43 -13
  59. package/dist/providers/gateway/index.js.map +1 -1
  60. package/dist/providers/google/index.d.ts.map +1 -1
  61. package/dist/providers/google/index.js +15 -3
  62. package/dist/providers/google/index.js.map +1 -1
  63. package/dist/providers/gradium/index.d.ts.map +1 -1
  64. package/dist/providers/gradium/index.js +6 -2
  65. package/dist/providers/gradium/index.js.map +1 -1
  66. package/dist/providers/hume/index.d.ts.map +1 -1
  67. package/dist/providers/hume/index.js +22 -6
  68. package/dist/providers/hume/index.js.map +1 -1
  69. package/dist/providers/inworld/index.d.ts.map +1 -1
  70. package/dist/providers/inworld/index.js +13 -5
  71. package/dist/providers/inworld/index.js.map +1 -1
  72. package/dist/providers/minimax/index.d.ts.map +1 -1
  73. package/dist/providers/minimax/index.js +8 -4
  74. package/dist/providers/minimax/index.js.map +1 -1
  75. package/dist/providers/mistral/index.d.ts.map +1 -1
  76. package/dist/providers/mistral/index.js +11 -3
  77. package/dist/providers/mistral/index.js.map +1 -1
  78. package/dist/providers/murf/index.d.ts.map +1 -1
  79. package/dist/providers/murf/index.js +10 -2
  80. package/dist/providers/murf/index.js.map +1 -1
  81. package/dist/providers/openai/index.d.ts.map +1 -1
  82. package/dist/providers/openai/index.js +15 -3
  83. package/dist/providers/openai/index.js.map +1 -1
  84. package/dist/providers/resemble/index.d.ts.map +1 -1
  85. package/dist/providers/resemble/index.js +12 -4
  86. package/dist/providers/resemble/index.js.map +1 -1
  87. package/dist/providers/smallest-ai/index.d.ts.map +1 -1
  88. package/dist/providers/smallest-ai/index.js +6 -2
  89. package/dist/providers/smallest-ai/index.js.map +1 -1
  90. package/dist/providers/speechify/index.d.ts.map +1 -1
  91. package/dist/providers/speechify/index.js +5 -1
  92. package/dist/providers/speechify/index.js.map +1 -1
  93. package/dist/providers/xai/index.d.ts.map +1 -1
  94. package/dist/providers/xai/index.js +11 -3
  95. package/dist/providers/xai/index.js.map +1 -1
  96. package/dist/speech-result.d.ts +6 -0
  97. package/dist/speech-result.d.ts.map +1 -1
  98. package/dist/speech-result.js.map +1 -1
  99. package/dist/timestamp-alignment.d.ts +34 -0
  100. package/dist/timestamp-alignment.d.ts.map +1 -0
  101. package/dist/timestamp-alignment.js +125 -0
  102. package/dist/timestamp-alignment.js.map +1 -0
  103. package/dist/timestamp-finalization.d.ts +15 -0
  104. package/dist/timestamp-finalization.d.ts.map +1 -0
  105. package/dist/timestamp-finalization.js +111 -0
  106. package/dist/timestamp-finalization.js.map +1 -0
  107. package/dist/timestamp-provider.d.ts +10 -0
  108. package/dist/timestamp-provider.d.ts.map +1 -0
  109. package/dist/timestamp-provider.js +2 -0
  110. package/dist/timestamp-provider.js.map +1 -0
  111. package/dist/types.d.ts +4 -1
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +1 -1
  114. package/dist/default-stt-fallback.d.ts +0 -3
  115. package/dist/default-stt-fallback.d.ts.map +0 -1
  116. package/dist/default-stt-fallback.js +0 -11
  117. 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` | Always return timestamps. Uses native alignment when available; otherwise transcribes the audio via STT (extra cost + latency). |
180
- | `false` *(default)* | Never return timestamps. |
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
- With `timestamps: true`, models without native alignment require an STT fallback. The SDK automatically uses OpenAI Whisper when `OPENAI_API_KEY` is set in the environment — no extra configuration needed. Gateway-routed models (string model IDs like `"openai/tts-1"`) do not need a fallback — the gateway server provides it.
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
- **Resolution order:** factory `fallbackSTT` → `OPENAI_API_KEY` env var (automatic Whisper fallback) → throws `TimestampKeyMissingError`.
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
- `generateConversation` accepts the same options and returns `ConversationWordTimestamp[]` — every word carries a `turnIndex: number` pointing back into the input `turns[]`. This is what lets you build chat-bubble UIs, speaker-attributed transcripts, and "who's speaking now?" lookups during playback without re-deriving turn boundaries.
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, // default false
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, ApiError } from '@speech-sdk/core';
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 ApiError) {
478
- error.statusCode; // 401, 429, 500, ...
479
- error.responseBody;
480
- error.code; // stable machine-readable code (optional)
481
- error.retryAfterMs; // parsed Retry-After header in ms (optional)
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
- `ApiError.code` is populated from the RFC 7807 `application/problem+json` `code` extension when the upstream provides one (currently only the Speech Gateway). Match on `err.code` over `err.message` text — codes are a stable contract, messages aren't.
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
- | `ApiError` | Provider returned non-2xx |
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
- | `TimestampKeyMissingError` | `timestamps: true` with no native support, no `fallbackSTT` configured, and `OPENAI_API_KEY` not set |
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 `ApiError.retryAfterMs` whenever the header is present, even on terminal errors that aren't retried. Default 2 retries; override via `maxRetries`.
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;AAQlE,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,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;AAID,wBAAsB,SAAS,CAAC,CAAC,SAAS,KAAK,EAC7C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,YAAY,CAAC,CAsJvB"}
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 && turnTimestamps.length > 0) {
81
- for (const w of turnTimestamps) {
82
- timestamps.push({
83
- text: w.text,
84
- start: w.start + offsetSec,
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
- else {
91
- const turnText = input.turns[i]?.text ?? "";
92
- const tokens = turnText
93
- .split(WHITESPACE_RE)
94
- .filter((t) => t.length > 0);
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
- if (filledTurns.length > 0) {
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: warnings.length > 0 || fillWarnings.length > 0
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":"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"}
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":"AACA,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
+ {"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,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAI3E,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,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
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
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
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; only Speech Gateway populates it today.
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