@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.
Files changed (245) hide show
  1. package/README.md +227 -108
  2. package/dist/__tests__/e2e/_save-audio.d.ts +0 -42
  3. package/dist/__tests__/e2e/_save-audio.d.ts.map +1 -1
  4. package/dist/__tests__/e2e/_save-audio.js +0 -59
  5. package/dist/__tests__/e2e/_save-audio.js.map +1 -1
  6. package/dist/audio-decode.d.ts +7 -0
  7. package/dist/audio-decode.d.ts.map +1 -0
  8. package/dist/audio-decode.js +109 -0
  9. package/dist/audio-decode.js.map +1 -0
  10. package/dist/audio-duration.d.ts +0 -5
  11. package/dist/audio-duration.d.ts.map +1 -1
  12. package/dist/audio-duration.js +5 -21
  13. package/dist/audio-duration.js.map +1 -1
  14. package/dist/audio-output.d.ts +39 -0
  15. package/dist/audio-output.d.ts.map +1 -0
  16. package/dist/audio-output.js +111 -0
  17. package/dist/audio-output.js.map +1 -0
  18. package/dist/audio-utils.d.ts +2 -10
  19. package/dist/audio-utils.d.ts.map +1 -1
  20. package/dist/audio-utils.js +57 -15
  21. package/dist/audio-utils.js.map +1 -1
  22. package/dist/captions.d.ts +0 -108
  23. package/dist/captions.d.ts.map +1 -1
  24. package/dist/captions.js +8 -98
  25. package/dist/captions.js.map +1 -1
  26. package/dist/conversation/attribute-timestamps.d.ts +26 -0
  27. package/dist/conversation/attribute-timestamps.d.ts.map +1 -0
  28. package/dist/conversation/attribute-timestamps.js +276 -0
  29. package/dist/conversation/attribute-timestamps.js.map +1 -0
  30. package/dist/conversation/dispatch.d.ts +5 -5
  31. package/dist/conversation/dispatch.d.ts.map +1 -1
  32. package/dist/conversation/dispatch.js +18 -8
  33. package/dist/conversation/dispatch.js.map +1 -1
  34. package/dist/conversation/errors.d.ts +3 -0
  35. package/dist/conversation/errors.d.ts.map +1 -1
  36. package/dist/conversation/errors.js +6 -0
  37. package/dist/conversation/errors.js.map +1 -1
  38. package/dist/conversation/pcm-concat.d.ts +0 -24
  39. package/dist/conversation/pcm-concat.d.ts.map +1 -1
  40. package/dist/conversation/pcm-concat.js +8 -183
  41. package/dist/conversation/pcm-concat.js.map +1 -1
  42. package/dist/conversation/proportional-fill.d.ts +10 -0
  43. package/dist/conversation/proportional-fill.d.ts.map +1 -0
  44. package/dist/conversation/proportional-fill.js +64 -0
  45. package/dist/conversation/proportional-fill.js.map +1 -0
  46. package/dist/conversation/silence-detection.d.ts +14 -0
  47. package/dist/conversation/silence-detection.d.ts.map +1 -0
  48. package/dist/conversation/silence-detection.js +52 -0
  49. package/dist/conversation/silence-detection.js.map +1 -0
  50. package/dist/conversation/stitch.d.ts +9 -6
  51. package/dist/conversation/stitch.d.ts.map +1 -1
  52. package/dist/conversation/stitch.js +72 -51
  53. package/dist/conversation/stitch.js.map +1 -1
  54. package/dist/conversation/types.d.ts +7 -37
  55. package/dist/conversation/types.d.ts.map +1 -1
  56. package/dist/conversation/validate.d.ts +1 -16
  57. package/dist/conversation/validate.d.ts.map +1 -1
  58. package/dist/conversation/validate.js +29 -29
  59. package/dist/conversation/validate.js.map +1 -1
  60. package/dist/default-stt-fallback.d.ts +3 -0
  61. package/dist/default-stt-fallback.d.ts.map +1 -0
  62. package/dist/default-stt-fallback.js +11 -0
  63. package/dist/default-stt-fallback.js.map +1 -0
  64. package/dist/derive-timestamps.d.ts +1 -5
  65. package/dist/derive-timestamps.d.ts.map +1 -1
  66. package/dist/derive-timestamps.js +1 -15
  67. package/dist/derive-timestamps.js.map +1 -1
  68. package/dist/encoders/mp3.d.ts +6 -0
  69. package/dist/encoders/mp3.d.ts.map +1 -0
  70. package/dist/encoders/mp3.js +54 -0
  71. package/dist/encoders/mp3.js.map +1 -0
  72. package/dist/errors.d.ts +20 -13
  73. package/dist/errors.d.ts.map +1 -1
  74. package/dist/errors.js +49 -15
  75. package/dist/errors.js.map +1 -1
  76. package/dist/generate-conversation.d.ts +5 -4
  77. package/dist/generate-conversation.d.ts.map +1 -1
  78. package/dist/generate-conversation.js +250 -93
  79. package/dist/generate-conversation.js.map +1 -1
  80. package/dist/generate-speech.d.ts +7 -28
  81. package/dist/generate-speech.d.ts.map +1 -1
  82. package/dist/generate-speech.js +185 -94
  83. package/dist/generate-speech.js.map +1 -1
  84. package/dist/index.d.ts +7 -11
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/logger.d.ts.map +1 -1
  89. package/dist/logger.js +2 -13
  90. package/dist/logger.js.map +1 -1
  91. package/dist/metadata.d.ts +0 -22
  92. package/dist/metadata.d.ts.map +1 -1
  93. package/dist/pronunciations/errors.d.ts +5 -0
  94. package/dist/pronunciations/errors.d.ts.map +1 -0
  95. package/dist/pronunciations/errors.js +8 -0
  96. package/dist/pronunciations/errors.js.map +1 -0
  97. package/dist/pronunciations/inverse-align.d.ts +4 -0
  98. package/dist/pronunciations/inverse-align.d.ts.map +1 -0
  99. package/dist/pronunciations/inverse-align.js +54 -0
  100. package/dist/pronunciations/inverse-align.js.map +1 -0
  101. package/dist/pronunciations/merge.d.ts +4 -0
  102. package/dist/pronunciations/merge.d.ts.map +1 -0
  103. package/dist/pronunciations/merge.js +13 -0
  104. package/dist/pronunciations/merge.js.map +1 -0
  105. package/dist/pronunciations/substitute.d.ts +6 -0
  106. package/dist/pronunciations/substitute.d.ts.map +1 -0
  107. package/dist/pronunciations/substitute.js +67 -0
  108. package/dist/pronunciations/substitute.js.map +1 -0
  109. package/dist/pronunciations/types.d.ts +18 -0
  110. package/dist/pronunciations/types.d.ts.map +1 -0
  111. package/dist/pronunciations/types.js +2 -0
  112. package/dist/pronunciations/types.js.map +1 -0
  113. package/dist/pronunciations/validate.d.ts +3 -0
  114. package/dist/pronunciations/validate.d.ts.map +1 -0
  115. package/dist/pronunciations/validate.js +26 -0
  116. package/dist/pronunciations/validate.js.map +1 -0
  117. package/dist/provider-utils.d.ts +4 -9
  118. package/dist/provider-utils.d.ts.map +1 -1
  119. package/dist/provider-utils.js +60 -51
  120. package/dist/provider-utils.js.map +1 -1
  121. package/dist/providers/cartesia/alignment.d.ts +0 -16
  122. package/dist/providers/cartesia/alignment.d.ts.map +1 -1
  123. package/dist/providers/cartesia/alignment.js +1 -6
  124. package/dist/providers/cartesia/alignment.js.map +1 -1
  125. package/dist/providers/cartesia/index.d.ts +29 -19
  126. package/dist/providers/cartesia/index.d.ts.map +1 -1
  127. package/dist/providers/cartesia/index.js +116 -80
  128. package/dist/providers/cartesia/index.js.map +1 -1
  129. package/dist/providers/deepgram/index.d.ts +23 -8
  130. package/dist/providers/deepgram/index.d.ts.map +1 -1
  131. package/dist/providers/deepgram/index.js +51 -18
  132. package/dist/providers/deepgram/index.js.map +1 -1
  133. package/dist/providers/elevenlabs/alignment.d.ts +7 -21
  134. package/dist/providers/elevenlabs/alignment.d.ts.map +1 -1
  135. package/dist/providers/elevenlabs/alignment.js +8 -9
  136. package/dist/providers/elevenlabs/alignment.js.map +1 -1
  137. package/dist/providers/elevenlabs/index.d.ts +14 -38
  138. package/dist/providers/elevenlabs/index.d.ts.map +1 -1
  139. package/dist/providers/elevenlabs/index.js +186 -169
  140. package/dist/providers/elevenlabs/index.js.map +1 -1
  141. package/dist/providers/fal/index.d.ts +11 -20
  142. package/dist/providers/fal/index.d.ts.map +1 -1
  143. package/dist/providers/fal/index.js +49 -37
  144. package/dist/providers/fal/index.js.map +1 -1
  145. package/dist/providers/fish-audio/index.d.ts +14 -8
  146. package/dist/providers/fish-audio/index.d.ts.map +1 -1
  147. package/dist/providers/fish-audio/index.js +47 -19
  148. package/dist/providers/fish-audio/index.js.map +1 -1
  149. package/dist/providers/gateway/index.d.ts +76 -0
  150. package/dist/providers/gateway/index.d.ts.map +1 -0
  151. package/dist/providers/gateway/index.js +251 -0
  152. package/dist/providers/gateway/index.js.map +1 -0
  153. package/dist/providers/google/index.d.ts +12 -20
  154. package/dist/providers/google/index.d.ts.map +1 -1
  155. package/dist/providers/google/index.js +180 -162
  156. package/dist/providers/google/index.js.map +1 -1
  157. package/dist/providers/hume/alignment.d.ts +30 -35
  158. package/dist/providers/hume/alignment.d.ts.map +1 -1
  159. package/dist/providers/hume/alignment.js +14 -8
  160. package/dist/providers/hume/alignment.js.map +1 -1
  161. package/dist/providers/hume/index.d.ts +16 -16
  162. package/dist/providers/hume/index.d.ts.map +1 -1
  163. package/dist/providers/hume/index.js +79 -65
  164. package/dist/providers/hume/index.js.map +1 -1
  165. package/dist/providers/inworld/alignment.d.ts +8 -22
  166. package/dist/providers/inworld/alignment.d.ts.map +1 -1
  167. package/dist/providers/inworld/alignment.js +9 -8
  168. package/dist/providers/inworld/alignment.js.map +1 -1
  169. package/dist/providers/inworld/index.d.ts +17 -20
  170. package/dist/providers/inworld/index.d.ts.map +1 -1
  171. package/dist/providers/inworld/index.js +79 -47
  172. package/dist/providers/inworld/index.js.map +1 -1
  173. package/dist/providers/mistral/index.d.ts +14 -8
  174. package/dist/providers/mistral/index.d.ts.map +1 -1
  175. package/dist/providers/mistral/index.js +63 -48
  176. package/dist/providers/mistral/index.js.map +1 -1
  177. package/dist/providers/murf/alignment.d.ts +10 -19
  178. package/dist/providers/murf/alignment.d.ts.map +1 -1
  179. package/dist/providers/murf/alignment.js +10 -5
  180. package/dist/providers/murf/alignment.js.map +1 -1
  181. package/dist/providers/murf/index.d.ts +15 -16
  182. package/dist/providers/murf/index.d.ts.map +1 -1
  183. package/dist/providers/murf/index.js +105 -58
  184. package/dist/providers/murf/index.js.map +1 -1
  185. package/dist/providers/openai/index.d.ts +43 -29
  186. package/dist/providers/openai/index.d.ts.map +1 -1
  187. package/dist/providers/openai/index.js +294 -106
  188. package/dist/providers/openai/index.js.map +1 -1
  189. package/dist/providers/resemble/alignment.d.ts +8 -29
  190. package/dist/providers/resemble/alignment.d.ts.map +1 -1
  191. package/dist/providers/resemble/alignment.js +9 -12
  192. package/dist/providers/resemble/alignment.js.map +1 -1
  193. package/dist/providers/resemble/index.d.ts +21 -11
  194. package/dist/providers/resemble/index.d.ts.map +1 -1
  195. package/dist/providers/resemble/index.js +89 -49
  196. package/dist/providers/resemble/index.js.map +1 -1
  197. package/dist/providers/smallest-ai/index.d.ts +47 -0
  198. package/dist/providers/smallest-ai/index.d.ts.map +1 -0
  199. package/dist/providers/smallest-ai/index.js +107 -0
  200. package/dist/providers/smallest-ai/index.js.map +1 -0
  201. package/dist/providers/xai/index.d.ts +25 -9
  202. package/dist/providers/xai/index.d.ts.map +1 -1
  203. package/dist/providers/xai/index.js +63 -40
  204. package/dist/providers/xai/index.js.map +1 -1
  205. package/dist/providers.d.ts +31 -0
  206. package/dist/providers.d.ts.map +1 -0
  207. package/dist/providers.js +16 -0
  208. package/dist/providers.js.map +1 -0
  209. package/dist/resolve-provider.d.ts.map +1 -1
  210. package/dist/resolve-provider.js +8 -51
  211. package/dist/resolve-provider.js.map +1 -1
  212. package/dist/retry-options.d.ts +6 -0
  213. package/dist/retry-options.d.ts.map +1 -0
  214. package/dist/retry-options.js +48 -0
  215. package/dist/retry-options.js.map +1 -0
  216. package/dist/speech-provider.d.ts +28 -53
  217. package/dist/speech-provider.d.ts.map +1 -1
  218. package/dist/speech-provider.js +5 -26
  219. package/dist/speech-provider.js.map +1 -1
  220. package/dist/speech-result.d.ts +8 -9
  221. package/dist/speech-result.d.ts.map +1 -1
  222. package/dist/speech-result.js.map +1 -1
  223. package/dist/speech-to-text-provider.d.ts +0 -12
  224. package/dist/speech-to-text-provider.d.ts.map +1 -1
  225. package/dist/stream-speech.d.ts +4 -2
  226. package/dist/stream-speech.d.ts.map +1 -1
  227. package/dist/stream-speech.js +36 -22
  228. package/dist/stream-speech.js.map +1 -1
  229. package/dist/timestamps.d.ts +3 -17
  230. package/dist/timestamps.d.ts.map +1 -1
  231. package/dist/turns.d.ts +9 -0
  232. package/dist/turns.d.ts.map +1 -0
  233. package/dist/turns.js +21 -0
  234. package/dist/turns.js.map +1 -0
  235. package/dist/types.d.ts +31 -0
  236. package/dist/types.d.ts.map +1 -1
  237. package/dist/volume-adjust.d.ts +0 -6
  238. package/dist/volume-adjust.d.ts.map +1 -1
  239. package/dist/volume-adjust.js +4 -16
  240. package/dist/volume-adjust.js.map +1 -1
  241. package/package.json +13 -66
  242. package/dist/stt-providers/openai/index.d.ts +0 -42
  243. package/dist/stt-providers/openai/index.d.ts.map +0 -1
  244. package/dist/stt-providers/openai/index.js +0 -184
  245. package/dist/stt-providers/openai/index.js.map +0 -1
@@ -1,39 +1,73 @@
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 { chooseConversationPath } from "./conversation/dispatch.js";
4
5
  import { ConversationInputError } from "./conversation/errors.js";
5
6
  import { validateConversationInput } from "./conversation/validate.js";
7
+ import { getDefaultSTTFallback } from "./default-stt-fallback.js";
6
8
  import { deriveTimestampsViaSTT } from "./derive-timestamps.js";
7
- import { ApiError, NoSpeechGeneratedError } from "./errors.js";
9
+ import { NoSpeechGeneratedError, OutputConversionUnsupportedError, } from "./errors.js";
8
10
  import { debug } from "./logger.js";
11
+ import { inverseAlign } from "./pronunciations/inverse-align.js";
12
+ import { mergeRules } from "./pronunciations/merge.js";
13
+ import { substitute } from "./pronunciations/substitute.js";
14
+ import { validatePronunciationsInput } from "./pronunciations/validate.js";
9
15
  import { resolveModel } from "./resolve-provider.js";
16
+ import { buildRetryOptions } from "./retry-options.js";
10
17
  import { modelDeclaresNativeTimestamps, } from "./speech-provider.js";
11
18
  import { DefaultGeneratedAudioFile } from "./speech-result.js";
12
19
  // biome-ignore lint/performance/noBarrelFile: public entry point — re-export error classes so callers get fn + types + errors from one import
13
- export { ConversationInputError, DialogueConstraintError, StitchUnsupportedError, } from "./conversation/errors.js";
20
+ export { ConversationInputError, DialogueConstraintError, MixedDispatchError, StitchUnsupportedError, } from "./conversation/errors.js";
14
21
  const DEFAULT_GAP_MS = 300;
15
22
  const DEFAULT_MAX_CONCURRENCY = 6;
16
23
  const DEFAULT_MAX_RETRIES = 2;
17
24
  export async function generateConversation(options) {
18
25
  validateConversationInput(options);
26
+ validateOutput(options.output);
27
+ // Cache string-model resolutions so turns share one provider instance — dispatch compares by reference.
28
+ const stringResolutionCache = new Map();
29
+ const resolveOnce = (model) => {
30
+ if (typeof model !== "string") {
31
+ return resolveModel(model, {
32
+ apiKey: options.apiKey,
33
+ });
34
+ }
35
+ const cached = stringResolutionCache.get(model);
36
+ if (cached) {
37
+ return cached;
38
+ }
39
+ const fresh = resolveModel(model, {
40
+ apiKey: options.apiKey,
41
+ });
42
+ stringResolutionCache.set(model, fresh);
43
+ return fresh;
44
+ };
45
+ const topLevelResolved = options.model == null ? undefined : resolveOnce(options.model);
19
46
  const resolvedPerTurn = options.turns.map((turn) => {
20
- const model = turn.model ?? options.model;
47
+ if (turn.model == null && topLevelResolved) {
48
+ return topLevelResolved;
49
+ }
50
+ const model = turn.model;
21
51
  if (!model) {
22
52
  throw new Error("generateConversation: model is required");
23
53
  }
24
- return resolveModel(model, { apiKey: options.apiKey });
54
+ return resolveOnce(model);
25
55
  });
26
56
  const path = chooseConversationPath({
27
57
  resolvedPerTurn,
28
58
  turns: options.turns,
29
59
  });
60
+ const isGateway = path.kind === "gateway";
61
+ validatePronunciationsInput(options.pronunciations, isGateway);
62
+ if (path.kind === "gateway") {
63
+ return await runGateway({
64
+ options,
65
+ resolvedPerTurn: path.resolvedPerTurn,
66
+ maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
67
+ });
68
+ }
30
69
  if (path.kind === "native") {
31
- // The native-dialogue path renders the entire script in a single provider
32
- // API call, so per-turn providerOptions have no well-defined meaning —
33
- // silently collapsing them to a single blob would lie to the caller. Fail
34
- // loudly and let them move providerOptions to the top level (where it's
35
- // forwarded once to the dialogue call) or pick a model that routes
36
- // through the stitch path.
70
+ // Native-dialogue is one API call; per-turn providerOptions can't be honored — fail loudly.
37
71
  const turnWithOpts = options.turns.findIndex((t) => t.providerOptions !== undefined);
38
72
  if (turnWithOpts !== -1) {
39
73
  throw new ConversationInputError(`turns[${turnWithOpts}].providerOptions is set, but ${path.resolved.provider.id}/${path.resolved.modelId} dispatched to the native dialogue path, which renders all turns in one API call. Per-turn providerOptions are not supported on this path; move them to the top-level providerOptions instead.`);
@@ -44,9 +78,7 @@ export async function generateConversation(options) {
44
78
  maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
45
79
  });
46
80
  }
47
- // Lazy-load the stitch pipeline so callers whose dispatch always picks
48
- // native (e.g. a Jellypod gateway provider that handles concatenation
49
- // server-side) never bundle pcm-concat / audio-utils / mediabunny WAV mux.
81
+ // Lazy-load so native-only callers don't bundle pcm-concat / mediabunny.
50
82
  const { runStitch } = await import("./conversation/stitch.js");
51
83
  const stitched = await runStitch({
52
84
  resolvedPerTurn,
@@ -57,26 +89,23 @@ export async function generateConversation(options) {
57
89
  gapMs: options.gapMs ?? DEFAULT_GAP_MS,
58
90
  maxConcurrency: options.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY,
59
91
  maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
60
- normalizeVolume: options.normalizeVolume ?? true,
92
+ output: options.output,
61
93
  volumeDbfs: options.volumeDbfs,
62
94
  abortSignal: options.abortSignal,
63
95
  headers: options.headers,
64
- timestamps: options.timestamps ?? "auto",
65
- timestampProvider: options.timestampProvider,
96
+ timestamps: options.timestamps ?? false,
97
+ pronunciations: options.pronunciations,
66
98
  });
67
99
  if (stitched.audio.length === 0) {
68
100
  throw new NoSpeechGeneratedError();
69
101
  }
70
- const providers = Array.from(new Set(resolvedPerTurn.map((r) => r.provider.id)));
71
- const models = Array.from(new Set(resolvedPerTurn.map((r) => r.modelId)));
72
102
  const metadata = {
73
103
  latencyMs: stitched.metadata.latencyMs,
74
104
  inputChars: stitched.metadata.inputChars,
75
- provider: providers.length === 1 ? providers[0] : providers.join(","),
76
- model: models.length === 1 ? models[0] : models.join(","),
77
105
  ...(stitched.metadata.audioDurationMs != null && {
78
106
  audioDurationMs: stitched.metadata.audioDurationMs,
79
107
  }),
108
+ perTurn: stitched.metadataPerTurn,
80
109
  };
81
110
  return {
82
111
  audio: new DefaultGeneratedAudioFile({
@@ -89,6 +118,68 @@ export async function generateConversation(options) {
89
118
  timestamps: stitched.timestamps,
90
119
  };
91
120
  }
121
+ async function runGateway(args) {
122
+ const { options, resolvedPerTurn, maxRetries } = args;
123
+ const start = performance.now();
124
+ const provider = resolvedPerTurn[0]
125
+ .provider;
126
+ const includeTimestamps = options.timestamps ?? false;
127
+ // Pick wire shape: shared model when every turn resolved to the same modelId
128
+ // (covers both `options.model` and the case where every turn happened to
129
+ // resolve identically); per-turn model when they diverge.
130
+ const firstModelId = resolvedPerTurn[0].modelId;
131
+ const allSameModel = resolvedPerTurn.every((r) => r.modelId === firstModelId);
132
+ // Object-shaped voices aren't supported on the gateway conversation path.
133
+ const wireTurns = options.turns.map((t, i) => {
134
+ if (typeof t.voice !== "string") {
135
+ throw new Error(`speech-gateway/conversation: gateway conversation path requires string voices; turns[${i}].voice is an object.`);
136
+ }
137
+ return {
138
+ ...(allSameModel ? {} : { model: resolvedPerTurn[i].modelId }),
139
+ voice: t.voice,
140
+ text: t.text,
141
+ ...(t.providerOptions && { providerOptions: t.providerOptions }),
142
+ };
143
+ });
144
+ const result = await pRetry(() => provider.generateConversation({
145
+ ...(allSameModel && { modelId: firstModelId }),
146
+ turns: wireTurns,
147
+ gapMs: options.gapMs ?? DEFAULT_GAP_MS,
148
+ volumeDbfs: options.volumeDbfs,
149
+ providerOptions: options.providerOptions,
150
+ abortSignal: options.abortSignal,
151
+ headers: options.headers,
152
+ includeTimestamps,
153
+ output: options.output,
154
+ pronunciations: options.pronunciations,
155
+ }), buildRetryOptions({ maxRetries, abortSignal: options.abortSignal }));
156
+ const latencyMs = Math.round(performance.now() - start);
157
+ if (result.audio.length === 0) {
158
+ throw new NoSpeechGeneratedError();
159
+ }
160
+ const audio = new DefaultGeneratedAudioFile({
161
+ data: result.audio,
162
+ mediaType: result.mediaType,
163
+ });
164
+ const audioDurationMs = await computeAudioDuration(audio.uint8Array, result.mediaType);
165
+ const timestamps = includeTimestamps ? (result.timestamps ?? []) : undefined;
166
+ const warnings = result.warnings;
167
+ const inputChars = options.turns.reduce((n, t) => n + t.text.length, 0);
168
+ const metadata = {
169
+ latencyMs,
170
+ inputChars,
171
+ ...(audioDurationMs != null && { audioDurationMs }),
172
+ };
173
+ return {
174
+ audio,
175
+ metadata,
176
+ ...(result.providerMetadata !== undefined && {
177
+ providerMetadata: result.providerMetadata,
178
+ }),
179
+ timestamps,
180
+ warnings: warnings && warnings.length > 0 ? warnings : undefined,
181
+ };
182
+ }
92
183
  async function runNative(args) {
93
184
  const { options, resolved, maxRetries } = args;
94
185
  const start = performance.now();
@@ -96,131 +187,197 @@ async function runNative(args) {
96
187
  throw new Error(`generateConversation: ${resolved.provider.id}/${resolved.modelId} dispatched to native but generateDialogue missing`);
97
188
  }
98
189
  const generateDialogue = resolved.provider.generateDialogue.bind(resolved.provider);
99
- // When normalization is requested and the provider exposes a decodable
100
- // PCM/WAV mode via getStitchOptions, force the dialogue request into that
101
- // mode so we can re-RMS-level the output. Otherwise the dialogue runs
102
- // unchanged and emerges in whatever format the provider mixes natively
103
- // (often MP3) — we surface that via a warning.
104
- const normalize = options.normalizeVolume ?? true;
105
- const stitchOpts = normalize
106
- ? resolved.provider.getStitchOptions?.(resolved.modelId)
107
- : undefined;
190
+ // Force decodable PCM/WAV via getStitchOptions for normalization; if unavailable, emit the provider's mixed audio and warn.
191
+ const stitchOpts = resolved.provider.getStitchOptions?.(resolved.modelId);
108
192
  const warnings = [];
109
- if (normalize && !stitchOpts) {
110
- warnings.push(`${resolved.provider.id}/${resolved.modelId}: native dialogue path returns the provider's mixed audio without volume normalization. Pass normalizeVolume:false to silence this warning.`);
193
+ if (!stitchOpts) {
194
+ warnings.push(`${resolved.provider.id}/${resolved.modelId}: native dialogue path returns the provider's mixed audio without volume normalization (no decodable PCM/WAV mode).`);
111
195
  }
112
- // Stitch-mode options are applied last so they override user-supplied
113
- // providerOptions that would otherwise break the decoder (e.g. a caller
114
- // requesting `response_format: "mp3"` while normalization is on). Same
115
- // precedence as the stitch path's per-turn merge.
196
+ if (options.output && !stitchOpts) {
197
+ throw new OutputConversionUnsupportedError(`${resolved.provider.id}/${resolved.modelId}`);
198
+ }
199
+ // Stitch options must win caller-supplied response_format would break the decoder.
116
200
  const dialogueProviderOptions = stitchOpts
117
201
  ? { ...options.providerOptions, ...stitchOpts.providerOptions }
118
202
  : options.providerOptions;
119
- const timestampMode = options.timestamps ?? "auto";
203
+ const requestTimestamps = options.timestamps ?? false;
120
204
  const hasNativeDialogueTimestamps = modelDeclaresNativeTimestamps(resolved);
121
- const shouldRequestNative = (timestampMode === "on" || timestampMode === "auto") &&
122
- hasNativeDialogueTimestamps;
205
+ const shouldRequestNative = requestTimestamps && hasNativeDialogueTimestamps;
123
206
  const dialogueId = `${resolved.provider.id}/${resolved.modelId}`;
124
- if (timestampMode === "off") {
125
- debug(`${dialogueId} (dialogue): timestamps: "off" — skipping alignment.`);
207
+ if (!requestTimestamps) {
208
+ debug(`${dialogueId} (dialogue): timestamps: false — skipping alignment.`);
126
209
  }
127
210
  else if (shouldRequestNative) {
128
- debug(`${dialogueId} (dialogue): timestamps: "${timestampMode}" — requesting native dialogue alignment.`);
129
- }
130
- else if (timestampMode === "auto") {
131
- debug(`${dialogueId} (dialogue): timestamps: "auto" — dialogue endpoint has no native alignment; skipping. Pass timestamps: "on" to derive from the mixed audio via STT (flat list, no speaker labels).`);
211
+ debug(`${dialogueId} (dialogue): timestamps: true — requesting native dialogue alignment.`);
132
212
  }
133
213
  else {
134
- debug(`${dialogueId} (dialogue): timestamps: "on" but no native dialogue alignment — will transcribe mixed audio via STT after rendering (adds a round-trip).`);
214
+ debug(`${dialogueId} (dialogue): timestamps: true but no native dialogue alignment — will transcribe mixed audio via STT after rendering (adds a round-trip).`);
135
215
  }
216
+ const ruleMap = options.pronunciations?.rules?.length
217
+ ? mergeRules(options.pronunciations.rules)
218
+ : null;
219
+ const substitutedTurns = buildSubstitutedTurns(options.turns, ruleMap);
136
220
  const result = await pRetry(() => generateDialogue({
137
221
  modelId: resolved.modelId,
138
- turns: options.turns.map((t) => ({ voice: t.voice, text: t.text })),
222
+ turns: substitutedTurns.map((t) => ({ voice: t.voice, text: t.text })),
139
223
  providerOptions: dialogueProviderOptions,
140
224
  abortSignal: options.abortSignal,
141
225
  headers: options.headers,
142
226
  includeTimestamps: shouldRequestNative,
143
- }), {
144
- retries: maxRetries,
145
- signal: options.abortSignal,
146
- shouldRetry: ({ error }) => {
147
- if (error instanceof ApiError && error.statusCode < 500) {
148
- return false;
149
- }
150
- return true;
151
- },
152
- });
227
+ }), buildRetryOptions({ maxRetries, abortSignal: options.abortSignal }));
153
228
  const latencyMs = Math.round(performance.now() - start);
154
229
  if (result.audio.length === 0) {
155
230
  throw new NoSpeechGeneratedError();
156
231
  }
157
- let audioBytes = result.audio;
158
- // Prefer the stitch-mode mediaType over the provider's response header;
159
- // some providers (e.g. Hume) omit the sample rate from content-type.
160
- let outputMediaType = stitchOpts?.mediaType ?? result.mediaType;
161
- if (stitchOpts) {
162
- const { adjustVolume } = await import("./volume-adjust.js");
163
- audioBytes = await adjustVolume({
164
- audio: result.audio,
165
- mediaType: stitchOpts.mediaType,
166
- volumeDbfs: options.volumeDbfs ?? -20,
167
- });
168
- outputMediaType = "audio/wav";
169
- }
170
- const audio = new DefaultGeneratedAudioFile({
171
- data: audioBytes,
172
- mediaType: outputMediaType,
232
+ const { audio, outputMediaType } = await buildNativeAudio({
233
+ result,
234
+ stitchOpts,
235
+ volumeDbfs: options.volumeDbfs,
173
236
  });
174
237
  const computedDuration = await computeAudioDuration(audio.uint8Array, outputMediaType);
175
238
  const audioDurationMs = computedDuration ?? result.audioDurationMs;
176
- const timestamps = await resolveNativeDialogueTimestamps({
177
- timestampMode,
239
+ const { timestamps: rawTimestamps, warnings: attributionWarnings } = await resolveNativeDialogueTimestamps({
240
+ requestTimestamps,
178
241
  nativeTimestamps: result.timestamps,
179
242
  audio: audio.uint8Array,
180
243
  mediaType: outputMediaType,
181
244
  ttsModel: `${resolved.provider.id}/${resolved.modelId}`,
182
- timestampProvider: options.timestampProvider,
245
+ resolved,
183
246
  abortSignal: options.abortSignal,
247
+ substitutedTurnTexts: substitutedTurns.map((t) => t.text),
184
248
  });
249
+ const timestamps = ruleMap
250
+ ? inverseAlignDialogueTimestamps(rawTimestamps, substitutedTurns)
251
+ : rawTimestamps;
252
+ const converted = await applyOptionalOutputConversion({
253
+ audio: audio.uint8Array,
254
+ mediaType: outputMediaType,
255
+ output: options.output,
256
+ });
257
+ const finalAudio = options.output
258
+ ? new DefaultGeneratedAudioFile({
259
+ data: converted.audio,
260
+ mediaType: converted.mediaType,
261
+ })
262
+ : audio;
185
263
  const inputChars = options.turns.reduce((n, t) => n + t.text.length, 0);
186
264
  const metadata = {
187
265
  latencyMs,
188
266
  inputChars,
189
- provider: resolved.provider.id,
190
- model: resolved.modelId,
191
267
  ...(audioDurationMs != null && { audioDurationMs }),
192
268
  };
269
+ const mergedWarnings = warnings.length > 0 || attributionWarnings.length > 0
270
+ ? [...warnings, ...attributionWarnings]
271
+ : undefined;
193
272
  return {
194
- audio,
273
+ audio: finalAudio,
195
274
  metadata,
196
275
  providerMetadata: result.providerMetadata,
197
- warnings: warnings.length > 0 ? warnings : undefined,
276
+ warnings: mergedWarnings,
198
277
  timestamps,
199
278
  };
200
279
  }
201
- // Resolves timestamps for the native dialogue path:
202
- // - "off" → undefined
203
- // - native alignment returned → pass through
204
- // - "on" without native → STT fallback on the mixed audio
205
- // (flat WordTimestamp[] without speaker labels — limitation of one-call
206
- // dialogue rendering)
207
- // - "auto" without native → undefined
208
280
  async function resolveNativeDialogueTimestamps(args) {
209
- if (args.timestampMode === "off") {
210
- return;
281
+ if (!args.requestTimestamps) {
282
+ return { timestamps: undefined, warnings: [] };
211
283
  }
284
+ // Either use native flat timestamps, or derive via STT fallback.
285
+ let flatTimestamps;
212
286
  if (args.nativeTimestamps && args.nativeTimestamps.length > 0) {
213
- return args.nativeTimestamps;
287
+ flatTimestamps = args.nativeTimestamps;
214
288
  }
215
- if (args.timestampMode === "on") {
216
- return await deriveTimestampsViaSTT({
289
+ else {
290
+ const fallback = args.resolved.fallbackSTT ?? (await getDefaultSTTFallback());
291
+ flatTimestamps = await deriveTimestampsViaSTT({
217
292
  ttsModel: args.ttsModel,
218
293
  audio: args.audio,
219
294
  mediaType: args.mediaType,
220
- timestampProvider: args.timestampProvider,
295
+ timestampFallback: fallback,
221
296
  abortSignal: args.abortSignal,
222
297
  });
223
298
  }
224
- return;
299
+ const { decodeAudioToPcm16 } = await import("./audio-decode.js");
300
+ const { detectSilenceGaps } = await import("./conversation/silence-detection.js");
301
+ const { attributeTimestamps } = await import("./conversation/attribute-timestamps.js");
302
+ let silenceGaps = [];
303
+ try {
304
+ const segment = await decodeAudioToPcm16(args.audio, args.mediaType);
305
+ const gaps = detectSilenceGaps(segment.pcm, {
306
+ sampleRate: segment.sampleRate,
307
+ minDurationMs: 150,
308
+ });
309
+ silenceGaps = gaps;
310
+ }
311
+ catch {
312
+ // Decoder couldn't read the audio (e.g., compressed format we can't decode locally).
313
+ // Tier 1 will be skipped; dispatcher falls through to Tier 2/3.
314
+ }
315
+ const result = attributeTimestamps({
316
+ timestamps: flatTimestamps,
317
+ turnTexts: args.substitutedTurnTexts,
318
+ silenceGaps,
319
+ });
320
+ return {
321
+ timestamps: result.timestamps,
322
+ warnings: result.warnings,
323
+ };
324
+ }
325
+ async function buildNativeAudio(args) {
326
+ let audioBytes = args.result.audio;
327
+ // Hume and others omit sample rate from content-type; prefer stitch mediaType.
328
+ let outputMediaType = args.stitchOpts?.mediaType ?? args.result.mediaType;
329
+ if (args.stitchOpts) {
330
+ const { adjustVolume } = await import("./volume-adjust.js");
331
+ audioBytes = await adjustVolume({
332
+ audio: args.result.audio,
333
+ mediaType: args.stitchOpts.mediaType,
334
+ volumeDbfs: args.volumeDbfs ?? -20,
335
+ });
336
+ outputMediaType = "audio/wav";
337
+ }
338
+ const audio = new DefaultGeneratedAudioFile({
339
+ data: audioBytes,
340
+ mediaType: outputMediaType,
341
+ });
342
+ return { audio, outputMediaType };
343
+ }
344
+ function buildSubstitutedTurns(turns, ruleMap) {
345
+ return turns.map((t) => {
346
+ if (!ruleMap) {
347
+ return { voice: t.voice, text: t.text, edits: [] };
348
+ }
349
+ const subbed = substitute(t.text, ruleMap);
350
+ return { voice: t.voice, text: subbed.text, edits: subbed.edits };
351
+ });
352
+ }
353
+ function inverseAlignDialogueTimestamps(timestamps, perTurn) {
354
+ if (!timestamps) {
355
+ return timestamps;
356
+ }
357
+ const buckets = new Map();
358
+ for (const ts of timestamps) {
359
+ const bucket = buckets.get(ts.turnIndex);
360
+ if (bucket) {
361
+ bucket.push(ts);
362
+ }
363
+ else {
364
+ buckets.set(ts.turnIndex, [ts]);
365
+ }
366
+ }
367
+ const out = [];
368
+ for (let i = 0; i < perTurn.length; i++) {
369
+ const turnTimestamps = buckets.get(i);
370
+ if (!turnTimestamps?.length) {
371
+ continue;
372
+ }
373
+ const turn = perTurn[i];
374
+ if (turn.edits.length === 0) {
375
+ out.push(...turnTimestamps);
376
+ }
377
+ else {
378
+ out.push(...inverseAlign(turnTimestamps, turn.text, turn.edits));
379
+ }
380
+ }
381
+ return out;
225
382
  }
226
383
  //# sourceMappingURL=generate-conversation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-conversation.js","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-conversation.js","sourceRoot":"","sources":["../src/generate-conversation.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
+ import { type AudioOutput } from "./audio-output.js";
2
+ import type { PronunciationsFor } from "./pronunciations/types.js";
1
3
  import { type ResolvedModel, type Voice } from "./speech-provider.js";
2
4
  import type { SpeechResult } from "./speech-result.js";
3
- import type { ResolvedSTTModel } from "./speech-to-text-provider.js";
4
- import type { TimestampMode } from "./timestamps.js";
5
- export declare function generateSpeech<V extends Voice = Voice>(options: {
6
- model: string | ResolvedModel<V>;
5
+ export declare function generateSpeech<V extends Voice = Voice, M extends string | ResolvedModel<V> = string | ResolvedModel<V>>(options: {
6
+ model: M;
7
7
  text: string;
8
8
  voice: V;
9
9
  apiKey?: string;
@@ -11,30 +11,9 @@ export declare function generateSpeech<V extends Voice = Voice>(options: {
11
11
  maxRetries?: number;
12
12
  abortSignal?: AbortSignal;
13
13
  headers?: Record<string, string>;
14
- /**
15
- * RMS-normalize the returned audio to this dBFS level. Must be ≤ 0.
16
- * When set, generateSpeech requests the provider's decodable PCM/WAV
17
- * output mode (via `getStitchOptions`), normalizes the samples to the
18
- * target loudness, and re-encodes the result as 16-bit mono WAV — so
19
- * the response `mediaType` will be `audio/wav` regardless of the
20
- * provider's native default. Throws `VolumeAdjustmentUnsupportedError`
21
- * if the provider doesn't expose a decodable output mode.
22
- */
23
14
  volumeDbfs?: number;
24
- /**
25
- * Controls whether the returned `SpeechResult` includes word-level
26
- * timestamps. Default `"auto"` — return natively when the TTS provider
27
- * supplies alignment, otherwise omit. `"on"` forces word timestamps
28
- * (falling back to STT round-trip when necessary). `"off"` suppresses
29
- * them even for providers that would return them free.
30
- */
31
- timestamps?: TimestampMode;
32
- /**
33
- * Override the STT provider used for the derived-timestamps path. Construct
34
- * via a factory (e.g. `createOpenAISTT({ apiKey })("whisper-1")`). Only
35
- * consulted when timestamps are requested AND the TTS provider can't supply
36
- * them natively. Defaults to OpenAI Whisper read from `OPENAI_API_KEY`.
37
- */
38
- timestampProvider?: ResolvedSTTModel;
15
+ timestamps?: boolean;
16
+ output?: AudioOutput;
17
+ pronunciations?: PronunciationsFor<M>;
39
18
  }): Promise<SpeechResult>;
40
19
  //# sourceMappingURL=generate-speech.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-speech.d.ts","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,KAAK,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAEpE,wBAAsB,cAAc,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE;IACrE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;CACtC,GAAG,OAAO,CAAC,YAAY,CAAC,CAuJxB"}
1
+ {"version":3,"file":"generate-speech.d.ts","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,mBAAmB,CAAC;AAc3B,OAAO,KAAK,EAAQ,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAKzE,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,KAAK,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,wBAAsB,cAAc,CAClC,CAAC,SAAS,KAAK,GAAG,KAAK,EACvB,CAAC,SAAS,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,EAC/D,OAAO,EAAE;IACT,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;CACvC,GAAG,OAAO,CAAC,YAAY,CAAC,CAqJxB"}