ssml-builder-js 2.9.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -6
- package/dist/{chunk-JNJVTEL6.mjs → chunk-BYIZQL2W.mjs} +77 -8
- package/dist/chunk-BYIZQL2W.mjs.map +1 -0
- package/dist/{chunk-7LCSH4SZ.mjs → chunk-GW6CKHXF.mjs} +90 -8
- package/dist/chunk-GW6CKHXF.mjs.map +1 -0
- package/dist/core.d.mts +7 -0
- package/dist/core.d.ts +7 -0
- package/dist/core.js +89 -7
- package/dist/core.js.map +1 -1
- package/dist/core.mjs +1 -1
- package/dist/elements.js +76 -7
- package/dist/elements.js.map +1 -1
- package/dist/elements.mjs +1 -1
- package/dist/index.js +89 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/react.d.mts +7 -0
- package/dist/react.d.ts +7 -0
- package/dist/react.js +76 -7
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-7LCSH4SZ.mjs.map +0 -1
- package/dist/chunk-JNJVTEL6.mjs.map +0 -1
|
@@ -53,6 +53,7 @@ var SSML_ATTRS = {
|
|
|
53
53
|
MSTTS_XMLNS: "xmlns:mstts",
|
|
54
54
|
NAME: "name",
|
|
55
55
|
VOICE: "voice",
|
|
56
|
+
SPEAKER: "speaker",
|
|
56
57
|
EFFECT: "effect",
|
|
57
58
|
RATE: "rate",
|
|
58
59
|
PITCH: "pitch",
|
|
@@ -83,6 +84,11 @@ var SSML_ATTRS = {
|
|
|
83
84
|
ALIAS: "alias",
|
|
84
85
|
MARK: "mark",
|
|
85
86
|
URI: "uri",
|
|
87
|
+
ID: "id",
|
|
88
|
+
MODEL: "model",
|
|
89
|
+
PROFILE: "profile",
|
|
90
|
+
URL: "url",
|
|
91
|
+
SPEAKER_PROFILE_ID: "speakerProfileId",
|
|
86
92
|
TYPE: "type",
|
|
87
93
|
VALUE: "value",
|
|
88
94
|
FADE_IN: "fadein",
|
|
@@ -180,6 +186,7 @@ function getAttributes(element) {
|
|
|
180
186
|
break;
|
|
181
187
|
case SSML_TAGS.MSTTS_TURN:
|
|
182
188
|
addAttribute(attributes, SSML_ATTRS.VOICE, element.voice);
|
|
189
|
+
addAttribute(attributes, SSML_ATTRS.SPEAKER, element.speaker);
|
|
183
190
|
break;
|
|
184
191
|
case SSML_TAGS.MSTTS_BACKGROUND_AUDIO:
|
|
185
192
|
addAttribute(attributes, SSML_ATTRS.SRC, element.src);
|
|
@@ -188,9 +195,18 @@ function getAttributes(element) {
|
|
|
188
195
|
addAttribute(attributes, SSML_ATTRS.FADE_OUT, element.fadeOut ?? element.fadeout);
|
|
189
196
|
break;
|
|
190
197
|
case SSML_TAGS.MSTTS_DIALOG:
|
|
198
|
+
break;
|
|
191
199
|
case SSML_TAGS.MSTTS_TTS_EMBEDDING:
|
|
200
|
+
addAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID, element.speakerProfileId);
|
|
201
|
+
break;
|
|
192
202
|
case SSML_TAGS.MSTTS_EMBEDDING:
|
|
203
|
+
addAttribute(attributes, SSML_ATTRS.ID, element.id);
|
|
204
|
+
addAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID, element.speakerProfileId);
|
|
205
|
+
break;
|
|
193
206
|
case SSML_TAGS.MSTTS_VOICE_CONVERSION:
|
|
207
|
+
addAttribute(attributes, SSML_ATTRS.URL, element.url);
|
|
208
|
+
addAttribute(attributes, SSML_ATTRS.PROFILE, element.profile);
|
|
209
|
+
addAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID, element.speakerProfileId);
|
|
194
210
|
break;
|
|
195
211
|
case SSML_TAGS.PARAGRAPH:
|
|
196
212
|
case SSML_TAGS.SENTENCE:
|
|
@@ -765,7 +781,9 @@ function convertElement(node) {
|
|
|
765
781
|
case SSML_TAGS.MSTTS_TURN: {
|
|
766
782
|
const element = { type: SSML_TAGS.MSTTS_TURN };
|
|
767
783
|
const voice = readAttribute(attributes, SSML_ATTRS.VOICE);
|
|
784
|
+
const speaker = readAttribute(attributes, SSML_ATTRS.SPEAKER);
|
|
768
785
|
if (voice !== void 0) element.voice = voice;
|
|
786
|
+
if (speaker !== void 0) element.speaker = speaker;
|
|
769
787
|
return finishElement(element, node, attributes);
|
|
770
788
|
}
|
|
771
789
|
case SSML_TAGS.MSTTS_BACKGROUND_AUDIO: {
|
|
@@ -782,14 +800,26 @@ function convertElement(node) {
|
|
|
782
800
|
}
|
|
783
801
|
case SSML_TAGS.MSTTS_TTS_EMBEDDING: {
|
|
784
802
|
const element = { type: SSML_TAGS.MSTTS_TTS_EMBEDDING };
|
|
803
|
+
const speakerProfileId = readAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID);
|
|
804
|
+
if (speakerProfileId !== void 0) element.speakerProfileId = speakerProfileId;
|
|
785
805
|
return finishElement(element, node, attributes);
|
|
786
806
|
}
|
|
787
807
|
case SSML_TAGS.MSTTS_EMBEDDING: {
|
|
788
808
|
const element = { type: SSML_TAGS.MSTTS_EMBEDDING };
|
|
809
|
+
const id = readAttribute(attributes, SSML_ATTRS.ID);
|
|
810
|
+
const speakerProfileId = readAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID);
|
|
811
|
+
if (id !== void 0) element.id = id;
|
|
812
|
+
if (speakerProfileId !== void 0) element.speakerProfileId = speakerProfileId;
|
|
789
813
|
return finishElement(element, node, attributes);
|
|
790
814
|
}
|
|
791
815
|
case SSML_TAGS.MSTTS_VOICE_CONVERSION: {
|
|
792
816
|
const element = { type: SSML_TAGS.MSTTS_VOICE_CONVERSION };
|
|
817
|
+
const url = readAttribute(attributes, SSML_ATTRS.URL);
|
|
818
|
+
const profile = readAttribute(attributes, SSML_ATTRS.PROFILE);
|
|
819
|
+
const speakerProfileId = readAttribute(attributes, SSML_ATTRS.SPEAKER_PROFILE_ID);
|
|
820
|
+
if (url !== void 0) element.url = url;
|
|
821
|
+
if (profile !== void 0) element.profile = profile;
|
|
822
|
+
if (speakerProfileId !== void 0) element.speakerProfileId = speakerProfileId;
|
|
793
823
|
return finishElement(element, node, attributes);
|
|
794
824
|
}
|
|
795
825
|
default: {
|
|
@@ -1165,6 +1195,7 @@ function elementAttributes(element) {
|
|
|
1165
1195
|
break;
|
|
1166
1196
|
case "mstts:turn":
|
|
1167
1197
|
addAttribute2(attributes, "voice", element.voice);
|
|
1198
|
+
addAttribute2(attributes, "speaker", element.speaker);
|
|
1168
1199
|
break;
|
|
1169
1200
|
case "mstts:backgroundaudio":
|
|
1170
1201
|
addAttribute2(attributes, "src", element.src);
|
|
@@ -1172,6 +1203,18 @@ function elementAttributes(element) {
|
|
|
1172
1203
|
addAttribute2(attributes, "fadein", element.fadeIn ?? element.fadein);
|
|
1173
1204
|
addAttribute2(attributes, "fadeout", element.fadeOut ?? element.fadeout);
|
|
1174
1205
|
break;
|
|
1206
|
+
case "mstts:ttsembedding":
|
|
1207
|
+
addAttribute2(attributes, "speakerProfileId", element.speakerProfileId);
|
|
1208
|
+
break;
|
|
1209
|
+
case "mstts:embedding":
|
|
1210
|
+
addAttribute2(attributes, "id", element.id);
|
|
1211
|
+
addAttribute2(attributes, "speakerProfileId", element.speakerProfileId);
|
|
1212
|
+
break;
|
|
1213
|
+
case "mstts:voiceconversion":
|
|
1214
|
+
addAttribute2(attributes, "url", element.url);
|
|
1215
|
+
addAttribute2(attributes, "profile", element.profile);
|
|
1216
|
+
addAttribute2(attributes, "speakerProfileId", element.speakerProfileId);
|
|
1217
|
+
break;
|
|
1175
1218
|
}
|
|
1176
1219
|
return Object.fromEntries(Object.entries(attributes).map(([name, value]) => [name, String(value)]));
|
|
1177
1220
|
}
|
|
@@ -1558,11 +1601,14 @@ function tokenizeElements(source) {
|
|
|
1558
1601
|
}
|
|
1559
1602
|
const selfClosing = /\/\s*>$/.test(raw);
|
|
1560
1603
|
const parent = openElements[openElements.length - 1];
|
|
1604
|
+
const childElementIndex = parent?.childElementCount;
|
|
1605
|
+
if (parent) parent.childElementCount += 1;
|
|
1561
1606
|
const parentVoiceName = [...openElements].reverse().find((element) => element.voiceName)?.voiceName;
|
|
1562
1607
|
const tokenName = nameMatch[1];
|
|
1563
1608
|
const tokenVoiceName = tokenName.toLowerCase() === "voice" ? attributes.get("name") : tokenName.toLowerCase() === "mstts:turn" ? attributes.get("voice") ?? parentVoiceName : parentVoiceName;
|
|
1564
1609
|
tokens.push({
|
|
1565
1610
|
attributes,
|
|
1611
|
+
childElementIndex,
|
|
1566
1612
|
end,
|
|
1567
1613
|
name: tokenName,
|
|
1568
1614
|
parentName: parent?.name,
|
|
@@ -1572,6 +1618,7 @@ function tokenizeElements(source) {
|
|
|
1572
1618
|
});
|
|
1573
1619
|
if (!selfClosing) {
|
|
1574
1620
|
openElements.push({
|
|
1621
|
+
childElementCount: 0,
|
|
1575
1622
|
name: tokenName,
|
|
1576
1623
|
voiceName: tokenVoiceName
|
|
1577
1624
|
});
|
|
@@ -1610,6 +1657,12 @@ function isValidAzureAudioDuration(value) {
|
|
|
1610
1657
|
if (!clock) return false;
|
|
1611
1658
|
return Number(clock[1]) > 0 || Number(clock[2]) > 0 || Number(clock[3]) > 0 || Number(clock[4] ?? 0) > 0;
|
|
1612
1659
|
}
|
|
1660
|
+
function isValidAzureBackgroundAudioDuration(value) {
|
|
1661
|
+
const match = /^(\d+(?:\.\d+)?)(ms|s)?$/i.exec(value.trim());
|
|
1662
|
+
if (!match) return false;
|
|
1663
|
+
const milliseconds = Number(match[1]) * (match[2]?.toLowerCase() === "s" ? 1e3 : 1);
|
|
1664
|
+
return Number.isFinite(milliseconds) && milliseconds >= 0 && milliseconds <= 1e4;
|
|
1665
|
+
}
|
|
1613
1666
|
function attr(token, name) {
|
|
1614
1667
|
return token.attributes.get(name.toLowerCase());
|
|
1615
1668
|
}
|
|
@@ -1749,9 +1802,16 @@ function validateAudioSource(token, source, diagnostics, options, elementName2)
|
|
|
1749
1802
|
}
|
|
1750
1803
|
if (parsed.protocol !== "https:" && !(options.allowHttpAudio && parsed.protocol === "http:"))
|
|
1751
1804
|
addDiagnostic(diagnostics, source, token.start, `<${elementName2} src> must use HTTPS.`);
|
|
1752
|
-
|
|
1805
|
+
const isAllowedOrigin = options.allowedAudioOrigins?.some((allowedOrigin) => {
|
|
1806
|
+
try {
|
|
1807
|
+
return new URL(allowedOrigin).origin === parsed.origin;
|
|
1808
|
+
} catch {
|
|
1809
|
+
return allowedOrigin === parsed.origin;
|
|
1810
|
+
}
|
|
1811
|
+
}) ?? false;
|
|
1812
|
+
if (options.allowedAudioOrigins && !isAllowedOrigin)
|
|
1753
1813
|
addDiagnostic(diagnostics, source, token.start, `<${elementName2} src> origin "${parsed.origin}" is not allowed.`);
|
|
1754
|
-
else if (!options.allowExternalAudio)
|
|
1814
|
+
else if (!isAllowedOrigin && !options.allowExternalAudio)
|
|
1755
1815
|
addDiagnostic(
|
|
1756
1816
|
diagnostics,
|
|
1757
1817
|
source,
|
|
@@ -1881,28 +1941,40 @@ function validateElement(token, source, diagnostics, voiceName, options, voiceCa
|
|
|
1881
1941
|
validateAudioSource(token, source, diagnostics, options, "audio");
|
|
1882
1942
|
}
|
|
1883
1943
|
if (name === "mstts:turn") {
|
|
1884
|
-
if (!attr(token, "voice")?.trim())
|
|
1885
|
-
addDiagnostic(
|
|
1944
|
+
if (!attr(token, "voice")?.trim() && !attr(token, "speaker")?.trim())
|
|
1945
|
+
addDiagnostic(
|
|
1946
|
+
diagnostics,
|
|
1947
|
+
source,
|
|
1948
|
+
token.start,
|
|
1949
|
+
'<mstts:turn> requires a non-empty "voice" or "speaker" attribute.'
|
|
1950
|
+
);
|
|
1886
1951
|
if (token.parentName?.toLowerCase() !== "mstts:dialog")
|
|
1887
1952
|
addDiagnostic(diagnostics, source, token.start, "<mstts:turn> is only allowed directly inside <mstts:dialog>.");
|
|
1888
1953
|
}
|
|
1889
1954
|
if (name === "mstts:backgroundaudio") {
|
|
1890
1955
|
validateAudioSource(token, source, diagnostics, options, "mstts:backgroundaudio");
|
|
1891
1956
|
const volume = attr(token, "volume");
|
|
1892
|
-
if (volume &&
|
|
1957
|
+
if (volume !== void 0 && (!/^\d+(?:\.\d+)?$/.test(volume.trim()) || Number(volume) > 100))
|
|
1893
1958
|
addDiagnostic(diagnostics, source, token.start, `Unsupported <mstts:backgroundaudio volume> value "${volume}".`);
|
|
1894
1959
|
for (const [attribute, value] of [
|
|
1895
1960
|
["fadein", attr(token, "fadein")],
|
|
1896
1961
|
["fadeout", attr(token, "fadeout")]
|
|
1897
1962
|
]) {
|
|
1898
|
-
if (value && !
|
|
1963
|
+
if (value !== void 0 && !isValidAzureBackgroundAudioDuration(value))
|
|
1899
1964
|
addDiagnostic(
|
|
1900
1965
|
diagnostics,
|
|
1901
1966
|
source,
|
|
1902
1967
|
token.start,
|
|
1903
|
-
`<mstts:backgroundaudio ${attribute}> must be
|
|
1968
|
+
`<mstts:backgroundaudio ${attribute}> must be between 0 and 10000 milliseconds, for example "500ms" or "10s".`
|
|
1904
1969
|
);
|
|
1905
1970
|
}
|
|
1971
|
+
if (token.parentName?.toLowerCase() !== "speak" || token.childElementIndex !== 0)
|
|
1972
|
+
addDiagnostic(
|
|
1973
|
+
diagnostics,
|
|
1974
|
+
source,
|
|
1975
|
+
token.start,
|
|
1976
|
+
"<mstts:backgroundaudio> must be the first element directly under <speak>."
|
|
1977
|
+
);
|
|
1906
1978
|
if (!token.selfClosing)
|
|
1907
1979
|
addDiagnostic(diagnostics, source, token.start, "<mstts:backgroundaudio> must be self-closing.");
|
|
1908
1980
|
}
|
|
@@ -1934,6 +2006,16 @@ function validateAzureSsml(ssml, options = {}) {
|
|
|
1934
2006
|
const tokens = tokenizeElements(ssml);
|
|
1935
2007
|
const speak = tokens.find((token) => token.name.toLowerCase() === "speak");
|
|
1936
2008
|
const voices = tokens.filter((token) => token.name.toLowerCase() === "voice");
|
|
2009
|
+
const backgroundAudioTokens = tokens.filter((token) => token.name.toLowerCase() === "mstts:backgroundaudio");
|
|
2010
|
+
for (const [index, token] of backgroundAudioTokens.entries()) {
|
|
2011
|
+
if (index > 0)
|
|
2012
|
+
addDiagnostic(
|
|
2013
|
+
diagnostics,
|
|
2014
|
+
ssml,
|
|
2015
|
+
token.start,
|
|
2016
|
+
"An SSML document can contain at most one <mstts:backgroundaudio> element."
|
|
2017
|
+
);
|
|
2018
|
+
}
|
|
1937
2019
|
if (!speak || voices.length === 0)
|
|
1938
2020
|
addDiagnostic(
|
|
1939
2021
|
diagnostics,
|
|
@@ -2023,4 +2105,4 @@ export {
|
|
|
2023
2105
|
getAzureVoiceCatalogMetadata,
|
|
2024
2106
|
getBuiltInVoiceCatalogMetadata
|
|
2025
2107
|
};
|
|
2026
|
-
//# sourceMappingURL=chunk-
|
|
2108
|
+
//# sourceMappingURL=chunk-GW6CKHXF.mjs.map
|
|
@@ -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/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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\").replace(/'/g, \"'\");\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, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\");\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 { 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 === \"&\") return \"&\";\n if (entity === \"'\") return \"'\";\n if (entity === \">\") return \">\";\n if (entity === \"<\") return \"<\";\n if (entity === \""\") 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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\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, \""\")}\"`)\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: \"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\";\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\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}\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 /** Optional model identifier used to validate a voice's model compatibility. */\n model?: string;\n normalizeLanguage?: (lang: string) => string;\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 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\"]);\n\nfunction decodeAttribute(value: string): string {\n return value.replace(\n /&(?:amp|apos|gt|lt|quot);/gi,\n (entity) =>\n ({ \"&\": \"&\", \"'\": \"'\", \">\": \">\", \"<\": \"<\", \""\": '\"' })[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 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+(?:\\.\\d+)?)(ms|s)?$/i.exec(value.trim());\n if (!match) return false;\n const milliseconds = Number(match[1]) * (match[2]?.toLowerCase() === \"s\" ? 1000 : 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.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 return new URL(allowedOrigin).origin === parsed.origin;\n } catch {\n return allowedOrigin === parsed.origin;\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 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 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 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 && 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"]}
|
package/dist/core.d.mts
CHANGED
|
@@ -109,6 +109,7 @@ interface SsmlDialogNode extends SsmlElementBase {
|
|
|
109
109
|
interface SsmlTurnNode extends SsmlElementBase {
|
|
110
110
|
type: "mstts:turn";
|
|
111
111
|
voice?: string;
|
|
112
|
+
speaker?: string;
|
|
112
113
|
}
|
|
113
114
|
interface SsmlBackgroundAudioNode extends SsmlElementBase {
|
|
114
115
|
type: "mstts:backgroundaudio";
|
|
@@ -122,12 +123,18 @@ interface SsmlBackgroundAudioNode extends SsmlElementBase {
|
|
|
122
123
|
}
|
|
123
124
|
interface MsttsTtsEmbeddingElement extends SsmlElementBase {
|
|
124
125
|
type: "mstts:ttsembedding";
|
|
126
|
+
speakerProfileId?: string;
|
|
125
127
|
}
|
|
126
128
|
interface MsttsEmbeddingElement extends SsmlElementBase {
|
|
127
129
|
type: "mstts:embedding";
|
|
130
|
+
id?: string;
|
|
131
|
+
speakerProfileId?: string;
|
|
128
132
|
}
|
|
129
133
|
interface MsttsVoiceConversionElement extends SsmlElementBase {
|
|
130
134
|
type: "mstts:voiceconversion";
|
|
135
|
+
url?: string;
|
|
136
|
+
profile?: string;
|
|
137
|
+
speakerProfileId?: string;
|
|
131
138
|
}
|
|
132
139
|
type SsmlTtsEmbeddingNode = MsttsTtsEmbeddingElement;
|
|
133
140
|
type SsmlEmbeddingNode = MsttsEmbeddingElement;
|