@ssml-builder-js/ssml-editor-react 2.8.0 → 2.8.1
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/CHANGELOG.md +8 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +181 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +181 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/SsmlEditor.tsx +25 -2
- package/src/buttonVisibility.ts +1 -0
- package/src/constants/azureVoiceStyleMap.generated.ts +94 -0
- package/src/constants/ssmlPresets.ts +18 -2
- package/src/formatXml.ts +1 -0
- package/src/hooks/useSsmlEditorState.ts +3 -3
- package/src/locales.ts +14 -0
- package/src/ssmlCodeLens.ts +19 -4
- package/src/ssmlCompletion.ts +4 -0
- package/src/ssmlHover.ts +11 -0
- package/src/ssmlInsertions.ts +24 -1
- package/test/index.test.ts +21 -2
package/dist/index.mjs
CHANGED
|
@@ -17,6 +17,8 @@ function isSsmlEditorButtonVisible(buttonVisibility, button) {
|
|
|
17
17
|
// src/constants/ssmlPresets.ts
|
|
18
18
|
var ssmlPresets_exports = {};
|
|
19
19
|
__export(ssmlPresets_exports, {
|
|
20
|
+
AUDIO_DURATION_DESCRIPTIONS: () => AUDIO_DURATION_DESCRIPTIONS,
|
|
21
|
+
AUDIO_DURATION_PRESETS: () => AUDIO_DURATION_PRESETS,
|
|
20
22
|
BREAK_STRENGTH_PRESETS: () => BREAK_STRENGTH_PRESETS,
|
|
21
23
|
BREAK_TIME_DESCRIPTIONS: () => BREAK_TIME_DESCRIPTIONS,
|
|
22
24
|
BREAK_TIME_PRESETS: () => BREAK_TIME_PRESETS,
|
|
@@ -49,6 +51,103 @@ __export(ssmlPresets_exports, {
|
|
|
49
51
|
getExpressAsStyleCategory: () => getExpressAsStyleCategory,
|
|
50
52
|
resolveExpressAsStyles: () => resolveExpressAsStyles
|
|
51
53
|
});
|
|
54
|
+
|
|
55
|
+
// src/constants/azureVoiceStyleMap.generated.ts
|
|
56
|
+
var AZURE_VOICE_STYLE_MAP = {
|
|
57
|
+
"de-DE-ConradNeural": ["cheerful", "sad"],
|
|
58
|
+
"de-DE-KatjaNeural": ["cheerful", "sad"],
|
|
59
|
+
"en-US-AndrewNeural": ["empathetic", "relieved"],
|
|
60
|
+
"en-US-GuyNeural": [
|
|
61
|
+
"angry",
|
|
62
|
+
"cheerful",
|
|
63
|
+
"excited",
|
|
64
|
+
"friendly",
|
|
65
|
+
"hopeful",
|
|
66
|
+
"newscast",
|
|
67
|
+
"sad",
|
|
68
|
+
"shouting",
|
|
69
|
+
"terrified",
|
|
70
|
+
"unfriendly",
|
|
71
|
+
"whispering"
|
|
72
|
+
],
|
|
73
|
+
"en-US-JennyMultilingualNeural": [
|
|
74
|
+
"cheerful",
|
|
75
|
+
"empathetic",
|
|
76
|
+
"excited",
|
|
77
|
+
"friendly",
|
|
78
|
+
"hopeful",
|
|
79
|
+
"sad",
|
|
80
|
+
"shouting",
|
|
81
|
+
"terrified",
|
|
82
|
+
"unfriendly",
|
|
83
|
+
"whispering"
|
|
84
|
+
],
|
|
85
|
+
"en-US-JennyNeural": [
|
|
86
|
+
"assistant",
|
|
87
|
+
"chat",
|
|
88
|
+
"customerservice",
|
|
89
|
+
"newscast",
|
|
90
|
+
"cheerful",
|
|
91
|
+
"empathetic",
|
|
92
|
+
"excited",
|
|
93
|
+
"friendly",
|
|
94
|
+
"hopeful",
|
|
95
|
+
"sad",
|
|
96
|
+
"shouting",
|
|
97
|
+
"terrified",
|
|
98
|
+
"unfriendly",
|
|
99
|
+
"whispering"
|
|
100
|
+
],
|
|
101
|
+
"es-ES-ElviraNeural": [],
|
|
102
|
+
"fil-PH-AngeloNeural": [],
|
|
103
|
+
"fr-FR-DeniseNeural": ["cheerful", "sad"],
|
|
104
|
+
"fr-FR-HenriNeural": ["cheerful", "sad"],
|
|
105
|
+
"id-ID-GadisNeural": [],
|
|
106
|
+
"it-IT-ElsaNeural": ["cheerful", "sad"],
|
|
107
|
+
"ja-JP-KeitaNeural": ["chat"],
|
|
108
|
+
"ja-JP-MayuNeural": ["calm", "cheerful", "sad"],
|
|
109
|
+
"ja-JP-NanamiNeural": ["chat", "customerservice", "cheerful", "whispering", "sad"],
|
|
110
|
+
"ko-KR-SunHiNeural": ["cheerful", "sad"],
|
|
111
|
+
"ms-MY-YasminNeural": [],
|
|
112
|
+
"pt-BR-FranciscaNeural": ["calm"],
|
|
113
|
+
"ru-RU-SvetlanaNeural": ["cheerful", "sad", "angry", "disgruntled", "embarrassed", "fearful"],
|
|
114
|
+
"th-TH-PremwadeeNeural": [],
|
|
115
|
+
"vi-VN-HoaiMyNeural": [],
|
|
116
|
+
"zh-CN-XiaoxiaoNeural": [
|
|
117
|
+
"assistant",
|
|
118
|
+
"chat",
|
|
119
|
+
"customerservice",
|
|
120
|
+
"newscast",
|
|
121
|
+
"cheerful",
|
|
122
|
+
"empathetic",
|
|
123
|
+
"excited",
|
|
124
|
+
"friendly",
|
|
125
|
+
"hopeful",
|
|
126
|
+
"sad",
|
|
127
|
+
"terrified",
|
|
128
|
+
"whispering",
|
|
129
|
+
"poetry-reading",
|
|
130
|
+
"sports_commentary",
|
|
131
|
+
"sports_commentary_excited",
|
|
132
|
+
"story"
|
|
133
|
+
],
|
|
134
|
+
"zh-CN-YunxiNeural": [
|
|
135
|
+
"narration-relaxed",
|
|
136
|
+
"embarrassed",
|
|
137
|
+
"fearful",
|
|
138
|
+
"sad",
|
|
139
|
+
"disgruntled",
|
|
140
|
+
"serious",
|
|
141
|
+
"angry",
|
|
142
|
+
"depressed",
|
|
143
|
+
"chat",
|
|
144
|
+
"cheerful",
|
|
145
|
+
"assistant"
|
|
146
|
+
],
|
|
147
|
+
"zh-TW-HsiaoChenNeural": []
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// src/constants/ssmlPresets.ts
|
|
52
151
|
var SSML_PRESETS = [
|
|
53
152
|
{
|
|
54
153
|
id: "basic",
|
|
@@ -148,7 +247,7 @@ function getExpressAsStyleCategory(style) {
|
|
|
148
247
|
}
|
|
149
248
|
return "other";
|
|
150
249
|
}
|
|
151
|
-
var
|
|
250
|
+
var LEGACY_VOICE_STYLE_MAP = {
|
|
152
251
|
"ja-JP-MayuNeural": ["calm", "cheerful", "sad"],
|
|
153
252
|
"ja-JP-KeitaNeural": ["chat"],
|
|
154
253
|
"ja-JP-NanamiNeural": ["chat", "customerservice", "cheerful", "whispering", "sad"],
|
|
@@ -234,6 +333,7 @@ var VOICE_STYLE_MAP = {
|
|
|
234
333
|
"de-DE-ConradNeural": ["cheerful", "sad"],
|
|
235
334
|
"ru-RU-SvetlanaNeural": ["cheerful", "sad", "angry", "disgruntled", "embarrassed", "fearful"]
|
|
236
335
|
};
|
|
336
|
+
var VOICE_STYLE_MAP = Object.keys(AZURE_VOICE_STYLE_MAP).length > 0 ? AZURE_VOICE_STYLE_MAP : LEGACY_VOICE_STYLE_MAP;
|
|
237
337
|
var VOICE_STYLE_MAP_BY_NORMALIZED_NAME = new Map(
|
|
238
338
|
Object.entries(VOICE_STYLE_MAP).map(([voiceName, styles]) => [voiceName.toLowerCase(), styles])
|
|
239
339
|
);
|
|
@@ -276,6 +376,7 @@ var SAY_AS_PRESETS = [
|
|
|
276
376
|
];
|
|
277
377
|
var LANGUAGE_PRESETS = ["ja-JP", "en-US", "de-DE", "fr-FR"];
|
|
278
378
|
var SILENCE_VALUE_PRESETS = ["300ms", "500ms", "1s"];
|
|
379
|
+
var AUDIO_DURATION_PRESETS = ["5s", "10s", "30s"];
|
|
279
380
|
var SILENCE_TYPE_PRESETS = [
|
|
280
381
|
"Leading",
|
|
281
382
|
"Tailing",
|
|
@@ -284,6 +385,11 @@ var SILENCE_TYPE_PRESETS = [
|
|
|
284
385
|
"Semicolon",
|
|
285
386
|
"Enumerationcomma"
|
|
286
387
|
];
|
|
388
|
+
var AUDIO_DURATION_DESCRIPTIONS = {
|
|
389
|
+
"5s": { ja: "5\u79D2", en: "5 seconds" },
|
|
390
|
+
"10s": { ja: "10\u79D2", en: "10 seconds" },
|
|
391
|
+
"30s": { ja: "30\u79D2", en: "30 seconds" }
|
|
392
|
+
};
|
|
287
393
|
var PHONEME_ALPHABET_PRESETS = ["ipa", "sapi", "ups", "x-sampa"];
|
|
288
394
|
var VISEME_TYPE_PRESETS = ["redlips_front", "FacialExpression"];
|
|
289
395
|
var SSML_ATTRIBUTE_PRESETS = {
|
|
@@ -327,6 +433,9 @@ var SSML_ATTRIBUTE_PRESETS = {
|
|
|
327
433
|
type: SILENCE_TYPE_PRESETS,
|
|
328
434
|
value: SILENCE_VALUE_PRESETS
|
|
329
435
|
},
|
|
436
|
+
"mstts:audioduration": {
|
|
437
|
+
value: AUDIO_DURATION_PRESETS
|
|
438
|
+
},
|
|
330
439
|
silence: {
|
|
331
440
|
type: SILENCE_TYPE_PRESETS,
|
|
332
441
|
value: SILENCE_VALUE_PRESETS
|
|
@@ -873,6 +982,13 @@ var SSML_HOVER_COPY = {
|
|
|
873
982
|
parameters: {
|
|
874
983
|
type: { title: "type", description: "\u30D3\u30BC\u30FC\u30E0\u30A4\u30D9\u30F3\u30C8\u306E\u5F62\u5F0F\u3002" }
|
|
875
984
|
}
|
|
985
|
+
},
|
|
986
|
+
"mstts:audioduration": {
|
|
987
|
+
title: "\u97F3\u58F0\u9577",
|
|
988
|
+
description: "\u5408\u6210\u97F3\u58F0\u306E\u76EE\u6A19\u6642\u9593\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002",
|
|
989
|
+
parameters: {
|
|
990
|
+
value: { title: "value", description: "\u76EE\u6A19\u6642\u9593\u3002\u4F8B: `10s`\u3001`5000ms`\u3001`00:00:10`\u3002" }
|
|
991
|
+
}
|
|
876
992
|
}
|
|
877
993
|
}
|
|
878
994
|
},
|
|
@@ -1030,6 +1146,13 @@ var SSML_HOVER_COPY = {
|
|
|
1030
1146
|
parameters: {
|
|
1031
1147
|
type: { title: "type", description: "The viseme event format." }
|
|
1032
1148
|
}
|
|
1149
|
+
},
|
|
1150
|
+
"mstts:audioduration": {
|
|
1151
|
+
title: "Audio duration",
|
|
1152
|
+
description: "Sets the target duration of synthesized audio.",
|
|
1153
|
+
parameters: {
|
|
1154
|
+
value: { title: "value", description: "The target duration, such as `10s`, `5000ms`, or `00:00:10`." }
|
|
1155
|
+
}
|
|
1033
1156
|
}
|
|
1034
1157
|
}
|
|
1035
1158
|
}
|
|
@@ -1567,6 +1690,7 @@ var INTRINSICALLY_EMPTY_ELEMENTS = /* @__PURE__ */ new Set([
|
|
|
1567
1690
|
"lexicon",
|
|
1568
1691
|
"mark",
|
|
1569
1692
|
"mstts:silence",
|
|
1693
|
+
"mstts:audioduration",
|
|
1570
1694
|
"mstts:viseme",
|
|
1571
1695
|
"silence",
|
|
1572
1696
|
"viseme"
|
|
@@ -2413,7 +2537,7 @@ function findSsmlVoiceContext(source, offset) {
|
|
|
2413
2537
|
}
|
|
2414
2538
|
|
|
2415
2539
|
// src/hooks/useSsmlEditorState.ts
|
|
2416
|
-
var TIMING_INSERTION_TAGS = /* @__PURE__ */ new Set(["break", "mstts:silence"]);
|
|
2540
|
+
var TIMING_INSERTION_TAGS = /* @__PURE__ */ new Set(["break", "mstts:silence", "mstts:audioduration"]);
|
|
2417
2541
|
var PROSODY_INSERTION_TAGS = /* @__PURE__ */ new Set(["prosody", "mstts:express-as", "voice", "emphasis"]);
|
|
2418
2542
|
var TEXT_INSERTION_TAGS = /* @__PURE__ */ new Set(["sub", "say-as", "phoneme", "w", "lang"]);
|
|
2419
2543
|
var EMPTY_SELECTION_OVERLAY = {
|
|
@@ -3135,6 +3259,10 @@ var SSML_COMPLETION_SNIPPETS = [
|
|
|
3135
3259
|
label: "mstts:express-as",
|
|
3136
3260
|
insertText: `<mstts:express-as style="cheerful">\${1:text}</mstts:express-as>`
|
|
3137
3261
|
},
|
|
3262
|
+
{
|
|
3263
|
+
label: "mstts:audioduration",
|
|
3264
|
+
insertText: '<mstts:audioduration value="10s" />'
|
|
3265
|
+
},
|
|
3138
3266
|
{
|
|
3139
3267
|
label: "sub",
|
|
3140
3268
|
insertText: `<sub alias="\${1:\u8AAD\u307F}">\${2:\u6F22\u5B57}</sub>`
|
|
@@ -3410,7 +3538,7 @@ function registerSsmlCodeLens(monaco, editor, onOpenPopover) {
|
|
|
3410
3538
|
break;
|
|
3411
3539
|
}
|
|
3412
3540
|
const tag = source.slice(tagStart, tagEnd + 1);
|
|
3413
|
-
const tagName = tag.match(/^<\s*(prosody|break)\b/i)?.[1]?.toLowerCase();
|
|
3541
|
+
const tagName = tag.match(/^<\s*(prosody|break|mstts:audioduration)\b/i)?.[1]?.toLowerCase();
|
|
3414
3542
|
index = tagEnd + 1;
|
|
3415
3543
|
if (!tagName) {
|
|
3416
3544
|
continue;
|
|
@@ -3440,7 +3568,22 @@ function registerSsmlCodeLens(monaco, editor, onOpenPopover) {
|
|
|
3440
3568
|
elementRange
|
|
3441
3569
|
})
|
|
3442
3570
|
);
|
|
3443
|
-
} else if (/\/\s*>$/.test(tag)) {
|
|
3571
|
+
} else if (tagName === "mstts:audioduration" && /\/\s*>$/.test(tag)) {
|
|
3572
|
+
lenses.push(
|
|
3573
|
+
createLens(
|
|
3574
|
+
model,
|
|
3575
|
+
tagStart,
|
|
3576
|
+
tagEnd + 1,
|
|
3577
|
+
`\u26A1 Duration: ${getAttributeValue(tag, "value") ?? "default"} (Click to edit)`,
|
|
3578
|
+
{ type: "attribute", insertionId: "mstts:audioduration", attributeName: "value", tagRange }
|
|
3579
|
+
),
|
|
3580
|
+
createLens(model, tagStart, tagEnd + 1, "Delete", {
|
|
3581
|
+
type: "delete",
|
|
3582
|
+
tagRange,
|
|
3583
|
+
elementRange
|
|
3584
|
+
})
|
|
3585
|
+
);
|
|
3586
|
+
} else if (tagName === "break" && /\/\s*>$/.test(tag)) {
|
|
3444
3587
|
lenses.push(
|
|
3445
3588
|
createLens(
|
|
3446
3589
|
model,
|
|
@@ -3776,6 +3919,17 @@ var SSML_TAG_DEFINITIONS = [
|
|
|
3776
3919
|
values: VISEME_TYPE_PRESETS2
|
|
3777
3920
|
}
|
|
3778
3921
|
]
|
|
3922
|
+
},
|
|
3923
|
+
{
|
|
3924
|
+
name: "mstts:audioduration",
|
|
3925
|
+
description: "Sets the target duration of synthesized audio.",
|
|
3926
|
+
parameters: [
|
|
3927
|
+
{
|
|
3928
|
+
name: "value",
|
|
3929
|
+
description: "The target duration, such as `10s`, `5000ms`, or `00:00:10`.",
|
|
3930
|
+
example: "10s"
|
|
3931
|
+
}
|
|
3932
|
+
]
|
|
3779
3933
|
}
|
|
3780
3934
|
];
|
|
3781
3935
|
var definitionsByName = /* @__PURE__ */ new Map();
|
|
@@ -4383,7 +4537,7 @@ function useSsmlMonaco({
|
|
|
4383
4537
|
// src/SsmlEditor.tsx
|
|
4384
4538
|
import { Fragment as Fragment4, jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
4385
4539
|
var UNGROUPED_TOOLBAR_GROUP = "__ssml-editor-ungrouped__";
|
|
4386
|
-
var TIMING_POPOVER_TAGS = /* @__PURE__ */ new Set(["break", "mstts:silence"]);
|
|
4540
|
+
var TIMING_POPOVER_TAGS = /* @__PURE__ */ new Set(["break", "mstts:silence", "mstts:audioduration"]);
|
|
4387
4541
|
var PROSODY_POPOVER_TAGS = /* @__PURE__ */ new Set(["prosody", "mstts:express-as", "voice", "emphasis"]);
|
|
4388
4542
|
var TEXT_POPOVER_TAGS = /* @__PURE__ */ new Set(["sub", "say-as", "phoneme", "w", "lang"]);
|
|
4389
4543
|
function localizedText(value) {
|
|
@@ -4611,13 +4765,34 @@ var SSML_INSERTIONS = [
|
|
|
4611
4765
|
suffix: "",
|
|
4612
4766
|
mode: "insert"
|
|
4613
4767
|
})
|
|
4768
|
+
},
|
|
4769
|
+
{
|
|
4770
|
+
id: "mstts:audioduration",
|
|
4771
|
+
icon: "\u25F7",
|
|
4772
|
+
tagName: "mstts:audioduration",
|
|
4773
|
+
selfClosing: true,
|
|
4774
|
+
labels: { ja: "\u97F3\u58F0\u9577", en: "Audio duration" },
|
|
4775
|
+
descriptions: {
|
|
4776
|
+
ja: "\u5408\u6210\u97F3\u58F0\u306E\u76EE\u6A19\u6642\u9593\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002",
|
|
4777
|
+
en: "Sets the target duration of synthesized audio."
|
|
4778
|
+
},
|
|
4779
|
+
parameterDescription: {
|
|
4780
|
+
ja: "\u76EE\u6A19\u6642\u9593\u3092\u9078\u629E\u3057\u307E\u3059\u3002",
|
|
4781
|
+
en: "Selects the target duration."
|
|
4782
|
+
},
|
|
4783
|
+
options: createInsertionOptions(AUDIO_DURATION_PRESETS, AUDIO_DURATION_DESCRIPTIONS),
|
|
4784
|
+
createTemplate: (value) => ({
|
|
4785
|
+
prefix: `<mstts:audioduration value="${value}"/>`,
|
|
4786
|
+
suffix: "",
|
|
4787
|
+
mode: "insert"
|
|
4788
|
+
})
|
|
4614
4789
|
}
|
|
4615
4790
|
];
|
|
4616
4791
|
var DEFAULT_INSERTION_GROUPS = [
|
|
4617
4792
|
{
|
|
4618
4793
|
id: "pauses",
|
|
4619
4794
|
labels: { ja: "\u9593\u30FB\u7121\u97F3", en: "Pauses" },
|
|
4620
|
-
insertionIds: ["break", "mstts:silence"]
|
|
4795
|
+
insertionIds: ["break", "mstts:silence", "mstts:audioduration"]
|
|
4621
4796
|
},
|
|
4622
4797
|
{
|
|
4623
4798
|
id: "prosody",
|