@ssml-builder-js/azure-tts-client 2.16.0 → 2.17.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/synthesis.ts","../src/outputFormats.ts","../src/speechConfig.ts","../src/safe.ts","../src/client.ts","../src/voiceCatalog.ts"],"sourcesContent":["/**\n * azure-tts-client: Azure Text-to-Speech client for SSML playback.\n */\n\nexport type {\n AzureTtsClientOptions,\n AzureTtsLogger,\n AudioSpecification,\n MappingStatus,\n MergedSynthesisResult,\n SsmlSynthesisBookmark,\n SsmlSynthesisBoundary,\n SsmlSynthesisResult,\n SsmlSynthesisViseme,\n SsmlSynthesisChunk,\n SynthesisProgressEvent,\n SynthesizeChunksOptions,\n SynthesisChunkStatus,\n RetryOptions,\n TtsConfig,\n} from \"./types.ts\";\nexport {\n AzureTtsError,\n AzureTtsSdkError,\n AudioFormatMismatchError,\n MergeError,\n SynthesisCancelledError,\n SynthesisTimeoutError,\n UnsupportedMergeFormatError,\n} from \"./errors.ts\";\nexport type { AzureTtsSynthesisError, SynthesisErrorKind } from \"./errors.ts\";\nexport { AzureTtsClient } from \"./client.ts\";\nexport { synthesizeSpeech } from \"./synthesis.ts\";\nexport { synthesizeSsml } from \"./synthesis.ts\";\nexport {\n canMergeAudioFormat,\n mergeAudioBuffers,\n mergeSynthesisResults,\n inspectAudioSpecification,\n resolveMergeAudioFormat,\n synthesizeSsmlChunks,\n} from \"./synthesis.ts\";\nexport type {\n CustomMergerContext,\n InputAudioSpecs,\n MergeAudioFormat,\n MergeAudioOptions,\n MergeSynthesisOptions,\n} from \"./synthesis.ts\";\nexport { DEFAULT_OUTPUT_FORMAT, resolveMimeType } from \"./outputFormats.ts\";\nexport type { AzureTtsOutputFormat } from \"./outputFormats.ts\";\nexport { ChunkValidationError, synthesizeSsmlChunksSafe, synthesizeSsmlSafe } from \"./safe.ts\";\nexport type {\n AzureApiErrorResult,\n Result,\n SsmlSynthesisSafeResult,\n SsmlSynthesisError,\n SsmlValidationError as AzureSsmlValidationError,\n Success,\n SynthesisResult,\n SynthesizeSsmlSafeOptions,\n SsmlSynthesisChunksSafeResult,\n SynthesizeSsmlChunksSafeOptions,\n ValidationErrorResult,\n} from \"./safe.ts\";\nexport { fetchAzureVoiceCatalog } from \"./voiceCatalog.ts\";\nexport type {\n AzureVoiceCatalog,\n AzureVoiceCatalogVoice,\n FetchedAzureVoiceCatalogMetadata,\n FetchAzureVoiceCatalogOptions,\n} from \"./voiceCatalog.ts\";\n","export type SynthesisErrorKind =\n | \"validation-error\"\n | \"azure-api-error\"\n | \"merge-error\"\n | \"audio-format-mismatch\"\n | \"unsupported-format-error\"\n | \"cancelled\"\n | \"timeout\";\n\nexport class AzureTtsError extends Error {\n readonly kind = \"azure-api-error\" as const;\n readonly status: number;\n readonly statusText: string;\n readonly responseBody: string;\n readonly requestId: string | null;\n\n constructor(status: number, statusText: string, responseBody: string, requestId: string | null) {\n super(`Azure TTS request failed: ${status} ${statusText}`);\n this.name = \"AzureTtsError\";\n this.status = status;\n this.statusText = statusText;\n this.responseBody = responseBody;\n this.requestId = requestId;\n }\n}\n\nexport class AzureTtsSdkError extends AzureTtsError {\n readonly errorDetails: string;\n\n constructor(errorDetails: string) {\n super(0, \"Speech SDK\", errorDetails, null);\n this.name = \"AzureTtsSdkError\";\n this.message = `Azure TTS synthesis failed: ${errorDetails}`;\n this.errorDetails = errorDetails;\n }\n}\n\nexport class SynthesisCancelledError extends Error {\n readonly kind = \"cancelled\" as const;\n\n constructor(message = \"Speech synthesis was cancelled.\") {\n super(message);\n this.name = \"SynthesisCancelledError\";\n }\n}\n\nexport class SynthesisTimeoutError extends Error {\n readonly kind = \"timeout\" as const;\n\n constructor(message: string) {\n super(message);\n this.name = \"SynthesisTimeoutError\";\n }\n}\n\nexport class MergeError extends Error {\n readonly kind = \"merge-error\" as const;\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"MergeError\";\n this.cause = cause;\n }\n}\n\n/** Thrown when chunk headers describe incompatible audio streams. */\nexport class AudioFormatMismatchError extends Error {\n readonly kind = \"audio-format-mismatch\" as const;\n readonly inputSpecs: readonly AudioSpecification[];\n\n constructor(message: string, inputSpecs: readonly AudioSpecification[] = []) {\n super(message);\n this.name = \"AudioFormatMismatchError\";\n this.inputSpecs = inputSpecs;\n }\n}\n\n/** Thrown when audio buffers require container re-multiplexing before they can be merged. */\nexport class UnsupportedMergeFormatError extends Error {\n readonly kind = \"unsupported-format-error\" as const;\n readonly format: string;\n\n constructor(format: string) {\n super(`Audio format \"${format}\" cannot be safely concatenated; container re-multiplexing is required.`);\n this.name = \"UnsupportedMergeFormatError\";\n this.format = format;\n }\n}\n\nexport type AzureTtsSynthesisError =\n | AzureTtsError\n | MergeError\n | AudioFormatMismatchError\n | UnsupportedMergeFormatError\n | SynthesisCancelledError\n | SynthesisTimeoutError;\n\nexport function toSynthesisError(\n error: unknown,\n):\n | AzureTtsError\n | MergeError\n | AudioFormatMismatchError\n | UnsupportedMergeFormatError\n | SynthesisCancelledError\n | SynthesisTimeoutError {\n if (\n error instanceof AzureTtsError ||\n error instanceof MergeError ||\n error instanceof AudioFormatMismatchError ||\n error instanceof UnsupportedMergeFormatError ||\n error instanceof SynthesisCancelledError ||\n error instanceof SynthesisTimeoutError\n )\n return error;\n const message = error instanceof Error ? error.message : String(error);\n if (/cancel|abort/i.test(message)) return new SynthesisCancelledError(message);\n if (/tim(?:e|ed) ?out/i.test(message)) return new SynthesisTimeoutError(message);\n return createSpeechSdkError(error);\n}\n\nexport function createSpeechSdkError(error: unknown): AzureTtsSdkError {\n const message = error instanceof Error ? error.message : String(error);\n return new AzureTtsSdkError(message);\n}\nimport type { AudioSpecification } from \"./types.ts\";\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\nimport { getSsmlSourceMap } from \"@ssml-builder-js/ssml-core\";\nimport {\n AzureTtsError,\n MergeError,\n AudioFormatMismatchError,\n SynthesisCancelledError,\n SynthesisTimeoutError,\n toSynthesisError,\n UnsupportedMergeFormatError,\n} from \"./errors.ts\";\nimport { DEFAULT_OUTPUT_FORMAT, resolveMimeType, type AzureTtsOutputFormat } from \"./outputFormats.ts\";\nimport { createSpeechConfig } from \"./speechConfig.ts\";\nimport type {\n MergedSynthesisResult,\n SsmlSynthesisChunk,\n SsmlSynthesisResult,\n AudioSpecification,\n SynthesisProgressEvent,\n TtsConfig,\n RetryOptions,\n} from \"./types.ts\";\n\nexport type MergeAudioFormat = \"wav\" | \"mp3\" | \"raw\";\n\nexport interface MergeAudioOptions {\n format: AzureTtsOutputFormat;\n signal?: AbortSignal;\n outputMimeType?: string;\n}\n\nexport type InputAudioSpecs = AudioSpecification[];\n\nexport interface CustomMergerContext {\n format: string;\n outputMimeType: string;\n inputSpecs: InputAudioSpecs;\n signal: AbortSignal;\n}\n\nexport interface MergeSynthesisOptions extends MergeAudioOptions {\n customMerger?: (buffers: ArrayBuffer[], context: CustomMergerContext) => Promise<ArrayBuffer> | ArrayBuffer;\n}\n\ntype AsyncMergeSynthesisOptions = MergeSynthesisOptions & {\n customMerger: NonNullable<MergeSynthesisOptions[\"customMerger\"]>;\n};\n\nfunction ascii(bytes: Uint8Array, offset: number, value: string): boolean {\n return [...value].every((character, index) => bytes[offset + index] === character.charCodeAt(0));\n}\n\nfunction readUint32(bytes: Uint8Array, offset: number): number {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(offset, true);\n}\n\ninterface RiffChunk {\n id: string;\n data: Uint8Array;\n}\n\ninterface ParsedWav {\n chunks: RiffChunk[];\n data: Uint8Array;\n format: Uint8Array;\n}\n\nfunction parseWav(buffer: ArrayBuffer): ParsedWav {\n const bytes = new Uint8Array(buffer);\n if (bytes.byteLength < 12 || !ascii(bytes, 0, \"RIFF\") || !ascii(bytes, 8, \"WAVE\")) {\n throw new Error(\"Invalid WAV/RIFF audio buffer.\");\n }\n const chunks: RiffChunk[] = [];\n const dataParts: Uint8Array[] = [];\n let format: Uint8Array | undefined;\n let offset = 12;\n while (offset < bytes.byteLength) {\n if (offset + 8 > bytes.byteLength) throw new Error(\"Invalid WAV chunk header.\");\n const id = String.fromCharCode(...bytes.slice(offset, offset + 4));\n const size = readUint32(bytes, offset + 4);\n const dataStart = offset + 8;\n const dataEnd = dataStart + size;\n if (dataEnd > bytes.byteLength) throw new Error(`WAV chunk \"${id}\" exceeds the audio buffer.`);\n const data = bytes.slice(dataStart, dataEnd);\n chunks.push({ id, data });\n if (id === \"fmt \") format ??= data;\n if (id === \"data\") dataParts.push(data);\n offset = dataEnd + (size & 1);\n if (offset > bytes.byteLength) throw new Error(\"Invalid WAV chunk padding.\");\n }\n if (!format || dataParts.length === 0) throw new Error(\"WAV audio must contain fmt and data chunks.\");\n const dataLength = dataParts.reduce((total, part) => total + part.byteLength, 0);\n const data = new Uint8Array(dataLength);\n let dataOffset = 0;\n for (const part of dataParts) {\n data.set(part, dataOffset);\n dataOffset += part.byteLength;\n }\n return { chunks, data, format };\n}\n\nfunction formatNumber(format: string, pattern: RegExp, fallback: number): number {\n const match = pattern.exec(format);\n return match?.[1] ? Number(match[1]) : fallback;\n}\n\nfunction formatChannels(format: string, fallback: number): number {\n if (/stereo|2ch|dual/i.test(format)) return 2;\n if (/mono|1ch/i.test(format)) return 1;\n return fallback;\n}\n\nfunction formatAudioSpecification(format: string): AudioSpecification {\n const sampleRate = formatNumber(format, /(\\d+)(?:khz|kHz|hz|Hz)/, 0);\n const channels = formatChannels(format, 0);\n const bitrateMatch = /(\\d+)(?:kbitrate|kbps|kbits?)/i.exec(format);\n const bitrate = bitrateMatch?.[1] ? Number(bitrateMatch[1]) * 1000 : undefined;\n const codec: AudioSpecification[\"codec\"] = /mp3|mpeg/i.test(format)\n ? \"mp3\"\n : /opus/i.test(format)\n ? \"opus\"\n : /silk/i.test(format)\n ? \"silk\"\n : /pcm|mulaw|alaw|siren/i.test(format)\n ? \"pcm\"\n : \"unknown\";\n return {\n format,\n mimeType: resolveMimeType(format),\n codec,\n sampleRate,\n channels,\n ...(bitrate ? { bitrate } : {}),\n isCompressed: codec === \"mp3\" || codec === \"opus\" || codec === \"silk\",\n };\n}\n\nfunction parseMp3Specification(buffer: ArrayBuffer, format: string): AudioSpecification | undefined {\n const bytes = stripMp3Tags(buffer);\n const bitrates = [\n [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0],\n [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0],\n ];\n const sampleRates = [\n [44_100, 48_000, 32_000],\n [22_050, 24_000, 16_000],\n [11_025, 12_000, 8_000],\n ];\n for (let index = 0; index + 4 <= bytes.length; index += 1) {\n if (bytes[index] !== 0xff || (bytes[index + 1] ?? 0) < 0xe0) continue;\n const header = bytes[index + 1] ?? 0;\n const versionBits = (header >> 3) & 0x03;\n const layer = (header >> 1) & 0x03;\n const bitrateIndex = (bytes[index + 2] ?? 0) >> 4;\n const sampleIndex = ((bytes[index + 2] ?? 0) >> 2) & 0x03;\n if (versionBits === 1 || layer !== 1 || bitrateIndex === 0 || bitrateIndex === 15 || sampleIndex === 3) continue;\n const versionIndex = versionBits === 3 ? 0 : versionBits === 2 ? 1 : 2;\n const bitrateTable = versionBits === 3 ? bitrates[1] : bitrates[2];\n const sampleRate = sampleRates[versionIndex]?.[sampleIndex] ?? 0;\n const bitrateKbps = bitrateTable?.[bitrateIndex] ?? 0;\n if (!sampleRate || !bitrateKbps) continue;\n return {\n format,\n mimeType: \"audio/mpeg\",\n codec: \"mp3\",\n sampleRate,\n channels: (bytes[index + 3] ?? 0) >> 6 === 3 ? 1 : 2,\n bitrate: bitrateKbps * 1000,\n isCompressed: true,\n };\n }\n return undefined;\n}\n\n/** Extracts the stream specification from a WAV/MP3 header and output-format fallback. */\nexport function inspectAudioSpecification(buffer: ArrayBuffer, format: string): AudioSpecification {\n if (isWavFormat(format) || ascii(new Uint8Array(buffer), 0, \"RIFF\")) {\n const parsed = parseWav(buffer);\n if (parsed.format.byteLength < 16) throw new Error(\"Invalid WAV fmt chunk.\");\n const view = new DataView(parsed.format.buffer, parsed.format.byteOffset, parsed.format.byteLength);\n const sampleRate = view.getUint32(4, true);\n const channels = view.getUint16(2, true);\n const bitsPerSample = parsed.format.byteLength >= 16 ? view.getUint16(14, true) : 0;\n const formatCode = view.getUint16(0, true);\n return {\n format,\n mimeType: \"audio/wav\",\n codec: formatCode === 1 ? \"pcm\" : \"unknown\",\n sampleRate,\n channels,\n ...(sampleRate && channels && bitsPerSample ? { bitrate: sampleRate * channels * bitsPerSample } : {}),\n isCompressed: formatCode !== 1,\n };\n }\n if (isMp3Format(format)) return parseMp3Specification(buffer, format) ?? formatAudioSpecification(format);\n return formatAudioSpecification(format);\n}\n\nfunction validateAudioSpecifications(specs: readonly AudioSpecification[]): void {\n const first = specs[0];\n if (!first) return;\n const mismatch = specs.find(\n (spec) =>\n spec.sampleRate !== first.sampleRate ||\n spec.channels !== first.channels ||\n (first.bitrate !== undefined && spec.bitrate !== undefined && spec.bitrate !== first.bitrate),\n );\n if (mismatch)\n throw new AudioFormatMismatchError(\n `Audio chunks have incompatible specifications: ${first.sampleRate}Hz/${first.channels}ch versus ${mismatch.sampleRate}Hz/${mismatch.channels}ch.`,\n specs,\n );\n}\n\nfunction isAudioFormatMismatch(error: unknown): error is AudioFormatMismatchError {\n return (\n error instanceof AudioFormatMismatchError ||\n (error !== null && typeof error === \"object\" && \"kind\" in error && error.kind === \"audio-format-mismatch\")\n );\n}\n\nfunction writeUint32(target: Uint8Array, offset: number, value: number): void {\n new DataView(target.buffer).setUint32(offset, value, true);\n}\n\nfunction writeChunk(target: Uint8Array, offset: number, id: string, data: Uint8Array): number {\n for (let index = 0; index < 4; index += 1) target[offset + index] = id.charCodeAt(index) ?? 0;\n writeUint32(target, offset + 4, data.byteLength);\n target.set(data, offset + 8);\n const end = offset + 8 + data.byteLength;\n if (data.byteLength & 1) target[end] = 0;\n return end + (data.byteLength & 1);\n}\n\nfunction mergeWavBuffers(buffers: readonly ArrayBuffer[]): ArrayBuffer {\n if (buffers.length === 0) return new ArrayBuffer(0);\n const parsed = buffers.map(parseWav);\n const first = parsed[0];\n if (!first) throw new Error(\"At least one WAV buffer is required.\");\n if (\n parsed.some(\n (item) => item.format.length !== first.format.length || item.format.some((value, i) => value !== first.format[i]),\n )\n )\n throw new Error(\"WAV buffers have incompatible fmt chunks.\");\n const dataLength = parsed.reduce((total, item) => total + item.data.byteLength, 0);\n const nonDataLength = first.chunks.reduce(\n (total, chunk) => (chunk.id === \"data\" ? total : total + 8 + chunk.data.byteLength + (chunk.data.byteLength & 1)),\n 0,\n );\n const outputLength = 12 + nonDataLength + 8 + dataLength + (dataLength & 1);\n if (outputLength - 8 > 0xffffffff) throw new RangeError(\"Merged WAV exceeds the RIFF format size limit.\");\n const output = new Uint8Array(outputLength);\n output.set(Uint8Array.from([0x52, 0x49, 0x46, 0x46]), 0);\n writeUint32(output, 4, outputLength - 8);\n output.set(Uint8Array.from([0x57, 0x41, 0x56, 0x45]), 8);\n let outputOffset = 12;\n let dataWritten = false;\n for (const chunk of first.chunks) {\n if (chunk.id === \"data\") {\n if (dataWritten) continue;\n const data = new Uint8Array(dataLength);\n let dataOffset = 0;\n for (const item of parsed) {\n data.set(item.data, dataOffset);\n dataOffset += item.data.byteLength;\n }\n outputOffset = writeChunk(output, outputOffset, \"data\", data);\n dataWritten = true;\n } else {\n outputOffset = writeChunk(output, outputOffset, chunk.id, chunk.data);\n }\n }\n if (!dataWritten) throw new Error(\"WAV audio must contain a data chunk.\");\n return output.buffer;\n}\n\nfunction skipId3v2(bytes: Uint8Array): number {\n if (!ascii(bytes, 0, \"ID3\") || bytes.byteLength < 10) return 0;\n const size = [bytes[6], bytes[7], bytes[8], bytes[9]].reduce((total, value) => (total << 7) | (value & 0x7f), 0);\n const hasFooter = (bytes[5] & 0x10) !== 0;\n return Math.min(bytes.byteLength, 10 + size + (hasFooter ? 10 : 0));\n}\n\nfunction stripMp3Tags(buffer: ArrayBuffer): Uint8Array {\n const bytes = new Uint8Array(buffer);\n const start = skipId3v2(bytes);\n const end =\n bytes.byteLength >= 128 && ascii(bytes, bytes.byteLength - 128, \"TAG\") ? bytes.byteLength - 128 : bytes.byteLength;\n return bytes.slice(Math.min(start, end), end);\n}\n\nfunction isMp3Format(format: string): boolean {\n return /(?:mp3|mpeg)/i.test(format);\n}\n\nfunction isWavFormat(format: string): boolean {\n return /(?:wav|wave|riff)/i.test(format);\n}\n\nfunction isRawFormat(format: string): boolean {\n return /^raw(?:-|$)/i.test(format);\n}\n\n/** Returns whether the named output format can be safely concatenated without re-multiplexing. */\nexport function resolveMergeAudioFormat(format: string): MergeAudioFormat | undefined {\n if (isWavFormat(format)) return \"wav\";\n if (isMp3Format(format)) return \"mp3\";\n if (isRawFormat(format)) return \"raw\";\n return undefined;\n}\n\nexport function canMergeAudioFormat(format: string): boolean {\n return resolveMergeAudioFormat(format) !== undefined;\n}\n\n/** Merges audio buffers while preserving the invariants of supported containers. */\nexport function mergeAudioBuffers(buffers: readonly ArrayBuffer[], options: MergeAudioOptions): ArrayBuffer;\nexport function mergeAudioBuffers(buffers: readonly ArrayBuffer[], options: MergeAudioOptions | string): ArrayBuffer {\n const format = typeof options === \"string\" ? options : options?.format;\n if (!format) throw new UnsupportedMergeFormatError(\"\");\n try {\n validateAudioSpecifications(buffers.map((buffer) => inspectAudioSpecification(buffer, format)));\n if (isWavFormat(format)) return mergeWavBuffers(buffers);\n if (isMp3Format(format)) {\n const parts = buffers.map(stripMp3Tags);\n const output = new Uint8Array(parts.reduce((total, part) => total + part.byteLength, 0));\n let offset = 0;\n for (const part of parts) {\n output.set(part, offset);\n offset += part.byteLength;\n }\n return output.buffer;\n }\n if (isRawFormat(format)) {\n const output = new Uint8Array(buffers.reduce((total, buffer) => total + buffer.byteLength, 0));\n let offset = 0;\n for (const buffer of buffers) {\n output.set(new Uint8Array(buffer), offset);\n offset += buffer.byteLength;\n }\n return output.buffer;\n }\n throw new UnsupportedMergeFormatError(format);\n } catch (error) {\n if (error instanceof UnsupportedMergeFormatError || isAudioFormatMismatch(error) || error instanceof MergeError)\n throw error;\n throw new MergeError(`Audio buffers could not be merged for format \"${format}\".`, error);\n }\n}\n\nfunction closeSpeechResources(speechConfig: SpeechSDK.SpeechConfig, synthesizer: SpeechSDK.SpeechSynthesizer): void {\n try {\n synthesizer.close();\n } catch {}\n\n try {\n speechConfig.close();\n } catch {}\n}\n\nconst ticksToMilliseconds = (ticks: number): number => Math.max(0, ticks) / 10_000;\n\nexport async function synthesizeSsml(ssml: string, config: TtsConfig): Promise<SsmlSynthesisResult> {\n if (config.signal?.aborted) {\n throw new SynthesisCancelledError();\n }\n\n const speechConfig = createSpeechConfig(config);\n const synthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, null);\n\n return await new Promise<SsmlSynthesisResult>((resolve, reject) => {\n let resourcesClosed = false;\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abortHandler: (() => void) | undefined;\n const cleanup = () => {\n if (timeout) clearTimeout(timeout);\n if (abortHandler) config.signal?.removeEventListener(\"abort\", abortHandler);\n };\n const closeResources = () => {\n if (resourcesClosed) return;\n resourcesClosed = true;\n closeSpeechResources(speechConfig, synthesizer);\n };\n const rejectWithError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n closeResources();\n reject(toSynthesisError(error));\n };\n\n const boundaries: SsmlSynthesisResult[\"boundaries\"] = [];\n const visemes: SsmlSynthesisResult[\"visemes\"] = [];\n const bookmarks: SsmlSynthesisResult[\"bookmarks\"] = [];\n let sourceEventCursor = 0;\n let generatedSourceMap: ReturnType<typeof getSsmlSourceMap> | undefined;\n if (!config.sourceTextSegments && !config.sourceMarkers) {\n try {\n generatedSourceMap = getSsmlSourceMap(ssml);\n } catch {\n generatedSourceMap = undefined;\n }\n }\n const sourceBaseOffset = config.sourceTextRange?.start ?? 0;\n const sourceSegments =\n config.sourceTextSegments ??\n generatedSourceMap?.segments.map((segment) => ({\n ...segment,\n range: {\n start: segment.range.start + sourceBaseOffset,\n end: segment.range.end + sourceBaseOffset,\n },\n sourceNodePath: [...segment.sourceNodePath],\n })) ??\n [];\n const sourceMarkers =\n config.sourceMarkers ??\n generatedSourceMap?.markers.map((marker) => ({\n ...marker,\n originalTextRange: {\n start: marker.originalTextRange.start + sourceBaseOffset,\n end: marker.originalTextRange.end + sourceBaseOffset,\n },\n sourceNodePath: [...marker.sourceNodePath],\n })) ??\n [];\n const sourceText = sourceSegments.map((segment) => segment.text).join(\"\");\n const mapSourceEvent = (\n text: string | undefined,\n offsetHint: number | undefined,\n markerName?: string,\n ): {\n textRange?: { start: number; end: number };\n originalTextRange?: { start: number; end: number };\n sourceNodePath?: string[];\n mappingStatus: \"exact\" | \"fallback\" | \"unmapped\";\n } => {\n const marker = markerName ? sourceMarkers.find((candidate) => candidate.name === markerName) : undefined;\n if (marker) {\n return {\n originalTextRange: { ...marker.originalTextRange },\n sourceNodePath: [...marker.sourceNodePath],\n textRange: { ...marker.originalTextRange },\n mappingStatus: \"exact\",\n };\n }\n if (sourceSegments.length === 0 && !config.sourceTextRange && !config.sourceNodePath) {\n const unmapped: { mappingStatus: \"unmapped\" } = { mappingStatus: \"unmapped\" };\n Object.defineProperty(unmapped, \"mappingStatus\", { value: \"unmapped\", enumerable: false });\n return unmapped;\n }\n const value = text ?? \"\";\n let localStart = Number.isFinite(offsetHint) && (offsetHint ?? 0) >= 0 ? (offsetHint as number) : -1;\n let mappingStatus: \"exact\" | \"fallback\" | \"unmapped\" = \"exact\";\n if (value && localStart >= 0 && sourceText.slice(localStart, localStart + value.length) !== value) {\n localStart = -1;\n mappingStatus = \"fallback\";\n }\n if (localStart < 0 || localStart > sourceText.length) {\n localStart = value ? sourceText.indexOf(value, sourceEventCursor) : sourceEventCursor;\n if (localStart < 0) localStart = value ? sourceText.indexOf(value) : sourceEventCursor;\n mappingStatus = \"fallback\";\n }\n localStart = Math.max(0, localStart);\n const localEnd = Math.min(sourceText.length, localStart + value.length);\n sourceEventCursor = Math.max(sourceEventCursor, localEnd);\n const baseStart = config.sourceTextRange?.start ?? sourceSegments[0]?.range.start ?? 0;\n const fallbackRange = { start: baseStart + localStart, end: baseStart + localEnd };\n const segment =\n sourceSegments.find(({ range }) => range.start <= fallbackRange.start && range.end > fallbackRange.start) ??\n sourceSegments.find(({ range }) => range.end > fallbackRange.start) ??\n (value.length === 0\n ? sourceSegments.find(({ range }) => range.start <= fallbackRange.start && range.end >= fallbackRange.start)\n : undefined);\n return {\n originalTextRange: { ...fallbackRange },\n textRange: { ...fallbackRange },\n ...(segment\n ? { sourceNodePath: [...segment.sourceNodePath] }\n : config.sourceNodePath\n ? { sourceNodePath: [...config.sourceNodePath] }\n : {}),\n mappingStatus: segment || config.sourceTextRange || config.sourceNodePath ? mappingStatus : \"unmapped\",\n };\n };\n synthesizer.wordBoundary = (_sender, event) => {\n boundaries.push({\n text: event.text,\n audioOffsetMs: ticksToMilliseconds(event.audioOffset),\n durationMs: ticksToMilliseconds(event.duration),\n ...mapSourceEvent(\n event.text,\n (event as SpeechSDK.SpeechSynthesisWordBoundaryEventArgs & { textOffset?: number }).textOffset,\n ),\n });\n };\n synthesizer.visemeReceived = (_sender, event) => {\n const eventWithOffset = event as SpeechSDK.SpeechSynthesisVisemeEventArgs & { textOffset?: number };\n visemes.push({\n visemeId: event.visemeId,\n audioOffsetMs: ticksToMilliseconds(event.audioOffset),\n ...mapSourceEvent(undefined, eventWithOffset.textOffset),\n });\n };\n synthesizer.bookmarkReached = (_sender, event) => {\n const eventWithOffset = event as SpeechSDK.SpeechSynthesisBookmarkEventArgs & { textOffset?: number };\n bookmarks.push({\n name: event.text,\n audioOffsetMs: ticksToMilliseconds(event.audioOffset),\n ...mapSourceEvent(undefined, eventWithOffset.textOffset, event.text),\n });\n };\n\n const cb = (result: SpeechSDK.SpeechSynthesisResult) => {\n if (settled) return;\n const { reason, errorDetails } = result;\n if (reason !== SpeechSDK.ResultReason.SynthesizingAudioCompleted) {\n const err = errorDetails || `Speech synthesis failed with reason ${reason}.`;\n rejectWithError(err);\n return;\n }\n settled = true;\n cleanup();\n closeResources();\n const eventDurationMs = Math.max(\n 0,\n ...(boundaries ?? []).map((boundary) => boundary.audioOffsetMs + boundary.durationMs),\n ...(visemes ?? []).map((viseme) => viseme.audioOffsetMs),\n ...(bookmarks ?? []).map((bookmark) => bookmark.audioOffsetMs),\n );\n const durationMs = result.audioDuration ? ticksToMilliseconds(result.audioDuration) : eventDurationMs;\n const requestId = (result as SpeechSDK.SpeechSynthesisResult & { resultId?: string }).resultId;\n const addSourceMetadata = <T extends { audioOffsetMs: number; mappingStatus: \"exact\" | \"fallback\" | \"unmapped\" }>(\n event: T,\n ): T => {\n const mapped = {\n ...event,\n ...(config.sourceTextRange && !(\"textRange\" in event) ? { textRange: { ...config.sourceTextRange } } : {}),\n ...(config.sourceTextRange && !(\"originalTextRange\" in event)\n ? { originalTextRange: { ...config.sourceTextRange } }\n : {}),\n ...(config.chunkIndex !== undefined ? { chunkIndex: config.chunkIndex } : {}),\n ...(config.sourceNodePath ? { sourceNodePath: [...config.sourceNodePath] } : {}),\n ...(requestId ? { requestId } : {}),\n } as T;\n if (event.mappingStatus === \"unmapped\")\n Object.defineProperty(mapped, \"mappingStatus\", { value: \"unmapped\", enumerable: false });\n return mapped;\n };\n const sourceBoundaries = boundaries.map((boundary) => addSourceMetadata(boundary));\n const sourceVisemes = visemes.map((viseme) => addSourceMetadata(viseme));\n const sourceBookmarks = bookmarks.map((bookmark) => addSourceMetadata(bookmark));\n resolve({\n audioData: result.audioData,\n durationMs,\n audioSpec: inspectAudioSpecification(result.audioData, config.outputFormat ?? DEFAULT_OUTPUT_FORMAT),\n mimeType: resolveMimeType(config.outputFormat ?? DEFAULT_OUTPUT_FORMAT),\n ...(config.sourceTextRange ? { textRange: { ...config.sourceTextRange } } : {}),\n ...(requestId ? { requestId } : {}),\n ...(sourceBoundaries.length > 0\n ? { boundaries: sourceBoundaries, wordBoundary: sourceBoundaries, wordBoundaries: sourceBoundaries }\n : {}),\n ...(sourceVisemes.length > 0 ? { visemes: sourceVisemes } : {}),\n ...(sourceBookmarks.length > 0 ? { bookmarks: sourceBookmarks } : {}),\n });\n };\n\n try {\n if (config.signal) {\n abortHandler = () => rejectWithError(new SynthesisCancelledError());\n config.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n if (config.timeoutMs !== undefined && config.timeoutMs > 0) {\n timeout = setTimeout(\n () => rejectWithError(new SynthesisTimeoutError(`Speech synthesis timed out after ${config.timeoutMs} ms.`)),\n config.timeoutMs,\n );\n }\n synthesizer.speakSsmlAsync(ssml, cb, rejectWithError);\n } catch (error) {\n rejectWithError(error);\n }\n });\n}\n\nfunction isRetryableSynthesisError(error: unknown): boolean {\n if (error instanceof SynthesisCancelledError || error instanceof SynthesisTimeoutError) return false;\n if (error instanceof AzureTtsError && error.status !== 0)\n return error.status === 429 || (error.status >= 500 && error.status < 600);\n const message = error instanceof Error ? error.message : String(error);\n if (/\\b4\\d{2}\\b/.test(message)) return false;\n const status = error && typeof error === \"object\" && \"status\" in error ? error.status : undefined;\n if (typeof status === \"number\") return status === 429 || (status >= 500 && status < 600);\n return /network|connection|connect|socket|fetch failed|econn|etimedout|temporar|transient|unavailable/i.test(message);\n}\n\nfunction retryDelay(options: RetryOptions, retryAttempt: number): number {\n const base = Math.min(options.maxDelayMs, options.initialDelayMs * 2 ** Math.max(0, retryAttempt - 1));\n return Math.floor(Math.random() * (base + 1));\n}\n\nfunction resolveConcurrency(value: number | undefined, total: number): number {\n if (value === undefined) return 1;\n if (value === Infinity) return Math.max(1, total);\n return Number.isFinite(value) ? Math.max(1, Math.floor(value)) : 1;\n}\n\nasync function waitForRetry(delayMs: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) throw new SynthesisCancelledError();\n if (delayMs <= 0) return;\n await new Promise<void>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout>;\n const abort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n reject(new SynthesisCancelledError());\n };\n timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, delayMs);\n if (signal) {\n signal.addEventListener(\"abort\", abort, { once: true });\n }\n });\n}\n\nasync function synthesizeWithRetry(\n ssml: string,\n config: TtsConfig,\n retryOptions: RetryOptions | undefined,\n onRetry: (retryAttempt: number, nextRetryDelayMs: number) => void,\n): Promise<SsmlSynthesisResult> {\n const options = retryOptions\n ? {\n maxRetries: Math.max(0, Math.floor(retryOptions.maxRetries)),\n initialDelayMs: Math.max(0, retryOptions.initialDelayMs),\n maxDelayMs: Math.max(0, retryOptions.maxDelayMs),\n }\n : undefined;\n let attempt = 0;\n while (true) {\n if (config.signal?.aborted) throw new SynthesisCancelledError();\n try {\n return await synthesizeSsml(ssml, config);\n } catch (error) {\n if (!options || attempt >= options.maxRetries || !isRetryableSynthesisError(error)) throw error;\n attempt += 1;\n const delayMs = retryDelay(options, attempt);\n onRetry(attempt, delayMs);\n await waitForRetry(delayMs, config.signal);\n }\n }\n}\n\n/** Synthesizes chunks with bounded concurrency, retries transient failures, and merges in chunk order. */\nexport async function synthesizeSsmlChunks(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n config: TtsConfig,\n): Promise<SsmlSynthesisResult> {\n const results: Array<SsmlSynthesisResult | undefined> = new Array(chunks.length);\n const totalChunks = chunks.length;\n const report = (event: SynthesisProgressEvent): void => config.onProgress?.(event);\n for (const [index, chunk] of chunks.entries()) {\n const input = typeof chunk === \"string\" ? { ssml: chunk } : chunk;\n report({\n currentChunk: index,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((index / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"pending\",\n durationMs: 0,\n });\n }\n let completed = 0;\n let nextIndex = 0;\n const concurrency = resolveConcurrency(config.concurrency, chunks.length);\n const worker = async (): Promise<void> => {\n while (true) {\n const index = nextIndex++;\n if (index >= chunks.length) return;\n const chunk = chunks[index];\n const input = typeof chunk === \"string\" ? { ssml: chunk } : chunk;\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"synthesizing\",\n durationMs: 0,\n });\n const startedAt = Date.now();\n try {\n const result = await synthesizeWithRetry(\n input.ssml,\n {\n ...config,\n ...(input.originalTextRange ? { sourceTextRange: input.originalTextRange } : {}),\n ...((input.sourceNodePath ?? config.sourceNodePath)\n ? { sourceNodePath: [...(input.sourceNodePath ?? config.sourceNodePath ?? [])] }\n : {}),\n ...(input.sourceTextSegments ? { sourceTextSegments: input.sourceTextSegments } : {}),\n ...(input.sourceMarkers ? { sourceMarkers: input.sourceMarkers } : {}),\n chunkIndex: index,\n onProgress: undefined,\n },\n config.retryOptions,\n (retryAttempt, nextRetryDelayMs) =>\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"synthesizing\",\n durationMs: Date.now() - startedAt,\n retryAttempt,\n nextRetryDelayMs,\n isRetrying: true,\n }),\n );\n results[index] = result;\n completed += 1;\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"success\",\n durationMs: Date.now() - startedAt,\n });\n } catch (error) {\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"failed\",\n durationMs: Date.now() - startedAt,\n error,\n });\n throw error;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(concurrency, chunks.length) }, () => worker()));\n const orderedResults = results.filter((result): result is SsmlSynthesisResult => result !== undefined);\n return mergeSynthesisResults(orderedResults, {\n format: (config.outputFormat ?? DEFAULT_OUTPUT_FORMAT) as AzureTtsOutputFormat,\n signal: config.signal,\n });\n}\n\n/** Concatenates audio buffers and shifts all synchronization events by prior chunk durations. */\nfunction createMergedResult(\n results: readonly SsmlSynthesisResult[],\n audioData: ArrayBuffer,\n format: string,\n audioSpec?: AudioSpecification,\n outputMimeType?: string,\n): MergedSynthesisResult {\n const boundaries: NonNullable<SsmlSynthesisResult[\"boundaries\"]> = [];\n const visemes: NonNullable<SsmlSynthesisResult[\"visemes\"]> = [];\n const bookmarks: NonNullable<SsmlSynthesisResult[\"bookmarks\"]> = [];\n let durationOffset = 0;\n\n for (const [resultIndex, result] of results.entries()) {\n const chunkBoundaries =\n result.boundaries && result.boundaries.length > 0\n ? result.boundaries\n : (result.wordBoundary ?? result.wordBoundaries ?? []);\n for (const boundary of chunkBoundaries) {\n const textRange = boundary.textRange ?? result.textRange;\n const originalTextRange = boundary.originalTextRange ?? textRange;\n const requestId = boundary.requestId ?? result.requestId;\n boundaries.push({\n ...boundary,\n audioOffsetMs: boundary.audioOffsetMs + durationOffset,\n chunkAudioOffsetMs: boundary.chunkAudioOffsetMs ?? boundary.audioOffsetMs,\n ...(boundary.chunkIndex === undefined ? { chunkIndex: resultIndex } : {}),\n ...(boundary.sourceNodePath ? { sourceNodePath: [...boundary.sourceNodePath] } : {}),\n ...(originalTextRange ? { originalTextRange: { ...originalTextRange } } : {}),\n ...(textRange ? { textRange: { ...textRange } } : {}),\n ...(requestId ? { requestId } : {}),\n mappingStatus: boundary.mappingStatus ?? \"unmapped\",\n });\n }\n for (const viseme of result.visemes ?? []) {\n const textRange = viseme.textRange ?? result.textRange;\n const originalTextRange = viseme.originalTextRange ?? textRange;\n const requestId = viseme.requestId ?? result.requestId;\n visemes.push({\n ...viseme,\n audioOffsetMs: viseme.audioOffsetMs + durationOffset,\n chunkAudioOffsetMs: viseme.chunkAudioOffsetMs ?? viseme.audioOffsetMs,\n ...(viseme.chunkIndex === undefined ? { chunkIndex: resultIndex } : {}),\n ...(viseme.sourceNodePath ? { sourceNodePath: [...viseme.sourceNodePath] } : {}),\n ...(originalTextRange ? { originalTextRange: { ...originalTextRange } } : {}),\n ...(textRange ? { textRange: { ...textRange } } : {}),\n ...(requestId ? { requestId } : {}),\n mappingStatus: viseme.mappingStatus ?? \"unmapped\",\n });\n }\n for (const bookmark of result.bookmarks ?? []) {\n const textRange = bookmark.textRange ?? result.textRange;\n const originalTextRange = bookmark.originalTextRange ?? textRange;\n const requestId = bookmark.requestId ?? result.requestId;\n bookmarks.push({\n ...bookmark,\n audioOffsetMs: bookmark.audioOffsetMs + durationOffset,\n chunkAudioOffsetMs: bookmark.chunkAudioOffsetMs ?? bookmark.audioOffsetMs,\n ...(bookmark.chunkIndex === undefined ? { chunkIndex: resultIndex } : {}),\n ...(bookmark.sourceNodePath ? { sourceNodePath: [...bookmark.sourceNodePath] } : {}),\n ...(originalTextRange ? { originalTextRange: { ...originalTextRange } } : {}),\n ...(textRange ? { textRange: { ...textRange } } : {}),\n ...(requestId ? { requestId } : {}),\n mappingStatus: bookmark.mappingStatus ?? \"unmapped\",\n });\n }\n durationOffset += Math.max(0, result.durationMs);\n }\n\n return {\n audioData,\n durationMs: durationOffset,\n mimeType: resolveMimeType(format),\n audioSpec: audioSpec ?? formatAudioSpecification(format),\n ...(outputMimeType ? { mimeType: outputMimeType } : {}),\n ...(boundaries.length > 0 ? { boundaries, wordBoundary: boundaries, wordBoundaries: boundaries } : {}),\n ...(visemes.length > 0 ? { visemes } : {}),\n ...(bookmarks.length > 0 ? { bookmarks } : {}),\n ...(results.length === 1 && results[0]?.requestId ? { requestId: results[0].requestId } : {}),\n ...(results.length === 1 && results[0]?.textRange ? { textRange: { ...results[0].textRange } } : {}),\n };\n}\n\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: AsyncMergeSynthesisOptions,\n): Promise<MergedSynthesisResult>;\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: MergeAudioOptions,\n): MergedSynthesisResult;\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: MergeSynthesisOptions | string,\n): SsmlSynthesisResult | Promise<SsmlSynthesisResult> {\n const resolvedOptions: MergeSynthesisOptions =\n typeof options === \"string\" ? { format: options as AzureTtsOutputFormat } : options;\n const format = resolvedOptions?.format;\n if (!format) throw new UnsupportedMergeFormatError(\"\");\n const buffers = results.map((result) => result.audioData);\n const inputSpecs = results.map((result) => result.audioSpec ?? inspectAudioSpecification(result.audioData, format));\n validateAudioSpecifications(inputSpecs);\n const signal = resolvedOptions.signal ?? new AbortController().signal;\n if (signal.aborted) throw new SynthesisCancelledError();\n if (resolvedOptions.customMerger) {\n return Promise.resolve()\n .then(() =>\n resolvedOptions.customMerger?.(buffers, {\n format,\n outputMimeType: resolvedOptions.outputMimeType ?? resolveMimeType(format),\n inputSpecs,\n signal,\n }),\n )\n .then((merged) => {\n if (!merged) throw new MergeError(\"The custom audio merger returned no audio buffer.\");\n if (\n !(merged instanceof ArrayBuffer) ||\n (buffers.some((buffer) => buffer.byteLength > 0) && merged.byteLength === 0)\n )\n throw new MergeError(\"The custom audio merger returned an invalid audio buffer.\");\n if (signal.aborted) throw new SynthesisCancelledError();\n return createMergedResult(\n results,\n merged,\n format,\n inspectAudioSpecification(merged, format),\n resolvedOptions.outputMimeType,\n );\n })\n .catch((error: unknown) => {\n if (error instanceof UnsupportedMergeFormatError || isAudioFormatMismatch(error) || error instanceof MergeError)\n throw error;\n throw new MergeError(`Custom audio merger failed for format \"${format}\".`, error);\n });\n }\n try {\n return createMergedResult(\n results,\n mergeAudioBuffers(buffers, { format }),\n format,\n inputSpecs[0],\n resolvedOptions.outputMimeType,\n );\n } catch (error) {\n if (error instanceof UnsupportedMergeFormatError || isAudioFormatMismatch(error) || error instanceof MergeError)\n throw error;\n throw new MergeError(`Audio buffers could not be merged for format \"${format}\".`, error);\n }\n}\n\n/** Backward-compatible audio-only synthesis helper. */\nexport async function synthesizeSpeech(ssml: string, config: TtsConfig): Promise<ArrayBuffer> {\n return (await synthesizeSsml(ssml, config)).audioData;\n}\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\n\nexport const DEFAULT_OUTPUT_FORMAT = \"audio-16khz-128kbitrate-mono-mp3\";\n\nconst OUTPUT_FORMATS = {\n \"raw-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoMULaw,\n \"riff-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16KbpsMonoSiren,\n \"audio-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16KbpsMonoSiren,\n \"audio-16khz-32kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz32KBitRateMonoMp3,\n \"audio-16khz-128kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz128KBitRateMonoMp3,\n \"audio-16khz-64kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz64KBitRateMonoMp3,\n \"audio-24khz-48kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz48KBitRateMonoMp3,\n \"audio-24khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz96KBitRateMonoMp3,\n \"audio-24khz-160kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz160KBitRateMonoMp3,\n \"raw-16khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoTrueSilk,\n \"riff-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16BitMonoPcm,\n \"riff-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz16BitMonoPcm,\n \"riff-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm,\n \"riff-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoMULaw,\n \"raw-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoPcm,\n \"raw-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoPcm,\n \"raw-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz16BitMonoPcm,\n \"ogg-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg16Khz16BitMonoOpus,\n \"ogg-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus,\n \"raw-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw48Khz16BitMonoPcm,\n \"riff-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff48Khz16BitMonoPcm,\n \"audio-48khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz96KBitRateMonoMp3,\n \"audio-48khz-192kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz192KBitRateMonoMp3,\n \"ogg-48khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg48Khz16BitMonoOpus,\n \"webm-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm16Khz16BitMonoOpus,\n \"webm-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16BitMonoOpus,\n \"webm-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16Bit24KbpsMonoOpus,\n \"raw-24khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoTrueSilk,\n \"raw-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoALaw,\n \"riff-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoALaw,\n \"audio-16khz-16bit-32kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16Bit32KbpsMonoOpus,\n \"audio-24khz-16bit-48kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit48KbpsMonoOpus,\n \"audio-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit24KbpsMonoOpus,\n \"raw-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw22050Hz16BitMonoPcm,\n \"riff-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff22050Hz16BitMonoPcm,\n \"raw-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw44100Hz16BitMonoPcm,\n \"riff-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff44100Hz16BitMonoPcm,\n \"amr-wb-16000hz\": SpeechSDK.SpeechSynthesisOutputFormat.AmrWb16000Hz,\n \"g722-16khz-64kbps\": SpeechSDK.SpeechSynthesisOutputFormat.G72216Khz64Kbps,\n} satisfies Record<string, SpeechSDK.SpeechSynthesisOutputFormat>;\n\nexport type AzureTtsOutputFormat = keyof typeof OUTPUT_FORMATS;\n\nexport function resolveMimeType(outputFormat: string): string {\n if (/(?:wav|wave|riff)/i.test(outputFormat)) return \"audio/wav\";\n if (/(?:mp3|mpeg)/i.test(outputFormat)) return \"audio/mpeg\";\n if (/ogg/i.test(outputFormat)) return \"audio/ogg\";\n if (/webm/i.test(outputFormat)) return \"audio/webm\";\n if (/raw/i.test(outputFormat)) return \"audio/L16\";\n return \"application/octet-stream\";\n}\n\nexport function resolveOutputFormat(outputFormat: string): SpeechSDK.SpeechSynthesisOutputFormat {\n const resolvedFormat = (OUTPUT_FORMATS as Record<string, SpeechSDK.SpeechSynthesisOutputFormat>)[outputFormat];\n if (resolvedFormat === undefined) {\n throw new Error(`Unsupported Azure Speech output format: ${outputFormat}`);\n }\n\n return resolvedFormat;\n}\n","import { SpeechConfig } from \"microsoft-cognitiveservices-speech-sdk\";\nimport { DEFAULT_OUTPUT_FORMAT, resolveOutputFormat } from \"./outputFormats.ts\";\nimport type { TtsConfig } from \"./types.ts\";\n\nexport function resolveEndpoint(config: TtsConfig): string {\n const endpoint = config.endpoint?.trim() || \"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1\";\n return endpoint.replace(/\\{region\\}/g, encodeURIComponent(config.region));\n}\n\nexport function createSpeechConfig(config: TtsConfig): SpeechConfig {\n const { outputFormat = DEFAULT_OUTPUT_FORMAT, subscriptionKey } = config;\n\n const endpoint = new URL(resolveEndpoint(config));\n const speechConfig = SpeechConfig.fromEndpoint(endpoint, subscriptionKey);\n speechConfig.speechSynthesisOutputFormat = resolveOutputFormat(outputFormat);\n return speechConfig;\n}\n","import {\n createAzureUrlValidatorRunner,\n validateAzureSsml,\n type AzureUrlValidator,\n type AzureValidationOptions,\n type SsmlDiagnostic,\n} from \"@ssml-builder-js/ssml-core\";\nimport {\n type AzureTtsError,\n type AzureTtsSynthesisError,\n type SynthesisErrorKind,\n toSynthesisError,\n} from \"./errors.ts\";\nimport type { AzureTtsClient } from \"./client.ts\";\nimport { mergeSynthesisResults } from \"./synthesis.ts\";\nimport type {\n SsmlSynthesisChunk,\n SsmlSynthesisResult,\n SynthesisProgressEvent,\n SynthesizeChunksOptions,\n RetryOptions,\n} from \"./types.ts\";\nimport type { AzureTtsOutputFormat } from \"./outputFormats.ts\";\n\nexport interface SsmlValidationError {\n readonly kind: \"validation-error\";\n readonly message: string;\n readonly diagnostics: readonly SsmlDiagnostic[];\n}\n\nexport type SsmlSynthesisError = SsmlValidationError | AzureTtsSynthesisError;\n\nexport class ChunkValidationError extends Error {\n readonly kind = \"validation-error\" as const;\n readonly chunkIndex: number;\n readonly diagnostics: readonly SsmlDiagnostic[];\n\n constructor(chunkIndex: number, diagnostics: readonly SsmlDiagnostic[]) {\n super(`SSML validation failed for chunk ${chunkIndex}; the Azure Speech API was not called.`);\n this.name = \"ChunkValidationError\";\n this.chunkIndex = chunkIndex;\n this.diagnostics = diagnostics;\n }\n}\n\nexport type Result<T, E> =\n | { readonly ok: true; readonly success: true; readonly status: \"success\"; readonly value: T }\n | (E extends { readonly kind: infer Kind extends SynthesisErrorKind }\n ? {\n readonly ok: false;\n readonly success: false;\n readonly status: Kind;\n readonly error: E;\n }\n : {\n readonly ok: false;\n readonly success: false;\n readonly status: SynthesisErrorKind;\n readonly error: E;\n });\n\nexport type SynthesisResult<T, E> = Result<T, E>;\n\nfunction failure<E extends { readonly kind: SynthesisErrorKind }>(error: E): Result<never, E> {\n return { ok: false, success: false, status: error.kind, error } as Result<never, E>;\n}\n\nexport type Success<T> = Extract<Result<T, never>, { readonly ok: true }>;\nexport type ValidationErrorResult = Extract<\n Result<never, SsmlValidationError>,\n { readonly status: \"validation-error\" }\n>;\nexport type AzureApiErrorResult = Extract<Result<never, AzureTtsError>, { readonly status: \"azure-api-error\" }>;\n\nexport type SsmlSynthesisSafeResult =\n | Result<SsmlSynthesisResult, never>\n | Result<never, SsmlValidationError>\n | Result<never, SsmlSynthesisError>;\n\nexport interface SynthesizeSsmlSafeOptions extends AzureValidationOptions {\n /** Optional nested form for callers that want to keep validation settings grouped. */\n validation?: AzureValidationOptions;\n signal?: AbortSignal;\n}\n\nexport interface SynthesizeSsmlChunksSafeOptions extends AzureValidationOptions {\n validation?: AzureValidationOptions;\n outputFormat?: string;\n signal?: AbortSignal;\n timeoutMs?: number;\n sourceNodePath?: string[];\n onProgress?: (event: SynthesisProgressEvent) => void;\n concurrency?: number;\n retryOptions?: RetryOptions;\n}\n\nexport type SsmlSynthesisChunksSafeResult =\n | Result<SsmlSynthesisResult, never>\n | Result<never, ChunkValidationError>\n | Result<never, SsmlSynthesisError | ChunkValidationError>;\n\ninterface SynthesisClient {\n synthesizeSsml(ssml: string, options?: Partial<SynthesizeChunksOptions>): Promise<SsmlSynthesisResult>;\n synthesizeChunks?(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options?: SynthesizeChunksOptions,\n ): Promise<SsmlSynthesisResult>;\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (error instanceof Error && /cancel|abort|tim(?:e|ed) ?out/i.test(error.message)) return false;\n const status =\n error && typeof error === \"object\" && \"status\" in error ? (error as { status?: unknown }).status : undefined;\n if (typeof status === \"number\" && status !== 0) return status === 429 || (status >= 500 && status < 600);\n const message = error instanceof Error ? error.message : String(error);\n if (/\\b4\\d{2}\\b/.test(message)) return false;\n return /network|connection|connect|socket|fetch failed|econn|etimedout|temporar|transient|unavailable/i.test(message);\n}\n\nfunction delayForRetry(options: RetryOptions, attempt: number): number {\n const maxDelay = Math.max(0, options.maxDelayMs);\n const base = Math.min(maxDelay, Math.max(0, options.initialDelayMs) * 2 ** Math.max(0, attempt - 1));\n return Math.floor(Math.random() * (base + 1));\n}\n\nfunction resolveConcurrency(value: number | undefined, total: number): number {\n if (value === undefined) return 1;\n if (value === Infinity) return Math.max(1, total);\n return Number.isFinite(value) ? Math.max(1, Math.floor(value)) : 1;\n}\n\nasync function retryableSynthesis(\n synthesize: () => Promise<SsmlSynthesisResult>,\n options: RetryOptions | undefined,\n signal: AbortSignal | undefined,\n onRetry: (attempt: number, delayMs: number) => void,\n): Promise<SsmlSynthesisResult> {\n const retry = options\n ? {\n maxRetries: Math.max(0, Math.floor(options.maxRetries)),\n initialDelayMs: options.initialDelayMs,\n maxDelayMs: options.maxDelayMs,\n }\n : undefined;\n let attempt = 0;\n while (true) {\n if (signal?.aborted) throw new Error(\"Speech synthesis was cancelled.\");\n try {\n return await synthesize();\n } catch (error) {\n if (!retry || attempt >= retry.maxRetries || !isRetryable(error)) throw error;\n attempt += 1;\n const delayMs = delayForRetry(retry, attempt);\n onRetry(attempt, delayMs);\n if (delayMs > 0)\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, delayMs);\n const abort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n reject(new Error(\"Speech synthesis was cancelled.\"));\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n }\n }\n}\n\nfunction sharedValidationOptions(options: AzureValidationOptions, signal?: AbortSignal): AzureValidationOptions {\n const validator = options.urlValidator ?? options.customUrlValidator;\n if (!validator) return signal ? withValidationSignal(options, signal) : options;\n const runner = createAzureUrlValidatorRunner(validator as AzureUrlValidator, {\n ...(options.urlValidation ?? {}),\n ...(options.urlValidatorConcurrency !== undefined ? { concurrency: options.urlValidatorConcurrency } : {}),\n ...(options.urlValidatorTimeoutMs !== undefined ? { timeoutMs: options.urlValidatorTimeoutMs } : {}),\n ...(signal ? { signal } : {}),\n ...(options.urlValidatorCache ? { cache: options.urlValidatorCache } : {}),\n });\n return {\n ...withValidationSignal(options, signal),\n urlValidatorRunner: runner,\n };\n}\n\n/** Validates SSML before invoking Azure and converts validation/API failures to one result shape. */\nexport async function synthesizeSsmlSafe(\n client: Pick<AzureTtsClient, \"synthesizeSsml\"> | SynthesisClient,\n ssml: string,\n options: SynthesizeSsmlSafeOptions = {},\n): Promise<SsmlSynthesisSafeResult> {\n const validationOptions = sharedValidationOptions(options.validation ?? options, options.signal);\n const diagnostics = await Promise.resolve(validateAzureSsml(ssml, validationOptions));\n if (options.signal?.aborted) {\n const error = toSynthesisError(new Error(\"Speech synthesis was cancelled.\"));\n return failure(error);\n }\n const errors = diagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n if (errors.length > 0) {\n return failure({\n kind: \"validation-error\",\n message: \"SSML validation failed; the Azure Speech API was not called.\",\n diagnostics: errors,\n });\n }\n\n try {\n return {\n ok: true,\n success: true,\n status: \"success\",\n value: await client.synthesizeSsml(ssml, { signal: options.signal }),\n };\n } catch (error) {\n const synthesisError = toSynthesisError(error);\n return failure(synthesisError);\n }\n}\n\n/** Validates every chunk before synthesis and returns a chunk-addressable result. */\nexport async function synthesizeSsmlChunksSafe(\n client: Pick<AzureTtsClient, \"synthesizeSsml\" | \"synthesizeChunks\"> | SynthesisClient,\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeSsmlChunksSafeOptions = {},\n): Promise<SsmlSynthesisChunksSafeResult> {\n const validationOptions = sharedValidationOptions(options.validation ?? options, options.signal);\n if (options.signal?.aborted) {\n const error = toSynthesisError(new Error(\"Speech synthesis was cancelled.\"));\n return failure(error);\n }\n const pending = (index: number, status: SynthesisProgressEvent[\"status\"], error?: unknown): void => {\n options.onProgress?.({\n currentChunk: status === \"success\" ? index + 1 : index,\n totalChunks: chunks.length,\n percent:\n chunks.length === 0 ? 100 : Math.round(((status === \"success\" ? index + 1 : index) / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: typeof chunks[index] === \"string\" ? undefined : chunks[index]?.originalTextRange,\n status,\n durationMs: 0,\n ...(error ? { error } : {}),\n });\n };\n chunks.forEach((_chunk, index) => {\n pending(index, \"pending\");\n });\n const validations = await Promise.all(\n chunks.map(async (chunk, index) => {\n const ssml = typeof chunk === \"string\" ? chunk : chunk.ssml;\n const sourceNodePath =\n typeof chunk === \"string\" ? options.sourceNodePath : (chunk.sourceNodePath ?? options.sourceNodePath);\n const diagnostics = await Promise.resolve(\n validateAzureSsml(ssml, {\n ...validationOptions,\n ...(sourceNodePath ? { sourceNodePath } : {}),\n chunkIndex: index,\n }),\n );\n return diagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n }),\n );\n const firstInvalidIndex = validations.findIndex((diagnostics) => diagnostics.length > 0);\n if (options.signal?.aborted) {\n const error = toSynthesisError(new Error(\"Speech synthesis was cancelled.\"));\n return failure(error);\n }\n if (firstInvalidIndex >= 0) {\n const error = new ChunkValidationError(firstInvalidIndex, validations[firstInvalidIndex] ?? []);\n pending(firstInvalidIndex, \"failed\", error);\n return failure(error);\n }\n\n try {\n if (client.synthesizeChunks) {\n const normalizedChunks = chunks.map((chunk) => {\n if (typeof chunk === \"string\" || chunk.sourceNodePath || !options.sourceNodePath) return chunk;\n return { ...chunk, sourceNodePath: [...options.sourceNodePath] };\n });\n const value = await client.synthesizeChunks(normalizedChunks, {\n onProgress: options.onProgress,\n outputFormat: options.outputFormat,\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n sourceNodePath: options.sourceNodePath,\n concurrency: options.concurrency,\n retryOptions: options.retryOptions,\n });\n return { ok: true, success: true, status: \"success\", value };\n }\n const results: Array<SsmlSynthesisResult | undefined> = new Array(chunks.length);\n let completed = 0;\n let nextIndex = 0;\n const concurrency = resolveConcurrency(options.concurrency, chunks.length);\n const worker = async (): Promise<void> => {\n while (true) {\n const index = nextIndex++;\n if (index >= chunks.length) return;\n const chunk = chunks[index];\n const input = typeof chunk === \"string\" ? { ssml: chunk } : chunk;\n const sourceNodePath = input.sourceNodePath;\n const originalTextRange = input.originalTextRange;\n pending(index, \"synthesizing\");\n const startedAt = Date.now();\n try {\n const result = await retryableSynthesis(\n () =>\n client.synthesizeSsml(input.ssml, {\n outputFormat: options.outputFormat,\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n sourceNodePath: input.sourceNodePath ?? options.sourceNodePath,\n }),\n options.retryOptions,\n options.signal,\n (retryAttempt, nextRetryDelayMs) =>\n options.onProgress?.({\n currentChunk: completed,\n totalChunks: chunks.length,\n percent: chunks.length === 0 ? 100 : Math.round((completed / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"synthesizing\",\n durationMs: Date.now() - startedAt,\n retryAttempt,\n nextRetryDelayMs,\n isRetrying: true,\n }),\n );\n results[index] = {\n ...result,\n ...(input.originalTextRange ? { textRange: { ...input.originalTextRange } } : {}),\n ...(sourceNodePath\n ? {\n boundaries: result.boundaries?.map((event) => ({\n ...event,\n sourceNodePath: [...sourceNodePath],\n ...(event.originalTextRange\n ? { originalTextRange: { ...event.originalTextRange } }\n : input.originalTextRange\n ? { originalTextRange: { ...input.originalTextRange } }\n : {}),\n })),\n visemes: result.visemes?.map((event) => ({\n ...event,\n sourceNodePath: [...sourceNodePath],\n ...(event.originalTextRange\n ? { originalTextRange: { ...event.originalTextRange } }\n : input.originalTextRange\n ? { originalTextRange: { ...input.originalTextRange } }\n : {}),\n })),\n bookmarks: result.bookmarks?.map((event) => ({\n ...event,\n sourceNodePath: [...sourceNodePath],\n ...(event.originalTextRange\n ? { originalTextRange: { ...event.originalTextRange } }\n : input.originalTextRange\n ? { originalTextRange: { ...input.originalTextRange } }\n : {}),\n })),\n }\n : {}),\n ...(originalTextRange\n ? {\n boundaries: result.boundaries?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n wordBoundary: result.wordBoundary?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n wordBoundaries: result.wordBoundaries?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n visemes: result.visemes?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n bookmarks: result.bookmarks?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n }\n : {}),\n };\n completed += 1;\n options.onProgress?.({\n currentChunk: completed,\n totalChunks: chunks.length,\n percent: chunks.length === 0 ? 100 : Math.round((completed / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"success\",\n durationMs: Date.now() - startedAt,\n });\n } catch (error) {\n options.onProgress?.({\n currentChunk: completed,\n totalChunks: chunks.length,\n percent: chunks.length === 0 ? 100 : Math.round((index / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"failed\",\n durationMs: Date.now() - startedAt,\n error,\n });\n throw error;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(concurrency, chunks.length) }, () => worker()));\n const orderedResults = results.filter((result): result is SsmlSynthesisResult => result !== undefined);\n return {\n ok: true,\n success: true,\n status: \"success\",\n value: mergeSynthesisResults(orderedResults, {\n format: (options.outputFormat ?? \"audio-16khz-128kbitrate-mono-mp3\") as AzureTtsOutputFormat,\n signal: options.signal,\n }),\n };\n } catch (error) {\n const synthesisError = toSynthesisError(error);\n return failure(synthesisError);\n }\n}\n\nfunction withValidationSignal(options: AzureValidationOptions, signal?: AbortSignal): AzureValidationOptions {\n if (!signal) return options;\n return {\n ...options,\n urlValidatorSignal: signal,\n urlValidation: { ...(options.urlValidation ?? {}), signal },\n };\n}\n","import { synthesizeSpeech, synthesizeSsml, synthesizeSsmlChunks } from \"./synthesis.ts\";\nimport { synthesizeSsmlChunksSafe, synthesizeSsmlSafe } from \"./safe.ts\";\nimport type { SynthesizeSsmlChunksSafeOptions, SynthesizeSsmlSafeOptions } from \"./safe.ts\";\nimport type {\n AzureTtsClientOptions,\n SsmlSynthesisChunk,\n SsmlSynthesisResult,\n SynthesizeChunksOptions,\n TtsConfig,\n} from \"./types.ts\";\n\nconst ENDPOINT_TEMPLATE = \"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1\";\n\nexport class AzureTtsClient {\n readonly #options: AzureTtsClientOptions;\n\n constructor(options: AzureTtsClientOptions) {\n this.#options = options;\n }\n\n async synthesize(ssml: string): Promise<ArrayBuffer> {\n const { region, subscriptionKey, outputFormat, signal, timeoutMs } = this.#options;\n const endpoint = this.#options.endpoint?.trim() || ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n this.#options.logger?.debug?.(\"Using Azure TTS endpoint:\", endpoint);\n\n const config = { endpoint, region, subscriptionKey, outputFormat, signal, timeoutMs };\n return synthesizeSpeech(ssml, config);\n }\n\n async synthesizeSsml(ssml: string, options: Partial<TtsConfig> = {}): Promise<SsmlSynthesisResult> {\n const { region, subscriptionKey, outputFormat, signal, timeoutMs } = this.#options;\n const endpoint = this.#options.endpoint?.trim() || ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n this.#options.logger?.debug?.(\"Using Azure TTS endpoint:\", endpoint);\n\n return synthesizeSsml(ssml, {\n endpoint,\n region,\n subscriptionKey,\n outputFormat: options.outputFormat ?? outputFormat,\n signal: options.signal ?? signal,\n timeoutMs: options.timeoutMs ?? timeoutMs,\n sourceNodePath: options.sourceNodePath,\n sourceTextSegments: options.sourceTextSegments,\n sourceMarkers: options.sourceMarkers,\n });\n }\n\n async synthesizeChunks(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeChunksOptions = {},\n ): Promise<SsmlSynthesisResult> {\n const { region, subscriptionKey, outputFormat, signal, timeoutMs } = this.#options;\n const endpoint = this.#options.endpoint?.trim() || ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n return synthesizeSsmlChunks(chunks, {\n endpoint,\n region,\n subscriptionKey,\n outputFormat: options.outputFormat ?? outputFormat,\n signal: options.signal ?? signal,\n timeoutMs: options.timeoutMs ?? timeoutMs,\n sourceNodePath: options.sourceNodePath,\n onProgress: options.onProgress ?? this.#options.onProgress,\n concurrency: options.concurrency ?? this.#options.concurrency,\n retryOptions: options.retryOptions ?? this.#options.retryOptions,\n });\n }\n\n async synthesizeSsmlSafe(ssml: string, options: SynthesizeSsmlSafeOptions = {}) {\n return synthesizeSsmlSafe(this, ssml, options);\n }\n\n async synthesizeChunksSafe(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeSsmlChunksSafeOptions = {},\n ) {\n return synthesizeSsmlChunksSafe(this, chunks, {\n ...options,\n outputFormat: options.outputFormat ?? this.#options.outputFormat,\n signal: options.signal ?? this.#options.signal,\n timeoutMs: options.timeoutMs ?? this.#options.timeoutMs,\n onProgress: options.onProgress ?? this.#options.onProgress,\n concurrency: options.concurrency ?? this.#options.concurrency,\n retryOptions: options.retryOptions ?? this.#options.retryOptions,\n });\n }\n\n async synthesizeSsmlChunksSafe(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeSsmlChunksSafeOptions = {},\n ) {\n return this.synthesizeChunksSafe(chunks, options);\n }\n}\n","const AZURE_VOICE_API_VERSION = \"2025-10-01\";\n\nexport interface FetchAzureVoiceCatalogOptions {\n apiKey: string;\n region: string | string[];\n}\n\nexport interface AzureVoiceCatalogVoice {\n name: string;\n locale: string;\n secondaryLocales?: readonly string[];\n styles?: readonly string[];\n supportedTags?: readonly string[];\n unsupportedTags?: readonly string[];\n models?: readonly string[];\n regions: readonly string[];\n status?: \"ga\" | \"preview\" | \"deprecated\";\n}\n\nexport interface FetchedAzureVoiceCatalogMetadata {\n voiceCount: number;\n generatedAt: string;\n apiVersion: string;\n regions: readonly string[];\n}\n\nexport interface AzureVoiceCatalog {\n voices: readonly AzureVoiceCatalogVoice[];\n metadata: FetchedAzureVoiceCatalogMetadata;\n}\n\ninterface AzureVoiceApiRecord {\n Locale?: unknown;\n Name?: unknown;\n SecondaryLocaleList?: unknown;\n ShortName?: unknown;\n Status?: unknown;\n StyleList?: unknown;\n SupportedTags?: unknown;\n UnsupportedTags?: unknown;\n Models?: unknown;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return [...new Set(value.map(stringValue).filter((item): item is string => item !== undefined))];\n}\n\nfunction normalizeStatus(value: unknown): AzureVoiceCatalogVoice[\"status\"] {\n const status = stringValue(value)?.toLowerCase();\n if (status === \"preview\" || status === \"deprecated\" || status === \"ga\") return status;\n return undefined;\n}\n\nfunction normalizeRegions(region: string | string[]): string[] {\n const regions = Array.isArray(region) ? region : [region];\n const result = [...new Set(regions.map((item) => item.trim()).filter(Boolean))];\n if (result.length === 0) throw new TypeError(\"At least one Azure Speech region is required.\");\n return result;\n}\n\nasync function fetchRegionVoices(region: string, apiKey: string): Promise<AzureVoiceApiRecord[]> {\n const endpoint = `https://${encodeURIComponent(region)}.tts.speech.microsoft.com/cognitiveservices/voices/list`;\n const response = await fetch(endpoint, {\n headers: {\n Accept: \"application/json\",\n \"Ocp-Apim-Subscription-Key\": apiKey,\n },\n });\n if (!response.ok) {\n throw new Error(`Azure List Voices API request failed for region \"${region}\" with HTTP ${response.status}.`);\n }\n const payload: unknown = await response.json();\n if (!Array.isArray(payload)) throw new Error(`Azure List Voices API returned an invalid response for \"${region}\".`);\n return payload.filter((item): item is AzureVoiceApiRecord => Boolean(item && typeof item === \"object\"));\n}\n\n/** Fetches and deduplicates the current Azure Speech voice catalog for one or more regions. */\nexport async function fetchAzureVoiceCatalog(options: FetchAzureVoiceCatalogOptions): Promise<AzureVoiceCatalog> {\n if (!options || typeof options.apiKey !== \"string\" || !options.apiKey.trim())\n throw new TypeError(\"An Azure Speech API key is required.\");\n const regions = normalizeRegions(options.region);\n const payloads = await Promise.all(regions.map((region) => fetchRegionVoices(region, options.apiKey)));\n const voices = new Map<string, AzureVoiceCatalogVoice>();\n\n for (let regionIndex = 0; regionIndex < payloads.length; regionIndex += 1) {\n const region = regions[regionIndex];\n for (const record of payloads[regionIndex]) {\n const name = stringValue(record.ShortName) ?? stringValue(record.Name);\n const locale = stringValue(record.Locale);\n if (!name || !locale) continue;\n const key = name.toLowerCase();\n const existing = voices.get(key);\n const secondaryLocales = stringList(record.SecondaryLocaleList);\n const styles = stringList(record.StyleList);\n const status = normalizeStatus(record.Status);\n const supportedTags = stringList(record.SupportedTags);\n const unsupportedTags = stringList(record.UnsupportedTags);\n const models = stringList(record.Models);\n const merged: AzureVoiceCatalogVoice = {\n name: existing?.name ?? name,\n locale: existing?.locale ?? locale,\n regions: [...new Set([...(existing?.regions ?? []), region])],\n };\n const mergedSecondaryLocales = [...new Set([...(existing?.secondaryLocales ?? []), ...secondaryLocales])];\n if (mergedSecondaryLocales.length > 0) merged.secondaryLocales = mergedSecondaryLocales;\n const mergedStyles = [...new Set([...(existing?.styles ?? []), ...styles])];\n if (mergedStyles.length > 0) merged.styles = mergedStyles;\n const mergedSupportedTags = [...new Set([...(existing?.supportedTags ?? []), ...supportedTags])];\n if (mergedSupportedTags.length > 0) merged.supportedTags = mergedSupportedTags;\n const mergedUnsupportedTags = [...new Set([...(existing?.unsupportedTags ?? []), ...unsupportedTags])];\n if (mergedUnsupportedTags.length > 0) merged.unsupportedTags = mergedUnsupportedTags;\n const mergedModels = [...new Set([...(existing?.models ?? []), ...models])];\n if (mergedModels.length > 0) merged.models = mergedModels;\n if (status) merged.status = status;\n else if (existing?.status) merged.status = existing.status;\n voices.set(key, merged);\n }\n }\n\n const sortedVoices = [...voices.values()].sort((first, second) => first.name.localeCompare(second.name));\n return {\n voices: sortedVoices,\n metadata: {\n voiceCount: sortedVoices.length,\n generatedAt: new Date().toISOString(),\n apiVersion: AZURE_VOICE_API_VERSION,\n regions,\n },\n };\n}\n"],"mappings":"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","names":["SpeechSDK","data","import_ssml_core","resolveConcurrency"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/synthesis.ts","../src/outputFormats.ts","../src/speechConfig.ts","../src/safe.ts","../src/client.ts","../src/voiceCatalog.ts"],"sourcesContent":["/**\n * azure-tts-client: Azure Text-to-Speech client for SSML playback.\n */\n\nexport type {\n AzureTtsClientOptions,\n AzureTtsLogger,\n AudioSpecification,\n MappingStatus,\n MergedSynthesisResult,\n SsmlSynthesisBookmark,\n SsmlSynthesisBoundary,\n SsmlSynthesisResult,\n SsmlSynthesisViseme,\n SsmlSynthesisChunk,\n SynthesisProgressEvent,\n SynthesizeChunksOptions,\n SynthesisChunkStatus,\n RetryOptions,\n SynthesisTimeouts,\n SynthesizedChunk,\n PartialChunkSynthesisResult,\n PartialSynthesisResult,\n CustomMergerContext,\n CustomAudioMerger,\n PostMergeValidator,\n TtsConfig,\n} from \"./types.ts\";\nexport {\n AzureTtsError,\n AzureTtsSdkError,\n AudioFormatMismatchError,\n MergeError,\n SynthesisCancelledError,\n SynthesisTimeoutError,\n UnsupportedMergeFormatError,\n getRetryAfterDelayMs,\n} from \"./errors.ts\";\nexport type { AzureTtsSynthesisError, SynthesisErrorKind } from \"./errors.ts\";\nexport { AzureTtsClient } from \"./client.ts\";\nexport { synthesizeSpeech } from \"./synthesis.ts\";\nexport { synthesizeSsml } from \"./synthesis.ts\";\nexport {\n canMergeAudioFormat,\n mergeAudioBuffers,\n mergeSynthesisResults,\n inspectAudioSpecification,\n resolveMergeAudioFormat,\n synthesizeSsmlChunks,\n} from \"./synthesis.ts\";\nexport type {\n InputAudioSpecs,\n MergeAudioFormat,\n MergeAudioOptions,\n MergeSynthesisOptions,\n} from \"./synthesis.ts\";\nexport { DEFAULT_OUTPUT_FORMAT, resolveMimeType } from \"./outputFormats.ts\";\nexport type { AzureTtsOutputFormat } from \"./outputFormats.ts\";\nexport {\n BatchChunkValidationError,\n ChunkValidationError,\n synthesizeSsmlChunksSafe,\n synthesizeSsmlSafe,\n} from \"./safe.ts\";\nexport type {\n AzureApiErrorResult,\n Result,\n SsmlSynthesisSafeResult,\n SsmlSynthesisError,\n SsmlValidationError as AzureSsmlValidationError,\n Success,\n SynthesisResult,\n SynthesizeSsmlSafeOptions,\n SsmlSynthesisChunksSafeResult,\n SynthesizeSsmlChunksSafeOptions,\n ValidationErrorResult,\n ChunkDiagnostics,\n} from \"./safe.ts\";\nexport { fetchAzureVoiceCatalog } from \"./voiceCatalog.ts\";\nexport type {\n AzureVoiceCatalog,\n AzureVoiceCatalogVoice,\n FetchedAzureVoiceCatalogMetadata,\n FetchAzureVoiceCatalogOptions,\n} from \"./voiceCatalog.ts\";\n","export type SynthesisErrorKind =\n | \"validation-error\"\n | \"azure-api-error\"\n | \"merge-error\"\n | \"audio-format-mismatch\"\n | \"unsupported-format-error\"\n | \"cancelled\"\n | \"timeout\";\n\nexport class AzureTtsError extends Error {\n readonly kind = \"azure-api-error\" as const;\n readonly status: number;\n readonly statusText: string;\n readonly responseBody: string;\n readonly requestId: string | null;\n readonly retryAfterMs?: number;\n\n constructor(\n status: number,\n statusText: string,\n responseBody: string,\n requestId: string | null,\n responseHeaders?: Headers | Readonly<Record<string, string>>,\n ) {\n super(`Azure TTS request failed: ${status} ${statusText}`);\n this.name = \"AzureTtsError\";\n this.status = status;\n this.statusText = statusText;\n this.responseBody = responseBody;\n this.requestId = requestId;\n const value =\n responseHeaders instanceof Headers\n ? responseHeaders.get(\"retry-after\")\n : (responseHeaders?.[\"retry-after\"] ?? responseHeaders?.[\"Retry-After\"]);\n const seconds = value ? Number(value.trim()) : NaN;\n const date = value ? Date.parse(value) : NaN;\n if (Number.isFinite(seconds) && seconds >= 0) this.retryAfterMs = seconds * 1000;\n else if (Number.isFinite(date)) this.retryAfterMs = Math.max(0, date - Date.now());\n }\n}\n\n/** Reads Retry-After from an error-like value, returning milliseconds when present. */\nexport function getRetryAfterDelayMs(error: unknown): number | undefined {\n if (error instanceof AzureTtsError && error.retryAfterMs !== undefined) return error.retryAfterMs;\n if (!error || typeof error !== \"object\") return undefined;\n const candidate = error as { retryAfterMs?: unknown; headers?: unknown; response?: unknown };\n if (typeof candidate.retryAfterMs === \"number\" && candidate.retryAfterMs >= 0) return candidate.retryAfterMs;\n const headers = candidate.headers ?? (candidate.response as { headers?: unknown } | undefined)?.headers;\n if (headers instanceof Headers) {\n const value = headers.get(\"retry-after\");\n if (!value) return undefined;\n const seconds = Number(value.trim());\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const date = Date.parse(value);\n return Number.isFinite(date) ? Math.max(0, date - Date.now()) : undefined;\n }\n if (headers && typeof headers === \"object\") {\n const value =\n (headers as Record<string, unknown>)[\"retry-after\"] ?? (headers as Record<string, unknown>)[\"Retry-After\"];\n if (typeof value !== \"string\") return undefined;\n const seconds = Number(value.trim());\n if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;\n const date = Date.parse(value);\n return Number.isFinite(date) ? Math.max(0, date - Date.now()) : undefined;\n }\n return undefined;\n}\n\nexport class AzureTtsSdkError extends AzureTtsError {\n readonly errorDetails: string;\n\n constructor(errorDetails: string) {\n super(0, \"Speech SDK\", errorDetails, null);\n this.name = \"AzureTtsSdkError\";\n this.message = `Azure TTS synthesis failed: ${errorDetails}`;\n this.errorDetails = errorDetails;\n }\n}\n\nexport class SynthesisCancelledError extends Error {\n readonly kind = \"cancelled\" as const;\n\n constructor(message = \"Speech synthesis was cancelled.\") {\n super(message);\n this.name = \"SynthesisCancelledError\";\n }\n}\n\nexport class SynthesisTimeoutError extends Error {\n readonly kind = \"timeout\" as const;\n\n constructor(message: string) {\n super(message);\n this.name = \"SynthesisTimeoutError\";\n }\n}\n\nexport class MergeError extends Error {\n readonly kind = \"merge-error\" as const;\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"MergeError\";\n this.cause = cause;\n }\n}\n\n/** Thrown when chunk headers describe incompatible audio streams. */\nexport class AudioFormatMismatchError extends Error {\n readonly kind = \"audio-format-mismatch\" as const;\n readonly inputSpecs: readonly AudioSpecification[];\n\n constructor(message: string, inputSpecs: readonly AudioSpecification[] = []) {\n super(message);\n this.name = \"AudioFormatMismatchError\";\n this.inputSpecs = inputSpecs;\n }\n}\n\n/** Thrown when audio buffers require container re-multiplexing before they can be merged. */\nexport class UnsupportedMergeFormatError extends Error {\n readonly kind = \"unsupported-format-error\" as const;\n readonly format: string;\n\n constructor(format: string) {\n super(`Audio format \"${format}\" cannot be safely concatenated; container re-multiplexing is required.`);\n this.name = \"UnsupportedMergeFormatError\";\n this.format = format;\n }\n}\n\nexport type AzureTtsSynthesisError =\n | AzureTtsError\n | MergeError\n | AudioFormatMismatchError\n | UnsupportedMergeFormatError\n | SynthesisCancelledError\n | SynthesisTimeoutError;\n\nexport function toSynthesisError(\n error: unknown,\n):\n | AzureTtsError\n | MergeError\n | AudioFormatMismatchError\n | UnsupportedMergeFormatError\n | SynthesisCancelledError\n | SynthesisTimeoutError {\n if (\n error instanceof AzureTtsError ||\n error instanceof MergeError ||\n error instanceof AudioFormatMismatchError ||\n error instanceof UnsupportedMergeFormatError ||\n error instanceof SynthesisCancelledError ||\n error instanceof SynthesisTimeoutError\n )\n return error;\n const message = error instanceof Error ? error.message : String(error);\n if (/cancel|abort/i.test(message)) return new SynthesisCancelledError(message);\n if (/tim(?:e|ed) ?out/i.test(message)) return new SynthesisTimeoutError(message);\n return createSpeechSdkError(error);\n}\n\nexport function createSpeechSdkError(error: unknown): AzureTtsSdkError {\n const message = error instanceof Error ? error.message : String(error);\n return new AzureTtsSdkError(message);\n}\nimport type { AudioSpecification } from \"./types.ts\";\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\nimport { getSsmlSourceMap } from \"@ssml-builder-js/ssml-core\";\nimport {\n AzureTtsError,\n MergeError,\n AudioFormatMismatchError,\n SynthesisCancelledError,\n SynthesisTimeoutError,\n toSynthesisError,\n UnsupportedMergeFormatError,\n getRetryAfterDelayMs,\n} from \"./errors.ts\";\nimport { DEFAULT_OUTPUT_FORMAT, resolveMimeType, type AzureTtsOutputFormat } from \"./outputFormats.ts\";\nimport { createSpeechConfig } from \"./speechConfig.ts\";\nimport type {\n MergedSynthesisResult,\n SsmlSynthesisChunk,\n SsmlSynthesisResult,\n AudioSpecification,\n SynthesisProgressEvent,\n TtsConfig,\n RetryOptions,\n CustomAudioMerger,\n PostMergeValidator,\n} from \"./types.ts\";\n\nexport type MergeAudioFormat = \"wav\" | \"mp3\" | \"raw\";\n\nexport interface MergeAudioOptions {\n format: AzureTtsOutputFormat;\n signal?: AbortSignal;\n outputMimeType?: string;\n}\n\nexport type InputAudioSpecs = AudioSpecification[];\n\nexport interface MergeSynthesisOptions extends MergeAudioOptions {\n customMerger?: CustomAudioMerger;\n postMergeValidator?: PostMergeValidator;\n}\n\ntype AsyncMergeSynthesisOptions = MergeSynthesisOptions & {\n customMerger: NonNullable<MergeSynthesisOptions[\"customMerger\"]>;\n};\n\nfunction ascii(bytes: Uint8Array, offset: number, value: string): boolean {\n return [...value].every((character, index) => bytes[offset + index] === character.charCodeAt(0));\n}\n\nfunction readUint32(bytes: Uint8Array, offset: number): number {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(offset, true);\n}\n\ninterface RiffChunk {\n id: string;\n data: Uint8Array;\n}\n\ninterface ParsedWav {\n chunks: RiffChunk[];\n data: Uint8Array;\n format: Uint8Array;\n}\n\nfunction parseWav(buffer: ArrayBuffer): ParsedWav {\n const bytes = new Uint8Array(buffer);\n if (bytes.byteLength < 12 || !ascii(bytes, 0, \"RIFF\") || !ascii(bytes, 8, \"WAVE\")) {\n throw new Error(\"Invalid WAV/RIFF audio buffer.\");\n }\n const chunks: RiffChunk[] = [];\n const dataParts: Uint8Array[] = [];\n let format: Uint8Array | undefined;\n let offset = 12;\n while (offset < bytes.byteLength) {\n if (offset + 8 > bytes.byteLength) throw new Error(\"Invalid WAV chunk header.\");\n const id = String.fromCharCode(...bytes.slice(offset, offset + 4));\n const size = readUint32(bytes, offset + 4);\n const dataStart = offset + 8;\n const dataEnd = dataStart + size;\n if (dataEnd > bytes.byteLength) throw new Error(`WAV chunk \"${id}\" exceeds the audio buffer.`);\n const data = bytes.slice(dataStart, dataEnd);\n chunks.push({ id, data });\n if (id === \"fmt \") format ??= data;\n if (id === \"data\") dataParts.push(data);\n offset = dataEnd + (size & 1);\n if (offset > bytes.byteLength) throw new Error(\"Invalid WAV chunk padding.\");\n }\n if (!format || dataParts.length === 0) throw new Error(\"WAV audio must contain fmt and data chunks.\");\n const dataLength = dataParts.reduce((total, part) => total + part.byteLength, 0);\n const data = new Uint8Array(dataLength);\n let dataOffset = 0;\n for (const part of dataParts) {\n data.set(part, dataOffset);\n dataOffset += part.byteLength;\n }\n return { chunks, data, format };\n}\n\nfunction formatNumber(format: string, pattern: RegExp, fallback: number): number {\n const match = pattern.exec(format);\n return match?.[1] ? Number(match[1]) : fallback;\n}\n\nfunction formatChannels(format: string, fallback: number): number {\n if (/stereo|2ch|dual/i.test(format)) return 2;\n if (/mono|1ch/i.test(format)) return 1;\n return fallback;\n}\n\nfunction formatAudioSpecification(format: string): AudioSpecification {\n const sampleRate = formatNumber(format, /(\\d+)(?:khz|kHz|hz|Hz)/, 0);\n const channels = formatChannels(format, 0);\n const bitrateMatch = /(\\d+)(?:kbitrate|kbps|kbits?)/i.exec(format);\n const bitrate = bitrateMatch?.[1] ? Number(bitrateMatch[1]) * 1000 : undefined;\n const codec: AudioSpecification[\"codec\"] = /mp3|mpeg/i.test(format)\n ? \"mp3\"\n : /opus/i.test(format)\n ? \"opus\"\n : /silk/i.test(format)\n ? \"silk\"\n : /pcm|mulaw|alaw|siren/i.test(format)\n ? \"pcm\"\n : \"unknown\";\n const bitDepthMatch = /(\\d+)bit/i.exec(format);\n const container = /(?:wav|wave|riff)/i.test(format)\n ? \"riff-wave\"\n : /mp3|mpeg/i.test(format)\n ? \"mp3-raw\"\n : /ogg/i.test(format)\n ? \"ogg\"\n : /webm/i.test(format)\n ? \"webm\"\n : /raw/i.test(format)\n ? \"raw\"\n : undefined;\n return {\n format,\n mimeType: resolveMimeType(format),\n codec,\n sampleRate,\n channels,\n ...(bitrate ? { bitrate } : {}),\n ...(bitDepthMatch?.[1] ? { bitDepth: Number(bitDepthMatch[1]) } : {}),\n ...(container ? { container } : {}),\n isVbr: /vbr/i.test(format),\n isCompressed: codec === \"mp3\" || codec === \"opus\" || codec === \"silk\",\n };\n}\n\nfunction parseMp3Specification(buffer: ArrayBuffer, format: string): AudioSpecification | undefined {\n const bytes = stripMp3Tags(buffer);\n const bitrates = [\n [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0],\n [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0],\n ];\n const sampleRates = [\n [44_100, 48_000, 32_000],\n [22_050, 24_000, 16_000],\n [11_025, 12_000, 8_000],\n ];\n for (let index = 0; index + 4 <= bytes.length; index += 1) {\n if (bytes[index] !== 0xff || (bytes[index + 1] ?? 0) < 0xe0) continue;\n const header = bytes[index + 1] ?? 0;\n const versionBits = (header >> 3) & 0x03;\n const layer = (header >> 1) & 0x03;\n const bitrateIndex = (bytes[index + 2] ?? 0) >> 4;\n const sampleIndex = ((bytes[index + 2] ?? 0) >> 2) & 0x03;\n if (versionBits === 1 || layer !== 1 || bitrateIndex === 0 || bitrateIndex === 15 || sampleIndex === 3) continue;\n const versionIndex = versionBits === 3 ? 0 : versionBits === 2 ? 1 : 2;\n const bitrateTable = versionBits === 3 ? bitrates[1] : bitrates[2];\n const sampleRate = sampleRates[versionIndex]?.[sampleIndex] ?? 0;\n const bitrateKbps = bitrateTable?.[bitrateIndex] ?? 0;\n if (!sampleRate || !bitrateKbps) continue;\n return {\n format,\n mimeType: \"audio/mpeg\",\n codec: \"mp3\",\n sampleRate,\n channels: (bytes[index + 3] ?? 0) >> 6 === 3 ? 1 : 2,\n bitrate: bitrateKbps * 1000,\n container: \"mp3-raw\",\n isVbr: false,\n isCompressed: true,\n };\n }\n return undefined;\n}\n\n/** Extracts the stream specification from a WAV/MP3 header and output-format fallback. */\nexport function inspectAudioSpecification(buffer: ArrayBuffer, format: string): AudioSpecification {\n if (isWavFormat(format) || ascii(new Uint8Array(buffer), 0, \"RIFF\")) {\n const parsed = parseWav(buffer);\n if (parsed.format.byteLength < 16) throw new Error(\"Invalid WAV fmt chunk.\");\n const view = new DataView(parsed.format.buffer, parsed.format.byteOffset, parsed.format.byteLength);\n const sampleRate = view.getUint32(4, true);\n const channels = view.getUint16(2, true);\n const bitsPerSample = parsed.format.byteLength >= 16 ? view.getUint16(14, true) : 0;\n const formatCode = view.getUint16(0, true);\n return {\n format,\n mimeType: \"audio/wav\",\n codec: formatCode === 1 ? \"pcm\" : \"unknown\",\n sampleRate,\n channels,\n ...(sampleRate && channels && bitsPerSample ? { bitrate: sampleRate * channels * bitsPerSample } : {}),\n bitDepth: bitsPerSample,\n container: \"riff-wave\",\n isVbr: false,\n isCompressed: formatCode !== 1,\n };\n }\n if (isMp3Format(format)) return parseMp3Specification(buffer, format) ?? formatAudioSpecification(format);\n return formatAudioSpecification(format);\n}\n\nfunction validateAudioSpecifications(specs: readonly AudioSpecification[]): void {\n const first = specs[0];\n if (!first) return;\n const mismatch = specs.find(\n (spec) =>\n spec.sampleRate !== first.sampleRate ||\n spec.channels !== first.channels ||\n (first.bitrate !== undefined && spec.bitrate !== undefined && spec.bitrate !== first.bitrate) ||\n (first.bitDepth !== undefined && spec.bitDepth !== undefined && spec.bitDepth !== first.bitDepth) ||\n (first.container !== undefined && spec.container !== undefined && spec.container !== first.container) ||\n (first.isVbr !== undefined && spec.isVbr !== undefined && spec.isVbr !== first.isVbr),\n );\n if (mismatch)\n throw new AudioFormatMismatchError(\n `Audio chunks have incompatible specifications: ${first.sampleRate}Hz/${first.channels}ch versus ${mismatch.sampleRate}Hz/${mismatch.channels}ch.`,\n specs,\n );\n}\n\nfunction isAudioFormatMismatch(error: unknown): error is AudioFormatMismatchError {\n return (\n error instanceof AudioFormatMismatchError ||\n (error !== null && typeof error === \"object\" && \"kind\" in error && error.kind === \"audio-format-mismatch\")\n );\n}\n\nfunction writeUint32(target: Uint8Array, offset: number, value: number): void {\n new DataView(target.buffer).setUint32(offset, value, true);\n}\n\nfunction writeChunk(target: Uint8Array, offset: number, id: string, data: Uint8Array): number {\n for (let index = 0; index < 4; index += 1) target[offset + index] = id.charCodeAt(index) ?? 0;\n writeUint32(target, offset + 4, data.byteLength);\n target.set(data, offset + 8);\n const end = offset + 8 + data.byteLength;\n if (data.byteLength & 1) target[end] = 0;\n return end + (data.byteLength & 1);\n}\n\nfunction mergeWavBuffers(buffers: readonly ArrayBuffer[]): ArrayBuffer {\n if (buffers.length === 0) return new ArrayBuffer(0);\n const parsed = buffers.map(parseWav);\n const first = parsed[0];\n if (!first) throw new Error(\"At least one WAV buffer is required.\");\n if (\n parsed.some(\n (item) => item.format.length !== first.format.length || item.format.some((value, i) => value !== first.format[i]),\n )\n )\n throw new Error(\"WAV buffers have incompatible fmt chunks.\");\n const dataLength = parsed.reduce((total, item) => total + item.data.byteLength, 0);\n const nonDataLength = first.chunks.reduce(\n (total, chunk) => (chunk.id === \"data\" ? total : total + 8 + chunk.data.byteLength + (chunk.data.byteLength & 1)),\n 0,\n );\n const outputLength = 12 + nonDataLength + 8 + dataLength + (dataLength & 1);\n if (outputLength - 8 > 0xffffffff) throw new RangeError(\"Merged WAV exceeds the RIFF format size limit.\");\n const output = new Uint8Array(outputLength);\n output.set(Uint8Array.from([0x52, 0x49, 0x46, 0x46]), 0);\n writeUint32(output, 4, outputLength - 8);\n output.set(Uint8Array.from([0x57, 0x41, 0x56, 0x45]), 8);\n let outputOffset = 12;\n let dataWritten = false;\n for (const chunk of first.chunks) {\n if (chunk.id === \"data\") {\n if (dataWritten) continue;\n const data = new Uint8Array(dataLength);\n let dataOffset = 0;\n for (const item of parsed) {\n data.set(item.data, dataOffset);\n dataOffset += item.data.byteLength;\n }\n outputOffset = writeChunk(output, outputOffset, \"data\", data);\n dataWritten = true;\n } else {\n outputOffset = writeChunk(output, outputOffset, chunk.id, chunk.data);\n }\n }\n if (!dataWritten) throw new Error(\"WAV audio must contain a data chunk.\");\n return output.buffer;\n}\n\nfunction skipId3v2(bytes: Uint8Array): number {\n if (!ascii(bytes, 0, \"ID3\") || bytes.byteLength < 10) return 0;\n const size = [bytes[6], bytes[7], bytes[8], bytes[9]].reduce((total, value) => (total << 7) | (value & 0x7f), 0);\n const hasFooter = (bytes[5] & 0x10) !== 0;\n return Math.min(bytes.byteLength, 10 + size + (hasFooter ? 10 : 0));\n}\n\nfunction stripMp3Tags(buffer: ArrayBuffer): Uint8Array {\n const bytes = new Uint8Array(buffer);\n const start = skipId3v2(bytes);\n const end =\n bytes.byteLength >= 128 && ascii(bytes, bytes.byteLength - 128, \"TAG\") ? bytes.byteLength - 128 : bytes.byteLength;\n return bytes.slice(Math.min(start, end), end);\n}\n\nfunction isMp3Format(format: string): boolean {\n return /(?:mp3|mpeg)/i.test(format);\n}\n\nfunction isWavFormat(format: string): boolean {\n return /(?:wav|wave|riff)/i.test(format);\n}\n\nfunction isRawFormat(format: string): boolean {\n return /^raw(?:-|$)/i.test(format);\n}\n\n/** Returns whether the named output format can be safely concatenated without re-multiplexing. */\nexport function resolveMergeAudioFormat(format: string): MergeAudioFormat | undefined {\n if (isWavFormat(format)) return \"wav\";\n if (isMp3Format(format)) return \"mp3\";\n if (isRawFormat(format)) return \"raw\";\n return undefined;\n}\n\nexport function canMergeAudioFormat(format: string): boolean {\n return resolveMergeAudioFormat(format) !== undefined;\n}\n\n/** Merges audio buffers while preserving the invariants of supported containers. */\nexport function mergeAudioBuffers(buffers: readonly ArrayBuffer[], options: MergeAudioOptions): ArrayBuffer;\nexport function mergeAudioBuffers(buffers: readonly ArrayBuffer[], options: MergeAudioOptions | string): ArrayBuffer {\n const format = typeof options === \"string\" ? options : options?.format;\n if (!format) throw new UnsupportedMergeFormatError(\"\");\n try {\n validateAudioSpecifications(buffers.map((buffer) => inspectAudioSpecification(buffer, format)));\n if (isWavFormat(format)) return mergeWavBuffers(buffers);\n if (isMp3Format(format)) {\n const parts = buffers.map(stripMp3Tags);\n const output = new Uint8Array(parts.reduce((total, part) => total + part.byteLength, 0));\n let offset = 0;\n for (const part of parts) {\n output.set(part, offset);\n offset += part.byteLength;\n }\n return output.buffer;\n }\n if (isRawFormat(format)) {\n const output = new Uint8Array(buffers.reduce((total, buffer) => total + buffer.byteLength, 0));\n let offset = 0;\n for (const buffer of buffers) {\n output.set(new Uint8Array(buffer), offset);\n offset += buffer.byteLength;\n }\n return output.buffer;\n }\n throw new UnsupportedMergeFormatError(format);\n } catch (error) {\n if (error instanceof UnsupportedMergeFormatError || isAudioFormatMismatch(error) || error instanceof MergeError)\n throw error;\n throw new MergeError(`Audio buffers could not be merged for format \"${format}\".`, error);\n }\n}\n\nfunction closeSpeechResources(speechConfig: SpeechSDK.SpeechConfig, synthesizer: SpeechSDK.SpeechSynthesizer): void {\n try {\n synthesizer.close();\n } catch {}\n\n try {\n speechConfig.close();\n } catch {}\n}\n\nconst ticksToMilliseconds = (ticks: number): number => Math.max(0, ticks) / 10_000;\n\nexport async function synthesizeSsml(ssml: string, config: TtsConfig): Promise<SsmlSynthesisResult> {\n if (config.signal?.aborted) {\n throw new SynthesisCancelledError();\n }\n\n const speechConfig = createSpeechConfig(config);\n const synthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, null);\n\n return await new Promise<SsmlSynthesisResult>((resolve, reject) => {\n let resourcesClosed = false;\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abortHandler: (() => void) | undefined;\n const cleanup = () => {\n if (timeout) clearTimeout(timeout);\n if (abortHandler) config.signal?.removeEventListener(\"abort\", abortHandler);\n };\n const closeResources = () => {\n if (resourcesClosed) return;\n resourcesClosed = true;\n closeSpeechResources(speechConfig, synthesizer);\n };\n const rejectWithError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n closeResources();\n reject(toSynthesisError(error));\n };\n\n const boundaries: SsmlSynthesisResult[\"boundaries\"] = [];\n const visemes: SsmlSynthesisResult[\"visemes\"] = [];\n const bookmarks: SsmlSynthesisResult[\"bookmarks\"] = [];\n let sourceEventCursor = 0;\n let generatedSourceMap: ReturnType<typeof getSsmlSourceMap> | undefined;\n if (!config.sourceTextSegments && !config.sourceMarkers) {\n try {\n generatedSourceMap = getSsmlSourceMap(ssml);\n } catch {\n generatedSourceMap = undefined;\n }\n }\n const sourceBaseOffset = config.sourceTextRange?.start ?? 0;\n const sourceSegments =\n config.sourceTextSegments ??\n generatedSourceMap?.segments.map((segment) => ({\n ...segment,\n range: {\n start: segment.range.start + sourceBaseOffset,\n end: segment.range.end + sourceBaseOffset,\n },\n sourceNodePath: [...segment.sourceNodePath],\n })) ??\n [];\n const sourceMarkers =\n config.sourceMarkers ??\n generatedSourceMap?.markers.map((marker) => ({\n ...marker,\n originalTextRange: {\n start: marker.originalTextRange.start + sourceBaseOffset,\n end: marker.originalTextRange.end + sourceBaseOffset,\n },\n sourceNodePath: [...marker.sourceNodePath],\n })) ??\n [];\n const sourceText = sourceSegments.map((segment) => segment.text).join(\"\");\n const mapSourceEvent = (\n text: string | undefined,\n offsetHint: number | undefined,\n markerName?: string,\n ): {\n textRange?: { start: number; end: number };\n originalTextRange?: { start: number; end: number };\n sourceNodePath?: string[];\n mappingStatus: \"exact\" | \"fallback\" | \"unmapped\";\n } => {\n const marker = markerName ? sourceMarkers.find((candidate) => candidate.name === markerName) : undefined;\n if (marker) {\n return {\n originalTextRange: { ...marker.originalTextRange },\n sourceNodePath: [...marker.sourceNodePath],\n textRange: { ...marker.originalTextRange },\n mappingStatus: \"exact\",\n };\n }\n if (sourceSegments.length === 0 && !config.sourceTextRange && !config.sourceNodePath) {\n return { mappingStatus: \"unmapped\" };\n }\n const value = text ?? \"\";\n let localStart = Number.isFinite(offsetHint) && (offsetHint ?? 0) >= 0 ? (offsetHint as number) : -1;\n let mappingStatus: \"exact\" | \"fallback\" | \"unmapped\" = \"exact\";\n if (value && localStart >= 0 && sourceText.slice(localStart, localStart + value.length) !== value) {\n localStart = -1;\n mappingStatus = \"fallback\";\n }\n if (localStart < 0 || localStart > sourceText.length) {\n localStart = value ? sourceText.indexOf(value, sourceEventCursor) : sourceEventCursor;\n if (localStart < 0) localStart = value ? sourceText.indexOf(value) : sourceEventCursor;\n mappingStatus = \"fallback\";\n }\n localStart = Math.max(0, localStart);\n const localEnd = Math.min(sourceText.length, localStart + value.length);\n sourceEventCursor = Math.max(sourceEventCursor, localEnd);\n const baseStart = config.sourceTextRange?.start ?? sourceSegments[0]?.range.start ?? 0;\n const fallbackRange = { start: baseStart + localStart, end: baseStart + localEnd };\n const segment =\n sourceSegments.find(({ range }) => range.start <= fallbackRange.start && range.end > fallbackRange.start) ??\n sourceSegments.find(({ range }) => range.end > fallbackRange.start) ??\n (value.length === 0\n ? sourceSegments.find(({ range }) => range.start <= fallbackRange.start && range.end >= fallbackRange.start)\n : undefined);\n return {\n originalTextRange: { ...fallbackRange },\n textRange: { ...fallbackRange },\n ...(segment\n ? { sourceNodePath: [...segment.sourceNodePath] }\n : config.sourceNodePath\n ? { sourceNodePath: [...config.sourceNodePath] }\n : {}),\n mappingStatus: segment || config.sourceTextRange || config.sourceNodePath ? mappingStatus : \"unmapped\",\n };\n };\n synthesizer.wordBoundary = (_sender, event) => {\n boundaries.push({\n text: event.text,\n audioOffsetMs: ticksToMilliseconds(event.audioOffset),\n durationMs: ticksToMilliseconds(event.duration),\n ...mapSourceEvent(\n event.text,\n (event as SpeechSDK.SpeechSynthesisWordBoundaryEventArgs & { textOffset?: number }).textOffset,\n ),\n });\n };\n synthesizer.visemeReceived = (_sender, event) => {\n const eventWithOffset = event as SpeechSDK.SpeechSynthesisVisemeEventArgs & { textOffset?: number };\n visemes.push({\n visemeId: event.visemeId,\n audioOffsetMs: ticksToMilliseconds(event.audioOffset),\n ...mapSourceEvent(undefined, eventWithOffset.textOffset),\n });\n };\n synthesizer.bookmarkReached = (_sender, event) => {\n const eventWithOffset = event as SpeechSDK.SpeechSynthesisBookmarkEventArgs & { textOffset?: number };\n bookmarks.push({\n name: event.text,\n audioOffsetMs: ticksToMilliseconds(event.audioOffset),\n ...mapSourceEvent(undefined, eventWithOffset.textOffset, event.text),\n });\n };\n\n const cb = (result: SpeechSDK.SpeechSynthesisResult) => {\n if (settled) return;\n const { reason, errorDetails } = result;\n if (reason !== SpeechSDK.ResultReason.SynthesizingAudioCompleted) {\n const err = errorDetails || `Speech synthesis failed with reason ${reason}.`;\n rejectWithError(err);\n return;\n }\n settled = true;\n cleanup();\n closeResources();\n const eventDurationMs = Math.max(\n 0,\n ...(boundaries ?? []).map((boundary) => boundary.audioOffsetMs + boundary.durationMs),\n ...(visemes ?? []).map((viseme) => viseme.audioOffsetMs),\n ...(bookmarks ?? []).map((bookmark) => bookmark.audioOffsetMs),\n );\n const durationMs = result.audioDuration ? ticksToMilliseconds(result.audioDuration) : eventDurationMs;\n const requestId = (result as SpeechSDK.SpeechSynthesisResult & { resultId?: string }).resultId;\n const addSourceMetadata = <T extends { audioOffsetMs: number; mappingStatus: \"exact\" | \"fallback\" | \"unmapped\" }>(\n event: T,\n ): T => {\n const mapped = {\n ...event,\n ...(config.sourceTextRange && !(\"textRange\" in event) ? { textRange: { ...config.sourceTextRange } } : {}),\n ...(config.sourceTextRange && !(\"originalTextRange\" in event)\n ? { originalTextRange: { ...config.sourceTextRange } }\n : {}),\n ...(config.chunkIndex !== undefined ? { chunkIndex: config.chunkIndex } : {}),\n ...(config.sourceNodePath ? { sourceNodePath: [...config.sourceNodePath] } : {}),\n ...(requestId ? { requestId } : {}),\n } as T;\n if (event.mappingStatus === \"unmapped\") {\n Object.defineProperty(mapped, \"mappingStatus\", { value: \"unmapped\", enumerable: false });\n Object.defineProperty(mapped, \"toJSON\", {\n value: () => ({ ...mapped, mappingStatus: \"unmapped\" }),\n enumerable: false,\n });\n }\n return mapped;\n };\n const sourceBoundaries = boundaries.map((boundary) => addSourceMetadata(boundary));\n const sourceVisemes = visemes.map((viseme) => addSourceMetadata(viseme));\n const sourceBookmarks = bookmarks.map((bookmark) => addSourceMetadata(bookmark));\n resolve({\n audioData: result.audioData,\n durationMs,\n audioSpec: inspectAudioSpecification(result.audioData, config.outputFormat ?? DEFAULT_OUTPUT_FORMAT),\n mimeType: resolveMimeType(config.outputFormat ?? DEFAULT_OUTPUT_FORMAT),\n ...(config.sourceTextRange ? { textRange: { ...config.sourceTextRange } } : {}),\n ...(requestId ? { requestId } : {}),\n ...(sourceBoundaries.length > 0\n ? { boundaries: sourceBoundaries, wordBoundary: sourceBoundaries, wordBoundaries: sourceBoundaries }\n : {}),\n ...(sourceVisemes.length > 0 ? { visemes: sourceVisemes } : {}),\n ...(sourceBookmarks.length > 0 ? { bookmarks: sourceBookmarks } : {}),\n });\n };\n\n try {\n if (config.signal) {\n abortHandler = () => rejectWithError(new SynthesisCancelledError());\n config.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n const timeoutMs = config.timeouts?.perChunkMs ?? config.timeoutMs;\n if (timeoutMs !== undefined && timeoutMs > 0) {\n timeout = setTimeout(\n () => rejectWithError(new SynthesisTimeoutError(`Speech synthesis timed out after ${timeoutMs} ms.`)),\n timeoutMs,\n );\n }\n synthesizer.speakSsmlAsync(ssml, cb, rejectWithError);\n } catch (error) {\n rejectWithError(error);\n }\n });\n}\n\nfunction isRetryableSynthesisError(error: unknown): boolean {\n if (error instanceof SynthesisCancelledError || error instanceof SynthesisTimeoutError) return false;\n if (error instanceof AzureTtsError && error.status !== 0)\n return error.status === 429 || (error.status >= 500 && error.status < 600);\n const message = error instanceof Error ? error.message : String(error);\n if (/\\b4\\d{2}\\b/.test(message)) return false;\n const status = error && typeof error === \"object\" && \"status\" in error ? error.status : undefined;\n if (typeof status === \"number\") return status === 429 || (status >= 500 && status < 600);\n return /network|connection|connect|socket|fetch failed|econn|etimedout|temporar|transient|unavailable/i.test(message);\n}\n\nfunction retryDelay(options: RetryOptions, retryAttempt: number, error?: unknown): number {\n const retryAfterMs = getRetryAfterDelayMs(error);\n if (retryAfterMs !== undefined) return retryAfterMs;\n const base = Math.min(options.maxDelayMs, options.initialDelayMs * 2 ** Math.max(0, retryAttempt - 1));\n return Math.floor(Math.random() * (base + 1));\n}\n\nfunction resolveConcurrency(value: number | undefined, total: number): number {\n if (value === undefined) return 1;\n if (value === Infinity) return Math.max(1, total);\n return Number.isFinite(value) ? Math.max(1, Math.floor(value)) : 1;\n}\n\nasync function waitForRetry(delayMs: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) throw new SynthesisCancelledError();\n if (delayMs <= 0) return;\n await new Promise<void>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout>;\n const abort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n reject(new SynthesisCancelledError());\n };\n timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, delayMs);\n if (signal) {\n signal.addEventListener(\"abort\", abort, { once: true });\n }\n });\n}\n\nasync function synthesizeWithRetry(\n ssml: string,\n config: TtsConfig,\n retryOptions: RetryOptions | undefined,\n onRetry: (retryAttempt: number, nextRetryDelayMs: number) => void,\n): Promise<SsmlSynthesisResult> {\n const options = retryOptions\n ? {\n maxRetries: Math.max(0, Math.floor(retryOptions.maxRetries)),\n initialDelayMs: Math.max(0, retryOptions.initialDelayMs),\n maxDelayMs: Math.max(0, retryOptions.maxDelayMs),\n shouldRetry: retryOptions.shouldRetry,\n }\n : undefined;\n let attempt = 0;\n while (true) {\n if (config.signal?.aborted) throw new SynthesisCancelledError();\n try {\n return await synthesizeSsml(ssml, config);\n } catch (error) {\n if (\n !options ||\n attempt >= options.maxRetries ||\n !(options.shouldRetry?.(error, attempt + 1) ?? isRetryableSynthesisError(error))\n )\n throw error;\n attempt += 1;\n const delayMs = retryDelay(options, attempt, error);\n onRetry(attempt, delayMs);\n await waitForRetry(delayMs, config.signal);\n }\n }\n}\n\ninterface AbortScope {\n signal: AbortSignal;\n timedOut: () => boolean;\n dispose: () => void;\n abort: () => void;\n}\n\nfunction createAbortScope(parent: AbortSignal | undefined, timeoutMs: number | undefined): AbortScope {\n const controller = new AbortController();\n let didTimeout = false;\n const onAbort = () => controller.abort();\n if (parent?.aborted) controller.abort();\n parent?.addEventListener(\"abort\", onAbort, { once: true });\n const timer =\n timeoutMs !== undefined && timeoutMs > 0\n ? setTimeout(() => {\n didTimeout = true;\n controller.abort();\n }, timeoutMs)\n : undefined;\n return {\n signal: controller.signal,\n timedOut: () => didTimeout,\n dispose: () => {\n if (timer) clearTimeout(timer);\n parent?.removeEventListener(\"abort\", onAbort);\n },\n abort: () => controller.abort(),\n };\n}\n\nasync function synthesizeChunkWithTimeout(\n ssml: string,\n config: TtsConfig,\n retryOptions: RetryOptions | undefined,\n timeoutMs: number | undefined,\n onRetry: (retryAttempt: number, nextRetryDelayMs: number) => void,\n): Promise<SsmlSynthesisResult> {\n const scope = createAbortScope(config.signal, timeoutMs);\n try {\n return await synthesizeWithRetry(ssml, { ...config, signal: scope.signal }, retryOptions, onRetry);\n } catch (error) {\n if (scope.timedOut()) throw new SynthesisTimeoutError(`Speech synthesis timed out after ${timeoutMs} ms.`);\n throw error;\n } finally {\n scope.dispose();\n }\n}\n\n/** Synthesizes chunks with bounded concurrency, retries transient failures, and merges in chunk order. */\nexport async function synthesizeSsmlChunks(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n config: TtsConfig,\n): Promise<SsmlSynthesisResult> {\n const results: Array<SsmlSynthesisResult | undefined> = new Array(chunks.length);\n const totalChunks = chunks.length;\n const cachedChunks = new Map((config.resumeChunks ?? []).map((chunk) => [chunk.chunkIndex, chunk]));\n for (const [index, cached] of cachedChunks) {\n if (index >= 0 && index < totalChunks) results[index] = cached;\n }\n const requestedIndices = config.resumeChunkIndices\n ? new Set(config.resumeChunkIndices.filter((index) => index >= 0 && index < totalChunks))\n : undefined;\n const shouldSynthesize = (index: number): boolean =>\n !cachedChunks.has(index) && (requestedIndices === undefined || requestedIndices.has(index));\n const scope = createAbortScope(config.signal, config.timeouts?.totalJobMs);\n const report = (event: SynthesisProgressEvent): void => config.onProgress?.(event);\n for (const [index, chunk] of chunks.entries()) {\n const input = typeof chunk === \"string\" ? { ssml: chunk } : chunk;\n report({\n currentChunk: index,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((index / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"pending\",\n durationMs: 0,\n });\n }\n let completed = [...results].filter((result) => result !== undefined).length;\n let nextIndex = 0;\n const concurrency = resolveConcurrency(config.concurrency, chunks.length);\n let firstError: unknown;\n const failedIndices = new Set<number>();\n const worker = async (): Promise<void> => {\n while (true) {\n const index = nextIndex++;\n if (index >= chunks.length) return;\n if (!shouldSynthesize(index)) continue;\n if (firstError && config.cancelOnFailure !== false) return;\n const chunk = chunks[index];\n const input = typeof chunk === \"string\" ? { ssml: chunk } : chunk;\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"synthesizing\",\n durationMs: 0,\n });\n const startedAt = Date.now();\n try {\n const result = await synthesizeChunkWithTimeout(\n input.ssml,\n {\n ...config,\n signal: scope.signal,\n ...(input.originalTextRange ? { sourceTextRange: input.originalTextRange } : {}),\n ...((input.sourceNodePath ?? config.sourceNodePath)\n ? { sourceNodePath: [...(input.sourceNodePath ?? config.sourceNodePath ?? [])] }\n : {}),\n ...(input.sourceTextSegments ? { sourceTextSegments: input.sourceTextSegments } : {}),\n ...(input.sourceMarkers ? { sourceMarkers: input.sourceMarkers } : {}),\n chunkIndex: index,\n onProgress: undefined,\n },\n config.retryOptions,\n config.timeouts?.chunkWithRetriesMs ?? config.timeouts?.perChunkMs ?? config.timeoutMs,\n (retryAttempt, nextRetryDelayMs) =>\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"synthesizing\",\n durationMs: Date.now() - startedAt,\n retryAttempt,\n nextRetryDelayMs,\n isRetrying: true,\n }),\n );\n results[index] = result;\n completed += 1;\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"success\",\n durationMs: Date.now() - startedAt,\n });\n } catch (error) {\n failedIndices.add(index);\n report({\n currentChunk: completed,\n totalChunks,\n percent: totalChunks === 0 ? 100 : Math.round((completed / totalChunks) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"failed\",\n durationMs: Date.now() - startedAt,\n error,\n });\n firstError ??= scope.timedOut()\n ? new SynthesisTimeoutError(`Speech synthesis timed out after ${config.timeouts?.totalJobMs} ms.`)\n : error;\n if (config.cancelOnFailure !== false) scope.abort();\n return;\n }\n }\n };\n try {\n await Promise.all(Array.from({ length: Math.min(concurrency, chunks.length) }, () => worker()));\n if (firstError) throw firstError;\n const orderedResults = results.filter((result): result is SsmlSynthesisResult => result !== undefined);\n return await mergeSynthesisResults(orderedResults, {\n format: (config.outputFormat ?? DEFAULT_OUTPUT_FORMAT) as AzureTtsOutputFormat,\n signal: scope.signal,\n customMerger: config.customMerger,\n outputMimeType: config.outputMimeType,\n postMergeValidator: config.postMergeValidator,\n });\n } catch (error) {\n const partial = {\n synthesizedChunks: results.flatMap((result, chunkIndex) => (result ? [{ ...result, chunkIndex }] : [])),\n completedChunks: results.flatMap((result, chunkIndex) => (result ? [{ ...result, chunkIndex }] : [])),\n pendingChunkIndices: chunks.flatMap((_chunk, chunkIndex) => (results[chunkIndex] ? [] : [chunkIndex])),\n failedChunkIndices: [...failedIndices],\n totalChunks,\n };\n if (error && typeof error === \"object\") (error as { partialResult?: unknown }).partialResult = partial;\n throw error;\n } finally {\n scope.dispose();\n }\n}\n\n/** Concatenates audio buffers and shifts all synchronization events by prior chunk durations. */\nfunction createMergedResult(\n results: readonly SsmlSynthesisResult[],\n audioData: ArrayBuffer,\n format: string,\n audioSpec?: AudioSpecification,\n outputMimeType?: string,\n): MergedSynthesisResult {\n const boundaries: NonNullable<SsmlSynthesisResult[\"boundaries\"]> = [];\n const visemes: NonNullable<SsmlSynthesisResult[\"visemes\"]> = [];\n const bookmarks: NonNullable<SsmlSynthesisResult[\"bookmarks\"]> = [];\n let durationOffset = 0;\n\n for (const [resultIndex, result] of results.entries()) {\n const chunkBoundaries =\n result.boundaries && result.boundaries.length > 0\n ? result.boundaries\n : (result.wordBoundary ?? result.wordBoundaries ?? []);\n for (const boundary of chunkBoundaries) {\n const textRange = boundary.textRange ?? result.textRange;\n const originalTextRange = boundary.originalTextRange ?? textRange;\n const requestId = boundary.requestId ?? result.requestId;\n boundaries.push({\n ...boundary,\n audioOffsetMs: boundary.audioOffsetMs + durationOffset,\n chunkAudioOffsetMs: boundary.chunkAudioOffsetMs ?? boundary.audioOffsetMs,\n ...(boundary.chunkIndex === undefined ? { chunkIndex: resultIndex } : {}),\n ...(boundary.sourceNodePath ? { sourceNodePath: [...boundary.sourceNodePath] } : {}),\n ...(originalTextRange ? { originalTextRange: { ...originalTextRange } } : {}),\n ...(textRange ? { textRange: { ...textRange } } : {}),\n ...(requestId ? { requestId } : {}),\n mappingStatus: boundary.mappingStatus ?? \"unmapped\",\n });\n }\n for (const viseme of result.visemes ?? []) {\n const textRange = viseme.textRange ?? result.textRange;\n const originalTextRange = viseme.originalTextRange ?? textRange;\n const requestId = viseme.requestId ?? result.requestId;\n visemes.push({\n ...viseme,\n audioOffsetMs: viseme.audioOffsetMs + durationOffset,\n chunkAudioOffsetMs: viseme.chunkAudioOffsetMs ?? viseme.audioOffsetMs,\n ...(viseme.chunkIndex === undefined ? { chunkIndex: resultIndex } : {}),\n ...(viseme.sourceNodePath ? { sourceNodePath: [...viseme.sourceNodePath] } : {}),\n ...(originalTextRange ? { originalTextRange: { ...originalTextRange } } : {}),\n ...(textRange ? { textRange: { ...textRange } } : {}),\n ...(requestId ? { requestId } : {}),\n mappingStatus: viseme.mappingStatus ?? \"unmapped\",\n });\n }\n for (const bookmark of result.bookmarks ?? []) {\n const textRange = bookmark.textRange ?? result.textRange;\n const originalTextRange = bookmark.originalTextRange ?? textRange;\n const requestId = bookmark.requestId ?? result.requestId;\n bookmarks.push({\n ...bookmark,\n audioOffsetMs: bookmark.audioOffsetMs + durationOffset,\n chunkAudioOffsetMs: bookmark.chunkAudioOffsetMs ?? bookmark.audioOffsetMs,\n ...(bookmark.chunkIndex === undefined ? { chunkIndex: resultIndex } : {}),\n ...(bookmark.sourceNodePath ? { sourceNodePath: [...bookmark.sourceNodePath] } : {}),\n ...(originalTextRange ? { originalTextRange: { ...originalTextRange } } : {}),\n ...(textRange ? { textRange: { ...textRange } } : {}),\n ...(requestId ? { requestId } : {}),\n mappingStatus: bookmark.mappingStatus ?? \"unmapped\",\n });\n }\n durationOffset += Math.max(0, result.durationMs);\n }\n\n return {\n audioData,\n durationMs: durationOffset,\n mimeType: resolveMimeType(format),\n audioSpec: audioSpec ?? formatAudioSpecification(format),\n ...(outputMimeType ? { mimeType: outputMimeType } : {}),\n ...(boundaries.length > 0 ? { boundaries, wordBoundary: boundaries, wordBoundaries: boundaries } : {}),\n ...(visemes.length > 0 ? { visemes } : {}),\n ...(bookmarks.length > 0 ? { bookmarks } : {}),\n ...(results.length === 1 && results[0]?.requestId ? { requestId: results[0].requestId } : {}),\n ...(results.length === 1 && results[0]?.textRange ? { textRange: { ...results[0].textRange } } : {}),\n };\n}\n\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: AsyncMergeSynthesisOptions,\n): Promise<MergedSynthesisResult>;\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: MergeSynthesisOptions,\n): MergedSynthesisResult | Promise<MergedSynthesisResult>;\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: MergeAudioOptions,\n): MergedSynthesisResult;\nexport function mergeSynthesisResults(\n results: readonly SsmlSynthesisResult[],\n options: MergeSynthesisOptions | string,\n): SsmlSynthesisResult | Promise<SsmlSynthesisResult> {\n const resolvedOptions: MergeSynthesisOptions =\n typeof options === \"string\" ? { format: options as AzureTtsOutputFormat } : options;\n const format = resolvedOptions?.format;\n if (!format) throw new UnsupportedMergeFormatError(\"\");\n const buffers = results.map((result) => result.audioData);\n const inputSpecs = results.map((result) => result.audioSpec ?? inspectAudioSpecification(result.audioData, format));\n validateAudioSpecifications(inputSpecs);\n const signal = resolvedOptions.signal ?? new AbortController().signal;\n if (signal.aborted) throw new SynthesisCancelledError();\n if (resolvedOptions.customMerger) {\n return Promise.resolve()\n .then(() =>\n resolvedOptions.customMerger?.(buffers, {\n format,\n outputMimeType: resolvedOptions.outputMimeType ?? resolveMimeType(format),\n inputSpecs,\n signal,\n }),\n )\n .then((merged) => {\n if (!merged) throw new MergeError(\"The custom audio merger returned no audio buffer.\");\n if (\n !(merged instanceof ArrayBuffer) ||\n (buffers.some((buffer) => buffer.byteLength > 0) && merged.byteLength === 0)\n )\n throw new MergeError(\"The custom audio merger returned an invalid audio buffer.\");\n if (signal.aborted) throw new SynthesisCancelledError();\n const result = createMergedResult(\n results,\n merged,\n format,\n inspectAudioSpecification(merged, format),\n resolvedOptions.outputMimeType,\n );\n return Promise.resolve(\n resolvedOptions.postMergeValidator?.(result, {\n format,\n outputMimeType: resolvedOptions.outputMimeType ?? resolveMimeType(format),\n inputSpecs,\n signal,\n }),\n ).then((valid) => {\n if (valid === false) throw new MergeError(\"The post-merge validator rejected the merged audio.\");\n return result;\n });\n })\n .catch((error: unknown) => {\n if (error instanceof UnsupportedMergeFormatError || isAudioFormatMismatch(error) || error instanceof MergeError)\n throw error;\n throw new MergeError(`Custom audio merger failed for format \"${format}\".`, error);\n });\n }\n try {\n const result = createMergedResult(\n results,\n mergeAudioBuffers(buffers, { format }),\n format,\n inputSpecs[0],\n resolvedOptions.outputMimeType,\n );\n if (resolvedOptions.postMergeValidator) {\n const validation = resolvedOptions.postMergeValidator(result, {\n format,\n outputMimeType: resolvedOptions.outputMimeType ?? resolveMimeType(format),\n inputSpecs,\n signal,\n });\n if (validation instanceof Promise)\n return validation.then((valid) => {\n if (valid === false) throw new MergeError(\"The post-merge validator rejected the merged audio.\");\n return result;\n });\n if (validation === false) throw new MergeError(\"The post-merge validator rejected the merged audio.\");\n }\n return result;\n } catch (error) {\n if (error instanceof UnsupportedMergeFormatError || isAudioFormatMismatch(error) || error instanceof MergeError)\n throw error;\n throw new MergeError(`Audio buffers could not be merged for format \"${format}\".`, error);\n }\n}\n\n/** Backward-compatible audio-only synthesis helper. */\nexport async function synthesizeSpeech(ssml: string, config: TtsConfig): Promise<ArrayBuffer> {\n return (await synthesizeSsml(ssml, config)).audioData;\n}\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\n\nexport const DEFAULT_OUTPUT_FORMAT = \"audio-16khz-128kbitrate-mono-mp3\";\n\nconst OUTPUT_FORMATS = {\n \"raw-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoMULaw,\n \"riff-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16KbpsMonoSiren,\n \"audio-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16KbpsMonoSiren,\n \"audio-16khz-32kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz32KBitRateMonoMp3,\n \"audio-16khz-128kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz128KBitRateMonoMp3,\n \"audio-16khz-64kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz64KBitRateMonoMp3,\n \"audio-24khz-48kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz48KBitRateMonoMp3,\n \"audio-24khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz96KBitRateMonoMp3,\n \"audio-24khz-160kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz160KBitRateMonoMp3,\n \"raw-16khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoTrueSilk,\n \"riff-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16BitMonoPcm,\n \"riff-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz16BitMonoPcm,\n \"riff-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm,\n \"riff-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoMULaw,\n \"raw-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoPcm,\n \"raw-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoPcm,\n \"raw-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz16BitMonoPcm,\n \"ogg-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg16Khz16BitMonoOpus,\n \"ogg-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus,\n \"raw-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw48Khz16BitMonoPcm,\n \"riff-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff48Khz16BitMonoPcm,\n \"audio-48khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz96KBitRateMonoMp3,\n \"audio-48khz-192kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz192KBitRateMonoMp3,\n \"ogg-48khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg48Khz16BitMonoOpus,\n \"webm-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm16Khz16BitMonoOpus,\n \"webm-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16BitMonoOpus,\n \"webm-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16Bit24KbpsMonoOpus,\n \"raw-24khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoTrueSilk,\n \"raw-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoALaw,\n \"riff-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoALaw,\n \"audio-16khz-16bit-32kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16Bit32KbpsMonoOpus,\n \"audio-24khz-16bit-48kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit48KbpsMonoOpus,\n \"audio-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit24KbpsMonoOpus,\n \"raw-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw22050Hz16BitMonoPcm,\n \"riff-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff22050Hz16BitMonoPcm,\n \"raw-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw44100Hz16BitMonoPcm,\n \"riff-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff44100Hz16BitMonoPcm,\n \"amr-wb-16000hz\": SpeechSDK.SpeechSynthesisOutputFormat.AmrWb16000Hz,\n \"g722-16khz-64kbps\": SpeechSDK.SpeechSynthesisOutputFormat.G72216Khz64Kbps,\n} satisfies Record<string, SpeechSDK.SpeechSynthesisOutputFormat>;\n\nexport type AzureTtsOutputFormat = keyof typeof OUTPUT_FORMATS;\n\nexport function resolveMimeType(outputFormat: string): string {\n if (/(?:wav|wave|riff)/i.test(outputFormat)) return \"audio/wav\";\n if (/(?:mp3|mpeg)/i.test(outputFormat)) return \"audio/mpeg\";\n if (/ogg/i.test(outputFormat)) return \"audio/ogg\";\n if (/webm/i.test(outputFormat)) return \"audio/webm\";\n if (/raw/i.test(outputFormat)) return \"audio/L16\";\n return \"application/octet-stream\";\n}\n\nexport function resolveOutputFormat(outputFormat: string): SpeechSDK.SpeechSynthesisOutputFormat {\n const resolvedFormat = (OUTPUT_FORMATS as Record<string, SpeechSDK.SpeechSynthesisOutputFormat>)[outputFormat];\n if (resolvedFormat === undefined) {\n throw new Error(`Unsupported Azure Speech output format: ${outputFormat}`);\n }\n\n return resolvedFormat;\n}\n","import { SpeechConfig } from \"microsoft-cognitiveservices-speech-sdk\";\nimport { DEFAULT_OUTPUT_FORMAT, resolveOutputFormat } from \"./outputFormats.ts\";\nimport type { TtsConfig } from \"./types.ts\";\n\nexport function resolveEndpoint(config: TtsConfig): string {\n const endpoint = config.endpoint?.trim() || \"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1\";\n return endpoint.replace(/\\{region\\}/g, encodeURIComponent(config.region));\n}\n\nexport function createSpeechConfig(config: TtsConfig): SpeechConfig {\n const { outputFormat = DEFAULT_OUTPUT_FORMAT, subscriptionKey } = config;\n\n const endpoint = new URL(resolveEndpoint(config));\n const speechConfig = SpeechConfig.fromEndpoint(endpoint, subscriptionKey);\n speechConfig.speechSynthesisOutputFormat = resolveOutputFormat(outputFormat);\n return speechConfig;\n}\n","import {\n createAzureUrlValidatorRunner,\n validateAzureSsml,\n type AzureUrlValidator,\n type AzureValidationOptions,\n type SsmlDiagnostic,\n} from \"@ssml-builder-js/ssml-core\";\nimport {\n type AzureTtsError,\n type AzureTtsSynthesisError,\n type SynthesisErrorKind,\n toSynthesisError,\n getRetryAfterDelayMs,\n} from \"./errors.ts\";\nimport type { AzureTtsClient } from \"./client.ts\";\nimport { mergeSynthesisResults } from \"./synthesis.ts\";\nimport type {\n SsmlSynthesisChunk,\n SsmlSynthesisResult,\n SynthesisProgressEvent,\n SynthesizeChunksOptions,\n RetryOptions,\n SynthesisTimeouts,\n SynthesizedChunk,\n PartialChunkSynthesisResult,\n CustomAudioMerger,\n PostMergeValidator,\n} from \"./types.ts\";\nimport type { AzureTtsOutputFormat } from \"./outputFormats.ts\";\n\nexport interface SsmlValidationError {\n readonly kind: \"validation-error\";\n readonly message: string;\n readonly diagnostics: readonly SsmlDiagnostic[];\n}\n\nexport type SsmlSynthesisError = SsmlValidationError | AzureTtsSynthesisError;\n\nexport class ChunkValidationError extends Error {\n readonly kind = \"validation-error\" as const;\n readonly chunkIndex: number;\n readonly diagnostics: readonly SsmlDiagnostic[];\n\n constructor(chunkIndex: number, diagnostics: readonly SsmlDiagnostic[]) {\n super(`SSML validation failed for chunk ${chunkIndex}; the Azure Speech API was not called.`);\n this.name = \"ChunkValidationError\";\n this.chunkIndex = chunkIndex;\n this.diagnostics = diagnostics;\n }\n}\n\nexport interface ChunkDiagnostics {\n readonly chunkIndex: number;\n readonly diagnostics: readonly SsmlDiagnostic[];\n}\n\nexport class BatchChunkValidationError extends ChunkValidationError {\n readonly chunkDiagnostics: readonly ChunkDiagnostics[];\n readonly totalErrorCount: number;\n readonly errorCount: number;\n readonly totalErrors: number;\n\n constructor(chunkDiagnostics: readonly ChunkDiagnostics[]) {\n const first = chunkDiagnostics[0];\n super(first?.chunkIndex ?? -1, first?.diagnostics ?? []);\n this.name = \"BatchChunkValidationError\";\n this.message = `SSML validation failed for ${chunkDiagnostics.length} chunk(s); the Azure Speech API was not called.`;\n this.chunkDiagnostics = chunkDiagnostics;\n this.totalErrorCount = chunkDiagnostics.reduce((total, chunk) => total + chunk.diagnostics.length, 0);\n this.errorCount = this.totalErrorCount;\n this.totalErrors = this.totalErrorCount;\n }\n}\n\nexport type Result<T, E> =\n | { readonly ok: true; readonly success: true; readonly status: \"success\"; readonly value: T }\n | (E extends { readonly kind: infer Kind extends SynthesisErrorKind }\n ? {\n readonly ok: false;\n readonly success: false;\n readonly status: Kind;\n readonly error: E;\n readonly partialResult?: PartialChunkSynthesisResult;\n }\n : {\n readonly ok: false;\n readonly success: false;\n readonly status: SynthesisErrorKind;\n readonly error: E;\n readonly partialResult?: PartialChunkSynthesisResult;\n });\n\nexport type SynthesisResult<T, E> = Result<T, E>;\n\nfunction failure<E extends { readonly kind: SynthesisErrorKind }>(\n error: E,\n partialResult?: PartialChunkSynthesisResult,\n): Result<never, E> {\n return {\n ok: false,\n success: false,\n status: error.kind,\n error,\n ...(partialResult ? { partialResult } : {}),\n } as Result<never, E>;\n}\n\nexport type Success<T> = Extract<Result<T, never>, { readonly ok: true }>;\nexport type ValidationErrorResult = Extract<\n Result<never, SsmlValidationError>,\n { readonly status: \"validation-error\" }\n>;\nexport type AzureApiErrorResult = Extract<Result<never, AzureTtsError>, { readonly status: \"azure-api-error\" }>;\n\nexport type SsmlSynthesisSafeResult =\n | Result<SsmlSynthesisResult, never>\n | Result<never, SsmlValidationError>\n | Result<never, SsmlSynthesisError>;\n\nexport interface SynthesizeSsmlSafeOptions extends AzureValidationOptions {\n /** Optional nested form for callers that want to keep validation settings grouped. */\n validation?: AzureValidationOptions;\n signal?: AbortSignal;\n timeouts?: SynthesisTimeouts;\n}\n\nexport interface SynthesizeSsmlChunksSafeOptions extends AzureValidationOptions {\n validation?: AzureValidationOptions;\n outputFormat?: string;\n signal?: AbortSignal;\n timeoutMs?: number;\n timeouts?: SynthesisTimeouts;\n sourceNodePath?: string[];\n onProgress?: (event: SynthesisProgressEvent) => void;\n concurrency?: number;\n retryOptions?: RetryOptions;\n cancelOnFailure?: boolean;\n resumeChunks?: readonly SynthesizedChunk[];\n resumeChunkIndices?: readonly number[];\n customMerger?: CustomAudioMerger;\n outputMimeType?: string;\n postMergeValidator?: PostMergeValidator;\n}\n\nexport type SsmlSynthesisChunksSafeResult =\n | Result<SsmlSynthesisResult, never>\n | Result<never, ChunkValidationError>\n | Result<never, BatchChunkValidationError>\n | Result<never, SsmlSynthesisError | ChunkValidationError>;\n\ninterface SynthesisClient {\n synthesizeSsml(ssml: string, options?: Partial<SynthesizeChunksOptions>): Promise<SsmlSynthesisResult>;\n synthesizeChunks?(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options?: SynthesizeChunksOptions,\n ): Promise<SsmlSynthesisResult>;\n}\n\nfunction partialResultFrom(error: unknown): PartialChunkSynthesisResult | undefined {\n if (!error || typeof error !== \"object\") return undefined;\n const partial = (error as { partialResult?: unknown }).partialResult;\n if (!partial || typeof partial !== \"object\") return undefined;\n return partial as PartialChunkSynthesisResult;\n}\n\ninterface SafeAbortScope {\n signal: AbortSignal;\n timedOut: () => boolean;\n dispose: () => void;\n abort: () => void;\n}\n\nfunction createSafeAbortScope(parent: AbortSignal | undefined, timeoutMs: number | undefined): SafeAbortScope {\n const controller = new AbortController();\n let didTimeout = false;\n const onAbort = () => controller.abort();\n if (parent?.aborted) controller.abort();\n parent?.addEventListener(\"abort\", onAbort, { once: true });\n const timer =\n timeoutMs !== undefined && timeoutMs > 0\n ? setTimeout(() => {\n didTimeout = true;\n controller.abort();\n }, timeoutMs)\n : undefined;\n return {\n signal: controller.signal,\n timedOut: () => didTimeout,\n dispose: () => {\n if (timer) clearTimeout(timer);\n parent?.removeEventListener(\"abort\", onAbort);\n },\n abort: () => controller.abort(),\n };\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (error instanceof Error && /cancel|abort|tim(?:e|ed) ?out/i.test(error.message)) return false;\n const status =\n error && typeof error === \"object\" && \"status\" in error ? (error as { status?: unknown }).status : undefined;\n if (typeof status === \"number\" && status !== 0) return status === 429 || (status >= 500 && status < 600);\n const message = error instanceof Error ? error.message : String(error);\n if (/\\b4\\d{2}\\b/.test(message)) return false;\n return /network|connection|connect|socket|fetch failed|econn|etimedout|temporar|transient|unavailable/i.test(message);\n}\n\nfunction delayForRetry(options: RetryOptions, attempt: number): number {\n const maxDelay = Math.max(0, options.maxDelayMs);\n const base = Math.min(maxDelay, Math.max(0, options.initialDelayMs) * 2 ** Math.max(0, attempt - 1));\n return Math.floor(Math.random() * (base + 1));\n}\n\nfunction retryDelayForError(options: RetryOptions, attempt: number, error: unknown): number {\n return getRetryAfterDelayMs(error) ?? delayForRetry(options, attempt);\n}\n\nfunction resolveConcurrency(value: number | undefined, total: number): number {\n if (value === undefined) return 1;\n if (value === Infinity) return Math.max(1, total);\n return Number.isFinite(value) ? Math.max(1, Math.floor(value)) : 1;\n}\n\nasync function retryableSynthesis(\n synthesize: () => Promise<SsmlSynthesisResult>,\n options: RetryOptions | undefined,\n signal: AbortSignal | undefined,\n onRetry: (attempt: number, delayMs: number) => void,\n): Promise<SsmlSynthesisResult> {\n const retry = options\n ? {\n maxRetries: Math.max(0, Math.floor(options.maxRetries)),\n initialDelayMs: options.initialDelayMs,\n maxDelayMs: options.maxDelayMs,\n shouldRetry: options.shouldRetry,\n }\n : undefined;\n let attempt = 0;\n while (true) {\n if (signal?.aborted) throw new Error(\"Speech synthesis was cancelled.\");\n try {\n return await synthesize();\n } catch (error) {\n if (!retry || attempt >= retry.maxRetries || !(retry.shouldRetry?.(error, attempt + 1) ?? isRetryable(error)))\n throw error;\n attempt += 1;\n const delayMs = retryDelayForError(retry, attempt, error);\n onRetry(attempt, delayMs);\n if (delayMs > 0)\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, delayMs);\n const abort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n reject(new Error(\"Speech synthesis was cancelled.\"));\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n }\n }\n}\n\nfunction sharedValidationOptions(\n options: AzureValidationOptions & { timeouts?: SynthesisTimeouts },\n signal?: AbortSignal,\n): AzureValidationOptions {\n const validator = options.urlValidator ?? options.customUrlValidator;\n if (!validator) return signal ? withValidationSignal(options, signal) : options;\n const runner = createAzureUrlValidatorRunner(validator as AzureUrlValidator, {\n ...(options.urlValidation ?? {}),\n ...(options.urlValidatorConcurrency !== undefined ? { concurrency: options.urlValidatorConcurrency } : {}),\n ...(options.timeouts?.urlValidationMs !== undefined\n ? { timeoutMs: options.timeouts.urlValidationMs }\n : options.urlValidatorTimeoutMs !== undefined\n ? { timeoutMs: options.urlValidatorTimeoutMs }\n : {}),\n ...(signal ? { signal } : {}),\n ...(options.urlValidatorCache ? { cache: options.urlValidatorCache } : {}),\n });\n return {\n ...withValidationSignal(options, signal),\n urlValidatorRunner: runner,\n };\n}\n\n/** Validates SSML before invoking Azure and converts validation/API failures to one result shape. */\nexport async function synthesizeSsmlSafe(\n client: Pick<AzureTtsClient, \"synthesizeSsml\"> | SynthesisClient,\n ssml: string,\n options: SynthesizeSsmlSafeOptions = {},\n): Promise<SsmlSynthesisSafeResult> {\n const validationOptions = sharedValidationOptions(options.validation ?? options, options.signal);\n const diagnostics = await Promise.resolve(validateAzureSsml(ssml, validationOptions));\n if (options.signal?.aborted) {\n const error = toSynthesisError(new Error(\"Speech synthesis was cancelled.\"));\n return failure(error);\n }\n const errors = diagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n if (errors.length > 0) {\n return failure({\n kind: \"validation-error\",\n message: \"SSML validation failed; the Azure Speech API was not called.\",\n diagnostics: errors,\n });\n }\n\n try {\n return {\n ok: true,\n success: true,\n status: \"success\",\n value: await client.synthesizeSsml(ssml, {\n signal: options.signal,\n timeoutMs: options.timeouts?.perChunkMs,\n timeouts: options.timeouts,\n }),\n };\n } catch (error) {\n const synthesisError = toSynthesisError(error);\n return failure(synthesisError);\n }\n}\n\n/** Validates every chunk before synthesis and returns a chunk-addressable result. */\nexport async function synthesizeSsmlChunksSafe(\n client: Pick<AzureTtsClient, \"synthesizeSsml\" | \"synthesizeChunks\"> | SynthesisClient,\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeSsmlChunksSafeOptions = {},\n): Promise<SsmlSynthesisChunksSafeResult> {\n const validationOptions = sharedValidationOptions(\n { ...(options.validation ?? options), timeouts: options.timeouts },\n options.signal,\n );\n if (options.signal?.aborted) {\n const error = toSynthesisError(new Error(\"Speech synthesis was cancelled.\"));\n return failure(error);\n }\n const pending = (index: number, status: SynthesisProgressEvent[\"status\"], error?: unknown): void => {\n options.onProgress?.({\n currentChunk: status === \"success\" ? index + 1 : index,\n totalChunks: chunks.length,\n percent:\n chunks.length === 0 ? 100 : Math.round(((status === \"success\" ? index + 1 : index) / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: typeof chunks[index] === \"string\" ? undefined : chunks[index]?.originalTextRange,\n status,\n durationMs: 0,\n ...(error ? { error } : {}),\n });\n };\n chunks.forEach((_chunk, index) => {\n pending(index, \"pending\");\n });\n const validations = await Promise.all(\n chunks.map(async (chunk, index) => {\n const ssml = typeof chunk === \"string\" ? chunk : chunk.ssml;\n const sourceNodePath =\n typeof chunk === \"string\" ? options.sourceNodePath : (chunk.sourceNodePath ?? options.sourceNodePath);\n const diagnostics = await Promise.resolve(\n validateAzureSsml(ssml, {\n ...validationOptions,\n ...(sourceNodePath ? { sourceNodePath } : {}),\n chunkIndex: index,\n }),\n );\n return diagnostics.filter((diagnostic) => diagnostic.severity === \"error\");\n }),\n );\n if (options.signal?.aborted) {\n const error = toSynthesisError(new Error(\"Speech synthesis was cancelled.\"));\n return failure(error);\n }\n const chunkDiagnostics = validations\n .map((diagnostics, chunkIndex) => ({ chunkIndex, diagnostics }))\n .filter((entry) => entry.diagnostics.length > 0);\n if (chunkDiagnostics.length > 0) {\n const error = new BatchChunkValidationError(chunkDiagnostics);\n for (const entry of chunkDiagnostics) pending(entry.chunkIndex, \"failed\", error);\n return failure(error);\n }\n\n let fallbackJobScope: SafeAbortScope | undefined;\n try {\n if (client.synthesizeChunks) {\n const normalizedChunks = chunks.map((chunk) => {\n if (typeof chunk === \"string\" || chunk.sourceNodePath || !options.sourceNodePath) return chunk;\n return { ...chunk, sourceNodePath: [...options.sourceNodePath] };\n });\n const value = await client.synthesizeChunks(normalizedChunks, {\n onProgress: options.onProgress,\n outputFormat: options.outputFormat,\n signal: options.signal,\n timeoutMs: options.timeoutMs,\n timeouts: options.timeouts,\n sourceNodePath: options.sourceNodePath,\n concurrency: options.concurrency,\n retryOptions: options.retryOptions,\n cancelOnFailure: options.cancelOnFailure,\n resumeChunks: options.resumeChunks,\n resumeChunkIndices: options.resumeChunkIndices,\n customMerger: options.customMerger,\n outputMimeType: options.outputMimeType,\n postMergeValidator: options.postMergeValidator,\n });\n return { ok: true, success: true, status: \"success\", value };\n }\n const results: Array<SsmlSynthesisResult | undefined> = new Array(chunks.length);\n const cachedChunks = new Map((options.resumeChunks ?? []).map((chunk) => [chunk.chunkIndex, chunk]));\n for (const [index, cached] of cachedChunks) {\n if (index >= 0 && index < chunks.length) results[index] = cached;\n }\n const requestedIndices = options.resumeChunkIndices\n ? new Set(options.resumeChunkIndices.filter((index) => index >= 0 && index < chunks.length))\n : undefined;\n const shouldSynthesize = (index: number): boolean =>\n !cachedChunks.has(index) && (requestedIndices === undefined || requestedIndices.has(index));\n const jobScope =\n chunks.length > 1 || options.timeouts?.totalJobMs !== undefined\n ? createSafeAbortScope(options.signal, options.timeouts?.totalJobMs)\n : undefined;\n fallbackJobScope = jobScope;\n const failedIndices = new Set<number>();\n let firstError: unknown;\n let completed = [...results].filter((result) => result !== undefined).length;\n let nextIndex = 0;\n const concurrency = resolveConcurrency(options.concurrency, chunks.length);\n const worker = async (): Promise<void> => {\n while (true) {\n const index = nextIndex++;\n if (index >= chunks.length) return;\n if (!shouldSynthesize(index)) continue;\n if (failedIndices.size > 0 && options.cancelOnFailure !== false) return;\n const chunk = chunks[index];\n const input = typeof chunk === \"string\" ? { ssml: chunk } : chunk;\n const sourceNodePath = input.sourceNodePath;\n const originalTextRange = input.originalTextRange;\n pending(index, \"synthesizing\");\n const startedAt = Date.now();\n try {\n const chunkTimeout = options.timeouts?.chunkWithRetriesMs ?? options.timeouts?.perChunkMs;\n const chunkScope =\n chunkTimeout !== undefined || jobScope\n ? createSafeAbortScope(jobScope?.signal ?? options.signal, chunkTimeout ?? options.timeoutMs)\n : undefined;\n const chunkSignal = chunkScope?.signal ?? options.signal;\n let result: SsmlSynthesisResult;\n try {\n result = await retryableSynthesis(\n () =>\n client.synthesizeSsml(input.ssml, {\n outputFormat: options.outputFormat,\n signal: chunkSignal,\n timeoutMs: options.timeouts?.perChunkMs ?? options.timeoutMs,\n sourceNodePath: input.sourceNodePath ?? options.sourceNodePath,\n }),\n options.retryOptions,\n chunkSignal,\n (retryAttempt, nextRetryDelayMs) =>\n options.onProgress?.({\n currentChunk: completed,\n totalChunks: chunks.length,\n percent: chunks.length === 0 ? 100 : Math.round((completed / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"synthesizing\",\n durationMs: Date.now() - startedAt,\n retryAttempt,\n nextRetryDelayMs,\n isRetrying: true,\n }),\n );\n } catch (error) {\n if (chunkScope?.timedOut())\n throw new Error(`Speech synthesis timed out after ${chunkTimeout ?? options.timeoutMs} ms.`);\n throw error;\n } finally {\n chunkScope?.dispose();\n }\n results[index] = {\n ...result,\n ...(input.originalTextRange ? { textRange: { ...input.originalTextRange } } : {}),\n ...(sourceNodePath\n ? {\n boundaries: result.boundaries?.map((event) => ({\n ...event,\n sourceNodePath: [...sourceNodePath],\n ...(event.originalTextRange\n ? { originalTextRange: { ...event.originalTextRange } }\n : input.originalTextRange\n ? { originalTextRange: { ...input.originalTextRange } }\n : {}),\n })),\n visemes: result.visemes?.map((event) => ({\n ...event,\n sourceNodePath: [...sourceNodePath],\n ...(event.originalTextRange\n ? { originalTextRange: { ...event.originalTextRange } }\n : input.originalTextRange\n ? { originalTextRange: { ...input.originalTextRange } }\n : {}),\n })),\n bookmarks: result.bookmarks?.map((event) => ({\n ...event,\n sourceNodePath: [...sourceNodePath],\n ...(event.originalTextRange\n ? { originalTextRange: { ...event.originalTextRange } }\n : input.originalTextRange\n ? { originalTextRange: { ...input.originalTextRange } }\n : {}),\n })),\n }\n : {}),\n ...(originalTextRange\n ? {\n boundaries: result.boundaries?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n wordBoundary: result.wordBoundary?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n wordBoundaries: result.wordBoundaries?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n visemes: result.visemes?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n bookmarks: result.bookmarks?.map((event) => ({\n ...event,\n originalTextRange: event.originalTextRange\n ? { ...event.originalTextRange }\n : { ...originalTextRange },\n })),\n }\n : {}),\n };\n completed += 1;\n options.onProgress?.({\n currentChunk: completed,\n totalChunks: chunks.length,\n percent: chunks.length === 0 ? 100 : Math.round((completed / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"success\",\n durationMs: Date.now() - startedAt,\n });\n } catch (error) {\n failedIndices.add(index);\n options.onProgress?.({\n currentChunk: completed,\n totalChunks: chunks.length,\n percent: chunks.length === 0 ? 100 : Math.round((index / chunks.length) * 100),\n chunkIndex: index,\n originalTextRange: input.originalTextRange,\n status: \"failed\",\n durationMs: Date.now() - startedAt,\n error,\n });\n if (options.cancelOnFailure !== false) jobScope?.abort();\n firstError ??= error;\n return;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(concurrency, chunks.length) }, () => worker()));\n if (failedIndices.size > 0) {\n const error = firstError ?? new Error(\"One or more SSML chunks failed to synthesize.\");\n (error as { partialResult?: PartialChunkSynthesisResult }).partialResult = {\n synthesizedChunks: results.flatMap((result, chunkIndex) => (result ? [{ ...result, chunkIndex }] : [])),\n completedChunks: results.flatMap((result, chunkIndex) => (result ? [{ ...result, chunkIndex }] : [])),\n pendingChunkIndices: chunks.flatMap((_chunk, chunkIndex) => (results[chunkIndex] ? [] : [chunkIndex])),\n failedChunkIndices: [...failedIndices],\n totalChunks: chunks.length,\n };\n throw error;\n }\n const orderedResults = results.filter((result): result is SsmlSynthesisResult => result !== undefined);\n return {\n ok: true,\n success: true,\n status: \"success\",\n value: await mergeSynthesisResults(orderedResults, {\n format: (options.outputFormat ?? \"audio-16khz-128kbitrate-mono-mp3\") as AzureTtsOutputFormat,\n signal: jobScope?.signal ?? options.signal,\n customMerger: options.customMerger,\n outputMimeType: options.outputMimeType,\n postMergeValidator: options.postMergeValidator,\n }),\n };\n } catch (error) {\n const synthesisError = toSynthesisError(error);\n return failure(synthesisError, partialResultFrom(error));\n } finally {\n fallbackJobScope?.dispose();\n }\n}\n\nfunction withValidationSignal(options: AzureValidationOptions, signal?: AbortSignal): AzureValidationOptions {\n if (!signal) return options;\n return {\n ...options,\n urlValidatorSignal: signal,\n urlValidation: { ...(options.urlValidation ?? {}), signal },\n };\n}\n","import { synthesizeSpeech, synthesizeSsml, synthesizeSsmlChunks } from \"./synthesis.ts\";\nimport { synthesizeSsmlChunksSafe, synthesizeSsmlSafe } from \"./safe.ts\";\nimport type { SynthesizeSsmlChunksSafeOptions, SynthesizeSsmlSafeOptions } from \"./safe.ts\";\nimport type {\n AzureTtsClientOptions,\n SsmlSynthesisChunk,\n SsmlSynthesisResult,\n SynthesizeChunksOptions,\n TtsConfig,\n} from \"./types.ts\";\n\nconst ENDPOINT_TEMPLATE = \"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1\";\n\nexport class AzureTtsClient {\n readonly #options: AzureTtsClientOptions;\n\n constructor(options: AzureTtsClientOptions) {\n this.#options = options;\n }\n\n async synthesize(ssml: string): Promise<ArrayBuffer> {\n const { region, subscriptionKey, outputFormat, signal, timeoutMs, timeouts } = this.#options;\n const endpoint = this.#options.endpoint?.trim() || ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n this.#options.logger?.debug?.(\"Using Azure TTS endpoint:\", endpoint);\n\n const config = { endpoint, region, subscriptionKey, outputFormat, signal, timeoutMs, timeouts };\n return synthesizeSpeech(ssml, config);\n }\n\n async synthesizeSsml(ssml: string, options: Partial<TtsConfig> = {}): Promise<SsmlSynthesisResult> {\n const { region, subscriptionKey, outputFormat, signal, timeoutMs, timeouts } = this.#options;\n const endpoint = this.#options.endpoint?.trim() || ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n this.#options.logger?.debug?.(\"Using Azure TTS endpoint:\", endpoint);\n\n return synthesizeSsml(ssml, {\n endpoint,\n region,\n subscriptionKey,\n outputFormat: options.outputFormat ?? outputFormat,\n signal: options.signal ?? signal,\n timeoutMs: options.timeoutMs ?? timeoutMs,\n timeouts: options.timeouts ?? timeouts,\n sourceNodePath: options.sourceNodePath,\n sourceTextSegments: options.sourceTextSegments,\n sourceMarkers: options.sourceMarkers,\n });\n }\n\n async synthesizeChunks(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeChunksOptions = {},\n ): Promise<SsmlSynthesisResult> {\n const { region, subscriptionKey, outputFormat, signal, timeoutMs, timeouts } = this.#options;\n const endpoint = this.#options.endpoint?.trim() || ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n return synthesizeSsmlChunks(chunks, {\n endpoint,\n region,\n subscriptionKey,\n outputFormat: options.outputFormat ?? outputFormat,\n signal: options.signal ?? signal,\n timeoutMs: options.timeoutMs ?? timeoutMs,\n timeouts: options.timeouts ?? timeouts,\n sourceNodePath: options.sourceNodePath,\n onProgress: options.onProgress ?? this.#options.onProgress,\n concurrency: options.concurrency ?? this.#options.concurrency,\n retryOptions: options.retryOptions ?? this.#options.retryOptions,\n cancelOnFailure: options.cancelOnFailure,\n resumeChunks: options.resumeChunks,\n resumeChunkIndices: options.resumeChunkIndices,\n customMerger: options.customMerger,\n outputMimeType: options.outputMimeType,\n postMergeValidator: options.postMergeValidator,\n });\n }\n\n async synthesizeSsmlSafe(ssml: string, options: SynthesizeSsmlSafeOptions = {}) {\n return synthesizeSsmlSafe(this, ssml, options);\n }\n\n async synthesizeChunksSafe(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeSsmlChunksSafeOptions = {},\n ) {\n return synthesizeSsmlChunksSafe(this, chunks, {\n ...options,\n outputFormat: options.outputFormat ?? this.#options.outputFormat,\n signal: options.signal ?? this.#options.signal,\n timeoutMs: options.timeoutMs ?? this.#options.timeoutMs,\n timeouts: options.timeouts ?? this.#options.timeouts,\n onProgress: options.onProgress ?? this.#options.onProgress,\n concurrency: options.concurrency ?? this.#options.concurrency,\n retryOptions: options.retryOptions ?? this.#options.retryOptions,\n });\n }\n\n async synthesizeSsmlChunksSafe(\n chunks: readonly (SsmlSynthesisChunk | string)[],\n options: SynthesizeSsmlChunksSafeOptions = {},\n ) {\n return this.synthesizeChunksSafe(chunks, options);\n }\n}\n","const AZURE_VOICE_API_VERSION = \"2025-10-01\";\n\nexport interface FetchAzureVoiceCatalogOptions {\n apiKey: string;\n region: string | string[];\n}\n\nexport interface AzureVoiceCatalogVoice {\n name: string;\n locale: string;\n secondaryLocales?: readonly string[];\n styles?: readonly string[];\n supportedTags?: readonly string[];\n unsupportedTags?: readonly string[];\n models?: readonly string[];\n regions: readonly string[];\n status?: \"ga\" | \"preview\" | \"deprecated\";\n}\n\nexport interface FetchedAzureVoiceCatalogMetadata {\n voiceCount: number;\n generatedAt: string;\n apiVersion: string;\n regions: readonly string[];\n expiresAt?: string;\n regionDiffs?: Readonly<Record<string, readonly string[]>>;\n}\n\nexport interface AzureVoiceCatalog {\n voices: readonly AzureVoiceCatalogVoice[];\n metadata: FetchedAzureVoiceCatalogMetadata;\n}\n\ninterface AzureVoiceApiRecord {\n Locale?: unknown;\n Name?: unknown;\n SecondaryLocaleList?: unknown;\n ShortName?: unknown;\n Status?: unknown;\n StyleList?: unknown;\n SupportedTags?: unknown;\n UnsupportedTags?: unknown;\n Models?: unknown;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return [...new Set(value.map(stringValue).filter((item): item is string => item !== undefined))];\n}\n\nfunction normalizeStatus(value: unknown): AzureVoiceCatalogVoice[\"status\"] {\n const status = stringValue(value)?.toLowerCase();\n if (status === \"preview\" || status === \"deprecated\" || status === \"ga\") return status;\n return undefined;\n}\n\nfunction normalizeRegions(region: string | string[]): string[] {\n const regions = Array.isArray(region) ? region : [region];\n const result = [...new Set(regions.map((item) => item.trim()).filter(Boolean))];\n if (result.length === 0) throw new TypeError(\"At least one Azure Speech region is required.\");\n return result;\n}\n\nasync function fetchRegionVoices(region: string, apiKey: string): Promise<AzureVoiceApiRecord[]> {\n const endpoint = `https://${encodeURIComponent(region)}.tts.speech.microsoft.com/cognitiveservices/voices/list`;\n const response = await fetch(endpoint, {\n headers: {\n Accept: \"application/json\",\n \"Ocp-Apim-Subscription-Key\": apiKey,\n },\n });\n if (!response.ok) {\n throw new Error(`Azure List Voices API request failed for region \"${region}\" with HTTP ${response.status}.`);\n }\n const payload: unknown = await response.json();\n if (!Array.isArray(payload)) throw new Error(`Azure List Voices API returned an invalid response for \"${region}\".`);\n return payload.filter((item): item is AzureVoiceApiRecord => Boolean(item && typeof item === \"object\"));\n}\n\n/** Fetches and deduplicates the current Azure Speech voice catalog for one or more regions. */\nexport async function fetchAzureVoiceCatalog(options: FetchAzureVoiceCatalogOptions): Promise<AzureVoiceCatalog> {\n if (!options || typeof options.apiKey !== \"string\" || !options.apiKey.trim())\n throw new TypeError(\"An Azure Speech API key is required.\");\n const regions = normalizeRegions(options.region);\n const payloads = await Promise.all(regions.map((region) => fetchRegionVoices(region, options.apiKey)));\n const voices = new Map<string, AzureVoiceCatalogVoice>();\n\n for (let regionIndex = 0; regionIndex < payloads.length; regionIndex += 1) {\n const region = regions[regionIndex];\n for (const record of payloads[regionIndex]) {\n const name = stringValue(record.ShortName) ?? stringValue(record.Name);\n const locale = stringValue(record.Locale);\n if (!name || !locale) continue;\n const key = name.toLowerCase();\n const existing = voices.get(key);\n const secondaryLocales = stringList(record.SecondaryLocaleList);\n const styles = stringList(record.StyleList);\n const status = normalizeStatus(record.Status);\n const supportedTags = stringList(record.SupportedTags);\n const unsupportedTags = stringList(record.UnsupportedTags);\n const models = stringList(record.Models);\n const merged: AzureVoiceCatalogVoice = {\n name: existing?.name ?? name,\n locale: existing?.locale ?? locale,\n regions: [...new Set([...(existing?.regions ?? []), region])],\n };\n const mergedSecondaryLocales = [...new Set([...(existing?.secondaryLocales ?? []), ...secondaryLocales])];\n if (mergedSecondaryLocales.length > 0) merged.secondaryLocales = mergedSecondaryLocales;\n const mergedStyles = [...new Set([...(existing?.styles ?? []), ...styles])];\n if (mergedStyles.length > 0) merged.styles = mergedStyles;\n const mergedSupportedTags = [...new Set([...(existing?.supportedTags ?? []), ...supportedTags])];\n if (mergedSupportedTags.length > 0) merged.supportedTags = mergedSupportedTags;\n const mergedUnsupportedTags = [...new Set([...(existing?.unsupportedTags ?? []), ...unsupportedTags])];\n if (mergedUnsupportedTags.length > 0) merged.unsupportedTags = mergedUnsupportedTags;\n const mergedModels = [...new Set([...(existing?.models ?? []), ...models])];\n if (mergedModels.length > 0) merged.models = mergedModels;\n if (status) merged.status = status;\n else if (existing?.status) merged.status = existing.status;\n voices.set(key, merged);\n }\n }\n\n const sortedVoices = [...voices.values()].sort((first, second) => first.name.localeCompare(second.name));\n return {\n voices: sortedVoices,\n metadata: {\n voiceCount: sortedVoices.length,\n generatedAt: new Date().toISOString(),\n apiVersion: AZURE_VOICE_API_VERSION,\n regions,\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n regionDiffs: {},\n },\n };\n}\n"],"mappings":"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","names":["SpeechSDK","data","import_ssml_core","resolveConcurrency"]}