@voqalize/avatar 0.4.1 → 0.4.3

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 (203) hide show
  1. package/LICENSE-APACHE-2.0 +201 -0
  2. package/README.md +26 -95
  3. package/assets/README.md +30 -18
  4. package/assets/tanvi.glb +0 -0
  5. package/assets/tanya.glb +0 -0
  6. package/assets/tara.glb +0 -0
  7. package/assets/tess.glb +0 -0
  8. package/assets/tushar.glb +0 -0
  9. package/client/internal.ts +24 -0
  10. package/client/supports.ts +6 -7
  11. package/client/three/assets.ts +7 -3
  12. package/client/three/budgets.ts +1 -1
  13. package/client/three/{tara-rig.ts → character-rig.ts} +682 -540
  14. package/client/three/createCharacter.ts +109 -0
  15. package/client/three/holds.ts +8 -3
  16. package/client/three/internal.ts +8 -7
  17. package/client/three/motion-limits.json +10 -2
  18. package/client/three/sequences.ts +5 -5
  19. package/client/three/tanvi-asset.ts +6 -0
  20. package/client/three/tanvi.ts +30 -0
  21. package/client/three/tanya.ts +18 -58
  22. package/client/three/tara.ts +19 -60
  23. package/client/three/tess-asset.ts +6 -0
  24. package/client/three/tess.ts +30 -0
  25. package/client/three/tushar.ts +18 -55
  26. package/dist/internal.d.ts +2 -2
  27. package/dist/internal.d.ts.map +1 -1
  28. package/dist/internal.js +16 -1
  29. package/dist/internal.js.map +1 -1
  30. package/dist/supports.d.ts +6 -7
  31. package/dist/supports.d.ts.map +1 -1
  32. package/dist/supports.js +6 -7
  33. package/dist/supports.js.map +1 -1
  34. package/dist/three/assets.d.ts +2 -0
  35. package/dist/three/assets.d.ts.map +1 -1
  36. package/dist/three/assets.js +7 -3
  37. package/dist/three/assets.js.map +1 -1
  38. package/dist/three/budgets.d.ts +1 -1
  39. package/dist/three/budgets.js +1 -1
  40. package/dist/three/character-rig.d.ts +366 -0
  41. package/dist/three/character-rig.d.ts.map +1 -0
  42. package/dist/three/{tara-rig.js → character-rig.js} +633 -526
  43. package/dist/three/character-rig.js.map +1 -0
  44. package/dist/three/createCharacter.d.ts +60 -0
  45. package/dist/three/createCharacter.d.ts.map +1 -0
  46. package/dist/three/createCharacter.js +84 -0
  47. package/dist/three/createCharacter.js.map +1 -0
  48. package/dist/three/holds.d.ts +7 -2
  49. package/dist/three/holds.d.ts.map +1 -1
  50. package/dist/three/holds.js +8 -3
  51. package/dist/three/holds.js.map +1 -1
  52. package/dist/three/internal.d.ts +7 -7
  53. package/dist/three/internal.d.ts.map +1 -1
  54. package/dist/three/internal.js +6 -6
  55. package/dist/three/internal.js.map +1 -1
  56. package/dist/three/motion-limits.json +10 -2
  57. package/dist/three/sequences.d.ts +5 -5
  58. package/dist/three/sequences.js +5 -5
  59. package/dist/three/tanvi-asset.d.ts +7 -0
  60. package/dist/three/tanvi-asset.d.ts.map +1 -0
  61. package/dist/three/tanvi-asset.js +7 -0
  62. package/dist/three/tanvi-asset.js.map +1 -0
  63. package/dist/three/tanvi.d.ts +24 -0
  64. package/dist/three/tanvi.d.ts.map +1 -0
  65. package/dist/three/tanvi.js +24 -0
  66. package/dist/three/tanvi.js.map +1 -0
  67. package/dist/three/tanya.d.ts +16 -28
  68. package/dist/three/tanya.d.ts.map +1 -1
  69. package/dist/three/tanya.js +15 -43
  70. package/dist/three/tanya.js.map +1 -1
  71. package/dist/three/tara.d.ts +17 -22
  72. package/dist/three/tara.d.ts.map +1 -1
  73. package/dist/three/tara.js +16 -45
  74. package/dist/three/tara.js.map +1 -1
  75. package/dist/three/tess-asset.d.ts +7 -0
  76. package/dist/three/tess-asset.d.ts.map +1 -0
  77. package/dist/three/tess-asset.js +7 -0
  78. package/dist/three/tess-asset.js.map +1 -0
  79. package/dist/three/tess.d.ts +24 -0
  80. package/dist/three/tess.d.ts.map +1 -0
  81. package/dist/three/tess.js +24 -0
  82. package/dist/three/tess.js.map +1 -0
  83. package/dist/three/tushar.d.ts +16 -25
  84. package/dist/three/tushar.d.ts.map +1 -1
  85. package/dist/three/tushar.js +15 -40
  86. package/dist/three/tushar.js.map +1 -1
  87. package/package.json +10 -49
  88. package/src/avatar.d.ts +67 -2
  89. package/src/avatar.js +131 -255
  90. package/src/faces.js +1 -1
  91. package/src/gaze.js +20 -47
  92. package/src/idle.js +69 -27
  93. package/src/prosody.js +109 -15
  94. package/src/rig.d.ts +7 -0
  95. package/src/speech-timing.js +9 -0
  96. package/src/visemes.js +107 -13
  97. package/client/arjun.ts +0 -26
  98. package/client/createCanvasAvatar.ts +0 -72
  99. package/client/interviewer-female.ts +0 -4
  100. package/client/interviewer-male.ts +0 -4
  101. package/client/ishita.ts +0 -26
  102. package/client/kabir.ts +0 -26
  103. package/client/meera.ts +0 -26
  104. package/client/naina.ts +0 -26
  105. package/client/professional-female-a.ts +0 -4
  106. package/client/professional-female-b.ts +0 -4
  107. package/client/professional-male-a.ts +0 -4
  108. package/client/professional-male-b.ts +0 -4
  109. package/client/vikram.ts +0 -26
  110. package/dist/arjun.d.ts +0 -7
  111. package/dist/arjun.d.ts.map +0 -1
  112. package/dist/arjun.js +0 -20
  113. package/dist/arjun.js.map +0 -1
  114. package/dist/createCanvasAvatar.d.ts +0 -22
  115. package/dist/createCanvasAvatar.d.ts.map +0 -1
  116. package/dist/createCanvasAvatar.js +0 -47
  117. package/dist/createCanvasAvatar.js.map +0 -1
  118. package/dist/interviewer-female.d.ts +0 -4
  119. package/dist/interviewer-female.d.ts.map +0 -1
  120. package/dist/interviewer-female.js +0 -3
  121. package/dist/interviewer-female.js.map +0 -1
  122. package/dist/interviewer-male.d.ts +0 -4
  123. package/dist/interviewer-male.d.ts.map +0 -1
  124. package/dist/interviewer-male.js +0 -3
  125. package/dist/interviewer-male.js.map +0 -1
  126. package/dist/ishita.d.ts +0 -7
  127. package/dist/ishita.d.ts.map +0 -1
  128. package/dist/ishita.js +0 -20
  129. package/dist/ishita.js.map +0 -1
  130. package/dist/kabir.d.ts +0 -7
  131. package/dist/kabir.d.ts.map +0 -1
  132. package/dist/kabir.js +0 -20
  133. package/dist/kabir.js.map +0 -1
  134. package/dist/meera.d.ts +0 -7
  135. package/dist/meera.d.ts.map +0 -1
  136. package/dist/meera.js +0 -20
  137. package/dist/meera.js.map +0 -1
  138. package/dist/naina.d.ts +0 -7
  139. package/dist/naina.d.ts.map +0 -1
  140. package/dist/naina.js +0 -20
  141. package/dist/naina.js.map +0 -1
  142. package/dist/professional-female-a.d.ts +0 -4
  143. package/dist/professional-female-a.d.ts.map +0 -1
  144. package/dist/professional-female-a.js +0 -3
  145. package/dist/professional-female-a.js.map +0 -1
  146. package/dist/professional-female-b.d.ts +0 -4
  147. package/dist/professional-female-b.d.ts.map +0 -1
  148. package/dist/professional-female-b.js +0 -3
  149. package/dist/professional-female-b.js.map +0 -1
  150. package/dist/professional-male-a.d.ts +0 -4
  151. package/dist/professional-male-a.d.ts.map +0 -1
  152. package/dist/professional-male-a.js +0 -3
  153. package/dist/professional-male-a.js.map +0 -1
  154. package/dist/professional-male-b.d.ts +0 -4
  155. package/dist/professional-male-b.d.ts.map +0 -1
  156. package/dist/professional-male-b.js +0 -3
  157. package/dist/professional-male-b.js.map +0 -1
  158. package/dist/three/tara-rig.d.ts +0 -409
  159. package/dist/three/tara-rig.d.ts.map +0 -1
  160. package/dist/three/tara-rig.js.map +0 -1
  161. package/dist/vikram.d.ts +0 -7
  162. package/dist/vikram.d.ts.map +0 -1
  163. package/dist/vikram.js +0 -20
  164. package/dist/vikram.js.map +0 -1
  165. package/src/canvas/author/parts/eye.mjs +0 -722
  166. package/src/canvas/author/parts/hand.mjs +0 -1156
  167. package/src/canvas/author/parts/mouth.mjs +0 -741
  168. package/src/canvas/author/parts/nose.mjs +0 -100
  169. package/src/canvas/author/parts/skin-detail.mjs +0 -67
  170. package/src/canvas/author/path.mjs +0 -283
  171. package/src/canvas/author/rig.mjs +0 -405
  172. package/src/canvas/avatars/round/face.d.mts +0 -3
  173. package/src/canvas/avatars/round/face.mjs +0 -1307
  174. package/src/canvas/create-rig.d.ts +0 -15
  175. package/src/canvas/create-rig.js +0 -100
  176. package/src/canvas/data/img/professional-female-a-hair-back.webp +0 -0
  177. package/src/canvas/data/img/professional-female-a-hair-front.webp +0 -0
  178. package/src/canvas/data/img/professional-female-a-top-body.webp +0 -0
  179. package/src/canvas/data/img/professional-female-b-hair-back.webp +0 -0
  180. package/src/canvas/data/img/professional-female-b-hair-front.webp +0 -0
  181. package/src/canvas/data/img/professional-female-b-top-body.webp +0 -0
  182. package/src/canvas/data/img/professional-male-a-hair-back.webp +0 -0
  183. package/src/canvas/data/img/professional-male-a-hair-front.webp +0 -0
  184. package/src/canvas/data/img/professional-male-a-top-body.webp +0 -0
  185. package/src/canvas/data/img/professional-male-b-hair-back.webp +0 -0
  186. package/src/canvas/data/img/professional-male-b-hair-front.webp +0 -0
  187. package/src/canvas/data/img/professional-male-b-top-body.webp +0 -0
  188. package/src/canvas/data/img/round-m3-hair-back.webp +0 -0
  189. package/src/canvas/data/img/round-m3-hair-front.webp +0 -0
  190. package/src/canvas/data/img/round-m3-top-body.webp +0 -0
  191. package/src/canvas/data/img/round-w1-hair-back.webp +0 -0
  192. package/src/canvas/data/img/round-w1-hair-front.webp +0 -0
  193. package/src/canvas/data/img/round-w1-top-body.webp +0 -0
  194. package/src/canvas/data/interviewer-female.rig.json +0 -1
  195. package/src/canvas/data/interviewer-male.rig.json +0 -1
  196. package/src/canvas/data/professional-female-a.rig.json +0 -1
  197. package/src/canvas/data/professional-female-b.rig.json +0 -1
  198. package/src/canvas/data/professional-male-a.rig.json +0 -1
  199. package/src/canvas/data/professional-male-b.rig.json +0 -1
  200. package/src/canvas/src/live.js +0 -508
  201. package/src/canvas/src/render2d.js +0 -218
  202. package/src/canvas/src/rig.js +0 -297
  203. package/src/canvas/src/vocab.js +0 -96
package/src/avatar.d.ts CHANGED
@@ -195,7 +195,7 @@ export interface AvatarApi {
195
195
  readonly gestureGain: Gain;
196
196
  setMotionGain(g: Gain): AvatarApi;
197
197
  readonly motionGain: Gain;
198
- blink(double?: boolean): AvatarApi;
198
+ blink(): AvatarApi;
199
199
  /** Advance one frame by hand — only meaningful under `{ manual: true }`. */
200
200
  step(dt: number): AvatarApi;
201
201
  /** Pin channels to fixed values, above the whole mix. `null` releases. */
@@ -316,7 +316,12 @@ export function createAvatar(opts: CreateAvatarOptions): AvatarApi;
316
316
  export const STATES: Readonly<Record<AvatarStateName, Readonly<Record<string, unknown>>>>;
317
317
  export const STATE_NAMES: readonly AvatarStateName[];
318
318
  export const GAZE_NAMES: readonly AvatarGazeName[];
319
- export const GAZE_TARGETS: Readonly<Record<AvatarGazeName, { x: number; y: number }>>;
319
+ /** Where each named direction puts the eyes and the head: pupil offset
320
+ * (`px`/`py`), the head's share of it (`hx`/`hy`) and any roll. Pose units, and
321
+ * the head deliberately carries less than the whole (`src/gaze.js`). */
322
+ export const GAZE_TARGETS: Readonly<Record<AvatarGazeName, {
323
+ px: number; py: number; hx: number; hy: number; roll?: number;
324
+ }>>;
320
325
  export const EMOTION_NAMES: readonly AvatarEmotionName[];
321
326
  export const ACTIONS: Readonly<Record<AvatarActionId, unknown>>;
322
327
  export const ACTION_IDS: readonly AvatarActionId[];
@@ -334,12 +339,24 @@ export const REST: Readonly<Record<PoseChannel, number>>;
334
339
  export const CHANNELS: readonly PoseChannel[];
335
340
  /** Post-mix clamp per channel, `[min, max]`. */
336
341
  export const RANGE: Readonly<Record<PoseChannel, readonly [number, number]>>;
342
+ /** Each channel's smoothing time constant, in seconds. */
343
+ export const TAU: Readonly<Record<PoseChannel, number>>;
344
+ export function clamp(v: number, lo?: number, hi?: number): number;
345
+ /** One frame of exponential smoothing: where `cur` lands `dt` seconds into a
346
+ * chase of `target` with time constant `tau`. */
347
+ export function approach(cur: number, target: number, tau: number, dt: number): number;
337
348
  export const VISEME_LETTERS: readonly VisemeLetter[];
338
349
  export const VISEME_SHAPES: Readonly<Record<VisemeLetter, PoseOverrides>>;
339
350
  /** Cues lead the audio by this many ms — perceptual tolerance is asymmetric. */
340
351
  export const LEAD_MS: number;
341
352
  /** The shoulder line's share of a held `headRoll`, per pose unit. */
342
353
  export const SHOULDER_TILT: number;
354
+ /** A full pose from a handful of overrides: every unnamed channel takes its
355
+ * `REST` value. The only correct way to build a frame by hand. */
356
+ export function makeParams(overrides?: PoseOverrides): Record<PoseChannel, number>;
357
+ /** One named emotion's channel deltas at `intensity` (0..1). */
358
+ export function emotionPose(name: AvatarEmotionName, intensity?: number): PoseOverrides;
359
+ export { avatarFrame, createSvgRig } from "./rig.js";
343
360
  export const ARPABET_TO_VISEME: Readonly<Record<string, VisemeLetter>>;
344
361
  export const AZURE_VISEME_TO_LETTER: Readonly<Record<number, VisemeLetter>>;
345
362
 
@@ -347,6 +364,8 @@ export const AZURE_VISEME_TO_LETTER: Readonly<Record<number, VisemeLetter>>;
347
364
  export const SILENT: VisemeLetter;
348
365
  /** Pose channels for one letter at `intensity` (0..1), ready to merge into a frame. */
349
366
  export function shapeFor(letter: VisemeLetter, intensity?: number): PoseOverrides;
367
+ /** `jaw` per unit of `mouthOpen`, the ratio the mouth's interior is calibrated at. */
368
+ export const JAW_OF_OPEN: number;
350
369
 
351
370
  /**
352
371
  * The mouth clock. Someone has to turn a cue array plus a clock into "which
@@ -365,6 +384,52 @@ export class VisemeTrack {
365
384
  readonly playing: boolean;
366
385
  }
367
386
 
387
+ /**
388
+ * One authored gesture: a short multi-channel timeline of additive deltas,
389
+ * optionally with its own mouth track, gaze override and blink beats.
390
+ */
391
+ export interface Clip {
392
+ readonly id: string;
393
+ readonly label: string;
394
+ readonly text: string;
395
+ /** Milliseconds, end to end. */
396
+ readonly duration: number;
397
+ /** Per channel, `[u, delta]` keys against normalized clip time. */
398
+ readonly keys: Readonly<Record<string, ReadonlyArray<readonly [number, number]>>>;
399
+ readonly mouthCues?: readonly Cue[];
400
+ readonly gaze?: AvatarGazeName;
401
+ readonly blinkAt?: readonly number[];
402
+ }
403
+
404
+ /**
405
+ * Every clip this renderer has, keyed by id — the authoring library, not the
406
+ * wire's vocabulary. Most are reachable only from inside the mixer: `ACTIONS`
407
+ * is what a server may name.
408
+ */
409
+ export const INTERNAL_CLIPS: Readonly<Record<string, Clip>>;
410
+
411
+ /** What one tick of a clip contributes: additive channel deltas, the ramp
412
+ * weight they already carry, and the mouth when the clip owns it. */
413
+ export interface ClipSample {
414
+ delta: Record<string, number> | null;
415
+ weight: number;
416
+ mouth: { letter: VisemeLetter; intensity: number } | null;
417
+ ownsMouth: boolean;
418
+ }
419
+
420
+ /** Plays one clip forward in ticks you supply. Fixed-`dt` stepping is what
421
+ * makes a rendered gesture reproducible. */
422
+ export class ClipPlayer {
423
+ constructor(hooks?: { onGaze?: (name: string | null) => void; onBlink?: () => void });
424
+ play(clip: Clip, audio?: HTMLMediaElement | null, opts?: { queue?: boolean }): void;
425
+ /** Advance by `dtMs` and report this frame's contribution. */
426
+ update(dtMs: number): ClipSample;
427
+ stop(immediate?: boolean): void;
428
+ onEnd: ((clip: Clip | null) => void) | null;
429
+ readonly playing: boolean;
430
+ readonly id: string | null;
431
+ }
432
+
368
433
  export function attachAudio(id: string, url: string): void;
369
434
  export function normalizeActions(actions: AvatarAction[]): AvatarAction[];
370
435
  export function normalizeCues(cues: Cue[]): Cue[];