ssml-builder-js 2.10.0 → 2.12.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ssml-core/src/constants/ssml.ts","../packages/ssml-core/src/builder.ts","../packages/ssml-core/src/parser.ts","../packages/ssml-core/src/partial.ts","../packages/ssml-core/src/split.ts","../packages/ssml-core/src/validation.ts","../packages/ssml-core/src/textNodes.ts","../packages/ssml-core/src/migration.ts","../packages/ssml-core/src/generated/azureVoiceDefinitions.ts","../packages/ssml-core/src/azureValidation.ts","../packages/ssml-core/src/generated/azureVoiceCatalog.ts","../packages/ssml-core/src/voiceCatalog.ts"],"sourcesContent":["export const SYNTHESIS_NAMESPACE = \"http://www.w3.org/2001/10/synthesis\" as const;\nexport const MSTTS_NAMESPACE = \"http://www.w3.org/2001/mstts\" as const;\nexport const DEFAULT_SSML_VERSION = \"1.0\" as const;\nexport const DEFAULT_SSML_LANGUAGE = \"en-US\" as const;\nexport const MAX_NESTING_DEPTH = 1000;\nexport const XML_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_.:-]*$/;\nexport const MSTTS_TAG_PREFIX = \"mstts:\" as const;\n\nexport const SSML_TAGS = {\n SPEAK: \"speak\",\n VOICE: \"voice\",\n PROSODY: \"prosody\",\n BREAK: \"break\",\n EXPRESS_AS: \"express-as\",\n EXPRESS_AS_CAMEL: \"expressAs\",\n MSTTS_EXPRESS_AS: \"mstts:express-as\",\n SAY_AS: \"say-as\",\n SAY_AS_CAMEL: \"sayAs\",\n PHONEME: \"phoneme\",\n EMPHASIS: \"emphasis\",\n AUDIO: \"audio\",\n SUB: \"sub\",\n LANG: \"lang\",\n MARK: \"mark\",\n BOOKMARK: \"bookmark\",\n LEXICON: \"lexicon\",\n PARAGRAPH: \"p\",\n SENTENCE: \"s\",\n WORD: \"w\",\n MSTTS_SILENCE: \"mstts:silence\",\n SILENCE: \"silence\",\n MSTTS_VISEME: \"mstts:viseme\",\n VISEME: \"viseme\",\n MSTTS_AUDIO_DURATION: \"mstts:audioduration\",\n MSTTS_DIALOG: \"mstts:dialog\",\n MSTTS_TURN: \"mstts:turn\",\n MSTTS_BACKGROUND_AUDIO: \"mstts:backgroundaudio\",\n MSTTS_TTS_EMBEDDING: \"mstts:ttsembedding\",\n MSTTS_EMBEDDING: \"mstts:embedding\",\n MSTTS_VOICE_CONVERSION: \"mstts:voiceconversion\",\n} as const;\n\nexport const SSML_ATTRS = {\n VERSION: \"version\",\n XMLNS: \"xmlns\",\n XML_LANG: \"xml:lang\",\n LANG: \"lang\",\n MSTTS_XMLNS: \"xmlns:mstts\",\n NAME: \"name\",\n VOICE: \"voice\",\n SPEAKER: \"speaker\",\n EFFECT: \"effect\",\n RATE: \"rate\",\n PITCH: \"pitch\",\n VOLUME: \"volume\",\n CONTOUR: \"contour\",\n RANGE: \"range\",\n TIME: \"time\",\n STRENGTH: \"strength\",\n STYLE: \"style\",\n STYLE_DEGREE: \"styledegree\",\n STYLE_DEGREE_CAMEL: \"styleDegree\",\n STYLE_DEGREE_HYPHEN: \"style-degree\",\n ROLE: \"role\",\n INTERPRET_AS: \"interpret-as\",\n FORMAT: \"format\",\n DETAIL: \"detail\",\n ALPHABET: \"alphabet\",\n PH: \"ph\",\n LEVEL: \"level\",\n SRC: \"src\",\n DESC: \"desc\",\n CLIP_BEGIN: \"clipBegin\",\n CLIP_END: \"clipEnd\",\n SPEED: \"speed\",\n REPEAT_COUNT: \"repeatCount\",\n REPEAT_DURATION: \"repeatDuration\",\n SOUND_LEVEL: \"soundLevel\",\n ALIAS: \"alias\",\n MARK: \"mark\",\n URI: \"uri\",\n ID: \"id\",\n MODEL: \"model\",\n PROFILE: \"profile\",\n URL: \"url\",\n SPEAKER_PROFILE_ID: \"speakerProfileId\",\n TYPE: \"type\",\n VALUE: \"value\",\n FADE_IN: \"fadein\",\n FADE_OUT: \"fadeout\",\n} as const;\n","import type {\n SsmlAttributeValue,\n SsmlAttributes,\n SsmlDocument,\n SsmlElement,\n SsmlElementBase,\n SsmlNode,\n} from \"./types.ts\";\nimport {\n DEFAULT_SSML_LANGUAGE,\n DEFAULT_SSML_VERSION,\n MSTTS_NAMESPACE,\n MSTTS_TAG_PREFIX,\n SSML_ATTRS,\n SSML_TAGS,\n SYNTHESIS_NAMESPACE,\n XML_NAME_PATTERN,\n} from \"./constants/ssml.ts\";\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\n}\n\nfunction addAttribute(attributes: SsmlAttributes, name: string, value: SsmlAttributeValue | undefined): void {\n if (value !== undefined) {\n attributes[name] = value;\n }\n}\n\nfunction getAttributes(element: SsmlElement): SsmlAttributes {\n const attributes: SsmlAttributes = {\n ...(element.attributes ?? {}),\n };\n\n switch (element.type) {\n case SSML_TAGS.VOICE:\n addAttribute(attributes, SSML_ATTRS.NAME, element.name);\n addAttribute(attributes, SSML_ATTRS.EFFECT, element.effect);\n break;\n case SSML_TAGS.PROSODY:\n addAttribute(attributes, SSML_ATTRS.RATE, element.rate);\n addAttribute(attributes, SSML_ATTRS.PITCH, element.pitch);\n addAttribute(attributes, SSML_ATTRS.VOLUME, element.volume);\n addAttribute(attributes, SSML_ATTRS.CONTOUR, element.contour);\n addAttribute(attributes, SSML_ATTRS.RANGE, element.range);\n break;\n case SSML_TAGS.BREAK:\n addAttribute(attributes, SSML_ATTRS.TIME, element.time);\n addAttribute(attributes, SSML_ATTRS.STRENGTH, element.strength);\n break;\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS:\n addAttribute(attributes, SSML_ATTRS.STYLE, element.style);\n addAttribute(attributes, SSML_ATTRS.STYLE_DEGREE, element.styleDegree);\n addAttribute(attributes, SSML_ATTRS.ROLE, element.role);\n break;\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL:\n addAttribute(attributes, SSML_ATTRS.INTERPRET_AS, element.interpretAs);\n addAttribute(attributes, SSML_ATTRS.FORMAT, element.format);\n addAttribute(attributes, SSML_ATTRS.DETAIL, element.detail);\n break;\n case SSML_TAGS.PHONEME:\n addAttribute(attributes, SSML_ATTRS.ALPHABET, element.alphabet);\n addAttribute(attributes, SSML_ATTRS.PH, element.ph);\n break;\n case SSML_TAGS.EMPHASIS:\n addAttribute(attributes, SSML_ATTRS.LEVEL, element.level);\n break;\n case SSML_TAGS.AUDIO:\n addAttribute(attributes, SSML_ATTRS.SRC, element.src);\n addAttribute(attributes, SSML_ATTRS.DESC, element.desc);\n addAttribute(attributes, SSML_ATTRS.CLIP_BEGIN, element.clipBegin);\n addAttribute(attributes, SSML_ATTRS.CLIP_END, element.clipEnd);\n addAttribute(attributes, SSML_ATTRS.SPEED, element.speed);\n addAttribute(attributes, SSML_ATTRS.REPEAT_COUNT, element.repeatCount);\n addAttribute(attributes, SSML_ATTRS.REPEAT_DURATION, element.repeatDuration);\n addAttribute(attributes, SSML_ATTRS.SOUND_LEVEL, element.soundLevel);\n break;\n case SSML_TAGS.SUB:\n addAttribute(attributes, SSML_ATTRS.ALIAS, element.alias);\n break;\n case SSML_TAGS.LANG:\n addAttribute(attributes, SSML_ATTRS.XML_LANG, element.lang);\n break;\n case SSML_TAGS.MARK:\n addAttribute(attributes, SSML_ATTRS.NAME, element.name);\n break;\n case SSML_TAGS.BOOKMARK:\n addAttribute(attributes, SSML_ATTRS.MARK, element.mark);\n break;\n case SSML_TAGS.LEXICON:\n addAttribute(attributes, SSML_ATTRS.URI, element.uri);\n break;\n case SSML_TAGS.MSTTS_SILENCE:\n case SSML_TAGS.SILENCE:\n addAttribute(attributes, SSML_ATTRS.TYPE, element.typeValue ?? element.silenceType);\n addAttribute(attributes, SSML_ATTRS.VALUE, element.value);\n break;\n case SSML_TAGS.MSTTS_VISEME:\n case SSML_TAGS.VISEME:\n addAttribute(attributes, SSML_ATTRS.TYPE, element.typeValue ?? element.visemeType);\n break;\n case SSML_TAGS.MSTTS_AUDIO_DURATION:\n addAttribute(attributes, SSML_ATTRS.VALUE, element.value);\n break;\n case SSML_TAGS.MSTTS_TURN:\n addAttribute(attributes, SSML_ATTRS.VOICE, element.voice);\n addAttribute(attributes, SSML_ATTRS.SPEAKER, element.speaker);\n break;\n case SSML_TAGS.MSTTS_BACKGROUND_AUDIO:\n addAttribute(attributes, SSML_ATTRS.SRC, element.src);\n addAttribute(attributes, SSML_ATTRS.VOLUME, element.volume);\n addAttribute(attributes, SSML_ATTRS.FADE_IN, element.fadeIn ?? element.fadein);\n addAttribute(attributes, SSML_ATTRS.FADE_OUT, element.fadeOut ?? element.fadeout);\n break;\n case SSML_TAGS.MSTTS_DIALOG:\n break;\n case SSML_TAGS.MSTTS_TTS_EMBEDDING:\n addAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID, element.speakerProfileId);\n break;\n case SSML_TAGS.MSTTS_EMBEDDING:\n addAttribute(attributes, SSML_ATTRS.ID, element.id);\n addAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID, element.speakerProfileId);\n break;\n case SSML_TAGS.MSTTS_VOICE_CONVERSION:\n addAttribute(attributes, SSML_ATTRS.URL, element.url);\n addAttribute(attributes, SSML_ATTRS.PROFILE, element.profile);\n addAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID, element.speakerProfileId);\n break;\n case SSML_TAGS.PARAGRAPH:\n case SSML_TAGS.SENTENCE:\n case SSML_TAGS.WORD:\n case \"element\":\n case \"custom\":\n break;\n }\n\n return attributes;\n}\n\nfunction getTagName(element: SsmlElement): string {\n switch (element.type) {\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS:\n return SSML_TAGS.MSTTS_EXPRESS_AS;\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL:\n return SSML_TAGS.SAY_AS;\n case SSML_TAGS.SILENCE:\n case SSML_TAGS.MSTTS_SILENCE:\n return SSML_TAGS.MSTTS_SILENCE;\n case SSML_TAGS.VISEME:\n case SSML_TAGS.MSTTS_VISEME:\n return SSML_TAGS.MSTTS_VISEME;\n case SSML_TAGS.MSTTS_AUDIO_DURATION:\n return SSML_TAGS.MSTTS_AUDIO_DURATION;\n case \"element\":\n case \"custom\":\n return element.name;\n default:\n return element.type;\n }\n}\n\nfunction getChildren(element: SsmlElementBase): SsmlNode[] {\n return element.children ?? [];\n}\n\nfunction validateName(name: string, kind: \"element\" | \"attribute\"): void {\n if (!XML_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid XML ${kind} name: ${name}`);\n }\n}\n\nfunction serializeAttributes(attributes: SsmlAttributes): string {\n return Object.entries(attributes)\n .map(([name, value]) => {\n validateName(name, \"attribute\");\n return ` ${name}=\"${escapeAttribute(String(value))}\"`;\n })\n .join(\"\");\n}\n\nfunction serializeNode(node: SsmlNode): string {\n if (typeof node === \"string\") {\n return escapeText(node);\n }\n\n if (node.type === \"text\") {\n return escapeText(node.value);\n }\n\n const tagName = getTagName(node);\n validateName(tagName, \"element\");\n\n const attributes = serializeAttributes(getAttributes(node));\n const children = getChildren(node);\n if (children.length === 0) {\n return `<${tagName}${attributes}/>`;\n }\n\n return `<${tagName}${attributes}>${children.map(serializeNode).join(\"\")}</${tagName}>`;\n}\n\nfunction usesMsttsNamespace(nodes: SsmlNode[]): boolean {\n return nodes.some((node) => {\n if (typeof node === \"string\" || node.type === \"text\") {\n return false;\n }\n\n const tagName = getTagName(node);\n return tagName.startsWith(MSTTS_TAG_PREFIX) || usesMsttsNamespace(getChildren(node));\n });\n}\n\nfunction serializeDocument(document: SsmlDocument): string {\n const children = document.children ?? (document.content === undefined ? [] : [document.content]);\n const attributes: SsmlAttributes = {\n ...(document.attributes ?? {}),\n [SSML_ATTRS.VERSION]: document.version,\n [SSML_ATTRS.XMLNS]: SYNTHESIS_NAMESPACE,\n [SSML_ATTRS.XML_LANG]: document.lang,\n };\n\n if (usesMsttsNamespace(children) && attributes[SSML_ATTRS.MSTTS_XMLNS] === undefined) {\n attributes[SSML_ATTRS.MSTTS_XMLNS] = MSTTS_NAMESPACE;\n }\n\n return `<${SSML_TAGS.SPEAK}${serializeAttributes(attributes)}>${children.map(serializeNode).join(\"\")}</${SSML_TAGS.SPEAK}>`;\n}\n\nexport function buildSsml(document: SsmlDocument): string;\nexport function buildSsml(content: string, lang?: string): SsmlDocument;\nexport function buildSsml(\n documentOrContent: SsmlDocument | string,\n lang: string = DEFAULT_SSML_LANGUAGE,\n): string | SsmlDocument {\n if (typeof documentOrContent === \"string\") {\n return {\n version: DEFAULT_SSML_VERSION,\n lang,\n content: documentOrContent,\n };\n }\n\n return serializeDocument(documentOrContent);\n}\n","import type {\n AudioElement,\n BookmarkElement,\n BreakElement,\n CustomElement,\n EmphasisElement,\n ExpressAsElement,\n LangElement,\n LexiconElement,\n MarkElement,\n MsttsSilenceElement,\n MsttsVisemeElement,\n MsttsAudioDurationElement,\n MsttsEmbeddingElement,\n MsttsTtsEmbeddingElement,\n MsttsVoiceConversionElement,\n ParagraphElement,\n PhonemeElement,\n ProsodyElement,\n SayAsElement,\n SentenceElement,\n SsmlAttributes,\n SsmlBackgroundAudioNode,\n SsmlDialogNode,\n SsmlDocument,\n SsmlElement,\n SsmlNode,\n SsmlTurnNode,\n SubElement,\n VoiceElement,\n WordElement,\n} from \"./types.ts\";\nimport { MAX_NESTING_DEPTH, MSTTS_NAMESPACE, SSML_ATTRS, SSML_TAGS, SYNTHESIS_NAMESPACE } from \"./constants/ssml.ts\";\n\ninterface XmlElementNode {\n name: string;\n attributes: SsmlAttributes;\n children: XmlNode[];\n}\n\ntype XmlNode = string | XmlElementNode;\n\nconst XML_ENTITIES: Record<string, string> = {\n amp: \"&\",\n apos: \"'\",\n gt: \">\",\n lt: \"<\",\n quot: '\"',\n};\n\nfunction hasOwn(object: object, property: PropertyKey): boolean {\n return Object.getOwnPropertyDescriptor(object, property) !== undefined;\n}\n\nfunction setAttribute(attributes: SsmlAttributes, name: string, value: string): void {\n Object.defineProperty(attributes, name, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nfunction decodeEntity(entity: string): string {\n const namedValue = hasOwn(XML_ENTITIES, entity) ? XML_ENTITIES[entity] : undefined;\n if (namedValue !== undefined) {\n return namedValue;\n }\n\n const isHexadecimal = entity.startsWith(\"#x\") || entity.startsWith(\"#X\");\n const isDecimal = entity.startsWith(\"#\");\n if (!isHexadecimal && !isDecimal) {\n throw new Error(`Unknown XML entity: &${entity};`);\n }\n\n const digits = entity.slice(isHexadecimal ? 2 : 1);\n const codePoint = Number.parseInt(digits, isHexadecimal ? 16 : 10);\n if (\n !digits ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > 0x10ffff ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n (codePoint < 0x20 && ![9, 10, 13].includes(codePoint))\n ) {\n throw new Error(`Invalid XML character reference: &${entity};`);\n }\n\n return String.fromCodePoint(codePoint);\n}\n\nfunction decodeXmlEntities(value: string): string {\n let result = \"\";\n let start = 0;\n\n while (true) {\n const ampersand = value.indexOf(\"&\", start);\n if (ampersand === -1) {\n return result + value.slice(start);\n }\n\n result += value.slice(start, ampersand);\n const semicolon = value.indexOf(\";\", ampersand + 1);\n if (semicolon === -1) {\n throw new Error(\"Unterminated XML entity reference\");\n }\n\n result += decodeEntity(value.slice(ampersand + 1, semicolon));\n start = semicolon + 1;\n }\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction removeStandardNamespaceAttributes(attributes: SsmlAttributes): void {\n if (attributes[SSML_ATTRS.XMLNS] === SYNTHESIS_NAMESPACE) {\n delete attributes[SSML_ATTRS.XMLNS];\n }\n if (attributes[SSML_ATTRS.MSTTS_XMLNS] === MSTTS_NAMESPACE) {\n delete attributes[SSML_ATTRS.MSTTS_XMLNS];\n }\n}\n\nclass XmlParser {\n #index = 0;\n private readonly source: string;\n\n constructor(source: string) {\n this.source = source;\n }\n\n parse(): XmlElementNode {\n if (this.source.charCodeAt(0) === 0xfeff) {\n this.#index += 1;\n }\n\n this.skipMisc();\n if (this.#index >= this.source.length) {\n this.fail(\"SSML input is empty\");\n }\n if (this.source[this.#index] !== \"<\") {\n this.fail(\"SSML input must start with an XML element\");\n }\n\n const root = this.parseElement(0);\n this.skipMisc();\n if (this.#index !== this.source.length) {\n this.fail(\"Unexpected content after the root XML element\");\n }\n return root;\n }\n\n private parseElement(depth: number): XmlElementNode {\n if (depth > MAX_NESTING_DEPTH) {\n this.fail(\"XML nesting depth exceeds the supported limit\");\n }\n\n this.expect(\"<\");\n if (this.source[this.#index] === \"/\") {\n this.fail(\"Unexpected closing XML element\");\n }\n\n const name = this.parseName();\n const { attributes, selfClosing } = this.parseStartTag();\n if (selfClosing) {\n return { name, attributes, children: [] };\n }\n\n const children: XmlNode[] = [];\n while (this.#index < this.source.length) {\n if (this.source.startsWith(\"</\", this.#index)) {\n this.#index += 2;\n const closingName = this.parseName();\n this.skipWhitespace();\n this.expect(\">\");\n if (closingName !== name) {\n this.fail(`Mismatched closing element: expected </${name}> but found </${closingName}>`);\n }\n return { name, attributes, children };\n }\n\n if (this.source.startsWith(\"<!--\", this.#index)) {\n this.skipComment();\n continue;\n }\n\n if (this.source.startsWith(\"<![CDATA[\", this.#index)) {\n this.appendText(children, this.parseCdata());\n continue;\n }\n\n if (this.source.startsWith(\"<?\", this.#index)) {\n this.skipProcessingInstruction();\n continue;\n }\n\n if (this.source.startsWith(\"<!\", this.#index)) {\n this.fail(\"Unsupported XML declaration inside an element\");\n }\n\n if (this.source[this.#index] === \"<\") {\n children.push(this.parseElement(depth + 1));\n } else {\n this.appendText(children, this.parseText());\n }\n }\n\n this.fail(`Unclosed XML element: <${name}>`);\n }\n\n private parseStartTag(): {\n attributes: SsmlAttributes;\n selfClosing: boolean;\n } {\n const attributes: SsmlAttributes = {};\n\n while (this.#index < this.source.length) {\n this.skipWhitespace();\n\n if (this.source.startsWith(\"/>\", this.#index)) {\n this.#index += 2;\n return { attributes, selfClosing: true };\n }\n if (this.source[this.#index] === \">\") {\n this.#index += 1;\n return { attributes, selfClosing: false };\n }\n\n const name = this.parseName();\n this.skipWhitespace();\n this.expect(\"=\");\n this.skipWhitespace();\n\n const quote = this.source[this.#index];\n if (quote !== '\"' && quote !== \"'\") {\n this.fail(`XML attribute ${name} must use a quoted value`);\n }\n this.#index += 1;\n\n const valueStart = this.#index;\n while (this.#index < this.source.length && this.source[this.#index] !== quote) {\n if (this.source[this.#index] === \"<\") {\n this.fail(`Invalid \"<\" in XML attribute ${name}`);\n }\n this.#index += 1;\n }\n if (this.#index >= this.source.length) {\n this.fail(`Unclosed XML attribute ${name}`);\n }\n\n const value = decodeXmlEntities(this.source.slice(valueStart, this.#index));\n this.#index += 1;\n\n if (hasOwn(attributes, name)) {\n this.fail(`Duplicate XML attribute: ${name}`);\n }\n setAttribute(attributes, name, value);\n }\n\n this.fail(\"Unclosed XML start tag\");\n }\n\n private parseText(): string {\n const start = this.#index;\n while (this.#index < this.source.length && this.source[this.#index] !== \"<\") {\n this.#index += 1;\n }\n\n const value = this.source.slice(start, this.#index);\n if (value.includes(\"]]>\")) {\n this.fail(\"CDATA termination is not valid in ordinary XML text\");\n }\n return decodeXmlEntities(value);\n }\n\n private parseCdata(): string {\n this.#index += \"<![CDATA[\".length;\n const end = this.source.indexOf(\"]]>\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML CDATA section\");\n }\n\n const value = this.source.slice(this.#index, end);\n this.#index = end + 3;\n return value;\n }\n\n private skipComment(): void {\n this.#index += \"<!--\".length;\n const end = this.source.indexOf(\"-->\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML comment\");\n }\n if (this.source.slice(this.#index, end).includes(\"--\")) {\n this.fail(\"XML comments cannot contain consecutive hyphens\");\n }\n this.#index = end + 3;\n }\n\n private skipProcessingInstruction(): void {\n this.#index += \"<?\".length;\n this.parseName();\n const end = this.source.indexOf(\"?>\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML processing instruction\");\n }\n this.#index = end + 2;\n }\n\n private skipMisc(): void {\n while (this.#index < this.source.length) {\n this.skipWhitespace();\n if (this.source.startsWith(\"<!--\", this.#index)) {\n this.skipComment();\n continue;\n }\n if (this.source.startsWith(\"<?\", this.#index)) {\n this.skipProcessingInstruction();\n continue;\n }\n if (this.source.startsWith(\"<!DOCTYPE\", this.#index)) {\n this.fail(\"DOCTYPE declarations are not supported\");\n }\n break;\n }\n }\n\n private parseName(): string {\n const first = this.source[this.#index];\n if (!isXmlNameStart(first)) {\n this.fail(\"Invalid XML name\");\n }\n\n const start = this.#index;\n this.#index += 1;\n while (isXmlNameCharacter(this.source[this.#index])) {\n this.#index += 1;\n }\n return this.source.slice(start, this.#index);\n }\n\n private appendText(children: XmlNode[], value: string): void {\n if (!value) {\n return;\n }\n\n const previous = children[children.length - 1];\n if (typeof previous === \"string\") {\n children[children.length - 1] = previous + value;\n } else {\n children.push(value);\n }\n }\n\n private skipWhitespace(): void {\n while (isXmlWhitespace(this.source[this.#index])) {\n this.#index += 1;\n }\n }\n\n private expect(value: string): void {\n if (!this.source.startsWith(value, this.#index)) {\n this.fail(`Expected \"${value}\"`);\n }\n this.#index += value.length;\n }\n\n private fail(message: string): never {\n throw new Error(`${message} at position ${this.#index}`);\n }\n}\n\nfunction readAttribute(attributes: SsmlAttributes, ...names: string[]): string | undefined {\n let found = false;\n let value: string | undefined;\n\n for (const name of names) {\n if (hasOwn(attributes, name)) {\n if (!found) {\n value = String(attributes[name]);\n found = true;\n }\n delete attributes[name];\n }\n }\n\n return value;\n}\n\nfunction getElementAttributes(node: XmlElementNode): SsmlAttributes {\n const attributes: SsmlAttributes = { ...node.attributes };\n removeStandardNamespaceAttributes(attributes);\n return attributes;\n}\n\nfunction finishElement<T extends SsmlElement>(element: T, node: XmlElementNode, attributes: SsmlAttributes): T {\n if (node.children.length > 0) {\n element.children = node.children.map(convertNode);\n }\n if (Object.keys(attributes).length > 0) {\n element.attributes = attributes;\n }\n return element;\n}\n\nfunction convertElement(node: XmlElementNode): SsmlElement {\n const attributes = getElementAttributes(node);\n\n switch (node.name) {\n case SSML_TAGS.VOICE: {\n const element: VoiceElement = { type: SSML_TAGS.VOICE };\n const name = readAttribute(attributes, SSML_ATTRS.NAME);\n const effect = readAttribute(attributes, SSML_ATTRS.EFFECT);\n if (name !== undefined) element.name = name;\n if (effect !== undefined) element.effect = effect;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PROSODY: {\n const element: ProsodyElement = { type: SSML_TAGS.PROSODY };\n const rate = readAttribute(attributes, SSML_ATTRS.RATE);\n const pitch = readAttribute(attributes, SSML_ATTRS.PITCH);\n const volume = readAttribute(attributes, SSML_ATTRS.VOLUME);\n const contour = readAttribute(attributes, SSML_ATTRS.CONTOUR);\n const range = readAttribute(attributes, SSML_ATTRS.RANGE);\n if (rate !== undefined) element.rate = rate;\n if (pitch !== undefined) element.pitch = pitch;\n if (volume !== undefined) element.volume = volume;\n if (contour !== undefined) element.contour = contour;\n if (range !== undefined) element.range = range;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.BREAK: {\n const element: BreakElement = { type: SSML_TAGS.BREAK };\n const time = readAttribute(attributes, SSML_ATTRS.TIME);\n const strength = readAttribute(attributes, SSML_ATTRS.STRENGTH);\n if (time !== undefined) element.time = time;\n if (strength !== undefined) element.strength = strength;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS: {\n const element: ExpressAsElement = { type: node.name };\n const style = readAttribute(attributes, SSML_ATTRS.STYLE);\n const styleDegree = readAttribute(\n attributes,\n SSML_ATTRS.STYLE_DEGREE,\n SSML_ATTRS.STYLE_DEGREE_CAMEL,\n SSML_ATTRS.STYLE_DEGREE_HYPHEN,\n );\n const role = readAttribute(attributes, SSML_ATTRS.ROLE);\n if (style !== undefined) element.style = style;\n if (styleDegree !== undefined) element.styleDegree = styleDegree;\n if (role !== undefined) element.role = role;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL: {\n const element: SayAsElement = { type: node.name };\n const interpretAs = readAttribute(attributes, SSML_ATTRS.INTERPRET_AS);\n const format = readAttribute(attributes, SSML_ATTRS.FORMAT);\n const detail = readAttribute(attributes, SSML_ATTRS.DETAIL);\n if (interpretAs !== undefined) element.interpretAs = interpretAs;\n if (format !== undefined) element.format = format;\n if (detail !== undefined) element.detail = detail;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PHONEME: {\n const element: PhonemeElement = { type: SSML_TAGS.PHONEME };\n const alphabet = readAttribute(attributes, SSML_ATTRS.ALPHABET);\n const ph = readAttribute(attributes, SSML_ATTRS.PH);\n if (alphabet !== undefined) element.alphabet = alphabet;\n if (ph !== undefined) element.ph = ph;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.EMPHASIS: {\n const element: EmphasisElement = { type: SSML_TAGS.EMPHASIS };\n const level = readAttribute(attributes, SSML_ATTRS.LEVEL);\n if (level !== undefined) element.level = level;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.AUDIO: {\n const element: AudioElement = { type: SSML_TAGS.AUDIO };\n const src = readAttribute(attributes, SSML_ATTRS.SRC);\n const desc = readAttribute(attributes, SSML_ATTRS.DESC);\n const clipBegin = readAttribute(attributes, SSML_ATTRS.CLIP_BEGIN);\n const clipEnd = readAttribute(attributes, SSML_ATTRS.CLIP_END);\n const speed = readAttribute(attributes, SSML_ATTRS.SPEED);\n const repeatCount = readAttribute(attributes, SSML_ATTRS.REPEAT_COUNT);\n const repeatDuration = readAttribute(attributes, SSML_ATTRS.REPEAT_DURATION);\n const soundLevel = readAttribute(attributes, SSML_ATTRS.SOUND_LEVEL);\n if (src !== undefined) element.src = src;\n if (desc !== undefined) element.desc = desc;\n if (clipBegin !== undefined) element.clipBegin = clipBegin;\n if (clipEnd !== undefined) element.clipEnd = clipEnd;\n if (speed !== undefined) element.speed = speed;\n if (repeatCount !== undefined) element.repeatCount = repeatCount;\n if (repeatDuration !== undefined) element.repeatDuration = repeatDuration;\n if (soundLevel !== undefined) element.soundLevel = soundLevel;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SUB: {\n const element: SubElement = { type: SSML_TAGS.SUB };\n const alias = readAttribute(attributes, SSML_ATTRS.ALIAS);\n if (alias !== undefined) element.alias = alias;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.LANG: {\n const element: LangElement = { type: SSML_TAGS.LANG };\n const lang = readAttribute(attributes, SSML_ATTRS.XML_LANG, SSML_ATTRS.LANG);\n if (lang !== undefined) element.lang = lang;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MARK: {\n const element: MarkElement = { type: SSML_TAGS.MARK };\n const name = readAttribute(attributes, SSML_ATTRS.NAME);\n if (name !== undefined) element.name = name;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.BOOKMARK: {\n const element: BookmarkElement = { type: SSML_TAGS.BOOKMARK };\n const mark = readAttribute(attributes, SSML_ATTRS.MARK);\n if (mark !== undefined) element.mark = mark;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.LEXICON: {\n const element: LexiconElement = { type: SSML_TAGS.LEXICON };\n const uri = readAttribute(attributes, SSML_ATTRS.URI);\n if (uri !== undefined) element.uri = uri;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PARAGRAPH: {\n const element: ParagraphElement = { type: SSML_TAGS.PARAGRAPH };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SENTENCE: {\n const element: SentenceElement = { type: SSML_TAGS.SENTENCE };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.WORD: {\n const element: WordElement = { type: SSML_TAGS.WORD };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_SILENCE:\n case SSML_TAGS.SILENCE: {\n const element: MsttsSilenceElement = {\n type: node.name === SSML_TAGS.MSTTS_SILENCE ? SSML_TAGS.MSTTS_SILENCE : SSML_TAGS.SILENCE,\n };\n const typeValue = readAttribute(attributes, SSML_ATTRS.TYPE);\n const value = readAttribute(attributes, SSML_ATTRS.VALUE);\n if (typeValue !== undefined) element.typeValue = typeValue;\n if (value !== undefined) element.value = value;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_VISEME:\n case SSML_TAGS.VISEME: {\n const element: MsttsVisemeElement = {\n type: node.name === SSML_TAGS.MSTTS_VISEME ? SSML_TAGS.MSTTS_VISEME : SSML_TAGS.VISEME,\n };\n const typeValue = readAttribute(attributes, SSML_ATTRS.TYPE);\n if (typeValue !== undefined) element.typeValue = typeValue;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_AUDIO_DURATION: {\n const element: MsttsAudioDurationElement = { type: SSML_TAGS.MSTTS_AUDIO_DURATION };\n const value = readAttribute(attributes, SSML_ATTRS.VALUE);\n if (value !== undefined) element.value = value;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_DIALOG: {\n const element: SsmlDialogNode = { type: SSML_TAGS.MSTTS_DIALOG };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_TURN: {\n const element: SsmlTurnNode = { type: SSML_TAGS.MSTTS_TURN };\n const voice = readAttribute(attributes, SSML_ATTRS.VOICE);\n const speaker = readAttribute(attributes, SSML_ATTRS.SPEAKER);\n if (voice !== undefined) element.voice = voice;\n if (speaker !== undefined) element.speaker = speaker;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_BACKGROUND_AUDIO: {\n const element: SsmlBackgroundAudioNode = { type: SSML_TAGS.MSTTS_BACKGROUND_AUDIO };\n const src = readAttribute(attributes, SSML_ATTRS.SRC);\n const volume = readAttribute(attributes, SSML_ATTRS.VOLUME);\n const fadeIn = readAttribute(attributes, SSML_ATTRS.FADE_IN);\n const fadeOut = readAttribute(attributes, SSML_ATTRS.FADE_OUT);\n if (src !== undefined) element.src = src;\n if (volume !== undefined) element.volume = volume;\n if (fadeIn !== undefined) element.fadeIn = fadeIn;\n if (fadeOut !== undefined) element.fadeOut = fadeOut;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_TTS_EMBEDDING: {\n const element: MsttsTtsEmbeddingElement = { type: SSML_TAGS.MSTTS_TTS_EMBEDDING };\n const speakerProfileId = readAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID);\n if (speakerProfileId !== undefined) element.speakerProfileId = speakerProfileId;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_EMBEDDING: {\n const element: MsttsEmbeddingElement = { type: SSML_TAGS.MSTTS_EMBEDDING };\n const id = readAttribute(attributes, SSML_ATTRS.ID);\n const speakerProfileId = readAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID);\n if (id !== undefined) element.id = id;\n if (speakerProfileId !== undefined) element.speakerProfileId = speakerProfileId;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_VOICE_CONVERSION: {\n const element: MsttsVoiceConversionElement = { type: SSML_TAGS.MSTTS_VOICE_CONVERSION };\n const url = readAttribute(attributes, SSML_ATTRS.URL);\n const profile = readAttribute(attributes, SSML_ATTRS.PROFILE);\n const speakerProfileId = readAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID);\n if (url !== undefined) element.url = url;\n if (profile !== undefined) element.profile = profile;\n if (speakerProfileId !== undefined) element.speakerProfileId = speakerProfileId;\n return finishElement(element, node, attributes);\n }\n default: {\n const element: CustomElement = {\n name: node.name,\n type: \"custom\",\n };\n return finishElement(element, node, attributes);\n }\n }\n}\n\nfunction convertNode(node: XmlNode): SsmlNode {\n return typeof node === \"string\" ? node : convertElement(node);\n}\n\nexport function parseSsml(xmlString: string): SsmlDocument {\n if (typeof xmlString !== \"string\") {\n throw new TypeError(\"SSML input must be a string\");\n }\n\n const root = new XmlParser(xmlString).parse();\n if (root.name !== SSML_TAGS.SPEAK) {\n throw new Error(`SSML root element must be <${SSML_TAGS.SPEAK}>, found <${root.name}>`);\n }\n\n const attributes: SsmlAttributes = { ...root.attributes };\n const version = readAttribute(attributes, SSML_ATTRS.VERSION);\n const lang = readAttribute(attributes, SSML_ATTRS.XML_LANG, SSML_ATTRS.LANG);\n if (version === undefined) {\n throw new Error(`SSML <${SSML_TAGS.SPEAK}> element is missing the \"${SSML_ATTRS.VERSION}\" attribute`);\n }\n if (lang === undefined) {\n throw new Error(`SSML <${SSML_TAGS.SPEAK}> element is missing the \"${SSML_ATTRS.XML_LANG}\" attribute`);\n }\n\n removeStandardNamespaceAttributes(attributes);\n const document: SsmlDocument = {\n children: root.children.map(convertNode),\n lang,\n type: SSML_TAGS.SPEAK,\n version,\n };\n if (Object.keys(attributes).length > 0) {\n document.attributes = attributes;\n }\n return document;\n}\n","import { buildSsml } from \"./builder.ts\";\nimport {\n DEFAULT_SSML_LANGUAGE,\n DEFAULT_SSML_VERSION,\n SSML_ATTRS,\n SSML_TAGS,\n SYNTHESIS_NAMESPACE,\n} from \"./constants/ssml.ts\";\nimport { parseSsml } from \"./parser.ts\";\nimport type { ProsodyElement, SsmlAttributes, SsmlDocument, SsmlNode, VoiceElement } from \"./types.ts\";\n\nexport type SsmlPartialVoice = Pick<VoiceElement, \"name\" | \"effect\" | \"attributes\">;\n\nexport type SsmlPartialProsody = Pick<ProsodyElement, \"rate\" | \"pitch\" | \"volume\" | \"contour\" | \"range\" | \"attributes\">;\n\nexport interface SsmlPartialContext {\n /** SSML version used for the generated document. */\n version?: string;\n /** BCP-47 language tag used for the generated document. */\n lang?: string;\n /** Preferred voice name; a voice object takes precedence, while this overrides a string `voice` shorthand. */\n voiceName?: string;\n /** Optional Azure voice effect used with `voiceName` or a string `voice` shorthand. */\n voiceEffect?: string;\n /** A voice name shorthand or a voice object whose attributes are preserved. */\n voice?: string | SsmlPartialVoice;\n /** Optional prosody values applied around the partial text. */\n prosody?: SsmlPartialProsody;\n /** Additional attributes added to the generated `speak` element. */\n attributes?: SsmlAttributes;\n}\n\nexport interface BuildPartialSsmlOptions extends SsmlPartialContext {\n text: string;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction getPartialTextNodes(text: string, version: string, lang: string): SsmlNode[] {\n if (!text.includes(\"<\")) {\n return [text];\n }\n\n try {\n const openingTag = `<${SSML_TAGS.SPEAK} ${SSML_ATTRS.VERSION}=\"${escapeAttribute(version)}\" ${SSML_ATTRS.XMLNS}=\"${SYNTHESIS_NAMESPACE}\" ${SSML_ATTRS.XML_LANG}=\"${escapeAttribute(lang)}\">`;\n return parseSsml(`${openingTag}${text}</${SSML_TAGS.SPEAK}>`).children ?? [];\n } catch {\n return [{ type: \"text\", value: text }];\n }\n}\n\nfunction getVoiceContext(context: SsmlPartialContext): SsmlPartialVoice | undefined {\n const voice = context.voice;\n if (typeof voice === \"object\" && voice !== null) {\n return voice;\n }\n\n if (context.voiceName === undefined && context.voiceEffect === undefined && typeof voice !== \"string\") {\n return undefined;\n }\n\n return {\n name: context.voiceName ?? voice,\n effect: context.voiceEffect,\n };\n}\n\nfunction serializePartialSsml(text: string, context: SsmlPartialContext): string {\n const version = context.version ?? DEFAULT_SSML_VERSION;\n const lang = context.lang ?? DEFAULT_SSML_LANGUAGE;\n let children = getPartialTextNodes(text, version, lang);\n\n if (context.prosody) {\n children = [\n {\n type: SSML_TAGS.PROSODY,\n ...context.prosody,\n children,\n },\n ];\n }\n\n const voice = getVoiceContext(context);\n if (voice) {\n children = [\n {\n type: SSML_TAGS.VOICE,\n ...voice,\n children,\n },\n ];\n }\n\n const document: SsmlDocument = {\n type: SSML_TAGS.SPEAK,\n version,\n lang,\n attributes: context.attributes,\n children,\n };\n return buildSsml(document);\n}\n\nexport function buildPartialSsml(text: string, context?: SsmlPartialContext): string;\nexport function buildPartialSsml(options: BuildPartialSsmlOptions): string;\nexport function buildPartialSsml(\n textOrOptions: string | BuildPartialSsmlOptions,\n context?: SsmlPartialContext,\n): string {\n if (typeof textOrOptions === \"string\") {\n return serializePartialSsml(textOrOptions, context ?? {});\n }\n\n return serializePartialSsml(textOrOptions.text, textOrOptions);\n}\n","import { buildSsml } from \"./builder.ts\";\nimport { parseSsml } from \"./parser.ts\";\nimport type { SsmlDocument, SsmlElement, SsmlNode } from \"./types.ts\";\n\nconst DEFAULT_MAX_LENGTH = 10_000;\n\nfunction cloneElement(element: SsmlElement, children: SsmlNode[]): SsmlElement {\n return { ...element, children };\n}\n\nfunction documentWithChildren(document: SsmlDocument, children: SsmlNode[]): string {\n return buildSsml({ ...document, children });\n}\n\nfunction wrapWithContext(node: SsmlNode, context: SsmlElement[]): SsmlNode {\n return context.reduceRight<SsmlNode>((current, parent) => cloneElement(parent, [current]), node);\n}\n\nfunction documentWithNode(document: SsmlDocument, node: SsmlNode, context: SsmlElement[]): string {\n return documentWithChildren(document, [wrapWithContext(node, context)]);\n}\n\nfunction splitTextNode(text: string, document: SsmlDocument, context: SsmlElement[], maxLength: number): SsmlNode[] {\n if (!text) return [text];\n const parts: string[] = [];\n let start = 0;\n while (start < text.length) {\n let end = start + 1;\n let bestEnd = end;\n while (end <= text.length) {\n if (documentWithNode(document, text.slice(start, end), context).length > maxLength) break;\n bestEnd = end;\n end += 1;\n }\n if (bestEnd === start) {\n throw new RangeError(\"maxLength is too small to contain the SSML document wrapper\");\n }\n\n // Prefer a word boundary, but fall back to a character for long words.\n const segment = text.slice(start, bestEnd);\n const boundary = Math.max(segment.lastIndexOf(\" \"), segment.lastIndexOf(\"\\n\"), segment.lastIndexOf(\"\\t\"));\n const splitEnd = boundary > 0 ? start + boundary + 1 : bestEnd;\n parts.push(text.slice(start, splitEnd));\n start = splitEnd;\n }\n return parts;\n}\n\nfunction splitNode(document: SsmlDocument, node: SsmlNode, maxLength: number, context: SsmlElement[] = []): SsmlNode[] {\n if (typeof node === \"string\" || node.type === \"text\") {\n const value = typeof node === \"string\" ? node : node.value;\n if (documentWithNode(document, node, context).length <= maxLength) return [node];\n return splitTextNode(value, document, context, maxLength);\n }\n\n if (documentWithNode(document, node, context).length <= maxLength) return [node];\n const children = node.children ?? [];\n if (children.length === 0) {\n throw new RangeError(`maxLength is too small to contain <${node.type}>`);\n }\n\n const splitChildren = children.flatMap((child) => splitNode(document, child, maxLength, [...context, node]));\n const parts: SsmlNode[] = [];\n let group: SsmlNode[] = [];\n const flush = (): void => {\n if (group.length > 0) {\n parts.push(cloneElement(node, group));\n group = [];\n }\n };\n\n for (const child of splitChildren) {\n const candidate = cloneElement(node, [...group, child]);\n if (documentWithNode(document, candidate, context).length <= maxLength) {\n group.push(child);\n continue;\n }\n flush();\n if (documentWithNode(document, cloneElement(node, [child]), context).length > maxLength) {\n throw new RangeError(`maxLength is too small to contain <${node.type}>`);\n }\n group.push(child);\n }\n flush();\n return parts;\n}\n\n/**\n * Splits SSML into independently synthesizable documents without breaking XML\n * elements. Parent elements such as `<voice>` and `<prosody>` are copied into\n * every block. Paragraph and sentence elements therefore remain the natural\n * split points, while oversized text is split at word/character boundaries.\n */\nexport function splitSsmlDocument(ssml: string, maxLength: number = DEFAULT_MAX_LENGTH): string[] {\n if (!Number.isInteger(maxLength) || maxLength <= 0) {\n throw new RangeError(\"maxLength must be a positive integer\");\n }\n const document = parseSsml(ssml);\n if (ssml.length <= maxLength) return [ssml];\n\n const children = document.children ?? [];\n const splitChildren = children.flatMap((child) => splitNode(document, child, maxLength));\n const chunks: SsmlNode[][] = [];\n let group: SsmlNode[] = [];\n for (const child of splitChildren) {\n const candidate = [...group, child];\n if (documentWithChildren(document, candidate).length <= maxLength) {\n group = candidate;\n continue;\n }\n if (group.length > 0) chunks.push(group);\n group = [child];\n if (documentWithChildren(document, group).length > maxLength) {\n throw new RangeError(\"maxLength is too small to contain the SSML document wrapper\");\n }\n }\n if (group.length > 0) chunks.push(group);\n return chunks.map((chunk) => documentWithChildren(document, chunk));\n}\n","import { parseSsml } from \"./parser.ts\";\n\nconst PARSER_POSITION_SUFFIX = / at position (\\d+)$/;\n\nexport interface SsmlValidationError {\n message: string;\n position: number;\n}\n\nexport function validateSsml(xmlString: string): SsmlValidationError | null {\n try {\n parseSsml(xmlString);\n return null;\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const positionMatch = PARSER_POSITION_SUFFIX.exec(rawMessage);\n\n return {\n message: positionMatch ? rawMessage.slice(0, positionMatch.index) : rawMessage,\n position: positionMatch ? Number.parseInt(positionMatch[1], 10) : 0,\n };\n }\n}\n","import { parseSsml } from \"./parser.ts\";\n\nexport interface SsmlTextNodeContext {\n parentTag: string;\n parentAttributes: Record<string, string>;\n ancestorTags: string[];\n path: string[];\n}\n\nexport interface MapSsmlTextNodesOptions {\n /** Element names whose text should not be passed to the transform. */\n skipTags?: readonly string[];\n /** Decides whether an individual text node should be passed to the transform. */\n filter?: (context: SsmlTextNodeContext) => boolean;\n}\n\ninterface TextNodeRecord {\n context: SsmlTextNodeContext;\n decodedText: string;\n end: number;\n sourceEnd: number;\n sourceStart: number;\n start: number;\n}\n\ninterface OpenElement {\n attributes: Record<string, string>;\n name: string;\n}\n\nfunction decodeXmlText(value: string): string {\n return value.replace(/&(?:amp|apos|gt|lt|quot);|&#(?:x[\\da-f]+|\\d+);/gi, (entity) => {\n if (entity === \"&amp;\") return \"&\";\n if (entity === \"&apos;\") return \"'\";\n if (entity === \"&gt;\") return \">\";\n if (entity === \"&lt;\") return \"<\";\n if (entity === \"&quot;\") return '\"';\n const hexadecimal = entity.toLowerCase().startsWith(\"&#x\");\n const digits = entity.slice(hexadecimal ? 3 : 2, -1);\n return String.fromCodePoint(Number.parseInt(digits, hexadecimal ? 16 : 10));\n });\n}\n\nfunction encodeXmlText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction decodeXmlAttribute(value: string): string {\n return decodeXmlText(value);\n}\n\nfunction findTagEnd(source: string, start: number): number {\n let quote = \"\";\n for (let index = start; index < source.length; index += 1) {\n const character = source[index];\n if (quote) {\n if (character === quote) quote = \"\";\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === \">\") {\n return index;\n }\n }\n return source.length - 1;\n}\n\nfunction readTagName(tag: string): string | undefined {\n const match = /^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/.exec(tag);\n return match?.[1];\n}\n\nfunction readTagAttributes(tag: string, name: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const nameStart = tag.indexOf(name);\n const attributeSource = tag.slice(nameStart + name.length, tag.length - 1).replace(/\\/\\s*$/, \"\");\n const attributePattern = /([A-Za-z_][A-Za-z0-9_.:-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\n for (const match of attributeSource.matchAll(attributePattern)) {\n attributes[match[1].toLowerCase()] = decodeXmlAttribute(match[3]);\n }\n return attributes;\n}\n\nfunction collectTextNodes(source: string): TextNodeRecord[] {\n const nodes: TextNodeRecord[] = [];\n const elements: OpenElement[] = [];\n let index = 0;\n\n const addText = (start: number, end: number, rawText: string, sourceStart = start, sourceEnd = end): void => {\n if (!rawText) return;\n const path = elements.map((element) => element.name);\n const parent = elements[elements.length - 1];\n nodes.push({\n context: {\n ancestorTags: path.slice(0, -1),\n parentAttributes: { ...(parent?.attributes ?? {}) },\n parentTag: parent?.name ?? \"\",\n path,\n },\n decodedText: decodeXmlText(rawText),\n end,\n sourceEnd,\n sourceStart,\n start,\n });\n };\n\n while (index < source.length) {\n if (source[index] !== \"<\") {\n const nextTag = source.indexOf(\"<\", index);\n const end = nextTag === -1 ? source.length : nextTag;\n addText(index, end, source.slice(index, end));\n index = end;\n continue;\n }\n\n if (source.startsWith(\"<!--\", index)) {\n const end = source.indexOf(\"-->\", index + 4);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<![CDATA[\", index)) {\n const contentStart = index + 9;\n const end = source.indexOf(\"]]>\", contentStart);\n const contentEnd = end === -1 ? source.length : end;\n addText(\n contentStart,\n contentEnd,\n source.slice(contentStart, contentEnd),\n index,\n end === -1 ? source.length : end + 3,\n );\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<?\", index)) {\n const end = source.indexOf(\"?>\", index + 2);\n index = end === -1 ? source.length : end + 2;\n continue;\n }\n if (source.startsWith(\"</\", index)) {\n const end = findTagEnd(source, index + 2);\n elements.pop();\n index = end + 1;\n continue;\n }\n\n const end = findTagEnd(source, index + 1);\n const tag = source.slice(index, end + 1);\n const name = readTagName(tag);\n if (name && !/\\/\\s*>$/.test(tag)) elements.push({ attributes: readTagAttributes(tag, name), name });\n index = end + 1;\n }\n\n return nodes;\n}\n\nexport function extractSsmlText(ssml: string): string[] {\n parseSsml(ssml);\n return collectTextNodes(ssml).map((node) => node.decodedText);\n}\n\nexport async function mapSsmlTextNodes(\n ssml: string,\n transform: (text: string, context: SsmlTextNodeContext) => string | Promise<string>,\n options: MapSsmlTextNodesOptions = {},\n): Promise<string> {\n parseSsml(ssml);\n const nodes = collectTextNodes(ssml);\n const skipTags = new Set((options.skipTags ?? [\"phoneme\", \"say-as\", \"sub\"]).map((tag) => tag.toLowerCase()));\n const replacements = await Promise.all(\n nodes.map(async (node) => {\n const context = {\n ancestorTags: [...node.context.ancestorTags],\n parentAttributes: { ...node.context.parentAttributes },\n parentTag: node.context.parentTag,\n path: [...node.context.path],\n };\n const shouldTransform = !skipTags.has(context.parentTag.toLowerCase()) && (options.filter?.(context) ?? true);\n if (!shouldTransform) return ssml.slice(node.sourceStart, node.sourceEnd);\n const transformed = await transform(node.decodedText, context);\n if (typeof transformed !== \"string\") {\n throw new TypeError(\"SSML text node transform must return a string\");\n }\n return transformed === node.decodedText\n ? ssml.slice(node.sourceStart, node.sourceEnd)\n : encodeXmlText(transformed);\n }),\n );\n\n let result = \"\";\n let cursor = 0;\n nodes.forEach((node, nodeIndex) => {\n result += ssml.slice(cursor, node.sourceStart) + replacements[nodeIndex];\n cursor = node.sourceEnd;\n });\n return result + ssml.slice(cursor);\n}\n","import { parseSsml } from \"./parser.ts\";\nimport type { SsmlAttributeValue, SsmlAttributes, SsmlDocument, SsmlElement, SsmlNode } from \"./types.ts\";\nimport type { SsmlTextNodeContext } from \"./textNodes.ts\";\n\nconst DEFAULT_TRANSLATION_SKIP_TAGS = [\"phoneme\", \"say-as\", \"sayAs\", \"sub\"] as const;\n\nexport interface ExtractSsmlTranslatableTextOptions {\n /** Element names whose descendants are not translation targets. */\n skipTags?: readonly string[];\n /** Include indentation and whitespace-only text nodes. Defaults to false. */\n includeWhitespace?: boolean;\n /** Further restrict text nodes after the skip-tag check. */\n filter?: (context: SsmlTextNodeContext) => boolean;\n}\n\nexport interface FromPlainTextToSsmlOptions {\n version?: string;\n lang?: string;\n /** Alias for lang, useful when options come from an application form. */\n language?: string;\n /** Wrap generated paragraphs in a voice element. */\n voice?: string;\n /** Alias for voice. */\n voiceName?: string;\n /** Generate sentence elements inside paragraphs. Defaults to true. */\n includeSentences?: boolean;\n /** Alias for includeSentences. */\n splitSentences?: boolean;\n}\n\nexport interface SsmlStructureMismatch {\n kind: \"element\" | \"attribute\" | \"parse\";\n path: string;\n original?: string;\n translated?: string;\n message: string;\n}\n\nexport interface SsmlStructureIntegrityResult {\n isValid: boolean;\n /** Alias for isValid for callers that prefer a shorter result property. */\n valid: boolean;\n errors: string[];\n mismatches: SsmlStructureMismatch[];\n /** Element or attribute names involved in each mismatch. */\n mismatchedTags: string[];\n}\n\nfunction elementName(element: SsmlElement): string {\n switch (element.type) {\n case \"custom\":\n case \"element\":\n return element.name;\n case \"expressAs\":\n return \"mstts:express-as\";\n case \"sayAs\":\n return \"say-as\";\n case \"silence\":\n return \"mstts:silence\";\n case \"viseme\":\n return \"mstts:viseme\";\n default:\n return element.type;\n }\n}\n\nfunction addAttribute(attributes: SsmlAttributes, name: string, value: SsmlAttributeValue | string | undefined): void {\n if (value !== undefined) attributes[name] = value;\n}\n\nfunction elementAttributes(element: SsmlElement): Record<string, string> {\n const attributes: SsmlAttributes = { ...(element.attributes ?? {}) };\n switch (element.type) {\n case \"voice\":\n addAttribute(attributes, \"name\", element.name);\n addAttribute(attributes, \"effect\", element.effect);\n break;\n case \"prosody\":\n addAttribute(attributes, \"rate\", element.rate);\n addAttribute(attributes, \"pitch\", element.pitch);\n addAttribute(attributes, \"volume\", element.volume);\n addAttribute(attributes, \"contour\", element.contour);\n addAttribute(attributes, \"range\", element.range);\n break;\n case \"break\":\n addAttribute(attributes, \"time\", element.time);\n addAttribute(attributes, \"strength\", element.strength);\n break;\n case \"express-as\":\n case \"expressAs\":\n case \"mstts:express-as\":\n addAttribute(attributes, \"style\", element.style);\n addAttribute(attributes, \"styledegree\", element.styleDegree);\n addAttribute(attributes, \"role\", element.role);\n break;\n case \"say-as\":\n case \"sayAs\":\n addAttribute(attributes, \"interpret-as\", element.interpretAs);\n addAttribute(attributes, \"format\", element.format);\n addAttribute(attributes, \"detail\", element.detail);\n break;\n case \"phoneme\":\n addAttribute(attributes, \"alphabet\", element.alphabet);\n addAttribute(attributes, \"ph\", element.ph);\n break;\n case \"emphasis\":\n addAttribute(attributes, \"level\", element.level);\n break;\n case \"audio\":\n addAttribute(attributes, \"src\", element.src);\n addAttribute(attributes, \"desc\", element.desc);\n addAttribute(attributes, \"clipBegin\", element.clipBegin);\n addAttribute(attributes, \"clipEnd\", element.clipEnd);\n addAttribute(attributes, \"speed\", element.speed);\n addAttribute(attributes, \"repeatCount\", element.repeatCount);\n addAttribute(attributes, \"repeatDuration\", element.repeatDuration);\n addAttribute(attributes, \"soundLevel\", element.soundLevel);\n break;\n case \"sub\":\n addAttribute(attributes, \"alias\", element.alias);\n break;\n case \"lang\":\n addAttribute(attributes, \"xml:lang\", element.lang);\n break;\n case \"mark\":\n addAttribute(attributes, \"name\", element.name);\n break;\n case \"bookmark\":\n addAttribute(attributes, \"mark\", element.mark);\n break;\n case \"lexicon\":\n addAttribute(attributes, \"uri\", element.uri);\n break;\n case \"mstts:silence\":\n case \"silence\":\n addAttribute(attributes, \"type\", element.typeValue ?? element.silenceType);\n addAttribute(attributes, \"value\", element.value);\n break;\n case \"mstts:viseme\":\n case \"viseme\":\n addAttribute(attributes, \"type\", element.typeValue ?? element.visemeType);\n break;\n case \"mstts:audioduration\":\n addAttribute(attributes, \"value\", element.value);\n break;\n case \"mstts:turn\":\n addAttribute(attributes, \"voice\", element.voice);\n addAttribute(attributes, \"speaker\", element.speaker);\n break;\n case \"mstts:backgroundaudio\":\n addAttribute(attributes, \"src\", element.src);\n addAttribute(attributes, \"volume\", element.volume);\n addAttribute(attributes, \"fadein\", element.fadeIn ?? element.fadein);\n addAttribute(attributes, \"fadeout\", element.fadeOut ?? element.fadeout);\n break;\n case \"mstts:ttsembedding\":\n addAttribute(attributes, \"speakerProfileId\", element.speakerProfileId);\n break;\n case \"mstts:embedding\":\n addAttribute(attributes, \"id\", element.id);\n addAttribute(attributes, \"speakerProfileId\", element.speakerProfileId);\n break;\n case \"mstts:voiceconversion\":\n addAttribute(attributes, \"url\", element.url);\n addAttribute(attributes, \"profile\", element.profile);\n addAttribute(attributes, \"speakerProfileId\", element.speakerProfileId);\n break;\n }\n return Object.fromEntries(Object.entries(attributes).map(([name, value]) => [name, String(value)]));\n}\n\nfunction childrenOf(node: SsmlDocument | SsmlElement): SsmlNode[] {\n return node.children ?? [];\n}\n\nexport function extractSsmlTranslatableText(ssml: string, options: ExtractSsmlTranslatableTextOptions = {}): string[] {\n const document = parseSsml(ssml);\n const skipTags = new Set((options.skipTags ?? DEFAULT_TRANSLATION_SKIP_TAGS).map((tag) => tag.toLowerCase()));\n const result: string[] = [];\n\n const visit = (nodes: SsmlNode[], ancestors: string[], path: string[]): void => {\n nodes.forEach((node, index) => {\n if (typeof node === \"string\") {\n if (options.includeWhitespace || node.trim().length > 0) {\n const context: SsmlTextNodeContext = {\n ancestorTags: [...ancestors],\n parentAttributes: {},\n parentTag: ancestors[ancestors.length - 1] ?? \"\",\n path: [...path, String(index)],\n };\n if (options.filter?.(context) ?? true) result.push(node);\n }\n return;\n }\n if (node.type === \"text\") {\n if (options.includeWhitespace || node.value.trim().length > 0) {\n const context: SsmlTextNodeContext = {\n ancestorTags: [...ancestors],\n parentAttributes: {},\n parentTag: ancestors[ancestors.length - 1] ?? \"\",\n path: [...path, String(index)],\n };\n if (options.filter?.(context) ?? true) result.push(node.value);\n }\n return;\n }\n\n const tag = elementName(node);\n if (skipTags.has(tag.toLowerCase())) return;\n visit(childrenOf(node), [...ancestors, tag], [...path, String(index)]);\n });\n };\n\n visit(childrenOf(document), [\"speak\"], []);\n return result;\n}\n\nfunction splitSentences(text: string): string[] {\n const sentences: string[] = [];\n let start = 0;\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index];\n const isTerminator = \"。!?!?\".includes(character) || (character === \".\" && /\\s|$/.test(text[index + 1] ?? \"\"));\n if (isTerminator) {\n const value = text.slice(start, index + 1).trim();\n if (value) sentences.push(value);\n start = index + 1;\n }\n }\n const tail = text.slice(start).trim();\n if (tail) sentences.push(tail);\n return sentences;\n}\n\nexport function fromPlainTextToSsml(text: string, options: FromPlainTextToSsmlOptions = {}): string {\n if (typeof text !== \"string\") throw new TypeError(\"Plain text must be a string\");\n const paragraphs = text\n .replace(/\\r\\n?/g, \"\\n\")\n .split(/\\n\\s*\\n/)\n .map((paragraph) => paragraph.replace(/\\s*\\n\\s*/g, \" \").trim())\n .filter(Boolean);\n const useSentences = options.splitSentences ?? options.includeSentences ?? true;\n const paragraphNodes = paragraphs.map((paragraph) => ({\n type: \"p\" as const,\n children: useSentences\n ? splitSentences(paragraph).map((sentence) => ({ type: \"s\" as const, children: [sentence] }))\n : [paragraph],\n }));\n const voiceName = options.voice ?? options.voiceName;\n const children: SsmlNode[] = voiceName\n ? [{ type: \"voice\", name: voiceName, children: paragraphNodes }]\n : paragraphNodes;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n${serializeDocument({\n version: options.version ?? \"1.0\",\n lang: options.lang ?? options.language ?? \"en-US\",\n children,\n })}`;\n}\n\nfunction serializeDocument(document: SsmlDocument): string {\n const attributes = [`version=\"${document.version}\"`, `xml:lang=\"${document.lang}\"`];\n const serialize = (node: SsmlNode): string => {\n if (typeof node === \"string\") return node.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n if (node.type === \"text\") return serialize(node.value);\n const tag = elementName(node);\n const nodeAttributes = elementAttributes(node);\n const serializedAttributes = Object.entries(nodeAttributes)\n .map(([name, value]) => ` ${name}=\"${serialize(value).replace(/\"/g, \"&quot;\")}\"`)\n .join(\"\");\n const children = childrenOf(node).map(serialize).join(\"\");\n return children ? `<${tag}${serializedAttributes}>${children}</${tag}>` : `<${tag}${serializedAttributes}/>`;\n };\n return `<speak ${attributes.join(\" \")} xmlns=\"http://www.w3.org/2001/10/synthesis\">${(document.children ?? [])\n .map(serialize)\n .join(\"\")}</speak>`;\n}\n\ninterface FlatElement {\n name: string;\n attributes: Record<string, string>;\n path: string;\n}\n\nfunction flatten(document: SsmlDocument): FlatElement[] {\n const result: FlatElement[] = [];\n const visit = (nodes: SsmlNode[], path: string): void => {\n nodes.forEach((node, index) => {\n if (typeof node === \"string\" || node.type === \"text\") return;\n const currentPath = `${path}/${index}`;\n result.push({ name: elementName(node), attributes: elementAttributes(node), path: currentPath });\n visit(childrenOf(node), currentPath);\n });\n };\n result.push({ name: \"speak\", attributes: { version: document.version, \"xml:lang\": document.lang }, path: \"0\" });\n visit(childrenOf(document), \"0\");\n return result;\n}\n\nexport function validateSsmlStructureIntegrity(\n originalSsml: string,\n translatedSsml: string,\n): SsmlStructureIntegrityResult {\n const mismatches: SsmlStructureMismatch[] = [];\n let original: SsmlDocument;\n let translated: SsmlDocument;\n try {\n original = parseSsml(originalSsml);\n } catch (error) {\n mismatches.push({ kind: \"parse\", message: `Original SSML cannot be parsed: ${String(error)}`, path: \"0\" });\n return {\n isValid: false,\n valid: false,\n errors: mismatches.map((item) => item.message),\n mismatches,\n mismatchedTags: [],\n };\n }\n try {\n translated = parseSsml(translatedSsml);\n } catch (error) {\n mismatches.push({ kind: \"parse\", message: `Translated SSML cannot be parsed: ${String(error)}`, path: \"0\" });\n return {\n isValid: false,\n valid: false,\n errors: mismatches.map((item) => item.message),\n mismatches,\n mismatchedTags: [],\n };\n }\n\n const originalElements = flatten(original);\n const translatedElements = flatten(translated);\n const count = Math.max(originalElements.length, translatedElements.length);\n for (let index = 0; index < count; index += 1) {\n const originalElement = originalElements[index];\n const translatedElement = translatedElements[index];\n if (!originalElement || !translatedElement || originalElement.name !== translatedElement.name) {\n mismatches.push({\n kind: \"element\",\n message: `SSML element structure differs at index ${index}`,\n original: originalElement?.name,\n path: originalElement?.path ?? translatedElement?.path ?? String(index),\n translated: translatedElement?.name,\n });\n continue;\n }\n const attributeNames = new Set([\n ...Object.keys(originalElement.attributes),\n ...Object.keys(translatedElement.attributes),\n ]);\n for (const attribute of attributeNames) {\n if (originalElement.attributes[attribute] !== translatedElement.attributes[attribute]) {\n mismatches.push({\n kind: \"attribute\",\n message: `Attribute ${attribute} differs on <${originalElement.name}>`,\n original: originalElement.attributes[attribute],\n path: originalElement.path,\n translated: translatedElement.attributes[attribute],\n });\n }\n }\n }\n\n const mismatchedTags = [\n ...new Set(mismatches.flatMap((mismatch) => [mismatch.original, mismatch.translated].filter(Boolean) as string[])),\n ];\n const errors = mismatches.map((mismatch) => mismatch.message);\n return { isValid: mismatches.length === 0, valid: mismatches.length === 0, errors, mismatches, mismatchedTags };\n}\n","/** Generated by scripts/sync-azure-voices.ts. */\nimport type { AzureVoiceDefinition } from \"../azureValidation.ts\";\n\nexport const AZURE_VOICE_DEFINITIONS: readonly AzureVoiceDefinition[] = [\n { name: \"de-DE-ConradNeural\", locale: \"de-DE\", styles: [\"cheerful\", \"sad\"] },\n { name: \"de-DE-KatjaNeural\", locale: \"de-DE\", styles: [\"cheerful\", \"sad\"] },\n { name: \"en-US-AndrewNeural\", locale: \"en-US\", styles: [\"empathetic\", \"relieved\"] },\n {\n name: \"en-US-GuyNeural\",\n locale: \"en-US\",\n styles: [\n \"angry\",\n \"cheerful\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"newscast\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n },\n {\n name: \"en-US-JennyMultilingualNeural\",\n locale: \"en-US\",\n styles: [\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n },\n {\n name: \"en-US-JennyNeural\",\n locale: \"en-US\",\n styles: [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n },\n { name: \"es-ES-ElviraNeural\", locale: \"es-ES\" },\n { name: \"fil-PH-AngeloNeural\", locale: \"fil-PH\" },\n { name: \"fil-PH-Angelo:DragonHDLatestNeural\", locale: \"fil-PH\" },\n { name: \"fil-PH-BlessicaNeural\", locale: \"fil-PH\" },\n { name: \"fil-PH-Blessica:DragonHDLatestNeural\", locale: \"fil-PH\" },\n { name: \"fr-FR-DeniseNeural\", locale: \"fr-FR\", styles: [\"cheerful\", \"sad\"] },\n { name: \"fr-FR-HenriNeural\", locale: \"fr-FR\", styles: [\"cheerful\", \"sad\"] },\n { name: \"id-ID-GadisNeural\", locale: \"id-ID\" },\n { name: \"it-IT-ElsaNeural\", locale: \"it-IT\", styles: [\"cheerful\", \"sad\"] },\n { name: \"ja-JP-KeitaNeural\", locale: \"ja-JP\", styles: [\"chat\"] },\n { name: \"ja-JP-MayuNeural\", locale: \"ja-JP\", styles: [\"calm\", \"cheerful\", \"sad\"] },\n { name: \"ja-JP-NanamiNeural\", locale: \"ja-JP\", styles: [\"chat\", \"customerservice\", \"cheerful\", \"whispering\", \"sad\"] },\n { name: \"ko-KR-SunHiNeural\", locale: \"ko-KR\", styles: [\"cheerful\", \"sad\"] },\n { name: \"ms-MY-YasminNeural\", locale: \"ms-MY\" },\n { name: \"pt-BR-FranciscaNeural\", locale: \"pt-BR\", styles: [\"calm\"] },\n {\n name: \"ru-RU-SvetlanaNeural\",\n locale: \"ru-RU\",\n styles: [\"cheerful\", \"sad\", \"angry\", \"disgruntled\", \"embarrassed\", \"fearful\"],\n },\n { name: \"th-TH-PremwadeeNeural\", locale: \"th-TH\" },\n { name: \"vi-VN-HoaiMyNeural\", locale: \"vi-VN\" },\n {\n name: \"zh-CN-XiaoxiaoNeural\",\n locale: \"zh-CN\",\n styles: [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"terrified\",\n \"whispering\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n ],\n },\n {\n name: \"zh-CN-YunxiNeural\",\n locale: \"zh-CN\",\n styles: [\n \"narration-relaxed\",\n \"embarrassed\",\n \"fearful\",\n \"sad\",\n \"disgruntled\",\n \"serious\",\n \"angry\",\n \"depressed\",\n \"chat\",\n \"cheerful\",\n \"assistant\",\n ],\n },\n { name: \"zh-TW-HsiaoChenNeural\", locale: \"zh-TW\" },\n];\n","import { parseSsml } from \"./parser.ts\";\nimport { AZURE_VOICE_DEFINITIONS } from \"./generated/azureVoiceDefinitions.ts\";\n\nexport type SsmlDiagnosticSeverity = \"error\" | \"warning\" | \"info\";\nexport type SsmlDiagnosticSource = \"ssml-static-validator\";\n\nexport type AzureDiagnosticCode =\n | \"azure-unknown-voice\"\n | \"azure-unsupported-style\"\n | \"azure-locale-mismatch\"\n | \"azure-unsupported-tag-for-voice\"\n | \"azure-unsupported-model-for-voice\"\n | \"azure-preview-voice\"\n | \"azure-deprecated-voice\"\n | \"azure-preview-tag\"\n | \"azure-deprecated-tag\";\n\nexport interface SsmlDiagnostic {\n code?: AzureDiagnosticCode;\n line: number;\n column: number;\n message: string;\n severity: SsmlDiagnosticSeverity;\n source: SsmlDiagnosticSource;\n}\n\nexport interface AzureVoiceDefinition {\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\n/** Alias retained for consumers that prefer the metadata terminology. */\nexport interface AzureVoiceMetadata extends AzureVoiceDefinition {}\n\nexport interface AzureValidationOptions {\n allowedAudioOrigins?: readonly string[];\n allowExternalAudio?: boolean;\n allowHttpAudio?: boolean;\n customVoiceStyleMap?: Record<string, readonly string[]>;\n customVoiceDefinitions?: readonly AzureVoiceDefinition[];\n languageAliases?: Record<string, string | readonly string[]>;\n maxLength?: number;\n /** Maximum XML element nesting depth, counting `<speak>` as depth 1. */\n maxXmlDepth?: number;\n /** Optional model identifier used to validate a voice's model compatibility. */\n model?: string;\n normalizeLanguage?: (lang: string) => string;\n /** Overrides the built-in preview tag list for this validation run. */\n previewTags?: readonly string[];\n /** Adds tags that should be reported as deprecated for this validation run. */\n deprecatedTags?: readonly string[];\n /** Explicit tag lifecycle metadata. This takes precedence over previewTags/deprecatedTags. */\n tagStatuses?: Readonly<Record<string, \"ga\" | \"preview\" | \"deprecated\">>;\n unknownVoicePolicy?: \"error\" | \"warn\" | \"ignore\";\n unsupportedStylePolicy?: \"error\" | \"warn\" | \"ignore\";\n validateNestedVoices?: boolean;\n voiceCatalog?: readonly AzureVoiceDefinition[];\n voiceDefinitions?: readonly AzureVoiceDefinition[];\n}\n\nexport type AzureLanguageNormalizationOptions = Pick<AzureValidationOptions, \"languageAliases\" | \"normalizeLanguage\">;\n\n/** @deprecated Use AzureValidationOptions instead. */\nexport type AzureSsmlValidationOptions = AzureValidationOptions;\n\ninterface ElementToken {\n attributes: Map<string, string>;\n childElementIndex?: number;\n end: number;\n depth: number;\n parentName?: string;\n name: string;\n parentVoiceName?: string;\n start: number;\n selfClosing: boolean;\n}\n\nconst ALLOWED_BREAK_STRENGTHS = new Set([\"none\", \"x-weak\", \"weak\", \"medium\", \"strong\", \"x-strong\"]);\nconst ALLOWED_SAY_AS = new Set([\n \"characters\",\n \"spell-out\",\n \"cardinal\",\n \"ordinal\",\n \"number\",\n \"date\",\n \"time\",\n \"telephone\",\n \"fraction\",\n \"address\",\n \"name\",\n \"currency\",\n \"number_digit\",\n]);\nconst ALLOWED_ROLES = new Set([\n \"Girl\",\n \"Boy\",\n \"YoungAdultFemale\",\n \"YoungAdultMale\",\n \"OlderAdultFemale\",\n \"OlderAdultMale\",\n \"SeniorFemale\",\n \"SeniorMale\",\n]);\nconst ALLOWED_EMPHASIS_LEVELS = new Set([\"strong\", \"moderate\", \"reduced\", \"none\"]);\nconst ALLOWED_SILENCE_TYPES = new Set([\n \"Leading\",\n \"Tailing\",\n \"Sentenceboundary\",\n \"Comma\",\n \"Semicolon\",\n \"Enumerationcomma\",\n]);\nconst ALLOWED_VISEME_TYPES = new Set([\"redlips_front\", \"FacialExpression\"]);\nconst DEFAULT_PREVIEW_TAGS = new Set([\"mstts:voiceconversion\"]);\n\nfunction featureStatusForTag(\n name: string,\n options: AzureValidationOptions,\n): \"ga\" | \"preview\" | \"deprecated\" | undefined {\n const tagName = canonicalTagName(name);\n const configured = Object.entries(options.tagStatuses ?? {}).find(\n ([candidate]) => canonicalTagName(candidate) === tagName,\n )?.[1];\n if (configured) return configured;\n if ((options.previewTags ?? [...DEFAULT_PREVIEW_TAGS]).some((candidate) => canonicalTagName(candidate) === tagName))\n return \"preview\";\n if ((options.deprecatedTags ?? []).some((candidate) => canonicalTagName(candidate) === tagName)) return \"deprecated\";\n return undefined;\n}\n\nfunction decodeAttribute(value: string): string {\n return value.replace(\n /&(?:amp|apos|gt|lt|quot);/gi,\n (entity) =>\n ({ \"&amp;\": \"&\", \"&apos;\": \"'\", \"&gt;\": \">\", \"&lt;\": \"<\", \"&quot;\": '\"' })[entity.toLowerCase()] ?? entity,\n );\n}\n\nfunction findTagEnd(source: string, start: number): number {\n let quote = \"\";\n for (let index = start; index < source.length; index += 1) {\n const character = source[index];\n if (quote) {\n if (character === quote) quote = \"\";\n } else if (character === '\"' || character === \"'\") quote = character;\n else if (character === \">\") return index;\n }\n return source.length - 1;\n}\n\nfunction tokenizeElements(source: string): ElementToken[] {\n const tokens: ElementToken[] = [];\n const openElements: Array<{ childElementCount: number; name: string; voiceName?: string }> = [];\n let index = 0;\n while (index < source.length) {\n const start = source.indexOf(\"<\", index);\n if (start === -1) break;\n if (source.startsWith(\"<!--\", start)) {\n const end = source.indexOf(\"-->\", start + 4);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<![CDATA[\", start)) {\n const end = source.indexOf(\"]]>\", start + 9);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<?\", start)) {\n const end = source.indexOf(\"?>\", start + 2);\n index = end === -1 ? source.length : end + 2;\n continue;\n }\n const end = findTagEnd(source, start + 1);\n const raw = source.slice(start, end + 1);\n if (raw.startsWith(\"</\")) {\n openElements.pop();\n index = end + 1;\n continue;\n }\n const nameMatch = /^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/.exec(raw);\n if (!nameMatch?.[1]) {\n index = end + 1;\n continue;\n }\n const attributes = new Map<string, string>();\n const attributeSource = raw.slice(nameMatch[0].length, raw.length - 1).replace(/\\/\\s*$/, \"\");\n const attributePattern = /([A-Za-z_][A-Za-z0-9_.:-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\n for (const match of attributeSource.matchAll(attributePattern)) {\n attributes.set(match[1].toLowerCase(), decodeAttribute(match[3]));\n }\n const selfClosing = /\\/\\s*>$/.test(raw);\n const parent = openElements[openElements.length - 1];\n const childElementIndex = parent?.childElementCount;\n if (parent) parent.childElementCount += 1;\n const parentVoiceName = [...openElements].reverse().find((element) => element.voiceName)?.voiceName;\n const tokenName = nameMatch[1];\n const tokenVoiceName =\n tokenName.toLowerCase() === \"voice\"\n ? attributes.get(\"name\")\n : tokenName.toLowerCase() === \"mstts:turn\"\n ? (attributes.get(\"voice\") ?? parentVoiceName)\n : parentVoiceName;\n tokens.push({\n attributes,\n childElementIndex,\n end,\n depth: openElements.length + 1,\n name: tokenName,\n parentName: parent?.name,\n parentVoiceName,\n selfClosing,\n start,\n });\n if (!selfClosing) {\n openElements.push({\n childElementCount: 0,\n name: tokenName,\n voiceName: tokenVoiceName,\n });\n }\n index = end + 1;\n }\n return tokens;\n}\n\nfunction location(source: string, offset: number): { column: number; line: number } {\n const before = source.slice(0, Math.max(0, offset));\n const line = before.split(\"\\n\").length;\n return { line, column: before.length - (before.lastIndexOf(\"\\n\") + 1) + 1 };\n}\n\nfunction addDiagnostic(\n diagnostics: SsmlDiagnostic[],\n source: string,\n offset: number,\n message: string,\n severity: SsmlDiagnosticSeverity = \"error\",\n code?: AzureDiagnosticCode,\n): void {\n diagnostics.push({\n ...location(source, offset),\n message,\n severity,\n source: \"ssml-static-validator\",\n ...(code ? { code } : {}),\n });\n}\n\nfunction isSupportedProsodyRate(value: string): boolean {\n const trimmed = value.trim();\n if (/^(x-slow|slow|medium|fast|x-fast|[+-]?\\d+(?:\\.\\d+)?%)$/.test(trimmed)) return true;\n const multiplier = /^(\\d+(?:\\.\\d+)?)(x)?$/i.exec(trimmed);\n if (!multiplier) return false;\n const numericValue = Number(multiplier[1]);\n return numericValue >= 0.5 && numericValue <= 2;\n}\n\n/** Returns whether a value is a positive Azure SSML audio duration. */\nexport function isValidAzureAudioDuration(value: string): boolean {\n const trimmed = value.trim();\n const numeric = /^(\\d+(?:\\.\\d+)?)(ms|s)$/.exec(trimmed);\n if (numeric) return Number(numeric[1]) > 0;\n\n const clock = /^(\\d{2,}):([0-5]\\d):([0-5]\\d)(?:\\.(\\d{1,3}))?$/.exec(trimmed);\n if (!clock) return false;\n return Number(clock[1]) > 0 || Number(clock[2]) > 0 || Number(clock[3]) > 0 || Number(clock[4] ?? 0) > 0;\n}\n\nfunction isValidAzureBackgroundAudioDuration(value: string): boolean {\n const match = /^(\\d+)$/.exec(value.trim());\n if (!match) return false;\n const milliseconds = Number(match[1]);\n return Number.isFinite(milliseconds) && milliseconds >= 0 && milliseconds <= 10_000;\n}\n\nfunction attr(token: ElementToken, name: string): string | undefined {\n return token.attributes.get(name.toLowerCase());\n}\n\nconst DEFAULT_LANGUAGE_ALIASES: Readonly<Record<string, readonly string[]>> = {\n \"zh-CN\": [\"zh-Hans\"],\n \"zh-TW\": [\"zh-Hant\"],\n};\n\nfunction canonicalLanguageTag(language: string): string {\n const trimmed = language.trim();\n if (!trimmed) return \"\";\n try {\n return new Intl.Locale(trimmed).toString().toLowerCase();\n } catch {\n return trimmed.toLowerCase();\n }\n}\n\nfunction createLanguageNormalizer(options: AzureValidationOptions): (language: string) => string {\n const aliases = new Map<string, string>();\n const addAliasGroup = (canonical: string, values: readonly string[]): void => {\n const normalizedCanonical = canonicalLanguageTag(canonical);\n if (!normalizedCanonical) return;\n aliases.set(normalizedCanonical, normalizedCanonical);\n for (const value of values) {\n const normalizedValue = canonicalLanguageTag(value);\n if (normalizedValue) aliases.set(normalizedValue, normalizedCanonical);\n }\n };\n for (const [canonical, values] of Object.entries(DEFAULT_LANGUAGE_ALIASES)) addAliasGroup(canonical, values);\n for (const [canonical, valueOrValues] of Object.entries(options.languageAliases ?? {}))\n addAliasGroup(canonical, typeof valueOrValues === \"string\" ? [valueOrValues] : valueOrValues);\n\n return (language: string): string => {\n const customValue = options.normalizeLanguage ? options.normalizeLanguage(language) : language;\n const normalized = canonicalLanguageTag(customValue);\n return aliases.get(normalized) ?? normalized;\n };\n}\n\n/** Normalizes an Azure language tag using BCP 47 and the configured aliases. */\nexport function normalizeAzureLanguage(language: string, options: AzureLanguageNormalizationOptions = {}): string {\n return createLanguageNormalizer(options)(language);\n}\n\n/** Compares two Azure language tags after BCP 47 and alias normalization. */\nexport function areAzureLanguagesEquivalent(\n first: string,\n second: string,\n options: AzureLanguageNormalizationOptions = {},\n): boolean {\n const normalize = createLanguageNormalizer(options);\n const normalizedFirst = normalize(first);\n const normalizedSecond = normalize(second);\n if (normalizedFirst === normalizedSecond) return true;\n return (\n normalizedFirst === languagePart(normalizedFirst) &&\n languagePart(normalizedFirst) === languagePart(normalizedSecond)\n );\n}\n\nfunction voiceLocalePrefix(voiceName: string): { language: string; region: string; tag: string } | undefined {\n const match = /^(?<language>[A-Za-z]{2,3})-(?<region>[A-Za-z]{2}|\\d{3})(?:-|$)/.exec(voiceName.trim());\n if (!match?.groups) return undefined;\n const tag = `${match.groups.language}-${match.groups.region}`;\n return {\n language: match.groups.language.toLowerCase(),\n region: match.groups.region.toLowerCase(),\n tag,\n };\n}\n\nfunction definitionFromStyleMap(voiceName: string, styles: readonly string[]): AzureVoiceDefinition {\n return {\n name: voiceName,\n locale: voiceLocalePrefix(voiceName)?.tag ?? \"\",\n styles,\n };\n}\n\nfunction normalizeVoiceCatalog(options: AzureValidationOptions): ReadonlyMap<string, AzureVoiceDefinition> {\n const definitions = new Map<string, AzureVoiceDefinition>();\n for (const definition of AZURE_VOICE_DEFINITIONS) definitions.set(definition.name.toLowerCase(), definition);\n for (const definition of options.voiceCatalog ?? []) definitions.set(definition.name.toLowerCase(), definition);\n for (const definition of options.voiceDefinitions ?? []) definitions.set(definition.name.toLowerCase(), definition);\n for (const definition of options.customVoiceDefinitions ?? [])\n definitions.set(definition.name.toLowerCase(), definition);\n for (const [voiceName, styles] of Object.entries(options.customVoiceStyleMap ?? {})) {\n const key = voiceName.toLowerCase();\n const current = definitions.get(key);\n definitions.set(key, {\n ...(current ?? definitionFromStyleMap(voiceName, styles)),\n name: current?.name ?? voiceName,\n styles: styles.map((style) => style.toLowerCase()),\n });\n }\n return definitions;\n}\n\nfunction diagnosticSeverity(policy: AzureValidationOptions[\"unknownVoicePolicy\"]): SsmlDiagnosticSeverity | undefined {\n if (policy === \"ignore\") return undefined;\n return policy === \"error\" ? \"error\" : \"warning\";\n}\n\nfunction languagePart(language: string): string {\n try {\n return new Intl.Locale(language).language.toLowerCase();\n } catch {\n return language.split(\"-\")[0]?.toLowerCase() ?? \"\";\n }\n}\n\nfunction definitionMatchesLanguage(\n definition: AzureVoiceDefinition | undefined,\n voiceName: string,\n language: string,\n normalizeLanguage: (language: string) => string,\n): boolean | undefined {\n const candidateLanguages = definition\n ? [definition.locale, ...(definition.secondaryLocales ?? [])].filter(Boolean)\n : [voiceLocalePrefix(voiceName)?.tag ?? \"\"];\n if (candidateLanguages.length === 0 || !language.trim()) return undefined;\n const normalizedLanguage = normalizeLanguage(language);\n const normalizedCandidates = candidateLanguages.map(normalizeLanguage);\n if (normalizedCandidates.includes(normalizedLanguage)) return true;\n if (!normalizedLanguage || !normalizedCandidates.some(Boolean)) return undefined;\n return normalizedLanguage === languagePart(normalizedLanguage)\n ? normalizedCandidates.some((candidate) => languagePart(candidate) === normalizedLanguage)\n : false;\n}\n\nfunction canonicalTagName(name: string): string {\n const normalized = name.toLowerCase();\n if (normalized === \"express-as\" || normalized === \"expressas\") return \"mstts:express-as\";\n if (normalized === \"sayas\") return \"say-as\";\n return normalized;\n}\n\nfunction validateVoiceFeatureMatrix(\n token: ElementToken,\n source: string,\n diagnostics: SsmlDiagnostic[],\n voiceName: string | undefined,\n definition: AzureVoiceDefinition | undefined,\n): void {\n if (!voiceName || !definition || token.name.toLowerCase() === \"voice\" || token.name.toLowerCase() === \"mstts:turn\")\n return;\n\n const tagName = canonicalTagName(token.name);\n const unsupportedTags = new Set((definition.unsupportedTags ?? []).map(canonicalTagName));\n const supportedTags = definition.supportedTags?.map(canonicalTagName);\n if (unsupportedTags.has(tagName) || (supportedTags !== undefined && !supportedTags.includes(tagName))) {\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `Tag <${token.name}> is not supported by voice \"${voiceName}\" according to the configured feature matrix.`,\n \"error\",\n \"azure-unsupported-tag-for-voice\",\n );\n }\n}\n\nfunction validateAudioSource(\n token: ElementToken,\n source: string,\n diagnostics: SsmlDiagnostic[],\n options: AzureValidationOptions,\n elementName: \"audio\" | \"mstts:backgroundaudio\",\n): void {\n const src = attr(token, \"src\");\n if (!src) {\n addDiagnostic(diagnostics, source, token.start, `<${elementName}> requires a \"src\" attribute.`);\n return;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(src);\n } catch {\n addDiagnostic(diagnostics, source, token.start, `<${elementName} src> must be an absolute HTTP(S) URL.`);\n return;\n }\n if (parsed.username || parsed.password)\n addDiagnostic(diagnostics, source, token.start, `<${elementName} src> must not contain URL credentials.`);\n if (parsed.protocol !== \"https:\" && !(options.allowHttpAudio && parsed.protocol === \"http:\"))\n addDiagnostic(diagnostics, source, token.start, `<${elementName} src> must use HTTPS.`);\n const isAllowedOrigin =\n options.allowedAudioOrigins?.some((allowedOrigin) => {\n try {\n const configured = new URL(allowedOrigin);\n if (\n (configured.protocol !== \"https:\" && configured.protocol !== \"http:\") ||\n configured.username ||\n configured.password ||\n configured.pathname !== \"/\" ||\n configured.search ||\n configured.hash\n )\n return false;\n return configured.origin === parsed.origin;\n } catch {\n return false;\n }\n }) ?? false;\n if (options.allowedAudioOrigins && !isAllowedOrigin)\n addDiagnostic(diagnostics, source, token.start, `<${elementName} src> origin \"${parsed.origin}\" is not allowed.`);\n else if (!isAllowedOrigin && !options.allowExternalAudio)\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `<${elementName} src> external origin \"${parsed.origin}\" is blocked by default; set allowExternalAudio to true or provide allowedAudioOrigins.`,\n );\n}\n\nfunction validateElement(\n token: ElementToken,\n source: string,\n diagnostics: SsmlDiagnostic[],\n voiceName: string | undefined,\n options: AzureValidationOptions,\n voiceCatalog: ReadonlyMap<string, AzureVoiceDefinition>,\n): void {\n const name = token.name.toLowerCase();\n const tagStatus = featureStatusForTag(token.name, options);\n if (tagStatus === \"preview\")\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `<${token.name}> is an Azure Speech preview feature and may change or require preview access.`,\n \"warning\",\n \"azure-preview-tag\",\n );\n if (tagStatus === \"deprecated\")\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `<${token.name}> is deprecated by Azure Speech; migrate to a supported alternative.`,\n \"info\",\n \"azure-deprecated-tag\",\n );\n if (name === \"voice\" && !attr(token, \"name\")?.trim())\n addDiagnostic(diagnostics, source, token.start, '<voice> requires a non-empty \"name\" attribute.');\n if (name === \"break\") {\n const time = attr(token, \"time\");\n const strength = attr(token, \"strength\");\n if (!time && !strength)\n addDiagnostic(diagnostics, source, token.start, '<break> requires either \"time\" or \"strength\".');\n if (time && strength)\n addDiagnostic(diagnostics, source, token.start, '<break> must not specify both \"time\" and \"strength\".');\n if (time && !/^\\d+(?:\\.\\d+)?(?:ms|s)$/.test(time.trim()))\n addDiagnostic(diagnostics, source, token.start, '<break time> must use a numeric value followed by \"ms\" or \"s\".');\n if (strength && !ALLOWED_BREAK_STRENGTHS.has(strength))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <break strength> value \"${strength}\".`);\n }\n if (name === \"prosody\") {\n const rate = attr(token, \"rate\");\n const pitch = attr(token, \"pitch\");\n const volume = attr(token, \"volume\");\n if (rate && !isSupportedProsodyRate(rate))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <prosody rate> value \"${rate}\".`);\n if (pitch && !/^(x-low|low|medium|high|x-high|[+-]?\\d+(?:\\.\\d+)?(?:st|Hz|%)?)$/.test(pitch.trim()))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <prosody pitch> value \"${pitch}\".`);\n if (volume && !/^(silent|x-soft|soft|medium|loud|x-loud|[+-]?\\d+(?:\\.\\d+)?(?:dB|%)?)$/.test(volume.trim()))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <prosody volume> value \"${volume}\".`);\n }\n if (name === \"mstts:express-as\" || name === \"express-as\" || name === \"expressas\") {\n const style = attr(token, \"style\");\n if (!style?.trim())\n addDiagnostic(diagnostics, source, token.start, '<mstts:express-as> requires a non-empty \"style\" attribute.');\n const degree = attr(token, \"styledegree\") ?? attr(token, \"style-degree\");\n if (degree && (!/^\\d+(?:\\.\\d+)?$/.test(degree) || Number(degree) < 0.01 || Number(degree) > 2))\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n \"<mstts:express-as styledegree> must be a number between 0.01 and 2.\",\n );\n const role = attr(token, \"role\");\n if (role && !ALLOWED_ROLES.has(role))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <mstts:express-as role> value \"${role}\".`);\n const definition = voiceName ? voiceCatalog.get(voiceName.toLowerCase()) : undefined;\n const supportedStyles = definition?.styles;\n const severity = diagnosticSeverity(options.unsupportedStylePolicy ?? options.unknownVoicePolicy ?? \"warn\");\n if (\n style &&\n definition &&\n !supportedStyles?.some((candidate) => candidate.toLowerCase() === style.toLowerCase()) &&\n severity\n )\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `Unknown style \"${style}\" is not supported by voice \"${voiceName}\" according to the configured voice style map.`,\n severity,\n \"azure-unsupported-style\",\n );\n if (style && voiceName && !definition && severity)\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `Unknown style \"${style}\" cannot be verified because voice \"${voiceName}\" is not registered in the voice style map.`,\n severity,\n );\n }\n if (name === \"say-as\" || name === \"sayas\") {\n const interpretAs = attr(token, \"interpret-as\");\n if (!interpretAs || !ALLOWED_SAY_AS.has(interpretAs))\n addDiagnostic(diagnostics, source, token.start, `<say-as> requires a supported \"interpret-as\" value.`);\n }\n if (name === \"phoneme\" && (!attr(token, \"alphabet\") || !attr(token, \"ph\")))\n addDiagnostic(diagnostics, source, token.start, '<phoneme> requires both \"alphabet\" and \"ph\" attributes.');\n if (name === \"emphasis\" && attr(token, \"level\") && !ALLOWED_EMPHASIS_LEVELS.has(attr(token, \"level\") ?? \"\"))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <emphasis level> value \"${attr(token, \"level\")}\".`);\n if (name === \"sub\" && !attr(token, \"alias\")?.trim())\n addDiagnostic(diagnostics, source, token.start, '<sub> requires a non-empty \"alias\" attribute.');\n if (name === \"lang\" && !attr(token, \"xml:lang\")?.trim() && !attr(token, \"lang\")?.trim())\n addDiagnostic(diagnostics, source, token.start, '<lang> requires an \"xml:lang\" attribute.');\n if (name === \"mark\" && !attr(token, \"name\")?.trim())\n addDiagnostic(diagnostics, source, token.start, '<mark> requires a non-empty \"name\" attribute.');\n if (name === \"bookmark\" && !attr(token, \"mark\")?.trim())\n addDiagnostic(diagnostics, source, token.start, '<bookmark> requires a non-empty \"mark\" attribute.');\n if (name === \"lexicon\") {\n const uri = attr(token, \"uri\");\n if (!uri) addDiagnostic(diagnostics, source, token.start, '<lexicon> requires a \"uri\" attribute.');\n else {\n try {\n const parsed = new URL(uri);\n if (parsed.protocol !== \"https:\")\n addDiagnostic(diagnostics, source, token.start, \"<lexicon uri> must use HTTPS.\");\n } catch {\n addDiagnostic(diagnostics, source, token.start, \"<lexicon uri> must be an absolute HTTPS URL.\");\n }\n }\n }\n if (name === \"mstts:silence\") {\n const type = attr(token, \"type\");\n const value = attr(token, \"value\");\n if (!type || !ALLOWED_SILENCE_TYPES.has(type))\n addDiagnostic(diagnostics, source, token.start, '<mstts:silence> requires a supported \"type\" attribute.');\n if (!value || !/^\\d+(?:\\.\\d+)?(?:ms|s)$/.test(value.trim()))\n addDiagnostic(diagnostics, source, token.start, '<mstts:silence> requires a time-valued \"value\" attribute.');\n }\n if (name === \"mstts:audioduration\") {\n const value = attr(token, \"value\");\n if (!value || !isValidAzureAudioDuration(value))\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n '<mstts:audioduration> requires a positive duration such as \"10s\", \"5000ms\", or \"00:00:10\".',\n );\n if (!token.selfClosing)\n addDiagnostic(diagnostics, source, token.start, \"<mstts:audioduration> must be self-closing.\");\n }\n if (name === \"mstts:viseme\") {\n const type = attr(token, \"type\");\n if (!type || !ALLOWED_VISEME_TYPES.has(type))\n addDiagnostic(diagnostics, source, token.start, '<mstts:viseme> requires a supported \"type\" attribute.');\n }\n if (name === \"audio\") {\n validateAudioSource(token, source, diagnostics, options, \"audio\");\n }\n if (name === \"mstts:turn\") {\n if (!attr(token, \"voice\")?.trim() && !attr(token, \"speaker\")?.trim())\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n '<mstts:turn> requires a non-empty \"voice\" or \"speaker\" attribute.',\n );\n if (token.parentName?.toLowerCase() !== \"mstts:dialog\")\n addDiagnostic(diagnostics, source, token.start, \"<mstts:turn> is only allowed directly inside <mstts:dialog>.\");\n }\n if (name === \"mstts:backgroundaudio\") {\n validateAudioSource(token, source, diagnostics, options, \"mstts:backgroundaudio\");\n const volume = attr(token, \"volume\");\n if (volume !== undefined && (!/^\\d+(?:\\.\\d+)?$/.test(volume.trim()) || Number(volume) > 100))\n addDiagnostic(diagnostics, source, token.start, `Unsupported <mstts:backgroundaudio volume> value \"${volume}\".`);\n for (const [attribute, value] of [\n [\"fadein\", attr(token, \"fadein\")],\n [\"fadeout\", attr(token, \"fadeout\")],\n ] as const) {\n if (value !== undefined && !isValidAzureBackgroundAudioDuration(value))\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n `<mstts:backgroundaudio ${attribute}> must be between 0 and 10000 milliseconds, for example \"500ms\" or \"10s\".`,\n );\n }\n if (token.parentName?.toLowerCase() !== \"speak\" || token.childElementIndex !== 0)\n addDiagnostic(\n diagnostics,\n source,\n token.start,\n \"<mstts:backgroundaudio> must be the first element directly under <speak>.\",\n );\n if (!token.selfClosing)\n addDiagnostic(diagnostics, source, token.start, \"<mstts:backgroundaudio> must be self-closing.\");\n }\n}\n\nexport function validateAzureSsml(ssml: string, options: AzureValidationOptions = {}): SsmlDiagnostic[] {\n const diagnostics: SsmlDiagnostic[] = [];\n if (typeof ssml !== \"string\") {\n return [\n {\n line: 1,\n column: 1,\n message: \"SSML input must be a string\",\n severity: \"error\",\n source: \"ssml-static-validator\",\n },\n ];\n }\n const maxLength = options.maxLength ?? 10_000;\n if (ssml.length > maxLength)\n addDiagnostic(diagnostics, ssml, maxLength, `SSML exceeds the maximum length of ${maxLength} characters.`);\n if (options.maxXmlDepth !== undefined && (!Number.isInteger(options.maxXmlDepth) || options.maxXmlDepth <= 0)) {\n addDiagnostic(diagnostics, ssml, 0, \"maxXmlDepth must be a positive integer.\");\n }\n try {\n parseSsml(ssml);\n } catch (error) {\n const message = error instanceof Error ? error.message.replace(/ at position \\d+$/, \"\") : String(error);\n const match = / at position (\\d+)$/.exec(error instanceof Error ? error.message : \"\");\n addDiagnostic(diagnostics, ssml, match ? Number(match[1]) : 0, message);\n return diagnostics;\n }\n const tokens = tokenizeElements(ssml);\n if (options.maxXmlDepth !== undefined) {\n for (const token of tokens) {\n if (token.depth > options.maxXmlDepth) {\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n `XML nesting depth ${token.depth} exceeds the configured maximum of ${options.maxXmlDepth}.`,\n );\n }\n }\n }\n const speak = tokens.find((token) => token.name.toLowerCase() === \"speak\");\n const voices = tokens.filter((token) => token.name.toLowerCase() === \"voice\");\n const backgroundAudioTokens = tokens.filter((token) => token.name.toLowerCase() === \"mstts:backgroundaudio\");\n for (const [index, token] of backgroundAudioTokens.entries()) {\n if (index > 0)\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n \"An SSML document can contain at most one <mstts:backgroundaudio> element.\",\n );\n }\n if (!speak || voices.length === 0)\n addDiagnostic(\n diagnostics,\n ssml,\n speak?.start ?? 0,\n \"Azure SSML requires at least one <voice> element under <speak>.\",\n );\n const voiceName = voices[0] ? attr(voices[0], \"name\") : undefined;\n const voiceCatalog = normalizeVoiceCatalog(options);\n const normalizeLanguage = createLanguageNormalizer(options);\n const policySeverity = diagnosticSeverity(options.unknownVoicePolicy ?? \"warn\");\n const voicesToValidate = options.validateNestedVoices === false ? voices.slice(0, 1) : voices;\n for (const token of voicesToValidate) {\n const name = attr(token, \"name\")?.trim();\n const language = attr(token, \"xml:lang\")?.trim() || (speak ? attr(speak, \"xml:lang\")?.trim() : undefined);\n const definition = name ? voiceCatalog.get(name.toLowerCase()) : undefined;\n if (name && definition?.status === \"preview\")\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n `Voice \"${name}\" is an Azure Speech preview voice and may change or require preview access.`,\n \"warning\",\n \"azure-preview-voice\",\n );\n if (name && definition?.status === \"deprecated\")\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n `Voice \"${name}\" is deprecated by Azure Speech; migrate to a supported voice.`,\n \"info\",\n \"azure-deprecated-voice\",\n );\n if (name && !definition && policySeverity)\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n `Unknown voice \"${name}\" is not registered in the voice catalog.`,\n policySeverity,\n \"azure-unknown-voice\",\n );\n if (name && language && definitionMatchesLanguage(definition, name, language, normalizeLanguage) === false)\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n `Voice \"${name}\" does not match language \"${language}\"; the voice name prefix indicates a different language or region.`,\n \"warning\",\n \"azure-locale-mismatch\",\n );\n }\n for (const token of tokens) {\n const tokenName = token.name.toLowerCase();\n const tokenVoiceName =\n tokenName === \"voice\"\n ? attr(token, \"name\")?.trim()\n : tokenName === \"mstts:turn\"\n ? attr(token, \"voice\")?.trim() || token.parentVoiceName\n : options.validateNestedVoices === false\n ? voiceName\n : token.parentVoiceName;\n validateElement(token, ssml, diagnostics, tokenVoiceName, options, voiceCatalog);\n const definition = tokenVoiceName ? voiceCatalog.get(tokenVoiceName.toLowerCase()) : undefined;\n validateVoiceFeatureMatrix(token, ssml, diagnostics, tokenVoiceName, definition);\n if (\n tokenName === \"voice\" &&\n options.model &&\n definition?.models &&\n !definition.models.some((model) => model.toLowerCase() === options.model?.toLowerCase())\n ) {\n addDiagnostic(\n diagnostics,\n ssml,\n token.start,\n `Voice \"${tokenVoiceName}\" does not support model \"${options.model}\" according to the configured feature matrix.`,\n \"error\",\n \"azure-unsupported-model-for-voice\",\n );\n }\n }\n return diagnostics;\n}\n","/** Generated by scripts/sync-azure-voices.ts. */\nimport { AZURE_VOICE_DEFINITIONS } from \"./azureVoiceDefinitions.ts\";\n\nexport interface AzureVoiceCatalogMetadata {\n apiVersion: string;\n generatedAt: string;\n regions: readonly string[];\n voiceCount: number;\n}\n\nexport const AZURE_VOICE_CATALOG_METADATA: AzureVoiceCatalogMetadata = {\n apiVersion: \"2025-10-01\",\n generatedAt: \"2026-08-28T00:00:00.000Z\",\n regions: [],\n voiceCount: AZURE_VOICE_DEFINITIONS.length,\n};\n","import { AZURE_VOICE_CATALOG_METADATA } from \"./generated/azureVoiceCatalog.ts\";\nimport type { AzureVoiceCatalogMetadata } from \"./generated/azureVoiceCatalog.ts\";\n\n/** Returns metadata for the built-in Azure voice catalog snapshot. */\nexport function getAzureVoiceCatalogMetadata(): AzureVoiceCatalogMetadata {\n return {\n ...AZURE_VOICE_CATALOG_METADATA,\n regions: [...AZURE_VOICE_CATALOG_METADATA.regions],\n };\n}\n\n/** Alias for consumers that refer to the bundled catalog as the built-in catalog. */\nexport const getBuiltInVoiceCatalogMetadata = getAzureVoiceCatalogMetadata;\n"],"mappings":"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","names":["escapeAttribute","end","addAttribute","serializeDocument","findTagEnd","end","elementName"]}
@@ -542,6 +542,7 @@ var ssmlPresets_exports = {};
542
542
  __export(ssmlPresets_exports, {
543
543
  AUDIO_DURATION_DESCRIPTIONS: () => AUDIO_DURATION_DESCRIPTIONS,
544
544
  AUDIO_DURATION_PRESETS: () => AUDIO_DURATION_PRESETS,
545
+ BACKGROUND_AUDIO_DURATION_PRESETS: () => BACKGROUND_AUDIO_DURATION_PRESETS,
545
546
  BREAK_STRENGTH_PRESETS: () => BREAK_STRENGTH_PRESETS,
546
547
  BREAK_TIME_DESCRIPTIONS: () => BREAK_TIME_DESCRIPTIONS,
547
548
  BREAK_TIME_PRESETS: () => BREAK_TIME_PRESETS,
@@ -623,6 +624,9 @@ var AZURE_VOICE_STYLE_MAP = {
623
624
  ],
624
625
  "es-ES-ElviraNeural": [],
625
626
  "fil-PH-AngeloNeural": [],
627
+ "fil-PH-Angelo:DragonHDLatestNeural": [],
628
+ "fil-PH-BlessicaNeural": [],
629
+ "fil-PH-Blessica:DragonHDLatestNeural": [],
626
630
  "fr-FR-DeniseNeural": ["cheerful", "sad"],
627
631
  "fr-FR-HenriNeural": ["cheerful", "sad"],
628
632
  "id-ID-GadisNeural": [],
@@ -900,6 +904,7 @@ var SAY_AS_PRESETS = [
900
904
  var LANGUAGE_PRESETS = ["ja-JP", "en-US", "de-DE", "fr-FR"];
901
905
  var SILENCE_VALUE_PRESETS = ["300ms", "500ms", "1s"];
902
906
  var AUDIO_DURATION_PRESETS = ["5s", "10s", "30s"];
907
+ var BACKGROUND_AUDIO_DURATION_PRESETS = ["0", "500", "1000", "3000", "10000"];
903
908
  var SILENCE_TYPE_PRESETS = [
904
909
  "Leading",
905
910
  "Tailing",
@@ -961,8 +966,8 @@ var SSML_ATTRIBUTE_PRESETS = {
961
966
  },
962
967
  "mstts:backgroundaudio": {
963
968
  volume: PROSODY_VOLUME_PRESETS,
964
- fadein: AUDIO_DURATION_PRESETS,
965
- fadeout: AUDIO_DURATION_PRESETS
969
+ fadein: BACKGROUND_AUDIO_DURATION_PRESETS,
970
+ fadeout: BACKGROUND_AUDIO_DURATION_PRESETS
966
971
  },
967
972
  silence: {
968
973
  type: SILENCE_TYPE_PRESETS,
@@ -2308,6 +2313,9 @@ var AZURE_VOICE_DEFINITIONS = [
2308
2313
  },
2309
2314
  { name: "es-ES-ElviraNeural", locale: "es-ES" },
2310
2315
  { name: "fil-PH-AngeloNeural", locale: "fil-PH" },
2316
+ { name: "fil-PH-Angelo:DragonHDLatestNeural", locale: "fil-PH" },
2317
+ { name: "fil-PH-BlessicaNeural", locale: "fil-PH" },
2318
+ { name: "fil-PH-Blessica:DragonHDLatestNeural", locale: "fil-PH" },
2311
2319
  { name: "fr-FR-DeniseNeural", locale: "fr-FR", styles: ["cheerful", "sad"] },
2312
2320
  { name: "fr-FR-HenriNeural", locale: "fr-FR", styles: ["cheerful", "sad"] },
2313
2321
  { name: "id-ID-GadisNeural", locale: "id-ID" },
@@ -2402,6 +2410,18 @@ var ALLOWED_SILENCE_TYPES = /* @__PURE__ */ new Set([
2402
2410
  "Enumerationcomma"
2403
2411
  ]);
2404
2412
  var ALLOWED_VISEME_TYPES = /* @__PURE__ */ new Set(["redlips_front", "FacialExpression"]);
2413
+ var DEFAULT_PREVIEW_TAGS = /* @__PURE__ */ new Set(["mstts:voiceconversion"]);
2414
+ function featureStatusForTag(name, options) {
2415
+ const tagName = canonicalTagName(name);
2416
+ const configured = Object.entries(options.tagStatuses ?? {}).find(
2417
+ ([candidate]) => canonicalTagName(candidate) === tagName
2418
+ )?.[1];
2419
+ if (configured) return configured;
2420
+ if ((options.previewTags ?? [...DEFAULT_PREVIEW_TAGS]).some((candidate) => canonicalTagName(candidate) === tagName))
2421
+ return "preview";
2422
+ if ((options.deprecatedTags ?? []).some((candidate) => canonicalTagName(candidate) === tagName)) return "deprecated";
2423
+ return void 0;
2424
+ }
2405
2425
  function decodeAttribute(value) {
2406
2426
  return value.replace(
2407
2427
  /&(?:amp|apos|gt|lt|quot);/gi,
@@ -2470,6 +2490,7 @@ function tokenizeElements(source) {
2470
2490
  attributes,
2471
2491
  childElementIndex,
2472
2492
  end,
2493
+ depth: openElements.length + 1,
2473
2494
  name: tokenName,
2474
2495
  parentName: parent?.name,
2475
2496
  parentVoiceName,
@@ -2518,9 +2539,9 @@ function isValidAzureAudioDuration(value) {
2518
2539
  return Number(clock[1]) > 0 || Number(clock[2]) > 0 || Number(clock[3]) > 0 || Number(clock[4] ?? 0) > 0;
2519
2540
  }
2520
2541
  function isValidAzureBackgroundAudioDuration(value) {
2521
- const match = /^(\d+(?:\.\d+)?)(ms|s)?$/i.exec(value.trim());
2542
+ const match = /^(\d+)$/.exec(value.trim());
2522
2543
  if (!match) return false;
2523
- const milliseconds = Number(match[1]) * (match[2]?.toLowerCase() === "s" ? 1e3 : 1);
2544
+ const milliseconds = Number(match[1]);
2524
2545
  return Number.isFinite(milliseconds) && milliseconds >= 0 && milliseconds <= 1e4;
2525
2546
  }
2526
2547
  function attr(token, name) {
@@ -2650,13 +2671,18 @@ function validateAudioSource(token, source, diagnostics, options, elementName2)
2650
2671
  addDiagnostic(diagnostics, source, token.start, `<${elementName2} src> must be an absolute HTTP(S) URL.`);
2651
2672
  return;
2652
2673
  }
2674
+ if (parsed.username || parsed.password)
2675
+ addDiagnostic(diagnostics, source, token.start, `<${elementName2} src> must not contain URL credentials.`);
2653
2676
  if (parsed.protocol !== "https:" && !(options.allowHttpAudio && parsed.protocol === "http:"))
2654
2677
  addDiagnostic(diagnostics, source, token.start, `<${elementName2} src> must use HTTPS.`);
2655
2678
  const isAllowedOrigin = options.allowedAudioOrigins?.some((allowedOrigin) => {
2656
2679
  try {
2657
- return new URL(allowedOrigin).origin === parsed.origin;
2680
+ const configured = new URL(allowedOrigin);
2681
+ if (configured.protocol !== "https:" && configured.protocol !== "http:" || configured.username || configured.password || configured.pathname !== "/" || configured.search || configured.hash)
2682
+ return false;
2683
+ return configured.origin === parsed.origin;
2658
2684
  } catch {
2659
- return allowedOrigin === parsed.origin;
2685
+ return false;
2660
2686
  }
2661
2687
  }) ?? false;
2662
2688
  if (options.allowedAudioOrigins && !isAllowedOrigin)
@@ -2671,6 +2697,25 @@ function validateAudioSource(token, source, diagnostics, options, elementName2)
2671
2697
  }
2672
2698
  function validateElement(token, source, diagnostics, voiceName, options, voiceCatalog) {
2673
2699
  const name = token.name.toLowerCase();
2700
+ const tagStatus = featureStatusForTag(token.name, options);
2701
+ if (tagStatus === "preview")
2702
+ addDiagnostic(
2703
+ diagnostics,
2704
+ source,
2705
+ token.start,
2706
+ `<${token.name}> is an Azure Speech preview feature and may change or require preview access.`,
2707
+ "warning",
2708
+ "azure-preview-tag"
2709
+ );
2710
+ if (tagStatus === "deprecated")
2711
+ addDiagnostic(
2712
+ diagnostics,
2713
+ source,
2714
+ token.start,
2715
+ `<${token.name}> is deprecated by Azure Speech; migrate to a supported alternative.`,
2716
+ "info",
2717
+ "azure-deprecated-tag"
2718
+ );
2674
2719
  if (name === "voice" && !attr(token, "name")?.trim())
2675
2720
  addDiagnostic(diagnostics, source, token.start, '<voice> requires a non-empty "name" attribute.');
2676
2721
  if (name === "break") {
@@ -2845,6 +2890,9 @@ function validateAzureSsml(ssml, options = {}) {
2845
2890
  const maxLength = options.maxLength ?? 1e4;
2846
2891
  if (ssml.length > maxLength)
2847
2892
  addDiagnostic(diagnostics, ssml, maxLength, `SSML exceeds the maximum length of ${maxLength} characters.`);
2893
+ if (options.maxXmlDepth !== void 0 && (!Number.isInteger(options.maxXmlDepth) || options.maxXmlDepth <= 0)) {
2894
+ addDiagnostic(diagnostics, ssml, 0, "maxXmlDepth must be a positive integer.");
2895
+ }
2848
2896
  try {
2849
2897
  parseSsml(ssml);
2850
2898
  } catch (error) {
@@ -2854,6 +2902,18 @@ function validateAzureSsml(ssml, options = {}) {
2854
2902
  return diagnostics;
2855
2903
  }
2856
2904
  const tokens = tokenizeElements(ssml);
2905
+ if (options.maxXmlDepth !== void 0) {
2906
+ for (const token of tokens) {
2907
+ if (token.depth > options.maxXmlDepth) {
2908
+ addDiagnostic(
2909
+ diagnostics,
2910
+ ssml,
2911
+ token.start,
2912
+ `XML nesting depth ${token.depth} exceeds the configured maximum of ${options.maxXmlDepth}.`
2913
+ );
2914
+ }
2915
+ }
2916
+ }
2857
2917
  const speak = tokens.find((token) => token.name.toLowerCase() === "speak");
2858
2918
  const voices = tokens.filter((token) => token.name.toLowerCase() === "voice");
2859
2919
  const backgroundAudioTokens = tokens.filter((token) => token.name.toLowerCase() === "mstts:backgroundaudio");
@@ -2882,6 +2942,24 @@ function validateAzureSsml(ssml, options = {}) {
2882
2942
  const name = attr(token, "name")?.trim();
2883
2943
  const language = attr(token, "xml:lang")?.trim() || (speak ? attr(speak, "xml:lang")?.trim() : void 0);
2884
2944
  const definition = name ? voiceCatalog.get(name.toLowerCase()) : void 0;
2945
+ if (name && definition?.status === "preview")
2946
+ addDiagnostic(
2947
+ diagnostics,
2948
+ ssml,
2949
+ token.start,
2950
+ `Voice "${name}" is an Azure Speech preview voice and may change or require preview access.`,
2951
+ "warning",
2952
+ "azure-preview-voice"
2953
+ );
2954
+ if (name && definition?.status === "deprecated")
2955
+ addDiagnostic(
2956
+ diagnostics,
2957
+ ssml,
2958
+ token.start,
2959
+ `Voice "${name}" is deprecated by Azure Speech; migrate to a supported voice.`,
2960
+ "info",
2961
+ "azure-deprecated-voice"
2962
+ );
2885
2963
  if (name && !definition && policySeverity)
2886
2964
  addDiagnostic(
2887
2965
  diagnostics,
@@ -3723,7 +3801,7 @@ var SSML_COMPLETION_SNIPPETS = [
3723
3801
  },
3724
3802
  {
3725
3803
  label: "mstts:backgroundaudio",
3726
- insertText: `<mstts:backgroundaudio src="\${1:https://example.com/audio.mp3}" volume="\${2:-3dB}" />`
3804
+ insertText: `<mstts:backgroundaudio src="\${1:https://example.com/audio.mp3}" volume="\${2:70}" fadein="\${3:1000}" fadeout="\${4:1000}" />`
3727
3805
  },
3728
3806
  {
3729
3807
  label: "mstts:ttsembedding",
@@ -4127,18 +4205,18 @@ var SSML_TAG_DEFINITIONS = [
4127
4205
  },
4128
4206
  {
4129
4207
  name: "volume",
4130
- description: "The background audio volume, for example `-3dB` or `medium`.",
4131
- example: "-3dB"
4208
+ description: "The background audio volume from 0 to 100.",
4209
+ example: "70"
4132
4210
  },
4133
4211
  {
4134
4212
  name: "fadein",
4135
- description: "The fade-in duration, for example `1s`.",
4136
- example: "1s"
4213
+ description: "The fade-in duration in milliseconds from 0 to 10000.",
4214
+ example: "1000"
4137
4215
  },
4138
4216
  {
4139
4217
  name: "fadeout",
4140
- description: "The fade-out duration, for example `500ms`.",
4141
- example: "500ms"
4218
+ description: "The fade-out duration in milliseconds from 0 to 10000.",
4219
+ example: "1000"
4142
4220
  }
4143
4221
  ]
4144
4222
  },
@@ -4508,4 +4586,4 @@ export {
4508
4586
  findSsmlHoverTarget,
4509
4587
  formatSsmlHover
4510
4588
  };
4511
- //# sourceMappingURL=chunk-BYIZQL2W.mjs.map
4589
+ //# sourceMappingURL=chunk-FHDFRM2F.mjs.map