@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/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 VOICE_STYLE_MAP = {
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",