@rydr/game-sdk 3.10.0 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/client/PlatformClient.d.ts +15 -3
  2. package/dist/client/PlatformClient.d.ts.map +1 -1
  3. package/dist/client/PlatformClient.js +1 -1
  4. package/dist/client/PlatformClient.js.map +1 -1
  5. package/dist/conversations/index.d.ts +15 -4
  6. package/dist/conversations/index.d.ts.map +1 -1
  7. package/dist/conversations/index.js +43 -14
  8. package/dist/conversations/index.js.map +1 -1
  9. package/dist/conversations/voice-samples.d.ts +45 -0
  10. package/dist/conversations/voice-samples.d.ts.map +1 -0
  11. package/dist/conversations/voice-samples.js +244 -0
  12. package/dist/conversations/voice-samples.js.map +1 -0
  13. package/dist/conversations/voices.d.ts +33 -5
  14. package/dist/conversations/voices.d.ts.map +1 -1
  15. package/dist/conversations/voices.js +61 -31
  16. package/dist/conversations/voices.js.map +1 -1
  17. package/dist/host/PlatformHost.d.ts +4 -2
  18. package/dist/host/PlatformHost.d.ts.map +1 -1
  19. package/dist/host/PlatformHost.js +1 -1
  20. package/dist/host/PlatformHost.js.map +1 -1
  21. package/dist/protocol/conversations.d.ts +13 -2
  22. package/dist/protocol/conversations.d.ts.map +1 -1
  23. package/dist/protocol/conversations.js +14 -0
  24. package/dist/protocol/conversations.js.map +1 -1
  25. package/dist/protocol/messages.d.ts +7 -1
  26. package/dist/protocol/messages.d.ts.map +1 -1
  27. package/dist/protocol/version.d.ts +2 -2
  28. package/dist/protocol/version.d.ts.map +1 -1
  29. package/dist/protocol/version.js +7 -2
  30. package/dist/protocol/version.js.map +1 -1
  31. package/dist/sound-gallery/index.d.ts +41 -0
  32. package/dist/sound-gallery/index.d.ts.map +1 -0
  33. package/dist/sound-gallery/index.js +1264 -0
  34. package/dist/sound-gallery/index.js.map +1 -0
  35. package/dist/sounds/audio-utils.d.ts +16 -0
  36. package/dist/sounds/audio-utils.d.ts.map +1 -0
  37. package/dist/sounds/audio-utils.js +150 -0
  38. package/dist/sounds/audio-utils.js.map +1 -0
  39. package/dist/sounds/index.d.ts +23 -0
  40. package/dist/sounds/index.d.ts.map +1 -0
  41. package/dist/sounds/index.js +21 -0
  42. package/dist/sounds/index.js.map +1 -0
  43. package/dist/sounds/sound-bank.d.ts +70 -0
  44. package/dist/sounds/sound-bank.d.ts.map +1 -0
  45. package/dist/sounds/sound-bank.js +313 -0
  46. package/dist/sounds/sound-bank.js.map +1 -0
  47. package/dist/sounds/types.d.ts +88 -0
  48. package/dist/sounds/types.d.ts.map +1 -0
  49. package/dist/sounds/types.js +8 -0
  50. package/dist/sounds/types.js.map +1 -0
  51. package/dist/ui/README.md +2 -0
  52. package/dist/ui/index.d.ts +4 -1
  53. package/dist/ui/index.d.ts.map +1 -1
  54. package/dist/ui/index.js +4 -1
  55. package/dist/ui/index.js.map +1 -1
  56. package/dist/ui/power-race.d.ts +125 -0
  57. package/dist/ui/power-race.d.ts.map +1 -0
  58. package/dist/ui/power-race.js +662 -0
  59. package/dist/ui/power-race.js.map +1 -0
  60. package/dist/ui/showcase/index.d.ts.map +1 -1
  61. package/dist/ui/showcase/index.js +85 -1
  62. package/dist/ui/showcase/index.js.map +1 -1
  63. package/dist/ui/solo-labeled-diamond.d.ts +69 -0
  64. package/dist/ui/solo-labeled-diamond.d.ts.map +1 -0
  65. package/dist/ui/solo-labeled-diamond.js +168 -0
  66. package/dist/ui/solo-labeled-diamond.js.map +1 -0
  67. package/dist/ui/styles.js +24 -2
  68. package/dist/ui/styles.js.map +1 -1
  69. package/dist/ui/subtitle.d.ts +27 -0
  70. package/dist/ui/subtitle.d.ts.map +1 -0
  71. package/dist/ui/subtitle.js +77 -0
  72. package/dist/ui/subtitle.js.map +1 -0
  73. package/dist/voice-gallery/index.d.ts +31 -0
  74. package/dist/voice-gallery/index.d.ts.map +1 -0
  75. package/dist/voice-gallery/index.js +396 -0
  76. package/dist/voice-gallery/index.js.map +1 -0
  77. package/dist/voiceover-editor/index.d.ts +6 -0
  78. package/dist/voiceover-editor/index.d.ts.map +1 -1
  79. package/dist/voiceover-editor/index.js +222 -14
  80. package/dist/voiceover-editor/index.js.map +1 -1
  81. package/package.json +16 -1
@@ -0,0 +1,77 @@
1
+ /**
2
+ * SUBTITLE — the voice-over **"auto" mode** look: a boxless, self-dismissing caption. A large speaker
3
+ * NAME line sits over a large LINE of dialogue, centred with a soft drop shadow and NO frame — so it
4
+ * reads over live gameplay without the weight of the {@link mountDialogueCard} box. Unlike the dialogue
5
+ * card it carries no keycap and never waits for input; the voice-over player ({@link VoicePlayer}) fades
6
+ * it in, holds it for a beat derived from the audio length, and fades it out.
7
+ *
8
+ * Its type sizes + shadow are part of the component contract (a trainer screen read from a few feet away
9
+ * while pedaling) — do NOT restyle them. The ONLY knobs are **position** (`anchor` + `offset`) so it can
10
+ * clear a game's HUD, and whether the **speaker name** shows.
11
+ */
12
+ import { injectCss } from "./styles.js";
13
+ /** Mount a boxless self-dismissing subtitle (the voice-over "auto" caption). */
14
+ export function mountSubtitle(host, opts = {}) {
15
+ injectCss();
16
+ const ms = opts.typeMs ?? 18;
17
+ const showName = opts.showName !== false;
18
+ const root = document.createElement("div");
19
+ root.className = "rydr-ui-sub";
20
+ const nameEl = document.createElement("div");
21
+ nameEl.className = "rydr-ui-sub-name";
22
+ const textEl = document.createElement("div");
23
+ textEl.className = "rydr-ui-sub-text";
24
+ root.append(nameEl, textEl);
25
+ // Position is the one layout knob: anchor to an edge, offset in from it. Everything else is contract.
26
+ const off = opts.offset ?? "9%";
27
+ const offCss = typeof off === "number" ? `${off}px` : off;
28
+ if (opts.anchor === "top") {
29
+ root.style.top = offCss;
30
+ root.style.bottom = "auto";
31
+ }
32
+ else {
33
+ root.style.bottom = offCss;
34
+ root.style.top = "auto";
35
+ }
36
+ host.appendChild(root);
37
+ let timer = null;
38
+ let full = "";
39
+ const stop = () => { if (timer !== null) {
40
+ clearInterval(timer);
41
+ timer = null;
42
+ } };
43
+ return {
44
+ root,
45
+ open(name, text) {
46
+ stop();
47
+ const showThis = showName && !!name;
48
+ nameEl.textContent = showThis ? name : "";
49
+ nameEl.style.display = showThis ? "" : "none";
50
+ full = text ?? "";
51
+ root.classList.add("show");
52
+ if (ms <= 0) {
53
+ textEl.textContent = full;
54
+ return;
55
+ }
56
+ let shown = 0;
57
+ textEl.textContent = "";
58
+ timer = setInterval(() => {
59
+ shown++;
60
+ textEl.textContent = full.slice(0, shown);
61
+ if (shown >= full.length)
62
+ stop();
63
+ }, ms);
64
+ },
65
+ advance() {
66
+ if (timer === null)
67
+ return false;
68
+ stop();
69
+ textEl.textContent = full; // reveal the whole line at once
70
+ return true;
71
+ },
72
+ close() { stop(); root.classList.remove("show"); },
73
+ setVisible(v) { root.classList.toggle("show", v); },
74
+ dispose() { stop(); root.remove(); },
75
+ };
76
+ }
77
+ //# sourceMappingURL=subtitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtitle.js","sourceRoot":"","sources":["../../src/ui/subtitle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /** The session surface the gallery needs — a `PlatformSession` satisfies it. */
2
+ export interface VoiceGallerySession {
3
+ readonly identity: {
4
+ isAdmin?: boolean;
5
+ };
6
+ generateVoiceover(input: {
7
+ text: string;
8
+ voice: string;
9
+ style?: string;
10
+ speed?: number;
11
+ lang?: string;
12
+ }): Promise<{
13
+ url: string;
14
+ hash: string;
15
+ cached: boolean;
16
+ }>;
17
+ }
18
+ export interface VoiceGalleryOptions {
19
+ session: VoiceGallerySession;
20
+ /** Parallel synthesis requests during "Generate all". Default 4. */
21
+ concurrency?: number;
22
+ }
23
+ export interface VoiceGallery {
24
+ dispose(): void;
25
+ }
26
+ /**
27
+ * Mount the voice gallery into `root`. Renders the committed catalogue immediately; an admin can
28
+ * regenerate and export. Returns a handle whose `dispose()` tears it down.
29
+ */
30
+ export declare function mountVoiceGallery(root: HTMLElement, opts: VoiceGalleryOptions): VoiceGallery;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voice-gallery/index.ts"],"names":[],"mappings":"AA4BA,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,iBAAiB,CAAC,KAAK,EAAE;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AA0ED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAuU5F"}
@@ -0,0 +1,396 @@
1
+ /**
2
+ * `@rydr/game-sdk/voice-gallery` — the "All voice characters" page.
3
+ *
4
+ * One row per prebuilt Gemini voice; columns for name/gender/persona, French, and English. Each
5
+ * language cell holds one play button per emotion (Dramatic / Excited / Tense), all speaking the
6
+ * same short line so a listener can compare timbres and deliveries at a glance.
7
+ *
8
+ * Clips are generated ONCE for all consumers (content-addressed in R2) and their URLs are committed
9
+ * to the SDK ({@link VOICE_SAMPLES}). Anyone can then play a clip with {@link getVoiceSample}. An
10
+ * admin sees a "Generate all" button that synthesises every missing clip and produces a ready-to-paste
11
+ * manifest block to commit. Non-admins just play whatever is already committed.
12
+ *
13
+ * Self-contained like `@rydr/game-sdk/ui`: injects its own scoped `.rydr-vg-*` CSS once.
14
+ */
15
+ import { GEMINI_VOICES, VOICE_SAMPLE_EMOTIONS, VOICE_SAMPLE_LANGS, } from "../conversations/voices.js";
16
+ import { getVoiceSamples, voiceSampleJobs, voiceSampleKey, } from "../conversations/voice-samples.js";
17
+ const LANG_LABEL = { fr: "🇫🇷 Français", en: "🇬🇧 English" };
18
+ const GENDER_ICON = { female: "♀", male: "♂" };
19
+ const CSS = `
20
+ .rydr-vg{position:fixed;inset:0;overflow:auto;font:14px/1.5 system-ui,sans-serif;color:#e7e9ee;background:#0d0f14}
21
+ .rydr-vg *{box-sizing:border-box}
22
+ .rydr-vg-head{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:16px;padding:14px 20px;background:#0d0f14;border-bottom:1px solid #232733}
23
+ .rydr-vg-head h1{font-size:16px;margin:0;font-weight:600}
24
+ .rydr-vg-head .sub{color:#8b93a7;font-size:12px}
25
+ .rydr-vg-actions{margin-left:auto;display:flex;align-items:center;gap:10px}
26
+ .rydr-vg-btn{padding:8px 14px;border-radius:8px;border:1px solid #31405f;background:#1b2130;color:#fff;cursor:pointer;font:inherit}
27
+ .rydr-vg-btn:disabled{opacity:.5;cursor:default}
28
+ .rydr-vg-btn.primary{background:#2b5fd6;border-color:#3f74ee}
29
+ .rydr-vg-prog{color:#9aa4b8;font-size:12px;min-width:120px}
30
+ .rydr-vg-prog b{color:#e7e9ee}
31
+ .rydr-vg-tbl{width:100%;border-collapse:collapse}
32
+ .rydr-vg-tbl th{position:sticky;top:57px;z-index:1;background:#12151d;text-align:left;padding:10px 16px;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:#8b93a7;border-bottom:1px solid #232733}
33
+ .rydr-vg-tbl td{padding:12px 16px;border-bottom:1px solid #191d27;vertical-align:top}
34
+ .rydr-vg-tbl tr:hover td{background:#11141b}
35
+ .rydr-vg-name{font-weight:600;display:flex;align-items:center;gap:8px}
36
+ .rydr-vg-g{font-size:13px;font-weight:700}
37
+ .rydr-vg-g.female{color:#ff8fc7}
38
+ .rydr-vg-g.male{color:#6fb4ff}
39
+ .rydr-vg-gender{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600}
40
+ .rydr-vg-filter{display:inline-flex;gap:3px;border:1px solid #2a3242;border-radius:8px;padding:3px;background:#12151d}
41
+ .rydr-vg-fbtn{padding:5px 11px;border-radius:6px;border:none;background:transparent;color:#9aa4b8;cursor:pointer;font:inherit;font-size:12px}
42
+ .rydr-vg-fbtn:hover{color:#e7e9ee}
43
+ .rydr-vg-fbtn.sel{background:#2b5fd6;color:#fff}
44
+ .rydr-vg-persona{color:#8b93a7;font-size:12px;margin-top:2px}
45
+ .rydr-vg-cell{display:flex;flex-wrap:wrap;gap:6px}
46
+ .rydr-vg-clip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;border:1px solid #2a3242;background:#161b25;color:#cdd3e0;cursor:pointer;font:inherit;font-size:12px}
47
+ .rydr-vg-clip:hover:not(:disabled){border-color:#3f74ee;color:#fff}
48
+ .rydr-vg-clip:disabled{opacity:.4;cursor:default}
49
+ .rydr-vg-clip.playing{background:#2b5fd6;border-color:#3f74ee;color:#fff}
50
+ .rydr-vg-clip.gen{border-color:#3f74ee;color:#fff}
51
+ .rydr-vg-clip.err{border-color:#5c2436;background:#2a1119;color:#e2718f}
52
+ .rydr-vg-clip.err:hover:not(:disabled){border-color:#e2718f;color:#f2a9bd}
53
+ .rydr-vg-clip .ic{font-size:10px}
54
+ .rydr-vg-clip.gen .ic{display:inline-block;animation:rydr-vg-spin 1s linear infinite}
55
+ @keyframes rydr-vg-spin{to{transform:rotate(360deg)}}
56
+ .rydr-vg-toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:#1b2130;border:1px solid #31405f;padding:10px 16px;border-radius:8px;box-shadow:0 8px 30px rgba(0,0,0,.5);z-index:5}
57
+ `;
58
+ /** A short, human-readable hint for a TTS failure — flags the content-policy block explicitly so the
59
+ * operator knows to simplify the text/style rather than just retry. */
60
+ function ttsErrorHint(msg) {
61
+ if (/usage guidelines|INVALID_ARGUMENT|violates|safety|policy/i.test(msg)) {
62
+ return "Blocked by content policy — simplify the spoken text and the style, then retry.";
63
+ }
64
+ return msg.length > 140 ? msg.slice(0, 137) + "…" : msg;
65
+ }
66
+ const STYLE_ID = "rydr-vg-style";
67
+ function ensureStyle() {
68
+ if (typeof document === "undefined" || document.getElementById(STYLE_ID))
69
+ return;
70
+ const s = document.createElement("style");
71
+ s.id = STYLE_ID;
72
+ s.textContent = CSS;
73
+ document.head.appendChild(s);
74
+ }
75
+ function el(tag, cls, text) {
76
+ const n = document.createElement(tag);
77
+ if (cls)
78
+ n.className = cls;
79
+ if (text != null)
80
+ n.textContent = text;
81
+ return n;
82
+ }
83
+ /**
84
+ * Mount the voice gallery into `root`. Renders the committed catalogue immediately; an admin can
85
+ * regenerate and export. Returns a handle whose `dispose()` tears it down.
86
+ */
87
+ export function mountVoiceGallery(root, opts) {
88
+ ensureStyle();
89
+ const { session } = opts;
90
+ const isAdmin = !!session.identity.isAdmin;
91
+ const concurrency = Math.max(1, opts.concurrency ?? 4);
92
+ // Runtime URL map, seeded from the committed manifest; generation updates it live so an admin can
93
+ // preview clips before committing.
94
+ const urls = new Map(Object.entries(getVoiceSamples().clips));
95
+ // Per-clip generation: the exact inputs for every (voice, lang, emotion) cell, keyed by sample key,
96
+ // plus the set of keys currently synthesising — so an admin can generate ONE cell and preview it
97
+ // (not just the whole grid via "Generate all").
98
+ const jobByKey = new Map(voiceSampleJobs().map((j) => [j.key, j]));
99
+ const generating = new Set();
100
+ const errors = new Map(); // key → last generation error (shown on the cell)
101
+ const audio = new Audio();
102
+ let playingKey = null;
103
+ const clipButtons = new Map();
104
+ const refreshClipButton = (key) => {
105
+ clipButtons.get(key)?._refresh?.();
106
+ };
107
+ function stopPlaying() {
108
+ audio.pause();
109
+ const was = playingKey;
110
+ playingKey = null;
111
+ if (was)
112
+ refreshClipButton(was); // flip ⏸ → ▶ (replay)
113
+ }
114
+ function togglePlay(key) {
115
+ const clip = urls.get(key);
116
+ if (!clip)
117
+ return;
118
+ if (playingKey === key) {
119
+ stopPlaying();
120
+ return;
121
+ }
122
+ stopPlaying();
123
+ audio.src = clip.url;
124
+ audio.currentTime = 0;
125
+ void audio.play().catch(() => undefined);
126
+ playingKey = key;
127
+ refreshClipButton(key); // flip ▶ → ⏸ (click to stop)
128
+ }
129
+ // At end-of-clip the audio stops itself; reset our state + icon so the button shows ▶ to replay.
130
+ audio.addEventListener("ended", stopPlaying);
131
+ const container = el("div", "rydr-vg");
132
+ // ── Header ──────────────────────────────────────────────────────────────────
133
+ const head = el("div", "rydr-vg-head");
134
+ const title = el("div");
135
+ title.appendChild(el("h1", undefined, "All voice characters"));
136
+ const total = voiceSampleJobs().length;
137
+ title.appendChild(el("div", "sub", `${GEMINI_VOICES.length} voices · ${VOICE_SAMPLE_LANGS.length} languages · ${VOICE_SAMPLE_EMOTIONS.length} emotions (${total} clips)`));
138
+ head.appendChild(title);
139
+ const actions = el("div", "rydr-vg-actions");
140
+ // Gender filter (everyone): All / Women / Men, toggling row visibility. `voiceRows` is filled as the
141
+ // table body is built below; the handlers only run after that, so the forward reference is safe.
142
+ const voiceRows = [];
143
+ let genderFilter = "all";
144
+ const filterBar = el("div", "rydr-vg-filter");
145
+ const applyGenderFilter = () => {
146
+ for (const [g, tr] of voiceRows)
147
+ tr.style.display = genderFilter === "all" || g === genderFilter ? "" : "none";
148
+ for (const b of Array.from(filterBar.children)) {
149
+ b.classList.toggle("sel", b.dataset.v === genderFilter);
150
+ }
151
+ };
152
+ for (const f of [
153
+ { v: "all", label: "All" },
154
+ { v: "female", label: "♀ Women" },
155
+ { v: "male", label: "♂ Men" },
156
+ ]) {
157
+ const b = el("button", "rydr-vg-fbtn", f.label);
158
+ b.dataset.v = f.v;
159
+ b.addEventListener("click", () => { genderFilter = f.v; applyGenderFilter(); });
160
+ filterBar.appendChild(b);
161
+ }
162
+ actions.appendChild(filterBar);
163
+ const prog = el("div", "rydr-vg-prog");
164
+ const genBtn = el("button", "rydr-vg-btn primary");
165
+ genBtn.textContent = "Generate all";
166
+ const copyBtn = el("button", "rydr-vg-btn");
167
+ copyBtn.textContent = "Copy manifest";
168
+ if (isAdmin) {
169
+ actions.appendChild(prog);
170
+ actions.appendChild(genBtn);
171
+ actions.appendChild(copyBtn);
172
+ }
173
+ head.appendChild(actions);
174
+ container.appendChild(head);
175
+ // ── Table ───────────────────────────────────────────────────────────────────
176
+ const table = el("table", "rydr-vg-tbl");
177
+ const thead = el("thead");
178
+ const hrow = el("tr");
179
+ hrow.appendChild(el("th", undefined, "Voice"));
180
+ hrow.appendChild(el("th", undefined, "Gender"));
181
+ for (const lang of VOICE_SAMPLE_LANGS)
182
+ hrow.appendChild(el("th", undefined, LANG_LABEL[lang]));
183
+ thead.appendChild(hrow);
184
+ table.appendChild(thead);
185
+ const tbody = el("tbody");
186
+ function renderClipButton(voice, lang, emotionId, label) {
187
+ const key = voiceSampleKey(voice, lang, emotionId);
188
+ const btn = el("button", "rydr-vg-clip");
189
+ const ic = el("span", "ic", "▶");
190
+ btn.appendChild(ic);
191
+ btn.appendChild(el("span", undefined, label));
192
+ const refresh = () => {
193
+ const has = urls.has(key);
194
+ const gen = generating.has(key);
195
+ const playing = playingKey === key;
196
+ const err = !has && !gen ? errors.get(key) : undefined;
197
+ btn.classList.toggle("gen", gen);
198
+ btn.classList.toggle("playing", playing);
199
+ btn.classList.toggle("err", !!err);
200
+ // An admin can click an ungenerated cell to synthesise just that one and preview it; a
201
+ // non-admin can only play what is already committed.
202
+ btn.disabled = gen || (!has && !isAdmin);
203
+ // ▶ play · ⏸ playing (click to stop) · ◌ generating · ⚠ failed (retry) · ✦ generate one
204
+ ic.textContent = playing ? "⏸" : has ? "▶" : gen ? "◌" : err ? "⚠" : "✦";
205
+ btn.title = playing
206
+ ? `Stop ${label} (${lang})`
207
+ : has
208
+ ? `Play ${label} (${lang})`
209
+ : gen
210
+ ? "Generating…"
211
+ : err
212
+ ? `${err} (click to retry)`
213
+ : isAdmin
214
+ ? `Generate ${label} (${lang}) and preview`
215
+ : "Not generated yet";
216
+ };
217
+ refresh();
218
+ btn.addEventListener("click", () => {
219
+ if (urls.has(key))
220
+ togglePlay(key);
221
+ else if (isAdmin)
222
+ void generateOne(key);
223
+ });
224
+ clipButtons.set(key, btn);
225
+ // stash the refresher so generation can re-enable it
226
+ btn._refresh = refresh;
227
+ return btn;
228
+ }
229
+ for (const voice of GEMINI_VOICES) {
230
+ const tr = el("tr");
231
+ const nameCell = el("td");
232
+ const nameLine = el("div", "rydr-vg-name");
233
+ nameLine.appendChild(el("span", undefined, voice.id));
234
+ nameCell.appendChild(nameLine);
235
+ nameCell.appendChild(el("div", "rydr-vg-persona", voice.persona));
236
+ tr.appendChild(nameCell);
237
+ const genderCell = el("td");
238
+ const gender = el("div", "rydr-vg-gender");
239
+ gender.appendChild(el("span", `rydr-vg-g ${voice.gender}`, GENDER_ICON[voice.gender]));
240
+ gender.appendChild(el("span", `rydr-vg-g ${voice.gender}`, voice.gender === "female" ? "Female" : "Male"));
241
+ genderCell.appendChild(gender);
242
+ tr.appendChild(genderCell);
243
+ for (const lang of VOICE_SAMPLE_LANGS) {
244
+ const cell = el("td");
245
+ const wrap = el("div", "rydr-vg-cell");
246
+ for (const emotion of VOICE_SAMPLE_EMOTIONS) {
247
+ wrap.appendChild(renderClipButton(voice.id, lang, emotion.id, emotion.label));
248
+ }
249
+ cell.appendChild(wrap);
250
+ tr.appendChild(cell);
251
+ }
252
+ voiceRows.push([voice.gender, tr]);
253
+ tbody.appendChild(tr);
254
+ }
255
+ table.appendChild(tbody);
256
+ applyGenderFilter(); // set the initial "All" selected state
257
+ container.appendChild(table);
258
+ root.appendChild(container);
259
+ // ── Generation (admin) ───────────────────────────────────────────────────────
260
+ let generatedAt = getVoiceSamples().generatedAt;
261
+ let busy = false;
262
+ function setProgress(msg) {
263
+ prog.innerHTML = "";
264
+ prog.appendChild(document.createTextNode(msg));
265
+ }
266
+ function markGenerated(key, clip) {
267
+ urls.set(key, clip);
268
+ refreshClipButton(key);
269
+ }
270
+ /** Synthesise a SINGLE (voice, lang, emotion) sample, then play it — the "generate one + preview"
271
+ * path. No-op if it is already generated or in flight. Updates the live manifest so "Copy manifest"
272
+ * includes it. */
273
+ async function generateOne(key) {
274
+ if (generating.has(key) || urls.has(key))
275
+ return;
276
+ const job = jobByKey.get(key);
277
+ if (!job)
278
+ return;
279
+ generating.add(key);
280
+ errors.delete(key); // clear any prior failure for this cell before retrying
281
+ refreshClipButton(key);
282
+ try {
283
+ const r = await session.generateVoiceover({
284
+ text: job.text,
285
+ voice: job.voice,
286
+ style: job.style,
287
+ speed: job.speed,
288
+ lang: job.lang,
289
+ });
290
+ generatedAt = Date.now();
291
+ markGenerated(key, { url: r.url, hash: r.hash });
292
+ generating.delete(key);
293
+ togglePlay(key); // preview immediately
294
+ if (isAdmin)
295
+ setProgress(`${urls.size}/${total} generated`);
296
+ }
297
+ catch (e) {
298
+ generating.delete(key);
299
+ errors.set(key, ttsErrorHint(e instanceof Error ? e.message : String(e)));
300
+ refreshClipButton(key);
301
+ }
302
+ }
303
+ async function generateAll() {
304
+ if (busy)
305
+ return;
306
+ busy = true;
307
+ genBtn.disabled = true;
308
+ copyBtn.disabled = true;
309
+ const jobs = voiceSampleJobs();
310
+ let done = 0;
311
+ let cached = 0;
312
+ let failed = 0;
313
+ setProgress(`0 / ${jobs.length}`);
314
+ // simple concurrency pool
315
+ let cursor = 0;
316
+ async function worker() {
317
+ while (cursor < jobs.length) {
318
+ const job = jobs[cursor++];
319
+ if (!job)
320
+ break;
321
+ try {
322
+ errors.delete(job.key);
323
+ const r = await session.generateVoiceover({
324
+ text: job.text,
325
+ voice: job.voice,
326
+ style: job.style,
327
+ speed: job.speed,
328
+ lang: job.lang,
329
+ });
330
+ markGenerated(job.key, { url: r.url, hash: r.hash });
331
+ if (r.cached)
332
+ cached++;
333
+ }
334
+ catch (e) {
335
+ failed++;
336
+ errors.set(job.key, ttsErrorHint(e instanceof Error ? e.message : String(e)));
337
+ refreshClipButton(job.key);
338
+ }
339
+ done++;
340
+ setProgress(`${done} / ${jobs.length}${failed ? ` · ${failed} failed` : ""}`);
341
+ }
342
+ }
343
+ await Promise.all(Array.from({ length: Math.min(concurrency, jobs.length) }, () => worker()));
344
+ generatedAt = Date.now();
345
+ genBtn.disabled = false;
346
+ copyBtn.disabled = false;
347
+ busy = false;
348
+ const okCount = jobs.length - failed;
349
+ setProgress(`✓ ${okCount}/${jobs.length}${failed ? ` · ${failed} failed` : ""} (${cached} cached)`);
350
+ }
351
+ function buildManifestSource() {
352
+ const clips = {};
353
+ for (const [k, v] of [...urls.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {
354
+ clips[k] = { url: v.url, hash: v.hash };
355
+ }
356
+ const clipLines = Object.entries(clips)
357
+ .map(([k, v]) => ` ${JSON.stringify(k)}: { url: ${JSON.stringify(v.url)}, hash: ${JSON.stringify(v.hash)} },`)
358
+ .join("\n");
359
+ return (`export const VOICE_SAMPLES: VoiceSampleManifest = {\n` +
360
+ ` generatedAt: ${generatedAt},\n` +
361
+ ` speed: VOICE_SAMPLE_SPEED,\n` +
362
+ ` clips: {\n${clipLines}\n },\n` +
363
+ `};\n`);
364
+ }
365
+ function toast(msg) {
366
+ const t = el("div", "rydr-vg-toast", msg);
367
+ container.appendChild(t);
368
+ setTimeout(() => t.remove(), 2200);
369
+ }
370
+ async function copyManifest() {
371
+ const src = buildManifestSource();
372
+ try {
373
+ await navigator.clipboard.writeText(src);
374
+ toast(`Manifest copied (${urls.size} clips). Paste over VOICE_SAMPLES in voice-samples.ts.`);
375
+ }
376
+ catch {
377
+ // clipboard blocked — dump to console as a fallback
378
+ console.log(src);
379
+ toast("Clipboard blocked — manifest logged to console.");
380
+ }
381
+ }
382
+ if (isAdmin) {
383
+ genBtn.addEventListener("click", () => void generateAll());
384
+ copyBtn.addEventListener("click", () => void copyManifest());
385
+ const generated = urls.size;
386
+ setProgress(generated ? `${generated}/${total} committed` : "not generated");
387
+ }
388
+ return {
389
+ dispose() {
390
+ stopPlaying();
391
+ audio.removeEventListener("ended", stopPlaying);
392
+ container.remove();
393
+ },
394
+ };
395
+ }
396
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/voice-gallery/index.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,12 @@ export interface VoiceoverEditorOptions {
54
54
  * code-aware (read-only code text + sync chip). Empty/omitted → plain authoring surface, no chip.
55
55
  */
56
56
  definitions?: ConversationDef[];
57
+ /**
58
+ * URL of the full voice gallery ("All voice characters"). When set, the Characters tab shows an
59
+ * "Open voice gallery ↗" link so authors can browse every voice × language × emotion. The platform
60
+ * passes `/core-voice-gallery.html`; games can omit it (the in-tab audition list still works).
61
+ */
62
+ galleryUrl?: string;
57
63
  }
58
64
  export interface VoiceoverEditor {
59
65
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voiceover-editor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAYlE,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7G,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,cAAc,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,iBAAiB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnK;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,sBAAsB,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AAqFD,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,eAAe,CA0nBrG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/voiceover-editor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAmBlE,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7G,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,cAAc,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,iBAAiB,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnK;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,sBAAsB,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AA2HD,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAqyBrG"}