@clipwright/core 0.34.0 → 0.36.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 (237) hide show
  1. package/README.md +6 -3
  2. package/dist/account-actors.d.ts +173 -15
  3. package/dist/account-actors.js +142 -11
  4. package/dist/account-actors.js.map +1 -1
  5. package/dist/actor-bounds.d.ts +4 -0
  6. package/dist/actor-bounds.js +4 -0
  7. package/dist/actor-bounds.js.map +1 -1
  8. package/dist/actors.d.ts +31 -0
  9. package/dist/actors.js +26 -0
  10. package/dist/actors.js.map +1 -1
  11. package/dist/api-failure.d.ts +1 -1
  12. package/dist/api-failure.js +2 -2
  13. package/dist/api-failure.js.map +1 -1
  14. package/dist/aspect.d.ts +1 -1
  15. package/dist/aspect.js +5 -5
  16. package/dist/aspect.js.map +1 -1
  17. package/dist/assets.d.ts +30 -6
  18. package/dist/assets.js +26 -8
  19. package/dist/assets.js.map +1 -1
  20. package/dist/billing-terms.d.ts +69 -0
  21. package/dist/billing-terms.js +8 -0
  22. package/dist/billing-terms.js.map +1 -1
  23. package/dist/canvas-fit.js +1 -1
  24. package/dist/canvas-fit.js.map +1 -1
  25. package/dist/contract-dispositions.d.ts +493 -9
  26. package/dist/contract-dispositions.js +38 -14
  27. package/dist/contract-dispositions.js.map +1 -1
  28. package/dist/contracts/v1/workflow-brief.d.ts +1441 -0
  29. package/dist/contracts/v1/workflow-brief.js +4 -0
  30. package/dist/contracts/v1/workflow-brief.js.map +1 -1
  31. package/dist/contracts/v1/workflow-catalog.d.ts +2181 -103
  32. package/dist/contracts/v1/workflow-catalog.js +4 -2
  33. package/dist/contracts/v1/workflow-catalog.js.map +1 -1
  34. package/dist/contracts/v1/workflow-client.d.ts +1673 -3
  35. package/dist/contracts/v1/workflow-client.js +6 -3
  36. package/dist/contracts/v1/workflow-client.js.map +1 -1
  37. package/dist/contracts/v1/workflow-execution.d.ts +164 -12
  38. package/dist/contracts/v1/workflow-execution.js +15 -7
  39. package/dist/contracts/v1/workflow-execution.js.map +1 -1
  40. package/dist/contracts/v1/workflow-plan.d.ts +3228 -140
  41. package/dist/contracts/v1/workflow-primitives.d.ts +3 -1
  42. package/dist/contracts/v1/workflow-primitives.js +1 -1
  43. package/dist/contracts/v1/workflow-primitives.js.map +1 -1
  44. package/dist/contracts/v1/workflow-run-read.d.ts +116 -3
  45. package/dist/edit-billing.d.ts +12 -0
  46. package/dist/edit-billing.js +7 -0
  47. package/dist/edit-billing.js.map +1 -1
  48. package/dist/edit-candidate.d.ts +2 -2
  49. package/dist/edit-candidate.js +2 -2
  50. package/dist/edit-candidate.js.map +1 -1
  51. package/dist/edit-long-form.d.ts +3 -3
  52. package/dist/edit-long-form.js +14 -4
  53. package/dist/edit-long-form.js.map +1 -1
  54. package/dist/edit-revision.d.ts +1 -1
  55. package/dist/edit-revision.js +1 -1
  56. package/dist/edit-revision.js.map +1 -1
  57. package/dist/endpoint-notes.d.ts +3 -0
  58. package/dist/endpoint-notes.js +70 -0
  59. package/dist/endpoint-notes.js.map +1 -0
  60. package/dist/endpoints.d.ts +4 -0
  61. package/dist/endpoints.js +16 -0
  62. package/dist/endpoints.js.map +1 -1
  63. package/dist/errors.d.ts +2 -2
  64. package/dist/errors.js +11 -2
  65. package/dist/errors.js.map +1 -1
  66. package/dist/face-billing.d.ts +55 -0
  67. package/dist/face-billing.js +24 -2
  68. package/dist/face-billing.js.map +1 -1
  69. package/dist/face-delivery.d.ts +1 -1
  70. package/dist/face-delivery.js +1 -1
  71. package/dist/face-delivery.js.map +1 -1
  72. package/dist/faceless-media-record.d.ts +1 -1
  73. package/dist/faceless-media-record.js +1 -1
  74. package/dist/faceless-media-record.js.map +1 -1
  75. package/dist/faceless-price.d.ts +49 -6
  76. package/dist/faceless-price.js +44 -10
  77. package/dist/faceless-price.js.map +1 -1
  78. package/dist/faceless-public-plan.d.ts +6 -2
  79. package/dist/faceless-public-plan.js +11 -7
  80. package/dist/faceless-public-plan.js.map +1 -1
  81. package/dist/faceless-public.d.ts +7 -2
  82. package/dist/faceless-public.js +5 -5
  83. package/dist/faceless-public.js.map +1 -1
  84. package/dist/faceless-voices.d.ts +6 -6
  85. package/dist/faceless-voices.js +5 -5
  86. package/dist/faceless-voices.js.map +1 -1
  87. package/dist/feedback.d.ts +29 -0
  88. package/dist/feedback.js +29 -0
  89. package/dist/feedback.js.map +1 -0
  90. package/dist/generations.d.ts +2 -19
  91. package/dist/generations.js +28 -49
  92. package/dist/generations.js.map +1 -1
  93. package/dist/idempotency.d.ts +2 -0
  94. package/dist/idempotency.js +7 -4
  95. package/dist/idempotency.js.map +1 -1
  96. package/dist/index.d.ts +12 -0
  97. package/dist/index.js +15 -0
  98. package/dist/index.js.map +1 -1
  99. package/dist/long-form-pricing.d.ts +7 -4
  100. package/dist/long-form-pricing.js +13 -10
  101. package/dist/long-form-pricing.js.map +1 -1
  102. package/dist/long-form-revision.js +1 -1
  103. package/dist/long-form-revision.js.map +1 -1
  104. package/dist/media-timebase.js +2 -2
  105. package/dist/media-timebase.js.map +1 -1
  106. package/dist/openapi.d.ts +155 -0
  107. package/dist/openapi.js +339 -0
  108. package/dist/openapi.js.map +1 -0
  109. package/dist/pacing.d.ts +15 -0
  110. package/dist/pacing.js +30 -0
  111. package/dist/pacing.js.map +1 -1
  112. package/dist/parts-pricing.d.ts +84 -0
  113. package/dist/parts-pricing.js +105 -0
  114. package/dist/parts-pricing.js.map +1 -0
  115. package/dist/presenter-beats.d.ts +45 -0
  116. package/dist/presenter-beats.js +144 -0
  117. package/dist/presenter-beats.js.map +1 -0
  118. package/dist/prices.d.ts +98 -0
  119. package/dist/prices.js +193 -0
  120. package/dist/prices.js.map +1 -0
  121. package/dist/public-responses.d.ts +23 -0
  122. package/dist/public-responses.js +11 -0
  123. package/dist/public-responses.js.map +1 -0
  124. package/dist/rate-limit.d.ts +2 -2
  125. package/dist/rate-limit.js +2 -2
  126. package/dist/rate-limit.js.map +1 -1
  127. package/dist/reference-analysis.d.ts +915 -0
  128. package/dist/reference-analysis.js +210 -0
  129. package/dist/reference-analysis.js.map +1 -0
  130. package/dist/reference-kinds.d.ts +8 -0
  131. package/dist/reference-kinds.js +10 -0
  132. package/dist/reference-kinds.js.map +1 -0
  133. package/dist/reference-profile.d.ts +671 -0
  134. package/dist/reference-profile.js +198 -0
  135. package/dist/reference-profile.js.map +1 -0
  136. package/dist/reference-staging.d.ts +583 -0
  137. package/dist/reference-staging.js +153 -0
  138. package/dist/reference-staging.js.map +1 -0
  139. package/dist/reference-voice.d.ts +305 -0
  140. package/dist/reference-voice.js +108 -0
  141. package/dist/reference-voice.js.map +1 -0
  142. package/dist/render-backend.d.ts +1 -1
  143. package/dist/resolved-timeline.d.ts +54 -2
  144. package/dist/resolved-timeline.js +52 -6
  145. package/dist/resolved-timeline.js.map +1 -1
  146. package/dist/run-static-warnings.js +15 -6
  147. package/dist/run-static-warnings.js.map +1 -1
  148. package/dist/runs.d.ts +78 -6
  149. package/dist/runs.js +9 -4
  150. package/dist/runs.js.map +1 -1
  151. package/dist/semantic-inserts.d.ts +1 -1
  152. package/dist/semantic-inserts.js +2 -2
  153. package/dist/semantic-inserts.js.map +1 -1
  154. package/dist/skills.d.ts +1810 -29
  155. package/dist/skills.js +148 -35
  156. package/dist/skills.js.map +1 -1
  157. package/dist/templates/callout.d.ts +2 -2
  158. package/dist/templates/callout.js +6 -6
  159. package/dist/templates/callout.js.map +1 -1
  160. package/dist/templates/checklist.js +2 -2
  161. package/dist/templates/checklist.js.map +1 -1
  162. package/dist/templates/index.d.ts +15 -8
  163. package/dist/templates/index.js +30 -18
  164. package/dist/templates/index.js.map +1 -1
  165. package/dist/templates/notification.js +2 -2
  166. package/dist/templates/notification.js.map +1 -1
  167. package/dist/templates/phone-call.d.ts +3 -0
  168. package/dist/templates/phone-call.js +14 -7
  169. package/dist/templates/phone-call.js.map +1 -1
  170. package/dist/templates/progress.js +2 -2
  171. package/dist/templates/progress.js.map +1 -1
  172. package/dist/templates/size.d.ts +1 -1
  173. package/dist/templates/size.js +1 -1
  174. package/dist/templates/size.js.map +1 -1
  175. package/dist/templates/sounds.d.ts +357 -7
  176. package/dist/templates/sounds.js +34 -12
  177. package/dist/templates/sounds.js.map +1 -1
  178. package/dist/ugc-call.d.ts +89 -0
  179. package/dist/ugc-call.js +111 -0
  180. package/dist/ugc-call.js.map +1 -0
  181. package/dist/ugc-delivery.d.ts +1 -1
  182. package/dist/ugc-delivery.js +1 -1
  183. package/dist/ugc-delivery.js.map +1 -1
  184. package/dist/ugc-framing.d.ts +26 -0
  185. package/dist/ugc-framing.js +64 -0
  186. package/dist/ugc-framing.js.map +1 -0
  187. package/dist/ugc-layers.d.ts +5 -1
  188. package/dist/ugc-layers.js +6 -1
  189. package/dist/ugc-layers.js.map +1 -1
  190. package/dist/ugc-video-media.d.ts +1 -1
  191. package/dist/ugc-video-media.js +1 -1
  192. package/dist/ugc-video-media.js.map +1 -1
  193. package/dist/uploads.d.ts +2 -2
  194. package/dist/uploads.js +2 -2
  195. package/dist/uploads.js.map +1 -1
  196. package/dist/vendor-response.d.ts +4 -0
  197. package/dist/vendor-response.js +12 -0
  198. package/dist/vendor-response.js.map +1 -1
  199. package/dist/voice-admission.d.ts +836 -420
  200. package/dist/voice-admission.js +22 -5
  201. package/dist/voice-admission.js.map +1 -1
  202. package/dist/voice-listing.d.ts +4 -4
  203. package/dist/voice-listing.js +11 -6
  204. package/dist/voice-listing.js.map +1 -1
  205. package/dist/voice-pace.d.ts +34 -0
  206. package/dist/voice-pace.generated.json +72 -0
  207. package/dist/voice-pace.js +34 -0
  208. package/dist/voice-pace.js.map +1 -0
  209. package/dist/voices.d.ts +32 -19
  210. package/dist/voices.js +81 -35
  211. package/dist/voices.js.map +1 -1
  212. package/dist/workflows/catalog.js +2 -1
  213. package/dist/workflows/catalog.js.map +1 -1
  214. package/dist/workflows/index.d.ts +2 -0
  215. package/dist/workflows/index.js +2 -0
  216. package/dist/workflows/index.js.map +1 -1
  217. package/dist/workflows/methods/faceless-explainer.d.ts +388 -10
  218. package/dist/workflows/methods/kinetic-launch.d.ts +388 -10
  219. package/dist/workflows/methods/kinetic-launch.js +1 -1
  220. package/dist/workflows/methods/product-image-story.d.ts +388 -10
  221. package/dist/workflows/methods/reference-remake.d.ts +881 -0
  222. package/dist/workflows/methods/reference-remake.js +26 -0
  223. package/dist/workflows/methods/reference-remake.js.map +1 -0
  224. package/dist/workflows/methods/shared.d.ts +388 -10
  225. package/dist/workflows/methods/shared.js +2 -2
  226. package/dist/workflows/methods/shared.js.map +1 -1
  227. package/dist/workflows/methods/ugc-faq-answer.d.ts +388 -10
  228. package/dist/workflows/methods/ugc-product-intro.d.ts +388 -10
  229. package/dist/workflows/methods/website-proof-demo.d.ts +388 -10
  230. package/dist/workflows/methods/website-proof-demo.js +1 -1
  231. package/dist/workflows/reference-remake.d.ts +684 -0
  232. package/dist/workflows/reference-remake.js +602 -0
  233. package/dist/workflows/reference-remake.js.map +1 -0
  234. package/dist/workflows/validate.js +10 -7
  235. package/dist/workflows/validate.js.map +1 -1
  236. package/package.json +9 -4
  237. package/CHANGELOG.md +0 -1393
@@ -0,0 +1,153 @@
1
+ import { z } from "zod";
2
+ import { REFERENCE_SOURCE_KINDS } from "./reference-kinds.js";
3
+ // Staging measured from a reference (#914 D1): each element's place, entry, exit, layer and motion, and each freeze's pose. Every number names the
4
+ // method that produced it; an absent field was not measured and `analysis.warnings` says why. Words come from closed lists, never the reference.
5
+ export const REFERENCE_STAGING_VERSION = "reference-staging-v1";
6
+ export const STAGING_METHODS = ["cv-cells/v1", "cv-template/v1", "cv-parallax/v1", "cv-before-after/v1", "yunet-native/v1", "vision-video",
7
+ "vision-still"];
8
+ export const STAGING_ANCHOR_KINDS = ["cut", "flash", "freeze_start", "freeze_end", "beat"];
9
+ export const STAGING_ENTRY_STYLES = ["pop", "fade", "blur_in", "slide", "scale_up", "tilt_in", "typewriter", "wipe", "unknown"];
10
+ export const STAGING_EXIT_STYLES = [...STAGING_ENTRY_STYLES, "cut", "flash"];
11
+ export const STAGING_SIDES = ["left", "right", "top", "bottom", "lower_left", "lower_right", "upper_left", "upper_right", "none"];
12
+ export const STAGING_LAYERS = ["in_front_of_presenter", "behind_presenter", "no_overlap", "presenter_absent", "unknown"];
13
+ export const STAGING_COVERS = ["hair", "face", "shoulder", "hand", "body", "chair", "microphone", "desk", "other"];
14
+ export const STAGING_MOTIONS = ["static", "float", "drift", "scale", "moves_with_frame", "pushed"];
15
+ export const STAGING_GAZES = ["camera", "up_left", "up_right", "left", "right", "down", "element", "closed"];
16
+ /** The image side the top of the head leans to; a roll within ±5° is upright. */
17
+ export const STAGING_HEAD_ROLLS = ["left", "right", "upright"];
18
+ export const STAGING_EXPRESSIONS = ["neutral", "smile", "surprised", "thinking", "other"];
19
+ export const STAGING_HANDS = ["at_chest", "gesturing", "out_of_frame", "other"];
20
+ export const STAGING_FREEZE_ENDS = ["cut", "flash", "unfreeze", "end"];
21
+ const frac = z.number().min(0).max(1);
22
+ const seconds = z.number().min(0);
23
+ const anchorId = z.string().regex(new RegExp(`^(${STAGING_ANCHOR_KINDS.join("|")})#\\d+$`));
24
+ const method = z.enum(STAGING_METHODS);
25
+ export const stagingRect = z.strictObject({ left: frac, top: frac, width: frac, height: frac });
26
+ /** A rect in face units: origin the face centre, unit the face height in pixels, so x and y share one scale. */
27
+ const faceUnits = z.number().min(-20).max(20);
28
+ export const stagingFaceRect = z.strictObject({ left: faceUnits, top: faceUnits, width: z.number().positive().max(20), height: z.number().positive().max(20) });
29
+ /** A moment named by its anchor: the nearest anchor on a side is never used, because it moves when the edit does. */
30
+ export const stagingAnchorRef = z.strictObject({ id: anchorId, offset_s: z.number() });
31
+ const entry = z.strictObject({
32
+ first_visible_s: seconds, settled_s: seconds, anchors: z.array(stagingAnchorRef).max(3),
33
+ style: z.enum(STAGING_ENTRY_STYLES), from: z.enum(STAGING_SIDES), duration_s: seconds,
34
+ displacement: z.tuple([z.number(), z.number()]).describe("Settled minus first position, in shares of width and height."),
35
+ scale_from: z.number().positive().optional(), method,
36
+ }).partial();
37
+ const exit = z.strictObject({
38
+ last_visible_s: seconds, anchors: z.array(stagingAnchorRef).max(3), style: z.enum(STAGING_EXIT_STYLES), to: z.enum(STAGING_SIDES),
39
+ duration_s: seconds, displacement: z.tuple([z.number(), z.number()]), method,
40
+ }).partial();
41
+ export const stagingElement = z.strictObject({
42
+ id: z.string().regex(/^[a-z0-9_]{1,24}$/),
43
+ beat_index: z.number().int().min(0),
44
+ graphic_index: z.number().int().min(0).nullable().describe("Its graphic in beats[beat_index].graphics; null when the beat pass missed it."),
45
+ kind: z.enum(REFERENCE_SOURCE_KINDS),
46
+ rect_hold: stagingRect.optional(),
47
+ rect_hold_face: stagingFaceRect.optional(),
48
+ rect_method: method.optional(),
49
+ rects: z.array(z.strictObject({ t_s: seconds, rect: stagingRect, visible: frac })).max(60).optional(),
50
+ entry: entry.optional(),
51
+ exit: exit.optional(),
52
+ layer: z.strictObject({
53
+ value: z.enum(STAGING_LAYERS), method,
54
+ covered_by: z.array(z.enum(STAGING_COVERS)).max(6),
55
+ face_clear: z.boolean().optional().describe("The face core stays clear in every measured frame of the element's life."),
56
+ face_core_cover_max: frac.optional().describe("The largest share of the face core the element covers in any measured frame."),
57
+ face_covered_share: frac.optional().describe("The share of measured frames in which the element covers the face core."),
58
+ blurs_presenter: z.boolean().optional(),
59
+ }).optional(),
60
+ motion: z.strictObject({
61
+ kind: z.enum(STAGING_MOTIONS), drift_per_s: z.tuple([z.number(), z.number()]).optional(), scale_per_s: z.number().optional(),
62
+ wobble: z.strictObject({ amplitude: frac, period_s: seconds }).optional(),
63
+ }).partial().optional(),
64
+ });
65
+ export const stagingFreeze = z.strictObject({
66
+ start_s: seconds, end_s: seconds, anchors: z.array(stagingAnchorRef).max(3),
67
+ face_box_start: stagingRect, face_box_end: stagingRect,
68
+ roll_deg: z.number().min(-90).max(90), yaw: z.number().min(-3).max(3), pitch: z.number().min(0).max(3),
69
+ gaze: z.enum(STAGING_GAZES).optional(), head_roll: z.enum(STAGING_HEAD_ROLLS),
70
+ expression: z.enum(STAGING_EXPRESSIONS).optional(), hands: z.enum(STAGING_HANDS).optional(),
71
+ frame_motion: z.strictObject({ scale_end: z.number().positive().max(4), centre_shift: z.tuple([z.number(), z.number()]) }).optional(),
72
+ ends_with: z.enum(STAGING_FREEZE_ENDS),
73
+ });
74
+ /** Elements one staging holds, measured or kept with only the vision pass's box and times (#930 S2). */
75
+ export const MAX_STAGING_ELEMENTS = 40;
76
+ export const referenceStaging = z.strictObject({
77
+ version: z.literal(REFERENCE_STAGING_VERSION),
78
+ analysis_width: z.number().int().positive(),
79
+ anchors: z.array(z.strictObject({ id: anchorId, t_s: seconds })).max(80),
80
+ elements: z.array(stagingElement).max(MAX_STAGING_ELEMENTS),
81
+ freezes: z.array(stagingFreeze).max(8),
82
+ });
83
+ /** Cross-field checks a profile runs on its staging: the beats and graphics it names exist, its anchors exist, and its times are ordered. */
84
+ export function stagingIssues(staging, beats, duration) {
85
+ const out = [];
86
+ const ids = new Set();
87
+ staging.anchors.forEach((anchor, index) => {
88
+ if (ids.has(anchor.id))
89
+ out.push({ path: ["anchors", index, "id"], message: `${anchor.id} is named twice` });
90
+ ids.add(anchor.id);
91
+ if (anchor.t_s > duration)
92
+ out.push({ path: ["anchors", index, "t_s"], message: `lies past the source's ${duration} s` });
93
+ });
94
+ const refs = (path, list) => list?.forEach((ref, index) => {
95
+ if (!ids.has(ref.id))
96
+ out.push({ path: [...path, index, "id"], message: `${ref.id} is not in staging.anchors` });
97
+ });
98
+ const ordered = (path, times) => {
99
+ const known = times.filter((entry) => entry[1] !== undefined);
100
+ known.forEach(([field, t], index) => {
101
+ if (t > duration)
102
+ out.push({ path: [...path, field], message: `lies past the source's ${duration} s` });
103
+ const before = known[index - 1];
104
+ if (before && t < before[1])
105
+ out.push({ path: [...path, field], message: `comes before ${before[0]}` });
106
+ });
107
+ };
108
+ staging.elements.forEach((element, index) => {
109
+ const path = ["elements", index];
110
+ const beat = beats[element.beat_index];
111
+ if (!beat)
112
+ out.push({ path: [...path, "beat_index"], message: `there are ${beats.length} beats` });
113
+ else if (element.graphic_index !== null && element.graphic_index >= beat.graphics.length) {
114
+ out.push({ path: [...path, "graphic_index"], message: `beat ${element.beat_index} has ${beat.graphics.length} graphics` });
115
+ }
116
+ refs([...path, "entry", "anchors"], element.entry?.anchors);
117
+ refs([...path, "exit", "anchors"], element.exit?.anchors);
118
+ ordered(path, [["entry.first_visible_s", element.entry?.first_visible_s], ["entry.settled_s", element.entry?.settled_s],
119
+ ["exit.last_visible_s", element.exit?.last_visible_s]]);
120
+ element.rects?.forEach((sample, at) => { if (sample.t_s > duration)
121
+ out.push({ path: [...path, "rects", at, "t_s"], message: `lies past the source's ${duration} s` }); });
122
+ });
123
+ staging.freezes.forEach((freeze, index) => {
124
+ refs(["freezes", index, "anchors"], freeze.anchors);
125
+ if (freeze.end_s <= freeze.start_s)
126
+ out.push({ path: ["freezes", index, "end_s"], message: "ends where or before the freeze starts" });
127
+ if (freeze.end_s > duration)
128
+ out.push({ path: ["freezes", index, "end_s"], message: `lies past the source's ${duration} s` });
129
+ });
130
+ return out;
131
+ }
132
+ /** A frame rect in face units: origin the face box's centre, unit its height in pixels (Q2: our actor does not sit where theirs does). */
133
+ export function faceRelativeRect(rect, face, width, height) {
134
+ const unit = face.height * height, cx = (face.left + face.width / 2) * width, cy = (face.top + face.height / 2) * height;
135
+ const round = (value) => Math.round(value * 1e4) / 1e4;
136
+ return { left: round((rect.left * width - cx) / unit), top: round((rect.top * height - cy) / unit), width: round((rect.width * width) / unit),
137
+ height: round((rect.height * height) / unit) };
138
+ }
139
+ /** Samples thinned to change points: one is kept when an edge moved more than `tolerance` since the last kept, and the last always stays. */
140
+ export function thinStagingRects(samples, tolerance = 0.003, max = 60) {
141
+ const kept = [];
142
+ samples.forEach((sample, index) => {
143
+ const last = kept.at(-1);
144
+ const moved = !last || ["left", "top", "width", "height"].some(edge => Math.abs(sample.rect[edge] - last.rect[edge]) > tolerance);
145
+ if (moved || index === samples.length - 1)
146
+ kept.push(sample);
147
+ });
148
+ if (kept.length <= max)
149
+ return kept;
150
+ const step = (kept.length - 1) / (max - 1);
151
+ return Array.from({ length: max }, (_, index) => kept[Math.round(index * step)]);
152
+ }
153
+ //# sourceMappingURL=reference-staging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-staging.js","sourceRoot":"","sources":["../src/reference-staging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ import { z } from "zod";
2
+ export declare const REFERENCE_VOICE_VERSION = "voice-profile-v1";
3
+ export declare const REFERENCE_VOICE_WARNINGS: readonly ["no_sentence_terminal_punctuation_pace_uses_turn_spans", "background_music_present_f0_and_intensity_may_be_contaminated"];
4
+ export declare const MAX_REFERENCE_VOICE_SPEAKERS = 6;
5
+ /** Words per second of our English default (eleven_v4) at speed 1 on the reference reel's text, as measured. */
6
+ export declare const NARRATION_BASELINE_WPS = 2.54;
7
+ /** ElevenLabs' speed range; make_ugc's voice_pace accepts the same. */
8
+ export declare const VOICE_PACE_MIN = 0.7;
9
+ export declare const VOICE_PACE_MAX = 1.2;
10
+ /** No trimmed pause gets shorter than this, whatever the reference measured. */
11
+ export declare const PAUSE_TRIM_FLOOR_S = 0.05;
12
+ /** The longest target make_ugc takes; a reference pause above it is compiled to it, with a plan note. */
13
+ export declare const PAUSE_TRIM_CEILING_S = 2;
14
+ /** make_ugc's opt-in: per gap class, the length a longer pause is cut down to; quiet audio only, a joint that would click is kept. */
15
+ export declare const pauseTrim: z.ZodObject<{
16
+ sentence_end_s: z.ZodOptional<z.ZodNumber>;
17
+ comma_s: z.ZodOptional<z.ZodNumber>;
18
+ mid_phrase_s: z.ZodOptional<z.ZodNumber>;
19
+ }, z.core.$strict>;
20
+ export type PauseTrimTargets = z.infer<typeof pauseTrim>;
21
+ declare const referenceVoiceSpeaker: z.ZodObject<{
22
+ speaker: z.ZodString;
23
+ word_count: z.ZodNumber;
24
+ sentence_count: z.ZodNumber;
25
+ pace: z.ZodObject<{
26
+ status: z.ZodEnum<{
27
+ measured: "measured";
28
+ unmeasured: "unmeasured";
29
+ }>;
30
+ words_per_second: z.ZodNullable<z.ZodNumber>;
31
+ basis: z.ZodEnum<{
32
+ sentence_spans: "sentence_spans";
33
+ turn_spans: "turn_spans";
34
+ }>;
35
+ }, z.core.$strict>;
36
+ pauses: z.ZodObject<{
37
+ sentence_end: z.ZodObject<{
38
+ timestamp: z.ZodObject<{
39
+ count: z.ZodNumber;
40
+ median_s: z.ZodNullable<z.ZodNumber>;
41
+ p90_s: z.ZodNullable<z.ZodNumber>;
42
+ count_ge150ms: z.ZodNumber;
43
+ }, z.core.$strict>;
44
+ acoustic_pause: z.ZodObject<{
45
+ count: z.ZodNumber;
46
+ median_s: z.ZodNullable<z.ZodNumber>;
47
+ p90_s: z.ZodNullable<z.ZodNumber>;
48
+ count_ge150ms: z.ZodNumber;
49
+ }, z.core.$strict>;
50
+ cut_safe: z.ZodObject<{
51
+ count: z.ZodNumber;
52
+ median_s: z.ZodNullable<z.ZodNumber>;
53
+ p90_s: z.ZodNullable<z.ZodNumber>;
54
+ count_ge150ms: z.ZodNumber;
55
+ }, z.core.$strict>;
56
+ acoustic_no_dip_count: z.ZodNumber;
57
+ acoustic_unconfirmed_count: z.ZodNumber;
58
+ }, z.core.$strict>;
59
+ comma: z.ZodObject<{
60
+ timestamp: z.ZodObject<{
61
+ count: z.ZodNumber;
62
+ median_s: z.ZodNullable<z.ZodNumber>;
63
+ p90_s: z.ZodNullable<z.ZodNumber>;
64
+ count_ge150ms: z.ZodNumber;
65
+ }, z.core.$strict>;
66
+ acoustic_pause: z.ZodObject<{
67
+ count: z.ZodNumber;
68
+ median_s: z.ZodNullable<z.ZodNumber>;
69
+ p90_s: z.ZodNullable<z.ZodNumber>;
70
+ count_ge150ms: z.ZodNumber;
71
+ }, z.core.$strict>;
72
+ cut_safe: z.ZodObject<{
73
+ count: z.ZodNumber;
74
+ median_s: z.ZodNullable<z.ZodNumber>;
75
+ p90_s: z.ZodNullable<z.ZodNumber>;
76
+ count_ge150ms: z.ZodNumber;
77
+ }, z.core.$strict>;
78
+ acoustic_no_dip_count: z.ZodNumber;
79
+ acoustic_unconfirmed_count: z.ZodNumber;
80
+ }, z.core.$strict>;
81
+ mid_phrase: z.ZodObject<{
82
+ timestamp: z.ZodObject<{
83
+ count: z.ZodNumber;
84
+ median_s: z.ZodNullable<z.ZodNumber>;
85
+ p90_s: z.ZodNullable<z.ZodNumber>;
86
+ count_ge150ms: z.ZodNumber;
87
+ }, z.core.$strict>;
88
+ acoustic_pause: z.ZodObject<{
89
+ count: z.ZodNumber;
90
+ median_s: z.ZodNullable<z.ZodNumber>;
91
+ p90_s: z.ZodNullable<z.ZodNumber>;
92
+ count_ge150ms: z.ZodNumber;
93
+ }, z.core.$strict>;
94
+ cut_safe: z.ZodObject<{
95
+ count: z.ZodNumber;
96
+ median_s: z.ZodNullable<z.ZodNumber>;
97
+ p90_s: z.ZodNullable<z.ZodNumber>;
98
+ count_ge150ms: z.ZodNumber;
99
+ }, z.core.$strict>;
100
+ acoustic_no_dip_count: z.ZodNumber;
101
+ acoustic_unconfirmed_count: z.ZodNumber;
102
+ }, z.core.$strict>;
103
+ }, z.core.$strict>;
104
+ long_pause_count: z.ZodNumber;
105
+ hinge: z.ZodObject<{
106
+ status: z.ZodEnum<{
107
+ measured: "measured";
108
+ not_evaluated: "not_evaluated";
109
+ }>;
110
+ sentence_share: z.ZodNullable<z.ZodNumber>;
111
+ evaluated_sentences: z.ZodNumber;
112
+ coverage: z.ZodNullable<z.ZodNumber>;
113
+ timestamp_sentence_share: z.ZodNullable<z.ZodNumber>;
114
+ median_position: z.ZodNullable<z.ZodNumber>;
115
+ median_seconds: z.ZodNullable<z.ZodNumber>;
116
+ }, z.core.$strict>;
117
+ pitch: z.ZodObject<{
118
+ status: z.ZodEnum<{
119
+ measured: "measured";
120
+ no_voiced_frames: "no_voiced_frames";
121
+ }>;
122
+ ceiling_hz: z.ZodNumber;
123
+ ceiling_basis: z.ZodEnum<{
124
+ configured: "configured";
125
+ default: "default";
126
+ low_f0: "low_f0";
127
+ }>;
128
+ median_hz: z.ZodNullable<z.ZodNumber>;
129
+ p10_hz: z.ZodNullable<z.ZodNumber>;
130
+ p90_hz: z.ZodNullable<z.ZodNumber>;
131
+ range_st: z.ZodNullable<z.ZodNumber>;
132
+ voiced_frames: z.ZodNumber;
133
+ }, z.core.$strict>;
134
+ loudness: z.ZodObject<{
135
+ status: z.ZodEnum<{
136
+ measured: "measured";
137
+ unmeasured: "unmeasured";
138
+ }>;
139
+ range_db_p10_p90: z.ZodNullable<z.ZodNumber>;
140
+ }, z.core.$strict>;
141
+ warnings: z.ZodArray<z.ZodEnum<{
142
+ background_music_present_f0_and_intensity_may_be_contaminated: "background_music_present_f0_and_intensity_may_be_contaminated";
143
+ no_sentence_terminal_punctuation_pace_uses_turn_spans: "no_sentence_terminal_punctuation_pace_uses_turn_spans";
144
+ }>>;
145
+ }, z.core.$strict>;
146
+ export type ReferenceVoiceSpeaker = z.infer<typeof referenceVoiceSpeaker>;
147
+ export declare const referenceVoice: z.ZodObject<{
148
+ version: z.ZodLiteral<"voice-profile-v1">;
149
+ method: z.ZodObject<{
150
+ pause_drop_db: z.ZodNumber;
151
+ pause_min_run_s: z.ZodNumber;
152
+ cut_safe_db: z.ZodNumber;
153
+ pitch: z.ZodLiteral<"yin">;
154
+ sample_rate: z.ZodNumber;
155
+ }, z.core.$strict>;
156
+ presenter_speaker: z.ZodNullable<z.ZodString>;
157
+ speakers: z.ZodArray<z.ZodObject<{
158
+ speaker: z.ZodString;
159
+ word_count: z.ZodNumber;
160
+ sentence_count: z.ZodNumber;
161
+ pace: z.ZodObject<{
162
+ status: z.ZodEnum<{
163
+ measured: "measured";
164
+ unmeasured: "unmeasured";
165
+ }>;
166
+ words_per_second: z.ZodNullable<z.ZodNumber>;
167
+ basis: z.ZodEnum<{
168
+ sentence_spans: "sentence_spans";
169
+ turn_spans: "turn_spans";
170
+ }>;
171
+ }, z.core.$strict>;
172
+ pauses: z.ZodObject<{
173
+ sentence_end: z.ZodObject<{
174
+ timestamp: z.ZodObject<{
175
+ count: z.ZodNumber;
176
+ median_s: z.ZodNullable<z.ZodNumber>;
177
+ p90_s: z.ZodNullable<z.ZodNumber>;
178
+ count_ge150ms: z.ZodNumber;
179
+ }, z.core.$strict>;
180
+ acoustic_pause: z.ZodObject<{
181
+ count: z.ZodNumber;
182
+ median_s: z.ZodNullable<z.ZodNumber>;
183
+ p90_s: z.ZodNullable<z.ZodNumber>;
184
+ count_ge150ms: z.ZodNumber;
185
+ }, z.core.$strict>;
186
+ cut_safe: z.ZodObject<{
187
+ count: z.ZodNumber;
188
+ median_s: z.ZodNullable<z.ZodNumber>;
189
+ p90_s: z.ZodNullable<z.ZodNumber>;
190
+ count_ge150ms: z.ZodNumber;
191
+ }, z.core.$strict>;
192
+ acoustic_no_dip_count: z.ZodNumber;
193
+ acoustic_unconfirmed_count: z.ZodNumber;
194
+ }, z.core.$strict>;
195
+ comma: z.ZodObject<{
196
+ timestamp: z.ZodObject<{
197
+ count: z.ZodNumber;
198
+ median_s: z.ZodNullable<z.ZodNumber>;
199
+ p90_s: z.ZodNullable<z.ZodNumber>;
200
+ count_ge150ms: z.ZodNumber;
201
+ }, z.core.$strict>;
202
+ acoustic_pause: z.ZodObject<{
203
+ count: z.ZodNumber;
204
+ median_s: z.ZodNullable<z.ZodNumber>;
205
+ p90_s: z.ZodNullable<z.ZodNumber>;
206
+ count_ge150ms: z.ZodNumber;
207
+ }, z.core.$strict>;
208
+ cut_safe: z.ZodObject<{
209
+ count: z.ZodNumber;
210
+ median_s: z.ZodNullable<z.ZodNumber>;
211
+ p90_s: z.ZodNullable<z.ZodNumber>;
212
+ count_ge150ms: z.ZodNumber;
213
+ }, z.core.$strict>;
214
+ acoustic_no_dip_count: z.ZodNumber;
215
+ acoustic_unconfirmed_count: z.ZodNumber;
216
+ }, z.core.$strict>;
217
+ mid_phrase: z.ZodObject<{
218
+ timestamp: z.ZodObject<{
219
+ count: z.ZodNumber;
220
+ median_s: z.ZodNullable<z.ZodNumber>;
221
+ p90_s: z.ZodNullable<z.ZodNumber>;
222
+ count_ge150ms: z.ZodNumber;
223
+ }, z.core.$strict>;
224
+ acoustic_pause: z.ZodObject<{
225
+ count: z.ZodNumber;
226
+ median_s: z.ZodNullable<z.ZodNumber>;
227
+ p90_s: z.ZodNullable<z.ZodNumber>;
228
+ count_ge150ms: z.ZodNumber;
229
+ }, z.core.$strict>;
230
+ cut_safe: z.ZodObject<{
231
+ count: z.ZodNumber;
232
+ median_s: z.ZodNullable<z.ZodNumber>;
233
+ p90_s: z.ZodNullable<z.ZodNumber>;
234
+ count_ge150ms: z.ZodNumber;
235
+ }, z.core.$strict>;
236
+ acoustic_no_dip_count: z.ZodNumber;
237
+ acoustic_unconfirmed_count: z.ZodNumber;
238
+ }, z.core.$strict>;
239
+ }, z.core.$strict>;
240
+ long_pause_count: z.ZodNumber;
241
+ hinge: z.ZodObject<{
242
+ status: z.ZodEnum<{
243
+ measured: "measured";
244
+ not_evaluated: "not_evaluated";
245
+ }>;
246
+ sentence_share: z.ZodNullable<z.ZodNumber>;
247
+ evaluated_sentences: z.ZodNumber;
248
+ coverage: z.ZodNullable<z.ZodNumber>;
249
+ timestamp_sentence_share: z.ZodNullable<z.ZodNumber>;
250
+ median_position: z.ZodNullable<z.ZodNumber>;
251
+ median_seconds: z.ZodNullable<z.ZodNumber>;
252
+ }, z.core.$strict>;
253
+ pitch: z.ZodObject<{
254
+ status: z.ZodEnum<{
255
+ measured: "measured";
256
+ no_voiced_frames: "no_voiced_frames";
257
+ }>;
258
+ ceiling_hz: z.ZodNumber;
259
+ ceiling_basis: z.ZodEnum<{
260
+ configured: "configured";
261
+ default: "default";
262
+ low_f0: "low_f0";
263
+ }>;
264
+ median_hz: z.ZodNullable<z.ZodNumber>;
265
+ p10_hz: z.ZodNullable<z.ZodNumber>;
266
+ p90_hz: z.ZodNullable<z.ZodNumber>;
267
+ range_st: z.ZodNullable<z.ZodNumber>;
268
+ voiced_frames: z.ZodNumber;
269
+ }, z.core.$strict>;
270
+ loudness: z.ZodObject<{
271
+ status: z.ZodEnum<{
272
+ measured: "measured";
273
+ unmeasured: "unmeasured";
274
+ }>;
275
+ range_db_p10_p90: z.ZodNullable<z.ZodNumber>;
276
+ }, z.core.$strict>;
277
+ warnings: z.ZodArray<z.ZodEnum<{
278
+ background_music_present_f0_and_intensity_may_be_contaminated: "background_music_present_f0_and_intensity_may_be_contaminated";
279
+ no_sentence_terminal_punctuation_pace_uses_turn_spans: "no_sentence_terminal_punctuation_pace_uses_turn_spans";
280
+ }>>;
281
+ }, z.core.$strict>>;
282
+ }, z.core.$strict>;
283
+ export type ReferenceVoice = z.infer<typeof referenceVoice>;
284
+ export type NarrationPace = {
285
+ kind: "paced";
286
+ target_wps: number;
287
+ voice_pace: number;
288
+ wanted: number;
289
+ clamped: boolean;
290
+ } | {
291
+ kind: "unmeasured";
292
+ reason: string;
293
+ };
294
+ /** The presenter's pace as make_ugc's voice_pace against our baseline voice, clamped to the vendor's range. */
295
+ export declare function narrationPaceFromVoice(voice: ReferenceVoice | undefined): NarrationPace;
296
+ export type PauseTrimFromVoice = {
297
+ targets: PauseTrimTargets;
298
+ capped: {
299
+ key: keyof PauseTrimTargets;
300
+ median_s: number;
301
+ }[];
302
+ };
303
+ /** The presenter's word-gap medians as trim targets within [floor, ceiling], naming each capped one; undefined when nothing was measured. */
304
+ export declare function pauseTrimFromVoice(voice: ReferenceVoice | undefined): PauseTrimFromVoice | undefined;
305
+ export {};
@@ -0,0 +1,108 @@
1
+ import { z } from "zod";
2
+ // Voice profile of a reference (reference-elements S7): pace, pauses, pitch and loudness per speaker, measured by our service from the transcribed
3
+ // words and the decoded audio. Numbers only, no words.
4
+ export const REFERENCE_VOICE_VERSION = "voice-profile-v1";
5
+ export const REFERENCE_VOICE_WARNINGS = ["no_sentence_terminal_punctuation_pace_uses_turn_spans",
6
+ "background_music_present_f0_and_intensity_may_be_contaminated"];
7
+ export const MAX_REFERENCE_VOICE_SPEAKERS = 6;
8
+ /** Words per second of our English default (eleven_v4) at speed 1 on the reference reel's text, as measured. */
9
+ export const NARRATION_BASELINE_WPS = 2.54;
10
+ /** ElevenLabs' speed range; make_ugc's voice_pace accepts the same. */
11
+ export const VOICE_PACE_MIN = 0.7;
12
+ export const VOICE_PACE_MAX = 1.2;
13
+ /** No trimmed pause gets shorter than this, whatever the reference measured. */
14
+ export const PAUSE_TRIM_FLOOR_S = 0.05;
15
+ /** The longest target make_ugc takes; a reference pause above it is compiled to it, with a plan note. */
16
+ export const PAUSE_TRIM_CEILING_S = 2;
17
+ const pauseTarget = z.number().min(PAUSE_TRIM_FLOOR_S).max(PAUSE_TRIM_CEILING_S).optional();
18
+ /** make_ugc's opt-in: per gap class, the length a longer pause is cut down to; quiet audio only, a joint that would click is kept. */
19
+ export const pauseTrim = z.strictObject({ sentence_end_s: pauseTarget, comma_s: pauseTarget, mid_phrase_s: pauseTarget })
20
+ .refine(targets => Object.values(targets).some(value => value !== undefined), "name at least one gap class");
21
+ const customIssue = "custom";
22
+ const count = z.number().int().min(0);
23
+ const seconds = z.number().min(0);
24
+ const share = z.number().min(0).max(1);
25
+ const pauseSummary = z.strictObject({ count, median_s: seconds.nullable(), p90_s: seconds.nullable(), count_ge150ms: count });
26
+ /** Three layers per gap kind: the ASR word gap, a local energy dip (12 dB below the neighbouring words, 40 ms), and cut-safe quiet (−40 dB). */
27
+ const pauseKind = z.strictObject({ timestamp: pauseSummary, acoustic_pause: pauseSummary, cut_safe: pauseSummary,
28
+ acoustic_no_dip_count: count, acoustic_unconfirmed_count: count });
29
+ /** A measured value is a number and an unmeasured one null: an absent pitch is never 0 Hz. */
30
+ function pairs(status, measured, values, ctx) {
31
+ const nulls = Object.entries(values).filter(([, value]) => value === null).map(([key]) => key);
32
+ if (status === measured && nulls.length)
33
+ ctx.addIssue({ code: customIssue, message: `${status} needs ${nulls.join(", ")}` });
34
+ if (status !== measured && nulls.length < Object.keys(values).length)
35
+ ctx.addIssue({ code: customIssue, message: `${status} keeps its values null` });
36
+ }
37
+ const referenceVoiceSpeaker = z.strictObject({
38
+ speaker: z.string().regex(/^[A-Za-z0-9_-]{1,40}$/).describe("The transcription vendor's speaker id."),
39
+ word_count: count,
40
+ sentence_count: count,
41
+ pace: z.strictObject({ status: z.enum(["measured", "unmeasured"]), words_per_second: z.number().positive().nullable()
42
+ .describe("Words over the sum of sentence spans: pauses inside a sentence count, gaps between sentences and other speakers do not."),
43
+ basis: z.enum(["sentence_spans", "turn_spans"]) })
44
+ .superRefine((pace, ctx) => pairs(pace.status, "measured", { words_per_second: pace.words_per_second }, ctx)),
45
+ pauses: z.strictObject({ sentence_end: pauseKind, comma: pauseKind, mid_phrase: pauseKind }),
46
+ long_pause_count: count.describe("Same-speaker pauses over two seconds, kept with their punctuation kind."),
47
+ hinge: z.strictObject({ status: z.enum(["measured", "not_evaluated"]),
48
+ sentence_share: share.nullable().describe("Share of acoustically evaluated sentences with an internal pause of 150 ms or more; not all sentences."),
49
+ evaluated_sentences: count, coverage: share.nullable(), timestamp_sentence_share: share.nullable(),
50
+ median_position: share.nullable().describe("Where the hinge falls, as the share of the sentence's words before it."), median_seconds: seconds.nullable() })
51
+ .superRefine((hinge, ctx) => pairs(hinge.status, "measured", { sentence_share: hinge.sentence_share }, ctx)),
52
+ pitch: z.strictObject({ status: z.enum(["measured", "no_voiced_frames"]), ceiling_hz: z.number().positive(),
53
+ ceiling_basis: z.enum(["default", "low_f0", "configured"]).describe("default 400 Hz; low_f0: a median under 165 Hz at 400 is measured again at 300 Hz."),
54
+ median_hz: z.number().positive().nullable(), p10_hz: z.number().positive().nullable(), p90_hz: z.number().positive().nullable(),
55
+ range_st: z.number().min(0).nullable(), voiced_frames: count })
56
+ .superRefine((pitch, ctx) => pairs(pitch.status, "measured", { median_hz: pitch.median_hz, p10_hz: pitch.p10_hz, p90_hz: pitch.p90_hz, range_st: pitch.range_st }, ctx)),
57
+ loudness: z.strictObject({ status: z.enum(["measured", "unmeasured"]), range_db_p10_p90: z.number().min(0).nullable() })
58
+ .superRefine((loudness, ctx) => pairs(loudness.status, "measured", { range_db_p10_p90: loudness.range_db_p10_p90 }, ctx)),
59
+ warnings: z.array(z.enum(REFERENCE_VOICE_WARNINGS)).max(REFERENCE_VOICE_WARNINGS.length),
60
+ });
61
+ export const referenceVoice = z.strictObject({
62
+ version: z.literal(REFERENCE_VOICE_VERSION),
63
+ method: z.strictObject({ pause_drop_db: z.number().positive(), pause_min_run_s: z.number().positive(), cut_safe_db: z.number().negative(),
64
+ pitch: z.literal("yin"), sample_rate: z.number().int().positive() }),
65
+ presenter_speaker: z.string().nullable(),
66
+ speakers: z.array(referenceVoiceSpeaker).min(1).max(MAX_REFERENCE_VOICE_SPEAKERS),
67
+ }).superRefine((voice, ctx) => {
68
+ voice.speakers.forEach((entry, index) => {
69
+ if (voice.speakers.findIndex(other => other.speaker === entry.speaker) < index) {
70
+ ctx.addIssue({ code: customIssue, path: ["speakers", index, "speaker"], message: "names a speaker twice" });
71
+ }
72
+ });
73
+ if (voice.presenter_speaker !== null && !voice.speakers.some(entry => entry.speaker === voice.presenter_speaker)) {
74
+ ctx.addIssue({ code: customIssue, path: ["presenter_speaker"], message: "is not one of the speakers" });
75
+ }
76
+ });
77
+ /** The presenter's pace as make_ugc's voice_pace against our baseline voice, clamped to the vendor's range. */
78
+ export function narrationPaceFromVoice(voice) {
79
+ if (!voice)
80
+ return { kind: "unmeasured", reason: "the reference voice was not measured" };
81
+ const presenter = voice.speakers.find(entry => entry.speaker === voice.presenter_speaker);
82
+ if (!presenter)
83
+ return { kind: "unmeasured", reason: "the reference has no presenter voice" };
84
+ const target = presenter.pace.words_per_second;
85
+ if (target === null)
86
+ return { kind: "unmeasured", reason: "the presenter's pace was not measured" };
87
+ const wanted = Math.round((target / NARRATION_BASELINE_WPS) * 100) / 100;
88
+ const pace = Math.min(VOICE_PACE_MAX, Math.max(VOICE_PACE_MIN, wanted));
89
+ return { kind: "paced", target_wps: Math.round(target * 100) / 100, voice_pace: pace, wanted, clamped: pace !== wanted };
90
+ }
91
+ /** The presenter's word-gap medians as trim targets within [floor, ceiling], naming each capped one; undefined when nothing was measured. */
92
+ export function pauseTrimFromVoice(voice) {
93
+ const presenter = voice?.speakers.find(entry => entry.speaker === voice.presenter_speaker);
94
+ if (!presenter)
95
+ return undefined;
96
+ const capped = [];
97
+ const targets = Object.fromEntries([["sentence_end_s", presenter.pauses.sentence_end], ["comma_s", presenter.pauses.comma],
98
+ ["mid_phrase_s", presenter.pauses.mid_phrase]].flatMap(([key, kind]) => {
99
+ const median = kind.timestamp.median_s;
100
+ if (median === null)
101
+ return [];
102
+ if (median > PAUSE_TRIM_CEILING_S)
103
+ capped.push({ key, median_s: median });
104
+ return [[key, Math.min(PAUSE_TRIM_CEILING_S, Math.max(PAUSE_TRIM_FLOOR_S, median))]];
105
+ }));
106
+ return Object.keys(targets).length ? { targets, capped } : undefined;
107
+ }
108
+ //# sourceMappingURL=reference-voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-voice.js","sourceRoot":"","sources":["../src/reference-voice.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,7 @@ export interface BackendCapabilities {
58
58
  export interface RenderBackend {
59
59
  readonly name: string;
60
60
  readonly capabilities: BackendCapabilities;
61
- /** Creates the vendor job: PAID and once, apart from the free, resumable poll. Keys vendor */
61
+ /** Creates the avatar job: PAID and once, apart from the free, resumable poll. Keys vendor */
62
62
  /** idempotency on the scope; `retryable` describes the error, and a paid create is never retried. */
63
63
  createAvatarJob(req: AvatarClipRequest): Promise<AvatarJobHandle>;
64
64
  /** Waits for a terminal state; free and idempotent. Fail-closed: only an explicit success */