@voqalize/avatar 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -661
- package/LICENSE-CC-BY-4.0 +396 -0
- package/README.md +191 -662
- package/assets/README.md +48 -0
- package/assets/tanya.glb +0 -0
- package/assets/tara.glb +0 -0
- package/assets/tushar.glb +0 -0
- package/client/Avatar.tsx +57 -0
- package/client/AvatarClient.ts +818 -0
- package/client/arjun.ts +26 -0
- package/client/createAvatar.ts +177 -0
- package/client/createCanvasAvatar.ts +72 -0
- package/client/index.ts +44 -0
- package/client/internal.ts +108 -0
- package/client/interviewer-female.ts +4 -0
- package/client/interviewer-male.ts +4 -0
- package/client/ishita.ts +26 -0
- package/client/kabir.ts +26 -0
- package/client/meera.ts +26 -0
- package/client/naina.ts +26 -0
- package/client/playout.ts +95 -0
- package/client/professional-female-a.ts +4 -0
- package/client/professional-female-b.ts +4 -0
- package/client/professional-male-a.ts +4 -0
- package/client/professional-male-b.ts +4 -0
- package/client/react.ts +13 -0
- package/client/supports.ts +28 -0
- package/client/three/assets.ts +24 -0
- package/client/three/budgets.ts +27 -0
- package/client/three/holds.ts +64 -0
- package/client/three/internal.ts +54 -0
- package/client/three/motion-limits.json +116 -0
- package/client/three/sequences.ts +281 -0
- package/client/three/tanya.ts +69 -0
- package/client/three/tara-rig.ts +1562 -0
- package/client/three/tara.ts +76 -0
- package/client/three/tushar.ts +65 -0
- package/client/types.ts +235 -0
- package/client/useAvatar.ts +74 -0
- package/client/vikram.ts +26 -0
- package/dist/Avatar.d.ts +44 -0
- package/dist/Avatar.d.ts.map +1 -0
- package/{client/dist → dist}/Avatar.js +2 -2
- package/dist/Avatar.js.map +1 -0
- package/dist/AvatarClient.d.ts +274 -0
- package/dist/AvatarClient.d.ts.map +1 -0
- package/dist/AvatarClient.js +712 -0
- package/dist/AvatarClient.js.map +1 -0
- package/dist/arjun.d.ts +7 -0
- package/dist/arjun.d.ts.map +1 -0
- package/dist/arjun.js +20 -0
- package/dist/arjun.js.map +1 -0
- package/dist/createAvatar.d.ts +135 -0
- package/dist/createAvatar.d.ts.map +1 -0
- package/dist/createAvatar.js +75 -0
- package/dist/createAvatar.js.map +1 -0
- package/dist/createCanvasAvatar.d.ts +22 -0
- package/dist/createCanvasAvatar.d.ts.map +1 -0
- package/dist/createCanvasAvatar.js +47 -0
- package/dist/createCanvasAvatar.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +34 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +41 -0
- package/dist/internal.js.map +1 -0
- package/dist/interviewer-female.d.ts +4 -0
- package/dist/interviewer-female.d.ts.map +1 -0
- package/dist/interviewer-female.js +3 -0
- package/dist/interviewer-female.js.map +1 -0
- package/dist/interviewer-male.d.ts +4 -0
- package/dist/interviewer-male.d.ts.map +1 -0
- package/dist/interviewer-male.js +3 -0
- package/dist/interviewer-male.js.map +1 -0
- package/dist/ishita.d.ts +7 -0
- package/dist/ishita.d.ts.map +1 -0
- package/dist/ishita.js +20 -0
- package/dist/ishita.js.map +1 -0
- package/dist/kabir.d.ts +7 -0
- package/dist/kabir.d.ts.map +1 -0
- package/dist/kabir.js +20 -0
- package/dist/kabir.js.map +1 -0
- package/dist/meera.d.ts +7 -0
- package/dist/meera.d.ts.map +1 -0
- package/dist/meera.js +20 -0
- package/dist/meera.js.map +1 -0
- package/dist/naina.d.ts +7 -0
- package/dist/naina.d.ts.map +1 -0
- package/dist/naina.js +20 -0
- package/dist/naina.js.map +1 -0
- package/dist/playout.d.ts +42 -0
- package/dist/playout.d.ts.map +1 -0
- package/dist/playout.js +85 -0
- package/dist/playout.js.map +1 -0
- package/dist/professional-female-a.d.ts +4 -0
- package/dist/professional-female-a.d.ts.map +1 -0
- package/dist/professional-female-a.js +3 -0
- package/dist/professional-female-a.js.map +1 -0
- package/dist/professional-female-b.d.ts +4 -0
- package/dist/professional-female-b.d.ts.map +1 -0
- package/dist/professional-female-b.js +3 -0
- package/dist/professional-female-b.js.map +1 -0
- package/dist/professional-male-a.d.ts +4 -0
- package/dist/professional-male-a.d.ts.map +1 -0
- package/dist/professional-male-a.js +3 -0
- package/dist/professional-male-a.js.map +1 -0
- package/dist/professional-male-b.d.ts +4 -0
- package/dist/professional-male-b.d.ts.map +1 -0
- package/dist/professional-male-b.js +3 -0
- package/dist/professional-male-b.js.map +1 -0
- package/dist/react.d.ts +13 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +13 -0
- package/dist/react.js.map +1 -0
- package/dist/supports.d.ts +20 -0
- package/dist/supports.d.ts.map +1 -0
- package/dist/supports.js +26 -0
- package/dist/supports.js.map +1 -0
- package/dist/three/assets.d.ts +24 -0
- package/dist/three/assets.d.ts.map +1 -0
- package/dist/three/assets.js +22 -0
- package/dist/three/assets.js.map +1 -0
- package/dist/three/budgets.d.ts +17 -0
- package/dist/three/budgets.d.ts.map +1 -0
- package/dist/three/budgets.js +21 -0
- package/dist/three/budgets.js.map +1 -0
- package/dist/three/holds.d.ts +33 -0
- package/dist/three/holds.d.ts.map +1 -0
- package/dist/three/holds.js +56 -0
- package/dist/three/holds.js.map +1 -0
- package/dist/three/internal.d.ts +52 -0
- package/dist/three/internal.d.ts.map +1 -0
- package/dist/three/internal.js +49 -0
- package/dist/three/internal.js.map +1 -0
- package/dist/three/motion-limits.json +116 -0
- package/dist/three/sequences.d.ts +71 -0
- package/dist/three/sequences.d.ts.map +1 -0
- package/dist/three/sequences.js +262 -0
- package/dist/three/sequences.js.map +1 -0
- package/dist/three/tanya.d.ts +35 -0
- package/dist/three/tanya.d.ts.map +1 -0
- package/dist/three/tanya.js +51 -0
- package/dist/three/tanya.js.map +1 -0
- package/dist/three/tara-rig.d.ts +403 -0
- package/dist/three/tara-rig.d.ts.map +1 -0
- package/dist/three/tara-rig.js +1500 -0
- package/dist/three/tara-rig.js.map +1 -0
- package/dist/three/tara.d.ts +35 -0
- package/dist/three/tara.d.ts.map +1 -0
- package/dist/three/tara.js +58 -0
- package/dist/three/tara.js.map +1 -0
- package/dist/three/tushar.d.ts +31 -0
- package/dist/three/tushar.d.ts.map +1 -0
- package/dist/three/tushar.js +47 -0
- package/dist/three/tushar.js.map +1 -0
- package/dist/types.d.ts +149 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +140 -0
- package/dist/types.js.map +1 -0
- package/dist/useAvatar.d.ts +39 -0
- package/dist/useAvatar.d.ts.map +1 -0
- package/dist/useAvatar.js +35 -0
- package/dist/useAvatar.js.map +1 -0
- package/dist/vikram.d.ts +7 -0
- package/dist/vikram.d.ts.map +1 -0
- package/dist/vikram.js +20 -0
- package/dist/vikram.js.map +1 -0
- package/package.json +110 -25
- package/src/avatar.d.ts +218 -120
- package/src/avatar.js +950 -213
- package/src/behavior.d.ts +42 -0
- package/src/behavior.js +114 -0
- package/src/camera.js +29 -0
- package/src/canvas/author/parts/eye.mjs +722 -0
- package/src/canvas/author/parts/hand.mjs +1156 -0
- package/src/canvas/author/parts/mouth.mjs +741 -0
- package/src/canvas/author/parts/nose.mjs +100 -0
- package/src/canvas/author/parts/skin-detail.mjs +67 -0
- package/src/canvas/author/path.mjs +283 -0
- package/src/canvas/author/rig.mjs +405 -0
- package/src/canvas/avatars/round/face.d.mts +3 -0
- package/src/canvas/avatars/round/face.mjs +1307 -0
- package/src/canvas/create-rig.d.ts +15 -0
- package/src/canvas/create-rig.js +100 -0
- 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 +1 -0
- package/src/canvas/data/interviewer-male.rig.json +1 -0
- package/src/canvas/data/professional-female-a.rig.json +1 -0
- package/src/canvas/data/professional-female-b.rig.json +1 -0
- package/src/canvas/data/professional-male-a.rig.json +1 -0
- package/src/canvas/data/professional-male-b.rig.json +1 -0
- package/src/canvas/src/live.js +508 -0
- package/src/canvas/src/render2d.js +218 -0
- package/src/canvas/src/rig.js +297 -0
- package/src/canvas/src/vocab.js +96 -0
- package/src/clips.js +18 -7
- package/src/conformance.js +119 -0
- package/src/emotions.js +8 -5
- package/src/face-core.js +27 -1
- package/src/face-myna.d.ts +7 -0
- package/src/face-myna.js +192 -131
- package/src/face-peep-control-plane.js +167 -0
- package/src/face-peep.d.ts +7 -0
- package/src/face-peep.js +274 -116
- package/src/face-wren.d.ts +7 -0
- package/src/face-wren.js +17 -19
- package/src/faces.d.ts +12 -0
- package/src/faces.js +53 -0
- package/src/gaze.js +434 -58
- package/src/hand.js +120 -91
- package/src/head.js +134 -0
- package/src/idle.js +227 -119
- package/src/interjections.js +200 -31
- package/src/params.js +8 -4
- package/src/perform.js +7 -9
- package/src/prosody.js +647 -0
- package/src/rig.d.ts +24 -0
- package/src/rig.js +32 -0
- package/src/speech-timing.js +23 -0
- package/src/visemes.js +110 -24
- package/client/dist/Avatar.d.ts +0 -27
- package/client/dist/Avatar.d.ts.map +0 -1
- package/client/dist/Avatar.js.map +0 -1
- package/client/dist/AvatarClient.d.ts +0 -139
- package/client/dist/AvatarClient.d.ts.map +0 -1
- package/client/dist/AvatarClient.js +0 -223
- package/client/dist/AvatarClient.js.map +0 -1
- package/client/dist/index.d.ts +0 -22
- package/client/dist/index.d.ts.map +0 -1
- package/client/dist/index.js +0 -22
- package/client/dist/index.js.map +0 -1
- package/client/dist/types.d.ts +0 -86
- package/client/dist/types.d.ts.map +0 -1
- package/client/dist/types.js +0 -31
- package/client/dist/types.js.map +0 -1
- package/client/dist/useAvatar.d.ts +0 -42
- package/client/dist/useAvatar.d.ts.map +0 -1
- package/client/dist/useAvatar.js +0 -51
- package/client/dist/useAvatar.js.map +0 -1
- package/client/src/Avatar.tsx +0 -33
- package/client/src/AvatarClient.ts +0 -270
- package/client/src/index.ts +0 -22
- package/client/src/types.ts +0 -104
- package/client/src/useAvatar.ts +0 -85
- package/docs/contract-avatar.md +0 -371
- package/docs/contract-protocol.md +0 -461
package/assets/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# The character binaries
|
|
2
|
+
|
|
3
|
+
Three 2.5-D characters, one compiled file each:
|
|
4
|
+
|
|
5
|
+
| file | character | what it is |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `tara.glb` | tara | the first; shallow geometry under a projected portrait |
|
|
8
|
+
| `tushar.glb` | tushar | the second, her scripts with his landmarks |
|
|
9
|
+
| `tanya.glb` | tanya | the third, built from supplied reference images |
|
|
10
|
+
|
|
11
|
+
They are loaded for you. `@voqalize/avatar/avatars/tara` resolves the file beside
|
|
12
|
+
itself and hands it to a loader; you never name a path, and the only reason to
|
|
13
|
+
know these are here is the licence below. `three` is an *optional* peer of this
|
|
14
|
+
package, so importing a drawing instead of a character downloads none of this.
|
|
15
|
+
|
|
16
|
+
Each file carries geometry, one morph target per pose channel, and its texture
|
|
17
|
+
atlases as WebP — which is most of the bytes, because the atlases are
|
|
18
|
+
photographs. **They are build outputs. Do not hand-edit one**; there is nothing
|
|
19
|
+
in this directory to regenerate it from, and the next release overwrites it.
|
|
20
|
+
|
|
21
|
+
## Licence: CC-BY 4.0
|
|
22
|
+
|
|
23
|
+
The rest of this package is MIT. These three files are artwork, not code, so they
|
|
24
|
+
carry an artwork licence: **Creative Commons Attribution 4.0 International**, the
|
|
25
|
+
full text in `LICENSE-CC-BY-4.0` at the package root. Use them in a product,
|
|
26
|
+
commercially, modified or retextured, and credit us:
|
|
27
|
+
|
|
28
|
+
> Character art © 2026 Voqalize, CC-BY 4.0.
|
|
29
|
+
|
|
30
|
+
That is the whole obligation. There is no non-commercial clause, no
|
|
31
|
+
no-derivatives clause — the renderer's entire job is deforming these meshes, so a
|
|
32
|
+
no-derivatives licence would forbid the only use there is — and no share-alike, so
|
|
33
|
+
retexturing a character does not oblige you to publish the result.
|
|
34
|
+
|
|
35
|
+
The licence is also written inside each file, in the glTF copyright field. A
|
|
36
|
+
binary gets copied out of a dependency tree and passed around; a string in the
|
|
37
|
+
file is the only way terms travel with it.
|
|
38
|
+
|
|
39
|
+
## The faces are synthetic
|
|
40
|
+
|
|
41
|
+
Every character began as an image from a generative model — OpenAI's and
|
|
42
|
+
Google's — and **none of them depicts a real person**. Any resemblance to one is
|
|
43
|
+
coincidence, not a likeness, and there are no personality rights attached to any
|
|
44
|
+
of these three. What we did with that image is ours: the geometry, the measured
|
|
45
|
+
landmarks, the projection, the relighting and the authored morph targets are all
|
|
46
|
+
human work, and they are the substance of what is licensed here.
|
|
47
|
+
|
|
48
|
+
The tooling that turns a portrait into one of these files is not published.
|
package/assets/tanya.glb
ADDED
|
Binary file
|
package/assets/tara.glb
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avatar — `createAvatar` as a call tile, and the whole of `@voqalize/avatar/react`.
|
|
3
|
+
*
|
|
4
|
+
* <Avatar client={session.client} className="avatar-tile" />
|
|
5
|
+
*
|
|
6
|
+
* Three props of its own; everything else is forwarded to the mount `<div>`, so
|
|
7
|
+
* it sizes and styles like the tile it lives in. There is nothing to configure
|
|
8
|
+
* because there is nothing the server does not already say: the
|
|
9
|
+
* `AvatarProcessor` in the pipeline drives the state, the gaze and the mouth.
|
|
10
|
+
*
|
|
11
|
+
* `create` is how you use a different avatar — any module exporting
|
|
12
|
+
* `createAvatar` (docs/design-avatar-interface.md), including a Rive or WebGL
|
|
13
|
+
* one. The component is generic over that implementation's options, so
|
|
14
|
+
* `options` is checked against the factory you passed rather than being a bag:
|
|
15
|
+
*
|
|
16
|
+
* <Avatar client={c} create={createMascot} options={{ mood: "sly" }} />
|
|
17
|
+
*
|
|
18
|
+
* With no `create` it is the bundled SVG avatar and `options` is
|
|
19
|
+
* `SvgAvatarOptions` minus `mount`/`client`, which the component supplies.
|
|
20
|
+
*
|
|
21
|
+
* The component renders an empty div and a static `role="img"`. It does not
|
|
22
|
+
* label the avatar with its current state: the implementation owns the DOM
|
|
23
|
+
* inside the mount and is the only thing that knows what it is portraying —
|
|
24
|
+
* and a live label would be this package reading back an avatar's internal
|
|
25
|
+
* state, which is the one thing the interface refuses to promise. Pass your
|
|
26
|
+
* own `aria-label` to override.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { HTMLAttributes } from "react";
|
|
30
|
+
import type { PipecatClient } from "@pipecat-ai/client-js";
|
|
31
|
+
import { useAvatar } from "./useAvatar.js";
|
|
32
|
+
import type { AvatarFactory, AvatarOptions, SvgAvatarOptions } from "./createAvatar.js";
|
|
33
|
+
|
|
34
|
+
/** An implementation's own options: everything it takes past the two the
|
|
35
|
+
* component supplies itself. */
|
|
36
|
+
export type ImplementationOptions<O extends AvatarOptions> = Omit<O, keyof AvatarOptions>;
|
|
37
|
+
|
|
38
|
+
export type AvatarProps<O extends AvatarOptions = SvgAvatarOptions> =
|
|
39
|
+
Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
40
|
+
/** The live `PipecatClient`, or `null` before connect. Nothing renders
|
|
41
|
+
* until it is non-null. */
|
|
42
|
+
client?: PipecatClient | null;
|
|
43
|
+
/** An avatar implementation. Omit for the bundled SVG faces. */
|
|
44
|
+
create?: AvatarFactory<O>;
|
|
45
|
+
/** Options for that implementation. Read at mount only. */
|
|
46
|
+
options?: ImplementationOptions<O>;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export function Avatar<O extends AvatarOptions = SvgAvatarOptions>({
|
|
50
|
+
client,
|
|
51
|
+
create,
|
|
52
|
+
options,
|
|
53
|
+
...rest
|
|
54
|
+
}: AvatarProps<O>) {
|
|
55
|
+
const { containerRef } = useAvatar<O>({ client, create, options });
|
|
56
|
+
return <div role="img" aria-label="avatar" {...rest} ref={containerRef} />;
|
|
57
|
+
}
|