@voqalize/avatar 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-APACHE-2.0 +201 -0
- package/README.md +26 -95
- package/assets/README.md +30 -18
- 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 +24 -0
- package/client/supports.ts +6 -7
- package/client/three/assets.ts +7 -3
- package/client/three/budgets.ts +1 -1
- package/client/three/{tara-rig.ts → character-rig.ts} +682 -540
- package/client/three/createCharacter.ts +109 -0
- package/client/three/holds.ts +8 -3
- package/client/three/internal.ts +8 -7
- package/client/three/motion-limits.json +10 -2
- package/client/three/sequences.ts +5 -5
- 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-asset.ts +6 -0
- package/client/three/tess.ts +30 -0
- package/client/three/tushar.ts +18 -55
- package/dist/internal.d.ts +2 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +16 -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 +2 -0
- package/dist/three/assets.d.ts.map +1 -1
- package/dist/three/assets.js +7 -3
- 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} +633 -526
- 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.d.ts +7 -2
- package/dist/three/holds.d.ts.map +1 -1
- package/dist/three/holds.js +8 -3
- package/dist/three/holds.js.map +1 -1
- package/dist/three/internal.d.ts +7 -7
- package/dist/three/internal.d.ts.map +1 -1
- package/dist/three/internal.js +6 -6
- package/dist/three/internal.js.map +1 -1
- package/dist/three/motion-limits.json +10 -2
- package/dist/three/sequences.d.ts +5 -5
- package/dist/three/sequences.js +5 -5
- 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-asset.d.ts +7 -0
- package/dist/three/tess-asset.d.ts.map +1 -0
- package/dist/three/tess-asset.js +7 -0
- package/dist/three/tess-asset.js.map +1 -0
- package/dist/three/tess.d.ts +24 -0
- package/dist/three/tess.d.ts.map +1 -0
- package/dist/three/tess.js +24 -0
- package/dist/three/tess.js.map +1 -0
- 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 +10 -49
- package/src/avatar.d.ts +67 -2
- package/src/avatar.js +131 -255
- package/src/faces.js +1 -1
- package/src/gaze.js +20 -47
- package/src/idle.js +69 -27
- package/src/prosody.js +109 -15
- package/src/rig.d.ts +7 -0
- 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 -409
- 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/src/avatar.d.ts
CHANGED
|
@@ -195,7 +195,7 @@ export interface AvatarApi {
|
|
|
195
195
|
readonly gestureGain: Gain;
|
|
196
196
|
setMotionGain(g: Gain): AvatarApi;
|
|
197
197
|
readonly motionGain: Gain;
|
|
198
|
-
blink(
|
|
198
|
+
blink(): AvatarApi;
|
|
199
199
|
/** Advance one frame by hand — only meaningful under `{ manual: true }`. */
|
|
200
200
|
step(dt: number): AvatarApi;
|
|
201
201
|
/** Pin channels to fixed values, above the whole mix. `null` releases. */
|
|
@@ -316,7 +316,12 @@ export function createAvatar(opts: CreateAvatarOptions): AvatarApi;
|
|
|
316
316
|
export const STATES: Readonly<Record<AvatarStateName, Readonly<Record<string, unknown>>>>;
|
|
317
317
|
export const STATE_NAMES: readonly AvatarStateName[];
|
|
318
318
|
export const GAZE_NAMES: readonly AvatarGazeName[];
|
|
319
|
-
|
|
319
|
+
/** Where each named direction puts the eyes and the head: pupil offset
|
|
320
|
+
* (`px`/`py`), the head's share of it (`hx`/`hy`) and any roll. Pose units, and
|
|
321
|
+
* the head deliberately carries less than the whole (`src/gaze.js`). */
|
|
322
|
+
export const GAZE_TARGETS: Readonly<Record<AvatarGazeName, {
|
|
323
|
+
px: number; py: number; hx: number; hy: number; roll?: number;
|
|
324
|
+
}>>;
|
|
320
325
|
export const EMOTION_NAMES: readonly AvatarEmotionName[];
|
|
321
326
|
export const ACTIONS: Readonly<Record<AvatarActionId, unknown>>;
|
|
322
327
|
export const ACTION_IDS: readonly AvatarActionId[];
|
|
@@ -334,12 +339,24 @@ export const REST: Readonly<Record<PoseChannel, number>>;
|
|
|
334
339
|
export const CHANNELS: readonly PoseChannel[];
|
|
335
340
|
/** Post-mix clamp per channel, `[min, max]`. */
|
|
336
341
|
export const RANGE: Readonly<Record<PoseChannel, readonly [number, number]>>;
|
|
342
|
+
/** Each channel's smoothing time constant, in seconds. */
|
|
343
|
+
export const TAU: Readonly<Record<PoseChannel, number>>;
|
|
344
|
+
export function clamp(v: number, lo?: number, hi?: number): number;
|
|
345
|
+
/** One frame of exponential smoothing: where `cur` lands `dt` seconds into a
|
|
346
|
+
* chase of `target` with time constant `tau`. */
|
|
347
|
+
export function approach(cur: number, target: number, tau: number, dt: number): number;
|
|
337
348
|
export const VISEME_LETTERS: readonly VisemeLetter[];
|
|
338
349
|
export const VISEME_SHAPES: Readonly<Record<VisemeLetter, PoseOverrides>>;
|
|
339
350
|
/** Cues lead the audio by this many ms — perceptual tolerance is asymmetric. */
|
|
340
351
|
export const LEAD_MS: number;
|
|
341
352
|
/** The shoulder line's share of a held `headRoll`, per pose unit. */
|
|
342
353
|
export const SHOULDER_TILT: number;
|
|
354
|
+
/** A full pose from a handful of overrides: every unnamed channel takes its
|
|
355
|
+
* `REST` value. The only correct way to build a frame by hand. */
|
|
356
|
+
export function makeParams(overrides?: PoseOverrides): Record<PoseChannel, number>;
|
|
357
|
+
/** One named emotion's channel deltas at `intensity` (0..1). */
|
|
358
|
+
export function emotionPose(name: AvatarEmotionName, intensity?: number): PoseOverrides;
|
|
359
|
+
export { avatarFrame, createSvgRig } from "./rig.js";
|
|
343
360
|
export const ARPABET_TO_VISEME: Readonly<Record<string, VisemeLetter>>;
|
|
344
361
|
export const AZURE_VISEME_TO_LETTER: Readonly<Record<number, VisemeLetter>>;
|
|
345
362
|
|
|
@@ -347,6 +364,8 @@ export const AZURE_VISEME_TO_LETTER: Readonly<Record<number, VisemeLetter>>;
|
|
|
347
364
|
export const SILENT: VisemeLetter;
|
|
348
365
|
/** Pose channels for one letter at `intensity` (0..1), ready to merge into a frame. */
|
|
349
366
|
export function shapeFor(letter: VisemeLetter, intensity?: number): PoseOverrides;
|
|
367
|
+
/** `jaw` per unit of `mouthOpen`, the ratio the mouth's interior is calibrated at. */
|
|
368
|
+
export const JAW_OF_OPEN: number;
|
|
350
369
|
|
|
351
370
|
/**
|
|
352
371
|
* The mouth clock. Someone has to turn a cue array plus a clock into "which
|
|
@@ -365,6 +384,52 @@ export class VisemeTrack {
|
|
|
365
384
|
readonly playing: boolean;
|
|
366
385
|
}
|
|
367
386
|
|
|
387
|
+
/**
|
|
388
|
+
* One authored gesture: a short multi-channel timeline of additive deltas,
|
|
389
|
+
* optionally with its own mouth track, gaze override and blink beats.
|
|
390
|
+
*/
|
|
391
|
+
export interface Clip {
|
|
392
|
+
readonly id: string;
|
|
393
|
+
readonly label: string;
|
|
394
|
+
readonly text: string;
|
|
395
|
+
/** Milliseconds, end to end. */
|
|
396
|
+
readonly duration: number;
|
|
397
|
+
/** Per channel, `[u, delta]` keys against normalized clip time. */
|
|
398
|
+
readonly keys: Readonly<Record<string, ReadonlyArray<readonly [number, number]>>>;
|
|
399
|
+
readonly mouthCues?: readonly Cue[];
|
|
400
|
+
readonly gaze?: AvatarGazeName;
|
|
401
|
+
readonly blinkAt?: readonly number[];
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Every clip this renderer has, keyed by id — the authoring library, not the
|
|
406
|
+
* wire's vocabulary. Most are reachable only from inside the mixer: `ACTIONS`
|
|
407
|
+
* is what a server may name.
|
|
408
|
+
*/
|
|
409
|
+
export const INTERNAL_CLIPS: Readonly<Record<string, Clip>>;
|
|
410
|
+
|
|
411
|
+
/** What one tick of a clip contributes: additive channel deltas, the ramp
|
|
412
|
+
* weight they already carry, and the mouth when the clip owns it. */
|
|
413
|
+
export interface ClipSample {
|
|
414
|
+
delta: Record<string, number> | null;
|
|
415
|
+
weight: number;
|
|
416
|
+
mouth: { letter: VisemeLetter; intensity: number } | null;
|
|
417
|
+
ownsMouth: boolean;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/** Plays one clip forward in ticks you supply. Fixed-`dt` stepping is what
|
|
421
|
+
* makes a rendered gesture reproducible. */
|
|
422
|
+
export class ClipPlayer {
|
|
423
|
+
constructor(hooks?: { onGaze?: (name: string | null) => void; onBlink?: () => void });
|
|
424
|
+
play(clip: Clip, audio?: HTMLMediaElement | null, opts?: { queue?: boolean }): void;
|
|
425
|
+
/** Advance by `dtMs` and report this frame's contribution. */
|
|
426
|
+
update(dtMs: number): ClipSample;
|
|
427
|
+
stop(immediate?: boolean): void;
|
|
428
|
+
onEnd: ((clip: Clip | null) => void) | null;
|
|
429
|
+
readonly playing: boolean;
|
|
430
|
+
readonly id: string | null;
|
|
431
|
+
}
|
|
432
|
+
|
|
368
433
|
export function attachAudio(id: string, url: string): void;
|
|
369
434
|
export function normalizeActions(actions: AvatarAction[]): AvatarAction[];
|
|
370
435
|
export function normalizeCues(cues: Cue[]): Cue[];
|