@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
@@ -1,35 +1,23 @@
1
1
  /**
2
- * tanya — the third 3-D character, and like `tushar.ts` a copy of `tara.ts`.
2
+ * tanya — the third 3-D character, and the first whose atlas is not tara's
3
+ * window.
3
4
  *
4
- * Her GLB is tara's scripts run with her landmarks and atlas layout in place of
5
- * hers (`characters/tanya/`, whose README has the provenance and the commands),
6
- * so the rig, the mixer, the sequences and her tuning are all hers, unmodified;
7
- * the one seam is `TaraRigOptions.url`.
5
+ * Her GLB is the shared scripts run with her landmarks and atlas layout
6
+ * (`characters/tanya/`, whose README has the provenance and the commands).
7
+ * Her hair is the silhouette down past the jaw, out to |u| 0.761 where tara's
8
+ * window stops at 0.64, so `characters/tanya/face_texture.py` widens it to
9
+ * 1408x1568 at the same 800 pixels per face height. That is a fact about the
10
+ * asset and costs this file nothing — the rig reads the window from the GLB.
8
11
  *
9
- * She is the first character whose atlas is not tara's window. Her hair is the
10
- * silhouette down past the jaw, out to |u| 0.761 where tara's window stops at
11
- * 0.64, so `characters/tanya/face_texture.py` widens it to 1408x1568 at the same
12
- * 800 pixels per face height. That is a fact about the asset and costs this file
13
- * nothing — the rig reads the window from the GLB.
12
+ * Hair that hangs is what else makes her the third rather than a fourth copy:
13
+ * hers is the only `Hair` mesh that carries the roll channels, because it is
14
+ * the only one with anything below the hold line to lag behind a tilt.
14
15
  */
15
- import type { PipecatClient } from "@pipecat-ai/client-js";
16
- export interface AvatarOptions {
17
- readonly mount: HTMLElement;
18
- readonly client: PipecatClient;
19
- /** Viseme amplitude, 0..2. `1` is as authored. */
20
- readonly mouthGain?: number;
21
- /** Gesture-clip amplitude, 0..2. */
22
- readonly gestureGain?: number;
23
- /** Idle/liveness amplitude, 0..2. */
24
- readonly motionGain?: number;
25
- /** Fires when the GLB is in the scene — for a capture tool, not a consumer. */
26
- readonly onReady?: () => void;
27
- }
28
- export interface AvatarInstance {
29
- destroy(): void;
30
- }
31
- /** The optional driving-UI declaration; one list for all three characters
16
+ import type { CharacterAvatarOptions } from "./createCharacter.js";
17
+ export type { CharacterAvatarOptions as AvatarOptions };
18
+ export type { AvatarInstance } from "./createCharacter.js";
19
+ /** The optional driving-UI declaration; one list for every Blender character
32
20
  * (`sequences.ts`), because they are one rig. */
33
21
  export declare const supports: import("../createAvatar.js").AvatarSupport;
34
- export declare function createAvatar(options: AvatarOptions): AvatarInstance;
22
+ export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
35
23
  //# sourceMappingURL=tanya.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tanya.d.ts","sourceRoot":"","sources":["../../client/three/tanya.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQ3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAAG,OAAO,IAAI,IAAI,CAAC;CAAE;AAEpD;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CA0BnE"}
1
+ {"version":3,"file":"tanya.d.ts","sourceRoot":"","sources":["../../client/three/tanya.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAAgC,CAAC"}
@@ -1,51 +1,23 @@
1
1
  /**
2
- * tanya — the third 3-D character, and like `tushar.ts` a copy of `tara.ts`.
2
+ * tanya — the third 3-D character, and the first whose atlas is not tara's
3
+ * window.
3
4
  *
4
- * Her GLB is tara's scripts run with her landmarks and atlas layout in place of
5
- * hers (`characters/tanya/`, whose README has the provenance and the commands),
6
- * so the rig, the mixer, the sequences and her tuning are all hers, unmodified;
7
- * the one seam is `TaraRigOptions.url`.
5
+ * Her GLB is the shared scripts run with her landmarks and atlas layout
6
+ * (`characters/tanya/`, whose README has the provenance and the commands).
7
+ * Her hair is the silhouette down past the jaw, out to |u| 0.761 where tara's
8
+ * window stops at 0.64, so `characters/tanya/face_texture.py` widens it to
9
+ * 1408x1568 at the same 800 pixels per face height. That is a fact about the
10
+ * asset and costs this file nothing — the rig reads the window from the GLB.
8
11
  *
9
- * She is the first character whose atlas is not tara's window. Her hair is the
10
- * silhouette down past the jaw, out to |u| 0.761 where tara's window stops at
11
- * 0.64, so `characters/tanya/face_texture.py` widens it to 1408x1568 at the same
12
- * 800 pixels per face height. That is a fact about the asset and costs this file
13
- * nothing — the rig reads the window from the GLB.
12
+ * Hair that hangs is what else makes her the third rather than a fourth copy:
13
+ * hers is the only `Hair` mesh that carries the roll channels, because it is
14
+ * the only one with anything below the hold line to lag behind a tilt.
14
15
  */
15
- import { AvatarClient, createSvgAvatar } from "../internal.js";
16
+ import { character } from "./createCharacter.js";
17
+ import { BLENDER_SUPPORTS } from "./sequences.js";
16
18
  import { TANYA_GLB } from "./tanya-asset.js";
17
- import { BLENDER_ACTIONS, BLENDER_SEQUENCES, BLENDER_SUPPORTS } from "./sequences.js";
18
- import { headHold } from "./holds.js";
19
- import { createTaraRig, TARA_TUNING } from "./tara-rig.js";
20
- /** The optional driving-UI declaration; one list for all three characters
19
+ /** The optional driving-UI declaration; one list for every Blender character
21
20
  * (`sequences.ts`), because they are one rig. */
22
21
  export const supports = BLENDER_SUPPORTS;
23
- export function createAvatar(options) {
24
- const { mount, client, onReady, ...gains } = options;
25
- if (!mount)
26
- throw new TypeError("createAvatar: `mount` is required");
27
- if (!client)
28
- throw new TypeError("createAvatar: `client` is required");
29
- const rigOptions = { onReady, url: TANYA_GLB };
30
- // TARA-SPECIFIC, kept on purpose: `TARA_TUNING` (her mouth and motion gains)
31
- // is the first thing to question if she reads wrong in a call.
32
- const widget = createSvgAvatar({
33
- mount, rig: createTaraRig, rigOptions, hand: false,
34
- sequences: BLENDER_SEQUENCES, actions: BLENDER_ACTIONS, ...TARA_TUNING,
35
- headHold: headHold("tanya"), ...gains,
36
- });
37
- const driver = new AvatarClient(widget);
38
- const detach = driver.attach(client);
39
- let destroyed = false;
40
- return {
41
- destroy() {
42
- if (destroyed)
43
- return;
44
- destroyed = true;
45
- detach();
46
- driver.destroy();
47
- widget.destroy();
48
- },
49
- };
50
- }
22
+ export const createAvatar = character("tanya", TANYA_GLB);
51
23
  //# sourceMappingURL=tanya.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tanya.js","sourceRoot":"","sources":["../../client/three/tanya.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkB3D;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC/D,6EAA6E;IAC7E,+DAA+D;IAC/D,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK;QAClD,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,WAAW;QACtE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK;KACtC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tanya.js","sourceRoot":"","sources":["../../client/three/tanya.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK7C;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC"}
@@ -4,32 +4,27 @@
4
4
  * Structurally this is the canvas avatars' shape, one layer down: the mixer
5
5
  * (`@voqalize/avatar/internal`) does states, layers, gaze, idle, blinks, clips
6
6
  * and per-channel smoothing exactly as it does for every SVG face, and the only
7
- * thing tara replaces is the renderer at the end of it. That is the whole
8
- * argument for authoring her morph targets under the library's pose-channel
9
- * names: nothing above this line knows there is a GPU involved, and every clip,
10
- * viseme and co-articulation rule the SVG faces have works here unmodified.
7
+ * thing a Blender character replaces is the renderer at the end of it. That is
8
+ * the whole argument for authoring her morph targets under the library's pose
9
+ * channel names: nothing above this line knows there is a GPU involved, and
10
+ * every clip, viseme and co-articulation rule the SVG faces have works here
11
+ * unmodified.
12
+ *
13
+ * How a Blender character is driven is `createCharacter.ts`, and it is the same
14
+ * for all of them. What is hers is the mesh — and, until 2026-09-23, rather
15
+ * more than that: this file was the original, the others were copies of it, and
16
+ * the performance every character inherits was measured on her face. It is the
17
+ * house performance now (`CHARACTER_TUNING`), which changes nothing about how
18
+ * she looks and everything about where it is decided.
11
19
  *
12
20
  * The Three.js import lives behind this module rather than in the barrel so an
13
21
  * SVG or Canvas consumer never downloads it.
14
22
  */
15
- import type { PipecatClient } from "@pipecat-ai/client-js";
16
- export interface AvatarOptions {
17
- readonly mount: HTMLElement;
18
- readonly client: PipecatClient;
19
- /** Viseme amplitude, 0..2. `1` is as authored. */
20
- readonly mouthGain?: number;
21
- /** Gesture-clip amplitude, 0..2. */
22
- readonly gestureGain?: number;
23
- /** Idle/liveness amplitude, 0..2. */
24
- readonly motionGain?: number;
25
- /** Fires when the GLB is in the scene — for a capture tool, not a consumer. */
26
- readonly onReady?: () => void;
27
- }
28
- export interface AvatarInstance {
29
- destroy(): void;
30
- }
31
- /** The optional driving-UI declaration; one list for all three characters
23
+ import type { CharacterAvatarOptions } from "./createCharacter.js";
24
+ export type { CharacterAvatarOptions as AvatarOptions };
25
+ export type { AvatarInstance } from "./createCharacter.js";
26
+ /** The optional driving-UI declaration; one list for every Blender character
32
27
  * (`sequences.ts`), because they are one rig. */
33
28
  export declare const supports: import("../createAvatar.js").AvatarSupport;
34
- export declare function createAvatar(options: AvatarOptions): AvatarInstance;
29
+ export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
35
30
  //# sourceMappingURL=tara.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tara.d.ts","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQ3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAAG,OAAO,IAAI,IAAI,CAAC;CAAE;AAEpD;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAkCnE"}
1
+ {"version":3,"file":"tara.d.ts","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAA8B,CAAC"}
@@ -4,56 +4,27 @@
4
4
  * Structurally this is the canvas avatars' shape, one layer down: the mixer
5
5
  * (`@voqalize/avatar/internal`) does states, layers, gaze, idle, blinks, clips
6
6
  * and per-channel smoothing exactly as it does for every SVG face, and the only
7
- * thing tara replaces is the renderer at the end of it. That is the whole
8
- * argument for authoring her morph targets under the library's pose-channel
9
- * names: nothing above this line knows there is a GPU involved, and every clip,
10
- * viseme and co-articulation rule the SVG faces have works here unmodified.
7
+ * thing a Blender character replaces is the renderer at the end of it. That is
8
+ * the whole argument for authoring her morph targets under the library's pose
9
+ * channel names: nothing above this line knows there is a GPU involved, and
10
+ * every clip, viseme and co-articulation rule the SVG faces have works here
11
+ * unmodified.
12
+ *
13
+ * How a Blender character is driven is `createCharacter.ts`, and it is the same
14
+ * for all of them. What is hers is the mesh — and, until 2026-09-23, rather
15
+ * more than that: this file was the original, the others were copies of it, and
16
+ * the performance every character inherits was measured on her face. It is the
17
+ * house performance now (`CHARACTER_TUNING`), which changes nothing about how
18
+ * she looks and everything about where it is decided.
11
19
  *
12
20
  * The Three.js import lives behind this module rather than in the barrel so an
13
21
  * SVG or Canvas consumer never downloads it.
14
22
  */
15
- import { AvatarClient, createSvgAvatar } from "../internal.js";
16
- import { BLENDER_ACTIONS, BLENDER_SEQUENCES, BLENDER_SUPPORTS } from "./sequences.js";
23
+ import { character } from "./createCharacter.js";
24
+ import { BLENDER_SUPPORTS } from "./sequences.js";
17
25
  import { TARA_GLB } from "./tara-asset.js";
18
- import { headHold } from "./holds.js";
19
- import { createTaraRig, TARA_TUNING } from "./tara-rig.js";
20
- /** The optional driving-UI declaration; one list for all three characters
26
+ /** The optional driving-UI declaration; one list for every Blender character
21
27
  * (`sequences.ts`), because they are one rig. */
22
28
  export const supports = BLENDER_SUPPORTS;
23
- export function createAvatar(options) {
24
- const { mount, client, onReady, ...gains } = options;
25
- if (!mount)
26
- throw new TypeError("createAvatar: `mount` is required");
27
- if (!client)
28
- throw new TypeError("createAvatar: `client` is required");
29
- const rigOptions = { onReady, url: TARA_GLB };
30
- // `hand: false` disables the bundled SVG hand renderer only; the semantic
31
- // hand frame still reaches the rig, which ignores it — tara has no arms, and
32
- // that is the library's oldest standing constraint rather than an omission.
33
- // `sequences` is what a server can address on *this* avatar beyond the two
34
- // ids every avatar owes it — the three nod types the listening research
35
- // separates, and a head shake sized for a rig whose pose unit is a degree.
36
- // The wire's action id is open, so nothing here needed promoting; a server
37
- // that does not know tara is mounted sends `ACKNOWLEDGE` and is never wrong.
38
- // `actions` is the other half: her own shape for an id the mixer already has,
39
- // whose shared keys land outside what it means on a head that turns in degrees.
40
- const widget = createSvgAvatar({
41
- mount, rig: createTaraRig, rigOptions, hand: false,
42
- sequences: BLENDER_SEQUENCES, actions: BLENDER_ACTIONS, ...TARA_TUNING,
43
- headHold: headHold("tara"), ...gains,
44
- });
45
- const driver = new AvatarClient(widget);
46
- const detach = driver.attach(client);
47
- let destroyed = false;
48
- return {
49
- destroy() {
50
- if (destroyed)
51
- return;
52
- destroyed = true;
53
- detach();
54
- driver.destroy();
55
- widget.destroy();
56
- },
57
- };
58
- }
29
+ export const createAvatar = character("tara", TARA_GLB);
59
30
  //# sourceMappingURL=tara.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tara.js","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkB3D;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAC9D,0EAA0E;IAC1E,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAC3E,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,gFAAgF;IAChF,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK;QAClD,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,WAAW;QACtE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK;KACrC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tara.js","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK3C;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Where tess's compiled GLB is. One character, one module — see
3
+ * [tara-asset.ts](./tara-asset.ts) for why that separation is load-bearing and
4
+ * why the `new URL` literal is spelled exactly this way.
5
+ */
6
+ export declare const TESS_GLB: string;
7
+ //# sourceMappingURL=tess-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tess-asset.d.ts","sourceRoot":"","sources":["../../client/three/tess-asset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,QAAQ,QAAyD,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Where tess's compiled GLB is. One character, one module — see
3
+ * [tara-asset.ts](./tara-asset.ts) for why that separation is load-bearing and
4
+ * why the `new URL` literal is spelled exactly this way.
5
+ */
6
+ export const TESS_GLB = new URL("../../assets/tess.glb", import.meta.url).href;
7
+ //# sourceMappingURL=tess-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tess-asset.js","sourceRoot":"","sources":["../../client/three/tess-asset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * tess — American, and the leanest character in the forge.
3
+ *
4
+ * Her GLB is the shared scripts run with her landmarks (`characters/tess/`,
5
+ * whose README has the provenance and the commands). She is back inside tara's
6
+ * atlas window — her hair is drawn into a low tail that clears both ears and
7
+ * reaches |u| 0.492 against a window that stops at 0.64 — so unlike tanya she
8
+ * needs no `face_texture.py` of her own, and her `Hair` shell gives up no roll:
9
+ * nothing of hers hangs past the jaw to lag. One supplied sheet, no paid edit,
10
+ * no module of her own; she is what a new character costs at the floor, which
11
+ * is why the README builds its template from her.
12
+ *
13
+ * Her head angles have not been read off her yet. `motion-limits.json` says so
14
+ * rather than guessing, and `headHold` gives her the tightest budget any face
15
+ * is still vouched for until the owner drives her.
16
+ */
17
+ import type { CharacterAvatarOptions } from "./createCharacter.js";
18
+ export type { CharacterAvatarOptions as AvatarOptions };
19
+ export type { AvatarInstance } from "./createCharacter.js";
20
+ /** The optional driving-UI declaration; one list for every Blender character
21
+ * (`sequences.ts`), because they are one rig. */
22
+ export declare const supports: import("../createAvatar.js").AvatarSupport;
23
+ export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
24
+ //# sourceMappingURL=tess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tess.d.ts","sourceRoot":"","sources":["../../client/three/tess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAA8B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * tess — American, and the leanest character in the forge.
3
+ *
4
+ * Her GLB is the shared scripts run with her landmarks (`characters/tess/`,
5
+ * whose README has the provenance and the commands). She is back inside tara's
6
+ * atlas window — her hair is drawn into a low tail that clears both ears and
7
+ * reaches |u| 0.492 against a window that stops at 0.64 — so unlike tanya she
8
+ * needs no `face_texture.py` of her own, and her `Hair` shell gives up no roll:
9
+ * nothing of hers hangs past the jaw to lag. One supplied sheet, no paid edit,
10
+ * no module of her own; she is what a new character costs at the floor, which
11
+ * is why the README builds its template from her.
12
+ *
13
+ * Her head angles have not been read off her yet. `motion-limits.json` says so
14
+ * rather than guessing, and `headHold` gives her the tightest budget any face
15
+ * is still vouched for until the owner drives her.
16
+ */
17
+ import { character } from "./createCharacter.js";
18
+ import { BLENDER_SUPPORTS } from "./sequences.js";
19
+ import { TESS_GLB } from "./tess-asset.js";
20
+ /** The optional driving-UI declaration; one list for every Blender character
21
+ * (`sequences.ts`), because they are one rig. */
22
+ export const supports = BLENDER_SUPPORTS;
23
+ export const createAvatar = character("tess", TESS_GLB);
24
+ //# sourceMappingURL=tess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tess.js","sourceRoot":"","sources":["../../client/three/tess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK3C;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC"}
@@ -1,31 +1,22 @@
1
1
  /**
2
- * tushar — the second 3-D character, and deliberately a copy of `tara.ts`.
2
+ * tushar — the second 3-D character, and the one who proved the factory.
3
3
  *
4
- * His GLB is tara's scripts run with his landmarks and atlas layout in place of
5
- * hers (`characters/tushar/`, whose README has the provenance and the commands),
6
- * so the rig, the mixer, the sequences and her tuning are all hers, unmodified;
7
- * the one seam is `TaraRigOptions.url`. What turns out to be hers rather than
8
- * general is marked TARA-SPECIFIC where it lives, and generalised only once a
9
- * third character agrees.
4
+ * His GLB is the shared scripts run with his landmarks and atlas layout in
5
+ * place of tara's (`characters/tushar/`, whose README has the provenance and
6
+ * the commands). He was a deliberate copy of `tara.ts` for as long as there was
7
+ * a `tara.ts` to copy; since 2026-09-23 there is one Blender entry point and he
8
+ * is its second caller rather than her second draft (`createCharacter.ts`).
9
+ *
10
+ * He is also the face that turned the ledger from a question into a decision.
11
+ * What was marked TARA-SPECIFIC was marked that way because one face cannot
12
+ * tell a convention from a coincidence; he agreed with her, and so did the two
13
+ * after him.
10
14
  */
11
- import type { PipecatClient } from "@pipecat-ai/client-js";
12
- export interface AvatarOptions {
13
- readonly mount: HTMLElement;
14
- readonly client: PipecatClient;
15
- /** Viseme amplitude, 0..2. `1` is as authored. */
16
- readonly mouthGain?: number;
17
- /** Gesture-clip amplitude, 0..2. */
18
- readonly gestureGain?: number;
19
- /** Idle/liveness amplitude, 0..2. */
20
- readonly motionGain?: number;
21
- /** Fires when the GLB is in the scene — for a capture tool, not a consumer. */
22
- readonly onReady?: () => void;
23
- }
24
- export interface AvatarInstance {
25
- destroy(): void;
26
- }
27
- /** The optional driving-UI declaration; one list for all three characters
15
+ import type { CharacterAvatarOptions } from "./createCharacter.js";
16
+ export type { CharacterAvatarOptions as AvatarOptions };
17
+ export type { AvatarInstance } from "./createCharacter.js";
18
+ /** The optional driving-UI declaration; one list for every Blender character
28
19
  * (`sequences.ts`), because they are one rig. */
29
20
  export declare const supports: import("../createAvatar.js").AvatarSupport;
30
- export declare function createAvatar(options: AvatarOptions): AvatarInstance;
21
+ export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
31
22
  //# sourceMappingURL=tushar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tushar.d.ts","sourceRoot":"","sources":["../../client/three/tushar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQ3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAAG,OAAO,IAAI,IAAI,CAAC;CAAE;AAEpD;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CA0BnE"}
1
+ {"version":3,"file":"tushar.d.ts","sourceRoot":"","sources":["../../client/three/tushar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAAkC,CAAC"}
@@ -1,47 +1,22 @@
1
1
  /**
2
- * tushar — the second 3-D character, and deliberately a copy of `tara.ts`.
2
+ * tushar — the second 3-D character, and the one who proved the factory.
3
3
  *
4
- * His GLB is tara's scripts run with his landmarks and atlas layout in place of
5
- * hers (`characters/tushar/`, whose README has the provenance and the commands),
6
- * so the rig, the mixer, the sequences and her tuning are all hers, unmodified;
7
- * the one seam is `TaraRigOptions.url`. What turns out to be hers rather than
8
- * general is marked TARA-SPECIFIC where it lives, and generalised only once a
9
- * third character agrees.
4
+ * His GLB is the shared scripts run with his landmarks and atlas layout in
5
+ * place of tara's (`characters/tushar/`, whose README has the provenance and
6
+ * the commands). He was a deliberate copy of `tara.ts` for as long as there was
7
+ * a `tara.ts` to copy; since 2026-09-23 there is one Blender entry point and he
8
+ * is its second caller rather than her second draft (`createCharacter.ts`).
9
+ *
10
+ * He is also the face that turned the ledger from a question into a decision.
11
+ * What was marked TARA-SPECIFIC was marked that way because one face cannot
12
+ * tell a convention from a coincidence; he agreed with her, and so did the two
13
+ * after him.
10
14
  */
11
- import { AvatarClient, createSvgAvatar } from "../internal.js";
15
+ import { character } from "./createCharacter.js";
16
+ import { BLENDER_SUPPORTS } from "./sequences.js";
12
17
  import { TUSHAR_GLB } from "./tushar-asset.js";
13
- import { BLENDER_ACTIONS, BLENDER_SEQUENCES, BLENDER_SUPPORTS } from "./sequences.js";
14
- import { headHold } from "./holds.js";
15
- import { createTaraRig, TARA_TUNING } from "./tara-rig.js";
16
- /** The optional driving-UI declaration; one list for all three characters
18
+ /** The optional driving-UI declaration; one list for every Blender character
17
19
  * (`sequences.ts`), because they are one rig. */
18
20
  export const supports = BLENDER_SUPPORTS;
19
- export function createAvatar(options) {
20
- const { mount, client, onReady, ...gains } = options;
21
- if (!mount)
22
- throw new TypeError("createAvatar: `mount` is required");
23
- if (!client)
24
- throw new TypeError("createAvatar: `client` is required");
25
- const rigOptions = { onReady, url: TUSHAR_GLB };
26
- // TARA-SPECIFIC, kept on purpose: `TARA_TUNING` (her mouth and motion gains)
27
- // is the first thing to question if he reads wrong in a call.
28
- const widget = createSvgAvatar({
29
- mount, rig: createTaraRig, rigOptions, hand: false,
30
- sequences: BLENDER_SEQUENCES, actions: BLENDER_ACTIONS, ...TARA_TUNING,
31
- headHold: headHold("tushar"), ...gains,
32
- });
33
- const driver = new AvatarClient(widget);
34
- const detach = driver.attach(client);
35
- let destroyed = false;
36
- return {
37
- destroy() {
38
- if (destroyed)
39
- return;
40
- destroyed = true;
41
- detach();
42
- driver.destroy();
43
- widget.destroy();
44
- },
45
- };
46
- }
21
+ export const createAvatar = character("tushar", TUSHAR_GLB);
47
22
  //# sourceMappingURL=tushar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tushar.js","sourceRoot":"","sources":["../../client/three/tushar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkB3D;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IAChE,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK;QAClD,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,WAAW;QACtE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK;KACvC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAErC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,OAAO;YACL,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tushar.js","sourceRoot":"","sources":["../../client/three/tushar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/C;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@voqalize/avatar",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "A JavaScript-programmable talking head for AI voice calls: line-art or 2.5-D faces, server-synced lipsync, state through motion, no runtime dependencies.",
5
- "license": "MIT AND CC-BY-4.0",
5
+ "license": "MIT AND CC-BY-4.0 AND Apache-2.0",
6
6
  "author": "Voqalize",
7
7
  "homepage": "https://github.com/voqalize/avatar#readme",
8
8
  "repository": {
@@ -77,53 +77,13 @@
77
77
  "types": "./dist/three/tanya.d.ts",
78
78
  "default": "./dist/three/tanya.js"
79
79
  },
80
- "./avatars/arjun": {
81
- "types": "./dist/arjun.d.ts",
82
- "default": "./dist/arjun.js"
80
+ "./avatars/tess": {
81
+ "types": "./dist/three/tess.d.ts",
82
+ "default": "./dist/three/tess.js"
83
83
  },
84
- "./avatars/meera": {
85
- "types": "./dist/meera.d.ts",
86
- "default": "./dist/meera.js"
87
- },
88
- "./avatars/vikram": {
89
- "types": "./dist/vikram.d.ts",
90
- "default": "./dist/vikram.js"
91
- },
92
- "./avatars/ishita": {
93
- "types": "./dist/ishita.d.ts",
94
- "default": "./dist/ishita.js"
95
- },
96
- "./avatars/kabir": {
97
- "types": "./dist/kabir.d.ts",
98
- "default": "./dist/kabir.js"
99
- },
100
- "./avatars/naina": {
101
- "types": "./dist/naina.d.ts",
102
- "default": "./dist/naina.js"
103
- },
104
- "./avatars/interviewer-male": {
105
- "types": "./dist/interviewer-male.d.ts",
106
- "default": "./dist/interviewer-male.js"
107
- },
108
- "./avatars/interviewer-female": {
109
- "types": "./dist/interviewer-female.d.ts",
110
- "default": "./dist/interviewer-female.js"
111
- },
112
- "./avatars/professional-male-a": {
113
- "types": "./dist/professional-male-a.d.ts",
114
- "default": "./dist/professional-male-a.js"
115
- },
116
- "./avatars/professional-female-a": {
117
- "types": "./dist/professional-female-a.d.ts",
118
- "default": "./dist/professional-female-a.js"
119
- },
120
- "./avatars/professional-male-b": {
121
- "types": "./dist/professional-male-b.d.ts",
122
- "default": "./dist/professional-male-b.js"
123
- },
124
- "./avatars/professional-female-b": {
125
- "types": "./dist/professional-female-b.d.ts",
126
- "default": "./dist/professional-female-b.js"
84
+ "./avatars/tanvi": {
85
+ "types": "./dist/three/tanvi.d.ts",
86
+ "default": "./dist/three/tanvi.js"
127
87
  },
128
88
  "./package.json": "./package.json"
129
89
  },
@@ -132,7 +92,8 @@
132
92
  "client",
133
93
  "dist",
134
94
  "assets",
135
- "LICENSE-CC-BY-4.0"
95
+ "LICENSE-CC-BY-4.0",
96
+ "LICENSE-APACHE-2.0"
136
97
  ],
137
98
  "scripts": {
138
99
  "build": "tsc -p tsconfig.json",