@voqalize/avatar 0.4.2 → 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.
- package/LICENSE-APACHE-2.0 +201 -0
- package/README.md +11 -98
- package/assets/README.md +28 -17
- package/assets/tanvi.glb +0 -0
- package/assets/tanya.glb +0 -0
- package/assets/tara.glb +0 -0
- package/assets/tess.glb +0 -0
- package/assets/tushar.glb +0 -0
- package/client/internal.ts +4 -0
- package/client/supports.ts +6 -7
- package/client/three/assets.ts +2 -0
- package/client/three/budgets.ts +1 -1
- package/client/three/{tara-rig.ts → character-rig.ts} +673 -545
- package/client/three/createCharacter.ts +109 -0
- package/client/three/holds.ts +1 -1
- package/client/three/internal.ts +4 -3
- package/client/three/motion-limits.json +5 -1
- package/client/three/tanvi-asset.ts +6 -0
- package/client/three/tanvi.ts +30 -0
- package/client/three/tanya.ts +18 -58
- package/client/three/tara.ts +19 -60
- package/client/three/tess.ts +17 -59
- package/client/three/tushar.ts +18 -55
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +5 -1
- package/dist/internal.js.map +1 -1
- package/dist/supports.d.ts +6 -7
- package/dist/supports.d.ts.map +1 -1
- package/dist/supports.js +6 -7
- package/dist/supports.js.map +1 -1
- package/dist/three/assets.d.ts +1 -0
- package/dist/three/assets.d.ts.map +1 -1
- package/dist/three/assets.js +2 -0
- package/dist/three/assets.js.map +1 -1
- package/dist/three/budgets.d.ts +1 -1
- package/dist/three/budgets.js +1 -1
- package/dist/three/character-rig.d.ts +366 -0
- package/dist/three/character-rig.d.ts.map +1 -0
- package/dist/three/{tara-rig.js → character-rig.js} +629 -523
- package/dist/three/character-rig.js.map +1 -0
- package/dist/three/createCharacter.d.ts +60 -0
- package/dist/three/createCharacter.d.ts.map +1 -0
- package/dist/three/createCharacter.js +84 -0
- package/dist/three/createCharacter.js.map +1 -0
- package/dist/three/holds.js +1 -1
- package/dist/three/holds.js.map +1 -1
- package/dist/three/internal.d.ts +3 -3
- package/dist/three/internal.d.ts.map +1 -1
- package/dist/three/internal.js +2 -2
- package/dist/three/internal.js.map +1 -1
- package/dist/three/motion-limits.json +5 -1
- package/dist/three/tanvi-asset.d.ts +7 -0
- package/dist/three/tanvi-asset.d.ts.map +1 -0
- package/dist/three/tanvi-asset.js +7 -0
- package/dist/three/tanvi-asset.js.map +1 -0
- package/dist/three/tanvi.d.ts +24 -0
- package/dist/three/tanvi.d.ts.map +1 -0
- package/dist/three/tanvi.js +24 -0
- package/dist/three/tanvi.js.map +1 -0
- package/dist/three/tanya.d.ts +16 -28
- package/dist/three/tanya.d.ts.map +1 -1
- package/dist/three/tanya.js +15 -43
- package/dist/three/tanya.js.map +1 -1
- package/dist/three/tara.d.ts +17 -22
- package/dist/three/tara.d.ts.map +1 -1
- package/dist/three/tara.js +16 -45
- package/dist/three/tara.js.map +1 -1
- package/dist/three/tess.d.ts +15 -29
- package/dist/three/tess.d.ts.map +1 -1
- package/dist/three/tess.js +14 -44
- package/dist/three/tess.js.map +1 -1
- package/dist/three/tushar.d.ts +16 -25
- package/dist/three/tushar.d.ts.map +1 -1
- package/dist/three/tushar.js +15 -40
- package/dist/three/tushar.js.map +1 -1
- package/package.json +7 -50
- package/src/avatar.d.ts +2 -0
- package/src/avatar.js +87 -216
- package/src/gaze.js +1 -3
- package/src/idle.js +10 -2
- package/src/prosody.js +7 -3
- package/src/speech-timing.js +9 -0
- package/src/visemes.js +107 -13
- package/client/arjun.ts +0 -26
- package/client/createCanvasAvatar.ts +0 -72
- package/client/interviewer-female.ts +0 -4
- package/client/interviewer-male.ts +0 -4
- package/client/ishita.ts +0 -26
- package/client/kabir.ts +0 -26
- package/client/meera.ts +0 -26
- package/client/naina.ts +0 -26
- package/client/professional-female-a.ts +0 -4
- package/client/professional-female-b.ts +0 -4
- package/client/professional-male-a.ts +0 -4
- package/client/professional-male-b.ts +0 -4
- package/client/vikram.ts +0 -26
- package/dist/arjun.d.ts +0 -7
- package/dist/arjun.d.ts.map +0 -1
- package/dist/arjun.js +0 -20
- package/dist/arjun.js.map +0 -1
- package/dist/createCanvasAvatar.d.ts +0 -22
- package/dist/createCanvasAvatar.d.ts.map +0 -1
- package/dist/createCanvasAvatar.js +0 -47
- package/dist/createCanvasAvatar.js.map +0 -1
- package/dist/interviewer-female.d.ts +0 -4
- package/dist/interviewer-female.d.ts.map +0 -1
- package/dist/interviewer-female.js +0 -3
- package/dist/interviewer-female.js.map +0 -1
- package/dist/interviewer-male.d.ts +0 -4
- package/dist/interviewer-male.d.ts.map +0 -1
- package/dist/interviewer-male.js +0 -3
- package/dist/interviewer-male.js.map +0 -1
- package/dist/ishita.d.ts +0 -7
- package/dist/ishita.d.ts.map +0 -1
- package/dist/ishita.js +0 -20
- package/dist/ishita.js.map +0 -1
- package/dist/kabir.d.ts +0 -7
- package/dist/kabir.d.ts.map +0 -1
- package/dist/kabir.js +0 -20
- package/dist/kabir.js.map +0 -1
- package/dist/meera.d.ts +0 -7
- package/dist/meera.d.ts.map +0 -1
- package/dist/meera.js +0 -20
- package/dist/meera.js.map +0 -1
- package/dist/naina.d.ts +0 -7
- package/dist/naina.d.ts.map +0 -1
- package/dist/naina.js +0 -20
- package/dist/naina.js.map +0 -1
- package/dist/professional-female-a.d.ts +0 -4
- package/dist/professional-female-a.d.ts.map +0 -1
- package/dist/professional-female-a.js +0 -3
- package/dist/professional-female-a.js.map +0 -1
- package/dist/professional-female-b.d.ts +0 -4
- package/dist/professional-female-b.d.ts.map +0 -1
- package/dist/professional-female-b.js +0 -3
- package/dist/professional-female-b.js.map +0 -1
- package/dist/professional-male-a.d.ts +0 -4
- package/dist/professional-male-a.d.ts.map +0 -1
- package/dist/professional-male-a.js +0 -3
- package/dist/professional-male-a.js.map +0 -1
- package/dist/professional-male-b.d.ts +0 -4
- package/dist/professional-male-b.d.ts.map +0 -1
- package/dist/professional-male-b.js +0 -3
- package/dist/professional-male-b.js.map +0 -1
- package/dist/three/tara-rig.d.ts +0 -423
- package/dist/three/tara-rig.d.ts.map +0 -1
- package/dist/three/tara-rig.js.map +0 -1
- package/dist/vikram.d.ts +0 -7
- package/dist/vikram.d.ts.map +0 -1
- package/dist/vikram.js +0 -20
- package/dist/vikram.js.map +0 -1
- package/src/canvas/author/parts/eye.mjs +0 -722
- package/src/canvas/author/parts/hand.mjs +0 -1156
- package/src/canvas/author/parts/mouth.mjs +0 -741
- package/src/canvas/author/parts/nose.mjs +0 -100
- package/src/canvas/author/parts/skin-detail.mjs +0 -67
- package/src/canvas/author/path.mjs +0 -283
- package/src/canvas/author/rig.mjs +0 -405
- package/src/canvas/avatars/round/face.d.mts +0 -3
- package/src/canvas/avatars/round/face.mjs +0 -1307
- package/src/canvas/create-rig.d.ts +0 -15
- package/src/canvas/create-rig.js +0 -100
- package/src/canvas/data/img/professional-female-a-hair-back.webp +0 -0
- package/src/canvas/data/img/professional-female-a-hair-front.webp +0 -0
- package/src/canvas/data/img/professional-female-a-top-body.webp +0 -0
- package/src/canvas/data/img/professional-female-b-hair-back.webp +0 -0
- package/src/canvas/data/img/professional-female-b-hair-front.webp +0 -0
- package/src/canvas/data/img/professional-female-b-top-body.webp +0 -0
- package/src/canvas/data/img/professional-male-a-hair-back.webp +0 -0
- package/src/canvas/data/img/professional-male-a-hair-front.webp +0 -0
- package/src/canvas/data/img/professional-male-a-top-body.webp +0 -0
- package/src/canvas/data/img/professional-male-b-hair-back.webp +0 -0
- package/src/canvas/data/img/professional-male-b-hair-front.webp +0 -0
- package/src/canvas/data/img/professional-male-b-top-body.webp +0 -0
- package/src/canvas/data/img/round-m3-hair-back.webp +0 -0
- package/src/canvas/data/img/round-m3-hair-front.webp +0 -0
- package/src/canvas/data/img/round-m3-top-body.webp +0 -0
- package/src/canvas/data/img/round-w1-hair-back.webp +0 -0
- package/src/canvas/data/img/round-w1-hair-front.webp +0 -0
- package/src/canvas/data/img/round-w1-top-body.webp +0 -0
- package/src/canvas/data/interviewer-female.rig.json +0 -1
- package/src/canvas/data/interviewer-male.rig.json +0 -1
- package/src/canvas/data/professional-female-a.rig.json +0 -1
- package/src/canvas/data/professional-female-b.rig.json +0 -1
- package/src/canvas/data/professional-male-a.rig.json +0 -1
- package/src/canvas/data/professional-male-b.rig.json +0 -1
- package/src/canvas/src/live.js +0 -508
- package/src/canvas/src/render2d.js +0 -218
- package/src/canvas/src/rig.js +0 -297
- package/src/canvas/src/vocab.js +0 -96
package/dist/three/tara.d.ts
CHANGED
|
@@ -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
|
|
8
|
-
* argument for authoring her morph targets under the library's pose
|
|
9
|
-
* names: nothing above this line knows there is a GPU involved, and
|
|
10
|
-
* viseme and co-articulation rule the SVG faces have works here
|
|
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 {
|
|
16
|
-
export
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
29
|
+
export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
|
|
35
30
|
//# sourceMappingURL=tara.d.ts.map
|
package/dist/three/tara.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tara.d.ts","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/three/tara.js
CHANGED
|
@@ -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
|
|
8
|
-
* argument for authoring her morph targets under the library's pose
|
|
9
|
-
* names: nothing above this line knows there is a GPU involved, and
|
|
10
|
-
* viseme and co-articulation rule the SVG faces have works here
|
|
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 {
|
|
16
|
-
import {
|
|
23
|
+
import { character } from "./createCharacter.js";
|
|
24
|
+
import { BLENDER_SUPPORTS } from "./sequences.js";
|
|
17
25
|
import { TARA_GLB } from "./tara-asset.js";
|
|
18
|
-
|
|
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
|
|
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
|
package/dist/three/tara.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tara.js","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/three/tess.d.ts
CHANGED
|
@@ -1,38 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tess — American, and
|
|
2
|
+
* tess — American, and the leanest character in the forge.
|
|
3
3
|
*
|
|
4
|
-
* Her GLB is
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `Hair` shell gives up no roll: nothing of hers hangs past the jaw to lag.
|
|
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.
|
|
13
12
|
*
|
|
14
13
|
* Her head angles have not been read off her yet. `motion-limits.json` says so
|
|
15
14
|
* rather than guessing, and `headHold` gives her the tightest budget any face
|
|
16
15
|
* is still vouched for until the owner drives her.
|
|
17
16
|
*/
|
|
18
|
-
import type {
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
readonly mouthGain?: number;
|
|
24
|
-
/** Gesture-clip amplitude, 0..2. */
|
|
25
|
-
readonly gestureGain?: number;
|
|
26
|
-
/** Idle/liveness amplitude, 0..2. */
|
|
27
|
-
readonly motionGain?: number;
|
|
28
|
-
/** Fires when the GLB is in the scene — for a capture tool, not a consumer. */
|
|
29
|
-
readonly onReady?: () => void;
|
|
30
|
-
}
|
|
31
|
-
export interface AvatarInstance {
|
|
32
|
-
destroy(): void;
|
|
33
|
-
}
|
|
34
|
-
/** The optional driving-UI declaration; one list for every character built on
|
|
35
|
-
* this rig (`sequences.ts`), because they are one rig. */
|
|
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. */
|
|
36
22
|
export declare const supports: import("../createAvatar.js").AvatarSupport;
|
|
37
|
-
export declare
|
|
23
|
+
export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
|
|
38
24
|
//# sourceMappingURL=tess.d.ts.map
|
package/dist/three/tess.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tess.d.ts","sourceRoot":"","sources":["../../client/three/tess.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/three/tess.js
CHANGED
|
@@ -1,54 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tess — American, and
|
|
2
|
+
* tess — American, and the leanest character in the forge.
|
|
3
3
|
*
|
|
4
|
-
* Her GLB is
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `Hair` shell gives up no roll: nothing of hers hangs past the jaw to lag.
|
|
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.
|
|
13
12
|
*
|
|
14
13
|
* Her head angles have not been read off her yet. `motion-limits.json` says so
|
|
15
14
|
* rather than guessing, and `headHold` gives her the tightest budget any face
|
|
16
15
|
* is still vouched for until the owner drives her.
|
|
17
16
|
*/
|
|
18
|
-
import {
|
|
17
|
+
import { character } from "./createCharacter.js";
|
|
18
|
+
import { BLENDER_SUPPORTS } from "./sequences.js";
|
|
19
19
|
import { TESS_GLB } from "./tess-asset.js";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import { createTaraRig, TARA_TUNING } from "./tara-rig.js";
|
|
23
|
-
/** The optional driving-UI declaration; one list for every character built on
|
|
24
|
-
* this rig (`sequences.ts`), because they are one rig. */
|
|
20
|
+
/** The optional driving-UI declaration; one list for every Blender character
|
|
21
|
+
* (`sequences.ts`), because they are one rig. */
|
|
25
22
|
export const supports = BLENDER_SUPPORTS;
|
|
26
|
-
export
|
|
27
|
-
const { mount, client, onReady, ...gains } = options;
|
|
28
|
-
if (!mount)
|
|
29
|
-
throw new TypeError("createAvatar: `mount` is required");
|
|
30
|
-
if (!client)
|
|
31
|
-
throw new TypeError("createAvatar: `client` is required");
|
|
32
|
-
const rigOptions = { onReady, url: TESS_GLB };
|
|
33
|
-
// TARA-SPECIFIC, kept on purpose: `TARA_TUNING` (her mouth and motion gains)
|
|
34
|
-
// is the first thing to question if she reads wrong in a call.
|
|
35
|
-
const widget = createSvgAvatar({
|
|
36
|
-
mount, rig: createTaraRig, rigOptions, hand: false,
|
|
37
|
-
sequences: BLENDER_SEQUENCES, actions: BLENDER_ACTIONS, ...TARA_TUNING,
|
|
38
|
-
headHold: headHold("tess"), ...gains,
|
|
39
|
-
});
|
|
40
|
-
const driver = new AvatarClient(widget);
|
|
41
|
-
const detach = driver.attach(client);
|
|
42
|
-
let destroyed = false;
|
|
43
|
-
return {
|
|
44
|
-
destroy() {
|
|
45
|
-
if (destroyed)
|
|
46
|
-
return;
|
|
47
|
-
destroyed = true;
|
|
48
|
-
detach();
|
|
49
|
-
driver.destroy();
|
|
50
|
-
widget.destroy();
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
}
|
|
23
|
+
export const createAvatar = character("tess", TESS_GLB);
|
|
54
24
|
//# sourceMappingURL=tess.js.map
|
package/dist/three/tess.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tess.js","sourceRoot":"","sources":["../../client/three/tess.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/three/tushar.d.ts
CHANGED
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tushar — the second 3-D character, and
|
|
2
|
+
* tushar — the second 3-D character, and the one who proved the factory.
|
|
3
3
|
*
|
|
4
|
-
* His GLB is
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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 {
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
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
|
|
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"}
|
package/dist/three/tushar.js
CHANGED
|
@@ -1,47 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tushar — the second 3-D character, and
|
|
2
|
+
* tushar — the second 3-D character, and the one who proved the factory.
|
|
3
3
|
*
|
|
4
|
-
* His GLB is
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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 {
|
|
15
|
+
import { character } from "./createCharacter.js";
|
|
16
|
+
import { BLENDER_SUPPORTS } from "./sequences.js";
|
|
12
17
|
import { TUSHAR_GLB } from "./tushar-asset.js";
|
|
13
|
-
|
|
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
|
|
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
|
package/dist/three/tushar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tushar.js","sourceRoot":"","sources":["../../client/three/tushar.ts"],"names":[],"mappings":"AAAA
|
|
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.
|
|
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": {
|
|
@@ -81,53 +81,9 @@
|
|
|
81
81
|
"types": "./dist/three/tess.d.ts",
|
|
82
82
|
"default": "./dist/three/tess.js"
|
|
83
83
|
},
|
|
84
|
-
"./avatars/
|
|
85
|
-
"types": "./dist/
|
|
86
|
-
"default": "./dist/
|
|
87
|
-
},
|
|
88
|
-
"./avatars/meera": {
|
|
89
|
-
"types": "./dist/meera.d.ts",
|
|
90
|
-
"default": "./dist/meera.js"
|
|
91
|
-
},
|
|
92
|
-
"./avatars/vikram": {
|
|
93
|
-
"types": "./dist/vikram.d.ts",
|
|
94
|
-
"default": "./dist/vikram.js"
|
|
95
|
-
},
|
|
96
|
-
"./avatars/ishita": {
|
|
97
|
-
"types": "./dist/ishita.d.ts",
|
|
98
|
-
"default": "./dist/ishita.js"
|
|
99
|
-
},
|
|
100
|
-
"./avatars/kabir": {
|
|
101
|
-
"types": "./dist/kabir.d.ts",
|
|
102
|
-
"default": "./dist/kabir.js"
|
|
103
|
-
},
|
|
104
|
-
"./avatars/naina": {
|
|
105
|
-
"types": "./dist/naina.d.ts",
|
|
106
|
-
"default": "./dist/naina.js"
|
|
107
|
-
},
|
|
108
|
-
"./avatars/interviewer-male": {
|
|
109
|
-
"types": "./dist/interviewer-male.d.ts",
|
|
110
|
-
"default": "./dist/interviewer-male.js"
|
|
111
|
-
},
|
|
112
|
-
"./avatars/interviewer-female": {
|
|
113
|
-
"types": "./dist/interviewer-female.d.ts",
|
|
114
|
-
"default": "./dist/interviewer-female.js"
|
|
115
|
-
},
|
|
116
|
-
"./avatars/professional-male-a": {
|
|
117
|
-
"types": "./dist/professional-male-a.d.ts",
|
|
118
|
-
"default": "./dist/professional-male-a.js"
|
|
119
|
-
},
|
|
120
|
-
"./avatars/professional-female-a": {
|
|
121
|
-
"types": "./dist/professional-female-a.d.ts",
|
|
122
|
-
"default": "./dist/professional-female-a.js"
|
|
123
|
-
},
|
|
124
|
-
"./avatars/professional-male-b": {
|
|
125
|
-
"types": "./dist/professional-male-b.d.ts",
|
|
126
|
-
"default": "./dist/professional-male-b.js"
|
|
127
|
-
},
|
|
128
|
-
"./avatars/professional-female-b": {
|
|
129
|
-
"types": "./dist/professional-female-b.d.ts",
|
|
130
|
-
"default": "./dist/professional-female-b.js"
|
|
84
|
+
"./avatars/tanvi": {
|
|
85
|
+
"types": "./dist/three/tanvi.d.ts",
|
|
86
|
+
"default": "./dist/three/tanvi.js"
|
|
131
87
|
},
|
|
132
88
|
"./package.json": "./package.json"
|
|
133
89
|
},
|
|
@@ -136,7 +92,8 @@
|
|
|
136
92
|
"client",
|
|
137
93
|
"dist",
|
|
138
94
|
"assets",
|
|
139
|
-
"LICENSE-CC-BY-4.0"
|
|
95
|
+
"LICENSE-CC-BY-4.0",
|
|
96
|
+
"LICENSE-APACHE-2.0"
|
|
140
97
|
],
|
|
141
98
|
"scripts": {
|
|
142
99
|
"build": "tsc -p tsconfig.json",
|
package/src/avatar.d.ts
CHANGED
|
@@ -364,6 +364,8 @@ export const AZURE_VISEME_TO_LETTER: Readonly<Record<number, VisemeLetter>>;
|
|
|
364
364
|
export const SILENT: VisemeLetter;
|
|
365
365
|
/** Pose channels for one letter at `intensity` (0..1), ready to merge into a frame. */
|
|
366
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;
|
|
367
369
|
|
|
368
370
|
/**
|
|
369
371
|
* The mouth clock. Someone has to turn a cue array plus a clock into "which
|