@voqalize/avatar 0.2.1 → 0.3.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/README.md +144 -663
- package/client/Avatar.tsx +57 -0
- package/client/AvatarClient.ts +523 -0
- package/client/arjun.ts +24 -0
- package/client/createAvatar.ts +139 -0
- package/client/createCanvasAvatar.ts +72 -0
- package/client/index.ts +39 -0
- package/client/internal.ts +80 -0
- package/client/interviewer-female.ts +4 -0
- package/client/interviewer-male.ts +4 -0
- package/client/ishita.ts +24 -0
- package/client/kabir.ts +24 -0
- package/client/meera.ts +24 -0
- package/client/naina.ts +24 -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/types.ts +146 -0
- package/client/useAvatar.ts +74 -0
- package/client/vikram.ts +24 -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 +196 -0
- package/dist/AvatarClient.d.ts.map +1 -0
- package/dist/AvatarClient.js +450 -0
- package/dist/AvatarClient.js.map +1 -0
- package/dist/arjun.d.ts +6 -0
- package/dist/arjun.d.ts.map +1 -0
- package/dist/arjun.js +18 -0
- package/dist/arjun.js.map +1 -0
- package/dist/createAvatar.d.ts +99 -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 +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +30 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +33 -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 +6 -0
- package/dist/ishita.d.ts.map +1 -0
- package/dist/ishita.js +18 -0
- package/dist/ishita.js.map +1 -0
- package/dist/kabir.d.ts +6 -0
- package/dist/kabir.d.ts.map +1 -0
- package/dist/kabir.js +18 -0
- package/dist/kabir.js.map +1 -0
- package/dist/meera.d.ts +6 -0
- package/dist/meera.d.ts.map +1 -0
- package/dist/meera.js +18 -0
- package/dist/meera.js.map +1 -0
- package/dist/naina.d.ts +6 -0
- package/dist/naina.d.ts.map +1 -0
- package/dist/naina.js +18 -0
- package/dist/naina.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/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +93 -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 +6 -0
- package/dist/vikram.d.ts.map +1 -0
- package/dist/vikram.js +18 -0
- package/dist/vikram.js.map +1 -0
- package/package.json +81 -24
- package/src/avatar.d.ts +161 -120
- package/src/avatar.js +234 -146
- package/src/behavior.d.ts +26 -0
- package/src/behavior.js +102 -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 +4 -3
- 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 +119 -4
- package/src/hand.js +120 -91
- package/src/idle.js +18 -101
- package/src/interjections.js +156 -31
- package/src/params.js +8 -4
- package/src/perform.js +7 -9
- package/src/rig.d.ts +24 -0
- package/src/rig.js +32 -0
- package/src/speech-timing.js +23 -0
- package/src/visemes.js +28 -12
- 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
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createAvatar` — the entire public surface of an avatar.
|
|
3
|
+
*
|
|
4
|
+
* const avatar = createAvatar({ mount: el, client: pipecatClient });
|
|
5
|
+
* // …
|
|
6
|
+
* avatar.destroy();
|
|
7
|
+
*
|
|
8
|
+
* An avatar is an embodiment of a `PipecatClient`. You hand it a mount and a
|
|
9
|
+
* live client; it subscribes and reacts. There is nothing else: no methods to
|
|
10
|
+
* drive it, no callbacks to observe it, no state to read back. Everything it
|
|
11
|
+
* needs to know is already on the wire — Pipecat's factual lifecycle events
|
|
12
|
+
* plus the avatar server-message envelope (docs/contract-wire.md).
|
|
13
|
+
*
|
|
14
|
+
* ## This is also the extension point
|
|
15
|
+
*
|
|
16
|
+
* There is no registry, no loader and no plug-in system. **You add an avatar by
|
|
17
|
+
* publishing a module that exports `createAvatar` with this signature**, and
|
|
18
|
+
* importing yours instead of ours:
|
|
19
|
+
*
|
|
20
|
+
* import { createAvatar } from "@acme/our-mascot";
|
|
21
|
+
*
|
|
22
|
+
* That is the whole mechanism, and it is deliberate. A registry would make us
|
|
23
|
+
* own resolution, versioning and asset paths for code we have never seen; a
|
|
24
|
+
* renderer interface would make us commit to a second public contract before we
|
|
25
|
+
* know what the second renderer actually needs. An ES module export we get for
|
|
26
|
+
* free from the platform.
|
|
27
|
+
*
|
|
28
|
+
* Everything past `mount` and `client` belongs to the implementation. Ours takes
|
|
29
|
+
* `SvgAvatarOptions`; yours takes whatever it likes, and `AvatarFactory<O>` is
|
|
30
|
+
* generic so the caller still gets your options checked.
|
|
31
|
+
*
|
|
32
|
+
* ## What an implementation owes the caller
|
|
33
|
+
*
|
|
34
|
+
* Only that `destroy()` leaves the mount as it found it and unsubscribes from
|
|
35
|
+
* the client. Not returning to rest, not honouring every action, not even
|
|
36
|
+
* having a mouth — a handless, mouthless avatar that only changes colour is a
|
|
37
|
+
* conforming avatar. The obligations that *matter* are perceptual, not typed,
|
|
38
|
+
* and they live in docs/contract-behavior.md.
|
|
39
|
+
*/
|
|
40
|
+
import { createAvatar as createSvgWidget } from "../src/avatar.js";
|
|
41
|
+
import { peep } from "../src/face-peep.js";
|
|
42
|
+
import { AvatarClient } from "./AvatarClient.js";
|
|
43
|
+
const GAINS = ["mouthGain", "gestureGain", "motionGain"];
|
|
44
|
+
export function createAvatar(options) {
|
|
45
|
+
const { mount, client, face = peep, ...rest } = options;
|
|
46
|
+
if (!mount)
|
|
47
|
+
throw new TypeError("createAvatar: `mount` is required");
|
|
48
|
+
if (!client)
|
|
49
|
+
throw new TypeError("createAvatar: `client` is required");
|
|
50
|
+
// The one range TypeScript cannot state, checked where it is cheapest to fix:
|
|
51
|
+
// at construction, by the caller who typed the number.
|
|
52
|
+
for (const key of GAINS) {
|
|
53
|
+
const g = rest[key];
|
|
54
|
+
if (g === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
if (!Number.isFinite(g) || g < 0 || g > 2) {
|
|
57
|
+
throw new RangeError(`createAvatar: \`${key}\` must be 0..2, got ${String(g)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const widget = createSvgWidget({ mount, face, ...rest });
|
|
61
|
+
const driver = new AvatarClient(widget);
|
|
62
|
+
const detach = driver.attach(client);
|
|
63
|
+
let destroyed = false;
|
|
64
|
+
return {
|
|
65
|
+
destroy() {
|
|
66
|
+
if (destroyed)
|
|
67
|
+
return;
|
|
68
|
+
destroyed = true;
|
|
69
|
+
detach();
|
|
70
|
+
driver.destroy();
|
|
71
|
+
widget.destroy();
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=createAvatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAvatar.js","sourceRoot":"","sources":["../client/createAvatar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgEjD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAU,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACvE,8EAA8E;IAC9E,uDAAuD;IACvD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,UAAU,CAAC,mBAAmB,GAAG,wBAAwB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACzD,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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Shared private constructor for the code-authored canvas avatars. */
|
|
2
|
+
import type { Gain } from '../src/avatar.js';
|
|
3
|
+
import type { AvatarInstance, AvatarOptions } from './createAvatar.js';
|
|
4
|
+
export interface CanvasAvatarOptions extends AvatarOptions {
|
|
5
|
+
/** Viseme amplitude, 0..2. `1` is as authored. */
|
|
6
|
+
readonly mouthGain?: Gain;
|
|
7
|
+
/** Gesture-clip amplitude, 0..2. */
|
|
8
|
+
readonly gestureGain?: Gain;
|
|
9
|
+
/** Idle/liveness amplitude, 0..2. */
|
|
10
|
+
readonly motionGain?: Gain;
|
|
11
|
+
}
|
|
12
|
+
/** @deprecated Use `CanvasAvatarOptions`; kept for the original entry points. */
|
|
13
|
+
export type InterviewerAvatarOptions = CanvasAvatarOptions;
|
|
14
|
+
interface CanvasAvatarConfig {
|
|
15
|
+
readonly rigUrl: URL;
|
|
16
|
+
readonly images: Readonly<Record<string, URL>>;
|
|
17
|
+
readonly face: () => Promise<unknown>;
|
|
18
|
+
readonly label: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function createCanvasAvatar(options: CanvasAvatarOptions, config: CanvasAvatarConfig): AvatarInstance;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=createCanvasAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCanvasAvatar.d.ts","sourceRoot":"","sources":["../client/createCanvasAvatar.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAIvE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC;IAC5B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED,iFAAiF;AACjF,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAE3D,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAQD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,kBAAkB,GACzB,cAAc,CAkChB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Shared private constructor for the code-authored canvas avatars. */
|
|
2
|
+
import { createAvatar as createMixer, STATES } from '../src/avatar.js';
|
|
3
|
+
import { createCanvasRig } from '../src/canvas/create-rig.js';
|
|
4
|
+
import { AvatarClient } from './AvatarClient.js';
|
|
5
|
+
const GAINS = ['mouthGain', 'gestureGain', 'motionGain'];
|
|
6
|
+
const PRESENCE_FILTERS = {
|
|
7
|
+
DEGRADED: String(STATES.DEGRADED.filter ?? ''),
|
|
8
|
+
OFFLINE: String(STATES.OFFLINE.filter ?? ''),
|
|
9
|
+
};
|
|
10
|
+
export function createCanvasAvatar(options, config) {
|
|
11
|
+
const { mount, client, ...gains } = options;
|
|
12
|
+
if (!mount)
|
|
13
|
+
throw new TypeError('createAvatar: `mount` is required');
|
|
14
|
+
if (!client)
|
|
15
|
+
throw new TypeError('createAvatar: `client` is required');
|
|
16
|
+
for (const key of GAINS) {
|
|
17
|
+
const gain = gains[key];
|
|
18
|
+
if (gain === undefined)
|
|
19
|
+
continue;
|
|
20
|
+
if (!Number.isFinite(gain) || gain < 0 || gain > 2) {
|
|
21
|
+
throw new RangeError(`createAvatar: \`${key}\` must be 0..2, got ${String(gain)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const canvas = createCanvasRig({
|
|
25
|
+
url: config.rigUrl,
|
|
26
|
+
images: config.images,
|
|
27
|
+
face: config.face,
|
|
28
|
+
label: config.label,
|
|
29
|
+
});
|
|
30
|
+
const widget = createMixer({ mount, rig: canvas.factory, ...gains });
|
|
31
|
+
const driver = new AvatarClient(widget, {
|
|
32
|
+
onPresenceChange: (state) => canvas.setPresenceFilter(PRESENCE_FILTERS[state] ?? ''),
|
|
33
|
+
});
|
|
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
|
+
}
|
|
47
|
+
//# sourceMappingURL=createCanvasAvatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createCanvasAvatar.js","sourceRoot":"","sources":["../client/createCanvasAvatar.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAGvE,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAsBjD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAU,CAAC;AAClE,MAAM,gBAAgB,GAAqC;IACzD,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,OAA4B,EAC5B,MAA0B;IAE1B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACvE,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,UAAU,CAAC,mBAAmB,GAAG,wBAAwB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,GAAG,EAAE,MAAM,CAAC,MAAM;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE;QACtC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;KACrF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAuB,CAAC,CAAC;IAEtD,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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voqalize/avatar` — a talking head that embodies a `PipecatClient`.
|
|
3
|
+
*
|
|
4
|
+
* import { createAvatar } from "@voqalize/avatar";
|
|
5
|
+
*
|
|
6
|
+
* const avatar = createAvatar({ mount: el, client: pipecatClient });
|
|
7
|
+
*
|
|
8
|
+
* That is the whole public surface. Put an `AvatarProcessor` in the pipecat
|
|
9
|
+
* pipeline (`pip install voqalize-avatar`), mount this in the bot's tile, and
|
|
10
|
+
* the face listens, thinks, claims the floor and lipsyncs what the TTS says.
|
|
11
|
+
*
|
|
12
|
+
* Entry points, and the split is the design rather than packaging taste:
|
|
13
|
+
*
|
|
14
|
+
* - `@voqalize/avatar` — this one. Framework-free. `@pipecat-ai/client-js` is
|
|
15
|
+
* a type-only import, so even that peer is genuinely optional at runtime.
|
|
16
|
+
* It carries exactly one drawing: `peep`, the default face.
|
|
17
|
+
* - `@voqalize/avatar/faces/{peep,wren,myna}` — one drawing each. Import the
|
|
18
|
+
* one you want and pass it as `face`; the others never enter your bundle.
|
|
19
|
+
* - `@voqalize/avatar/react` — `<Avatar>`. Pulls React; nothing here does.
|
|
20
|
+
* - `@voqalize/avatar/internal` — the SVG widget, the behavior catalog and the
|
|
21
|
+
* viseme clock. **No semver promise**: these move in any minor. They are
|
|
22
|
+
* exported because an avatar author building on our renderer needs them, not
|
|
23
|
+
* because they are an interface.
|
|
24
|
+
*
|
|
25
|
+
* To ship your own avatar, publish a module exporting `createAvatar` and import
|
|
26
|
+
* that instead — see `createAvatar.ts` and docs/design-avatar-interface.md.
|
|
27
|
+
*/
|
|
28
|
+
export { createAvatar } from "./createAvatar.js";
|
|
29
|
+
export type { AvatarOptions, AvatarInstance, AvatarFactory, SvgAvatarOptions, Face, FaceTheme, Gain, HandSide, } from "./createAvatar.js";
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voqalize/avatar` — a talking head that embodies a `PipecatClient`.
|
|
3
|
+
*
|
|
4
|
+
* import { createAvatar } from "@voqalize/avatar";
|
|
5
|
+
*
|
|
6
|
+
* const avatar = createAvatar({ mount: el, client: pipecatClient });
|
|
7
|
+
*
|
|
8
|
+
* That is the whole public surface. Put an `AvatarProcessor` in the pipecat
|
|
9
|
+
* pipeline (`pip install voqalize-avatar`), mount this in the bot's tile, and
|
|
10
|
+
* the face listens, thinks, claims the floor and lipsyncs what the TTS says.
|
|
11
|
+
*
|
|
12
|
+
* Entry points, and the split is the design rather than packaging taste:
|
|
13
|
+
*
|
|
14
|
+
* - `@voqalize/avatar` — this one. Framework-free. `@pipecat-ai/client-js` is
|
|
15
|
+
* a type-only import, so even that peer is genuinely optional at runtime.
|
|
16
|
+
* It carries exactly one drawing: `peep`, the default face.
|
|
17
|
+
* - `@voqalize/avatar/faces/{peep,wren,myna}` — one drawing each. Import the
|
|
18
|
+
* one you want and pass it as `face`; the others never enter your bundle.
|
|
19
|
+
* - `@voqalize/avatar/react` — `<Avatar>`. Pulls React; nothing here does.
|
|
20
|
+
* - `@voqalize/avatar/internal` — the SVG widget, the behavior catalog and the
|
|
21
|
+
* viseme clock. **No semver promise**: these move in any minor. They are
|
|
22
|
+
* exported because an avatar author building on our renderer needs them, not
|
|
23
|
+
* because they are an interface.
|
|
24
|
+
*
|
|
25
|
+
* To ship your own avatar, publish a module exporting `createAvatar` and import
|
|
26
|
+
* that instead — see `createAvatar.ts` and docs/design-avatar-interface.md.
|
|
27
|
+
*/
|
|
28
|
+
export { createAvatar } from "./createAvatar.js";
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voqalize/avatar/internal` — the parts of our own implementation that
|
|
3
|
+
* another avatar can build on.
|
|
4
|
+
*
|
|
5
|
+
* **Nothing here is covered by semver.** Names, signatures and semantics move
|
|
6
|
+
* in any minor release. It is exported because an avatar author who wants the
|
|
7
|
+
* SVG mixer, the behavior catalog or — most usefully — the viseme clock should
|
|
8
|
+
* not have to vendor a copy, not because any of it is an interface. The
|
|
9
|
+
* interface is `createAvatar`, and it is one function.
|
|
10
|
+
*
|
|
11
|
+
* The one thing here worth reaching for on purpose is `VisemeTrack`: someone
|
|
12
|
+
* has to turn a cue array plus a clock into "which mouth shape is on screen
|
|
13
|
+
* right now", every renderer needs exactly that, and it is a solved problem.
|
|
14
|
+
*
|
|
15
|
+
* const track = new VisemeTrack();
|
|
16
|
+
* track.start(cues, () => performance.now() - t0);
|
|
17
|
+
* // per frame:
|
|
18
|
+
* const s = track.sample(); // { letter: "D", intensity: 1 } | null
|
|
19
|
+
*
|
|
20
|
+
* `docs/internal-rig.md` describes the pose-channel model the bundled SVG
|
|
21
|
+
* renderer uses internally. It is *not* the seam to implement — see
|
|
22
|
+
* docs/design-avatar-interface.md.
|
|
23
|
+
*/
|
|
24
|
+
export { createAvatar as createSvgAvatar, STATES, STATE_NAMES, ACTIONS, ACTION_IDS, GAZE_NAMES, GAZE_TARGETS, EMOTION_NAMES, VisemeTrack, VISEME_LETTERS, VISEME_SHAPES, SILENT, LEAD_MS, shapeFor, normalizeCues, textToCues, ARPABET_TO_VISEME, AZURE_VISEME_TO_LETTER, } from "../src/avatar.js";
|
|
25
|
+
export type { AvatarApi, AvatarStateName, AvatarActionId, AvatarGazeName, AvatarEmotionName, AvatarAction, AvatarMeta, VisemeLetter, Cue, PoseChannel, PoseOverrides, CreateAvatarOptions as CreateSvgAvatarOptions, } from "../src/avatar.js";
|
|
26
|
+
export { BEHAVIOR_STATES, BEHAVIOR_STATE_IDS, BEHAVIOR_ACTIONS, BEHAVIOR_ACTION_IDS, WIRE_ACTION_TO_BEHAVIOR, } from "../src/behavior.js";
|
|
27
|
+
export type { BehaviorStateId, BehaviorActionId } from "../src/behavior.js";
|
|
28
|
+
export { isAvatarMessage } from "./types.js";
|
|
29
|
+
export type { AvatarCommand, AvatarCue, AvatarCuesCmd, } from "./types.js";
|
|
30
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../client/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAIL,YAAY,IAAI,eAAe,EAC/B,MAAM,EACN,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EAEb,WAAW,EACX,cAAc,EACd,aAAa,EACb,MAAM,EACN,OAAO,EACP,QAAQ,EACR,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,GAAG,EACH,WAAW,EACX,aAAa,EACb,mBAAmB,IAAI,sBAAsB,GAC9C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,YAAY,EACV,aAAa,EACb,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAC"}
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voqalize/avatar/internal` — the parts of our own implementation that
|
|
3
|
+
* another avatar can build on.
|
|
4
|
+
*
|
|
5
|
+
* **Nothing here is covered by semver.** Names, signatures and semantics move
|
|
6
|
+
* in any minor release. It is exported because an avatar author who wants the
|
|
7
|
+
* SVG mixer, the behavior catalog or — most usefully — the viseme clock should
|
|
8
|
+
* not have to vendor a copy, not because any of it is an interface. The
|
|
9
|
+
* interface is `createAvatar`, and it is one function.
|
|
10
|
+
*
|
|
11
|
+
* The one thing here worth reaching for on purpose is `VisemeTrack`: someone
|
|
12
|
+
* has to turn a cue array plus a clock into "which mouth shape is on screen
|
|
13
|
+
* right now", every renderer needs exactly that, and it is a solved problem.
|
|
14
|
+
*
|
|
15
|
+
* const track = new VisemeTrack();
|
|
16
|
+
* track.start(cues, () => performance.now() - t0);
|
|
17
|
+
* // per frame:
|
|
18
|
+
* const s = track.sample(); // { letter: "D", intensity: 1 } | null
|
|
19
|
+
*
|
|
20
|
+
* `docs/internal-rig.md` describes the pose-channel model the bundled SVG
|
|
21
|
+
* renderer uses internally. It is *not* the seam to implement — see
|
|
22
|
+
* docs/design-avatar-interface.md.
|
|
23
|
+
*/
|
|
24
|
+
export {
|
|
25
|
+
// The bundled SVG widget. Not the faces: importing one from here would put
|
|
26
|
+
// all three in every bundle that wanted the viseme clock.
|
|
27
|
+
// `@voqalize/avatar/faces/<name>` is where a face comes from.
|
|
28
|
+
createAvatar as createSvgAvatar, STATES, STATE_NAMES, ACTIONS, ACTION_IDS, GAZE_NAMES, GAZE_TARGETS, EMOTION_NAMES,
|
|
29
|
+
// The viseme clock and its tables.
|
|
30
|
+
VisemeTrack, VISEME_LETTERS, VISEME_SHAPES, SILENT, LEAD_MS, shapeFor, normalizeCues, textToCues, ARPABET_TO_VISEME, AZURE_VISEME_TO_LETTER, } from "../src/avatar.js";
|
|
31
|
+
export { BEHAVIOR_STATES, BEHAVIOR_STATE_IDS, BEHAVIOR_ACTIONS, BEHAVIOR_ACTION_IDS, WIRE_ACTION_TO_BEHAVIOR, } from "../src/behavior.js";
|
|
32
|
+
export { isAvatarMessage } from "./types.js";
|
|
33
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../client/internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO;AACL,2EAA2E;AAC3E,0DAA0D;AAC1D,8DAA8D;AAC9D,YAAY,IAAI,eAAe,EAC/B,MAAM,EACN,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa;AACb,mCAAmC;AACnC,WAAW,EACX,cAAc,EACd,aAAa,EACb,MAAM,EACN,OAAO,EACP,QAAQ,EACR,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAiB1B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @deprecated Renamed to `meera`; kept as an alias so existing imports keep working. */
|
|
2
|
+
export { createAvatar } from './meera.js';
|
|
3
|
+
export type { CanvasAvatarOptions, CanvasAvatarOptions as InterviewerAvatarOptions } from './createCanvasAvatar.js';
|
|
4
|
+
//# sourceMappingURL=interviewer-female.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interviewer-female.d.ts","sourceRoot":"","sources":["../client/interviewer-female.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,IAAI,wBAAwB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interviewer-female.js","sourceRoot":"","sources":["../client/interviewer-female.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @deprecated Renamed to `arjun`; kept as an alias so existing imports keep working. */
|
|
2
|
+
export { createAvatar } from './arjun.js';
|
|
3
|
+
export type { CanvasAvatarOptions, CanvasAvatarOptions as InterviewerAvatarOptions } from './createCanvasAvatar.js';
|
|
4
|
+
//# sourceMappingURL=interviewer-male.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interviewer-male.d.ts","sourceRoot":"","sources":["../client/interviewer-male.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,IAAI,wBAAwB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interviewer-male.js","sourceRoot":"","sources":["../client/interviewer-male.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/ishita.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Polished professional female avatar, authored to read at call-tile size. */
|
|
2
|
+
import type { CanvasAvatarOptions } from './createCanvasAvatar.js';
|
|
3
|
+
import type { AvatarInstance } from './createAvatar.js';
|
|
4
|
+
export type { CanvasAvatarOptions };
|
|
5
|
+
export declare function createAvatar(options: CanvasAvatarOptions): AvatarInstance;
|
|
6
|
+
//# sourceMappingURL=ishita.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ishita.d.ts","sourceRoot":"","sources":["../client/ishita.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAG/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAOzE"}
|
package/dist/ishita.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Polished professional female avatar, authored to read at call-tile size. */
|
|
2
|
+
import { createCanvasAvatar } from './createCanvasAvatar.js';
|
|
3
|
+
const RIG_URL = new URL('../src/canvas/data/professional-female-a.rig.json', import.meta.url);
|
|
4
|
+
const IMAGES = {
|
|
5
|
+
'professional-female-a-top-body.webp': new URL('../src/canvas/data/img/professional-female-a-top-body.webp', import.meta.url),
|
|
6
|
+
'professional-female-a-hair-back.webp': new URL('../src/canvas/data/img/professional-female-a-hair-back.webp', import.meta.url),
|
|
7
|
+
'professional-female-a-hair-front.webp': new URL('../src/canvas/data/img/professional-female-a-hair-front.webp', import.meta.url),
|
|
8
|
+
};
|
|
9
|
+
const FACE = () => import('../src/canvas/avatars/round/face.mjs');
|
|
10
|
+
export function createAvatar(options) {
|
|
11
|
+
return createCanvasAvatar(options, {
|
|
12
|
+
rigUrl: RIG_URL,
|
|
13
|
+
images: IMAGES,
|
|
14
|
+
face: FACE,
|
|
15
|
+
label: 'Ishita — polished professional female avatar',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ishita.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ishita.js","sourceRoot":"","sources":["../client/ishita.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,mDAAmD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9F,MAAM,MAAM,GAAG;IACb,qCAAqC,EAAE,IAAI,GAAG,CAAC,4DAA4D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7H,sCAAsC,EAAE,IAAI,GAAG,CAAC,6DAA6D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/H,uCAAuC,EAAE,IAAI,GAAG,CAAC,8DAA8D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CACzH,CAAC;AACX,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAIlE,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,kBAAkB,CAAC,OAAO,EAAE;QACjC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,8CAA8C;KACtD,CAAC,CAAC;AACL,CAAC"}
|
package/dist/kabir.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Relaxed professional male avatar, authored to read at call-tile size. */
|
|
2
|
+
import type { CanvasAvatarOptions } from './createCanvasAvatar.js';
|
|
3
|
+
import type { AvatarInstance } from './createAvatar.js';
|
|
4
|
+
export type { CanvasAvatarOptions };
|
|
5
|
+
export declare function createAvatar(options: CanvasAvatarOptions): AvatarInstance;
|
|
6
|
+
//# sourceMappingURL=kabir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kabir.d.ts","sourceRoot":"","sources":["../client/kabir.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAG5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAOzE"}
|
package/dist/kabir.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Relaxed professional male avatar, authored to read at call-tile size. */
|
|
2
|
+
import { createCanvasAvatar } from './createCanvasAvatar.js';
|
|
3
|
+
const RIG_URL = new URL('../src/canvas/data/professional-male-b.rig.json', import.meta.url);
|
|
4
|
+
const IMAGES = {
|
|
5
|
+
'professional-male-b-top-body.webp': new URL('../src/canvas/data/img/professional-male-b-top-body.webp', import.meta.url),
|
|
6
|
+
'professional-male-b-hair-back.webp': new URL('../src/canvas/data/img/professional-male-b-hair-back.webp', import.meta.url),
|
|
7
|
+
'professional-male-b-hair-front.webp': new URL('../src/canvas/data/img/professional-male-b-hair-front.webp', import.meta.url),
|
|
8
|
+
};
|
|
9
|
+
const FACE = () => import('../src/canvas/avatars/round/face.mjs');
|
|
10
|
+
export function createAvatar(options) {
|
|
11
|
+
return createCanvasAvatar(options, {
|
|
12
|
+
rigUrl: RIG_URL,
|
|
13
|
+
images: IMAGES,
|
|
14
|
+
face: FACE,
|
|
15
|
+
label: 'Kabir — relaxed professional male avatar',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=kabir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kabir.js","sourceRoot":"","sources":["../client/kabir.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iDAAiD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5F,MAAM,MAAM,GAAG;IACb,mCAAmC,EAAE,IAAI,GAAG,CAAC,0DAA0D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACzH,oCAAoC,EAAE,IAAI,GAAG,CAAC,2DAA2D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3H,qCAAqC,EAAE,IAAI,GAAG,CAAC,4DAA4D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CACrH,CAAC;AACX,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAIlE,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,kBAAkB,CAAC,OAAO,EAAE;QACjC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,0CAA0C;KAClD,CAAC,CAAC;AACL,CAAC"}
|
package/dist/meera.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Professional Indian female interviewer, authored to read at call-tile size. */
|
|
2
|
+
import type { CanvasAvatarOptions } from './createCanvasAvatar.js';
|
|
3
|
+
import type { AvatarInstance } from './createAvatar.js';
|
|
4
|
+
export type { CanvasAvatarOptions };
|
|
5
|
+
export declare function createAvatar(options: CanvasAvatarOptions): AvatarInstance;
|
|
6
|
+
//# sourceMappingURL=meera.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meera.d.ts","sourceRoot":"","sources":["../client/meera.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAGlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAOzE"}
|
package/dist/meera.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Professional Indian female interviewer, authored to read at call-tile size. */
|
|
2
|
+
import { createCanvasAvatar } from './createCanvasAvatar.js';
|
|
3
|
+
const RIG_URL = new URL('../src/canvas/data/interviewer-female.rig.json', import.meta.url);
|
|
4
|
+
const IMAGES = {
|
|
5
|
+
'round-w1-hair-back.webp': new URL('../src/canvas/data/img/round-w1-hair-back.webp', import.meta.url),
|
|
6
|
+
'round-w1-top-body.webp': new URL('../src/canvas/data/img/round-w1-top-body.webp', import.meta.url),
|
|
7
|
+
'round-w1-hair-front.webp': new URL('../src/canvas/data/img/round-w1-hair-front.webp', import.meta.url),
|
|
8
|
+
};
|
|
9
|
+
const FACE = () => import('../src/canvas/avatars/round/face.mjs');
|
|
10
|
+
export function createAvatar(options) {
|
|
11
|
+
return createCanvasAvatar(options, {
|
|
12
|
+
rigUrl: RIG_URL,
|
|
13
|
+
images: IMAGES,
|
|
14
|
+
face: FACE,
|
|
15
|
+
label: 'Meera — professional female interviewer avatar',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=meera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meera.js","sourceRoot":"","sources":["../client/meera.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,gDAAgD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3F,MAAM,MAAM,GAAG;IACb,yBAAyB,EAAE,IAAI,GAAG,CAAC,gDAAgD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACrG,wBAAwB,EAAE,IAAI,GAAG,CAAC,+CAA+C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACnG,0BAA0B,EAAE,IAAI,GAAG,CAAC,iDAAiD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CAC/F,CAAC;AACX,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAIlE,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,kBAAkB,CAAC,OAAO,EAAE;QACjC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,gDAAgD;KACxD,CAAC,CAAC;AACL,CAAC"}
|
package/dist/naina.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Relaxed professional female avatar, authored to read at call-tile size. */
|
|
2
|
+
import type { CanvasAvatarOptions } from './createCanvasAvatar.js';
|
|
3
|
+
import type { AvatarInstance } from './createAvatar.js';
|
|
4
|
+
export type { CanvasAvatarOptions };
|
|
5
|
+
export declare function createAvatar(options: CanvasAvatarOptions): AvatarInstance;
|
|
6
|
+
//# sourceMappingURL=naina.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naina.d.ts","sourceRoot":"","sources":["../client/naina.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAG9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUxD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc,CAOzE"}
|
package/dist/naina.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Relaxed professional female avatar, authored to read at call-tile size. */
|
|
2
|
+
import { createCanvasAvatar } from './createCanvasAvatar.js';
|
|
3
|
+
const RIG_URL = new URL('../src/canvas/data/professional-female-b.rig.json', import.meta.url);
|
|
4
|
+
const IMAGES = {
|
|
5
|
+
'professional-female-b-top-body.webp': new URL('../src/canvas/data/img/professional-female-b-top-body.webp', import.meta.url),
|
|
6
|
+
'professional-female-b-hair-back.webp': new URL('../src/canvas/data/img/professional-female-b-hair-back.webp', import.meta.url),
|
|
7
|
+
'professional-female-b-hair-front.webp': new URL('../src/canvas/data/img/professional-female-b-hair-front.webp', import.meta.url),
|
|
8
|
+
};
|
|
9
|
+
const FACE = () => import('../src/canvas/avatars/round/face.mjs');
|
|
10
|
+
export function createAvatar(options) {
|
|
11
|
+
return createCanvasAvatar(options, {
|
|
12
|
+
rigUrl: RIG_URL,
|
|
13
|
+
images: IMAGES,
|
|
14
|
+
face: FACE,
|
|
15
|
+
label: 'Naina — relaxed professional female avatar',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=naina.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naina.js","sourceRoot":"","sources":["../client/naina.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,mDAAmD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9F,MAAM,MAAM,GAAG;IACb,qCAAqC,EAAE,IAAI,GAAG,CAAC,4DAA4D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7H,sCAAsC,EAAE,IAAI,GAAG,CAAC,6DAA6D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/H,uCAAuC,EAAE,IAAI,GAAG,CAAC,8DAA8D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CACzH,CAAC;AACX,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAIlE,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,kBAAkB,CAAC,OAAO,EAAE;QACjC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,4CAA4C;KACpD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-female-a.d.ts","sourceRoot":"","sources":["../client/professional-female-a.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-female-a.js","sourceRoot":"","sources":["../client/professional-female-a.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-female-b.d.ts","sourceRoot":"","sources":["../client/professional-female-b.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-female-b.js","sourceRoot":"","sources":["../client/professional-female-b.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-male-a.d.ts","sourceRoot":"","sources":["../client/professional-male-a.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-male-a.js","sourceRoot":"","sources":["../client/professional-male-a.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-male-b.d.ts","sourceRoot":"","sources":["../client/professional-male-b.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"professional-male-b.js","sourceRoot":"","sources":["../client/professional-male-b.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voqalize/avatar/react` — the avatar as one component.
|
|
3
|
+
*
|
|
4
|
+
* import { Avatar } from "@voqalize/avatar/react";
|
|
5
|
+
*
|
|
6
|
+
* <Avatar client={session.client} className="avatar-tile" />
|
|
7
|
+
*
|
|
8
|
+
* Separate from the main entry so that `createAvatar` costs nothing to a
|
|
9
|
+
* caller who is not on React — React is an optional peer, and a barrel that
|
|
10
|
+
* re-exported this would make it a hard one.
|
|
11
|
+
*/
|
|
12
|
+
export { Avatar, type AvatarProps } from "./Avatar.js";
|
|
13
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../client/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@voqalize/avatar/react` — the avatar as one component.
|
|
3
|
+
*
|
|
4
|
+
* import { Avatar } from "@voqalize/avatar/react";
|
|
5
|
+
*
|
|
6
|
+
* <Avatar client={session.client} className="avatar-tile" />
|
|
7
|
+
*
|
|
8
|
+
* Separate from the main entry so that `createAvatar` costs nothing to a
|
|
9
|
+
* caller who is not on React — React is an optional peer, and a barrel that
|
|
10
|
+
* re-exported this would make it a hard one.
|
|
11
|
+
*/
|
|
12
|
+
export { Avatar } from "./Avatar.js";
|
|
13
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../client/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC"}
|