@sage-rsc/talking-head-react 1.0.51 → 1.0.53
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/dist/index.cjs +2 -2
- package/dist/index.js +990 -910
- package/package.json +1 -1
- package/src/components/CurriculumLearning.jsx +182 -13
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsxs as ke, jsx as
|
|
2
|
-
import { forwardRef as
|
|
1
|
+
import { jsxs as ke, jsx as ne } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as fe, useRef as V, useState as re, useEffect as le, useCallback as M, useImperativeHandle as xe, useLayoutEffect as Ee } from "react";
|
|
3
3
|
import * as f from "three";
|
|
4
4
|
import { OrbitControls as Fe } from "three/addons/controls/OrbitControls.js";
|
|
5
5
|
import { GLTFLoader as Pe } from "three/addons/loaders/GLTFLoader.js";
|
|
@@ -7,14 +7,14 @@ import { DRACOLoader as Be } from "three/addons/loaders/DRACOLoader.js";
|
|
|
7
7
|
import { FBXLoader as ve } from "three/addons/loaders/FBXLoader.js";
|
|
8
8
|
import { RoomEnvironment as De } from "three/addons/environments/RoomEnvironment.js";
|
|
9
9
|
import Oe from "three/addons/libs/stats.module.js";
|
|
10
|
-
let m,
|
|
11
|
-
const A = [0, 0, 0, 0],
|
|
10
|
+
let m, j, q;
|
|
11
|
+
const A = [0, 0, 0, 0], w = new f.Vector3(), de = new f.Vector3(), G = new f.Vector3(), ce = new f.Vector3();
|
|
12
12
|
new f.Plane();
|
|
13
13
|
new f.Ray();
|
|
14
14
|
new f.Euler();
|
|
15
|
-
const
|
|
15
|
+
const Z = new f.Quaternion(), Ie = new f.Quaternion(), J = new f.Matrix4(), $ = new f.Matrix4();
|
|
16
16
|
new f.Vector3();
|
|
17
|
-
const
|
|
17
|
+
const me = new f.Vector3(0, 0, 1), Ne = new f.Vector3(1, 0, 0), Ue = new f.Vector3(0, 1, 0), We = new f.Vector3(0, 0, 1);
|
|
18
18
|
class Ve {
|
|
19
19
|
constructor(t = null) {
|
|
20
20
|
this.opt = Object.assign({
|
|
@@ -192,7 +192,7 @@ class Ve {
|
|
|
192
192
|
const r = this.armature.getObjectByName(s.bone);
|
|
193
193
|
if (!r) throw new Error("Bone '" + s.bone + "' not found in #" + o + " exclude.");
|
|
194
194
|
if (Number.isNaN(s.radius) && s.radius >= 0) throw new Error("Radius must be a non-negative number in #" + o + " exclude.");
|
|
195
|
-
const
|
|
195
|
+
const u = {
|
|
196
196
|
bone: r,
|
|
197
197
|
// Bone object
|
|
198
198
|
radius: s.radius,
|
|
@@ -203,9 +203,9 @@ class Ve {
|
|
|
203
203
|
};
|
|
204
204
|
if (s.deltaLocal) {
|
|
205
205
|
if (!Array.isArray(s.deltaLocal) || s.deltaLocal.length !== 3 || s.deltaLocal.some((a) => Number.isNaN(a))) throw new Error("deltaLocal must be an array of three numbers in #" + o + " exclude.");
|
|
206
|
-
|
|
206
|
+
u.deltaLocal = [...s.deltaLocal];
|
|
207
207
|
}
|
|
208
|
-
n.excludes.push(
|
|
208
|
+
n.excludes.push(u);
|
|
209
209
|
});
|
|
210
210
|
}
|
|
211
211
|
this.showHelpers();
|
|
@@ -282,8 +282,8 @@ class Ve {
|
|
|
282
282
|
m = this.dict[o.boneParent.name], m && (m.children || (m.children = []), m.children.push(o));
|
|
283
283
|
}), this.objectsUpdate = [];
|
|
284
284
|
const i = /* @__PURE__ */ new WeakSet(), n = (o) => o.parent?.isBone ? [o, ...n(o.parent)] : [o], s = (o) => {
|
|
285
|
-
n(o).forEach((
|
|
286
|
-
i.has(
|
|
285
|
+
n(o).forEach((u) => {
|
|
286
|
+
i.has(u) || (this.objectsUpdate.push(u), i.add(u));
|
|
287
287
|
});
|
|
288
288
|
};
|
|
289
289
|
this.data.forEach((o) => {
|
|
@@ -308,12 +308,12 @@ class Ve {
|
|
|
308
308
|
n(t?.isScene, "First parameter must be Scene."), this.scene = t, n(e?.isObject3D, "Second parameter must be the armature Object3D."), this.armature = e, n(Array.isArray(i), "Third parameter must be an array of bone configs."), this.config = i, this.config.forEach((s, o) => {
|
|
309
309
|
const r = "Config item #" + o + ": ";
|
|
310
310
|
n(s.bone, r + "Bone not specified.");
|
|
311
|
-
const
|
|
312
|
-
n(typeof
|
|
313
|
-
const a = this.armature.getObjectByName(
|
|
314
|
-
n(a, r + "Bone '" +
|
|
315
|
-
const
|
|
316
|
-
name:
|
|
311
|
+
const u = s.bone;
|
|
312
|
+
n(typeof u == "string" && u.length > 0, r + "Bone name must be a non-empty string.");
|
|
313
|
+
const a = this.armature.getObjectByName(u);
|
|
314
|
+
n(a, r + "Bone '" + u + "' not found."), n(a.parent?.isBone, r + "Bone must have a parent bone."), n(this.data.every((l) => l.bone !== a), r + "Bone '" + u + "' already exists."), a.updateMatrixWorld(!0);
|
|
315
|
+
const h = {
|
|
316
|
+
name: u,
|
|
317
317
|
// Bone name
|
|
318
318
|
bone: a,
|
|
319
319
|
// Bone object
|
|
@@ -321,7 +321,7 @@ class Ve {
|
|
|
321
321
|
/// Bone's parent object
|
|
322
322
|
vBasis: a.position.clone(),
|
|
323
323
|
// Original local position
|
|
324
|
-
vWorld: a.parent.getWorldPosition(
|
|
324
|
+
vWorld: a.parent.getWorldPosition(w).clone(),
|
|
325
325
|
// World position, parent
|
|
326
326
|
qBasis: a.parent.quaternion.clone(),
|
|
327
327
|
// Original quaternion, parent
|
|
@@ -338,9 +338,9 @@ class Ve {
|
|
|
338
338
|
ea: [0, 0, 0, 0]
|
|
339
339
|
// External acceleration [m/s^2]
|
|
340
340
|
};
|
|
341
|
-
|
|
341
|
+
h.boneParent.matrixWorld.decompose(w, Z, G), w.copy(me).applyQuaternion(Z).setY(0).normalize(), Z.premultiply(Ie.setFromUnitVectors(me, w).invert()).normalize(), h.qWorldInverseYaw = Z.clone().normalize(), this.data.push(h), this.dict[u] = h;
|
|
342
342
|
try {
|
|
343
|
-
this.setValue(
|
|
343
|
+
this.setValue(u, "type", s.type), this.setValue(u, "stiffness", s.stiffness), this.setValue(u, "damping", s.damping), this.setValue(u, "external", s.external), this.setValue(u, "limits", s.limits), this.setValue(u, "excludes", s.excludes), this.setValue(u, "deltaLocal", s.deltaLocal), this.setValue(u, "deltaWorld", s.deltaWorld), this.setValue(u, "pivot", s.pivot), this.setValue(u, "helper", s.helper);
|
|
344
344
|
} catch (l) {
|
|
345
345
|
n(!1, r + l);
|
|
346
346
|
}
|
|
@@ -356,22 +356,22 @@ class Ve {
|
|
|
356
356
|
for (this.timerMs += t, t > 1e3 && (this.timerMs = 0), t /= 1e3, e = 0, n = this.objectsUpdate.length; e < n; e++)
|
|
357
357
|
o = this.objectsUpdate[e], o.updateMatrix(), o.parent === null ? o.matrixWorld.copy(o.matrix) : o.matrixWorld.multiplyMatrices(o.parent.matrixWorld, o.matrix), o.matrixWorldNeedsUpdate = !1;
|
|
358
358
|
for (e = 0, n = this.data.length; e < n; e++) {
|
|
359
|
-
if (o = this.data[e],
|
|
359
|
+
if (o = this.data[e], w.copy(o.vWorld), J.copy(o.boneParent.matrixWorld), $.copy(J).invert(), o.vWorld.setFromMatrixPosition(J), w.applyMatrix4($), w.length() > 0.5 && (console.info("Info: Unrealistic jump of " + w.length().toFixed(2) + " meters."), w.setLength(0.5)), w.applyQuaternion(o.bone.quaternion), A[0] = w.x, A[1] = w.y, A[2] = -w.z, A[3] = w.length() / 3, o.children)
|
|
360
360
|
for (i = 0, s = o.children.length; i < s; i++)
|
|
361
361
|
m = o.children[i], A[0] -= m.v[0] * t / 3, A[1] -= m.v[1] * t / 3, A[2] += m.v[2] * t / 3, A[3] -= m.v[3] * t / 3;
|
|
362
|
-
if (m = this.opt.sensitivityFactor, A[0] *= o.ext * m, A[1] *= o.ext * m, A[2] *= o.ext * m, A[3] *= o.ext * m, o.isX && (m = A[0] / t, o.ea[0] = (m - o.ev[0]) / t, o.ev[0] = m, o.a[0] = -o.k[0] * o.p[0] - o.c[0] * o.v[0] - o.ea[0], o.p[0] += o.v[0] * t + o.a[0] * t * t / 2 + A[0], m = o.v[0] + o.a[0] * t / 2, m = -o.k[0] * o.p[0] - o.c[0] * m - o.ea[0], o.v[0] = o.v[0] + (m + o.a[0]) * t / 2), o.isY && (m = A[1] / t, o.ea[1] = (m - o.ev[1]) / t, o.ev[1] = m, o.a[1] = -o.k[1] * o.p[1] - o.c[1] * o.v[1] - o.ea[1], o.p[1] += o.v[1] * t + o.a[1] * t * t / 2 + A[1], m = o.v[1] + o.a[1] * t / 2, m = -o.k[1] * o.p[1] - o.c[1] * m - o.ea[1], o.v[1] = o.v[1] + (m + o.a[1]) * t / 2), o.isZ && (m = A[2] / t, o.ea[2] = (m - o.ev[2]) / t, o.ev[2] = m, o.a[2] = -o.k[2] * o.p[2] - o.c[2] * o.v[2] - o.ea[2], o.p[2] += o.v[2] * t + o.a[2] * t * t / 2 + A[2], m = o.v[2] + o.a[2] * t / 2, m = -o.k[2] * o.p[2] - o.c[2] * m - o.ea[2], o.v[2] = o.v[2] + (m + o.a[2]) * t / 2), o.isT && (m = A[3] / t, o.ea[3] = (m - o.ev[3]) / t, o.ev[3] = m, o.a[3] = -o.k[3] * o.p[3] - o.c[3] * o.v[3] - o.ea[3], o.p[3] += o.v[3] * t + o.a[3] * t * t / 2 + A[3], m = o.v[3] + o.a[3] * t / 2, m = -o.k[3] * o.p[3] - o.c[3] * m - o.ea[3], o.v[3] = o.v[3] + (m + o.a[3]) * t / 2), this.timerMs < this.opt.warmupMs && (o.v[0] *= 1e-4, o.p[0] *= 1e-4, o.v[1] *= 1e-4, o.p[1] *= 1e-4, o.v[2] *= 1e-4, o.p[2] *= 1e-4, o.v[3] *= 1e-4, o.p[3] *= 1e-4), A[0] = o.p[0], A[1] = o.p[1], A[2] = o.p[2], A[3] = o.p[3], m = this.opt.movementFactor, A[0] *= m, A[1] *= m, A[2] *= m, A[3] *= m, o.dl && (m = o.dl, A[0] += m[0], A[1] += m[1], A[2] += m[2]), o.dw && (m = o.dw,
|
|
362
|
+
if (m = this.opt.sensitivityFactor, A[0] *= o.ext * m, A[1] *= o.ext * m, A[2] *= o.ext * m, A[3] *= o.ext * m, o.isX && (m = A[0] / t, o.ea[0] = (m - o.ev[0]) / t, o.ev[0] = m, o.a[0] = -o.k[0] * o.p[0] - o.c[0] * o.v[0] - o.ea[0], o.p[0] += o.v[0] * t + o.a[0] * t * t / 2 + A[0], m = o.v[0] + o.a[0] * t / 2, m = -o.k[0] * o.p[0] - o.c[0] * m - o.ea[0], o.v[0] = o.v[0] + (m + o.a[0]) * t / 2), o.isY && (m = A[1] / t, o.ea[1] = (m - o.ev[1]) / t, o.ev[1] = m, o.a[1] = -o.k[1] * o.p[1] - o.c[1] * o.v[1] - o.ea[1], o.p[1] += o.v[1] * t + o.a[1] * t * t / 2 + A[1], m = o.v[1] + o.a[1] * t / 2, m = -o.k[1] * o.p[1] - o.c[1] * m - o.ea[1], o.v[1] = o.v[1] + (m + o.a[1]) * t / 2), o.isZ && (m = A[2] / t, o.ea[2] = (m - o.ev[2]) / t, o.ev[2] = m, o.a[2] = -o.k[2] * o.p[2] - o.c[2] * o.v[2] - o.ea[2], o.p[2] += o.v[2] * t + o.a[2] * t * t / 2 + A[2], m = o.v[2] + o.a[2] * t / 2, m = -o.k[2] * o.p[2] - o.c[2] * m - o.ea[2], o.v[2] = o.v[2] + (m + o.a[2]) * t / 2), o.isT && (m = A[3] / t, o.ea[3] = (m - o.ev[3]) / t, o.ev[3] = m, o.a[3] = -o.k[3] * o.p[3] - o.c[3] * o.v[3] - o.ea[3], o.p[3] += o.v[3] * t + o.a[3] * t * t / 2 + A[3], m = o.v[3] + o.a[3] * t / 2, m = -o.k[3] * o.p[3] - o.c[3] * m - o.ea[3], o.v[3] = o.v[3] + (m + o.a[3]) * t / 2), this.timerMs < this.opt.warmupMs && (o.v[0] *= 1e-4, o.p[0] *= 1e-4, o.v[1] *= 1e-4, o.p[1] *= 1e-4, o.v[2] *= 1e-4, o.p[2] *= 1e-4, o.v[3] *= 1e-4, o.p[3] *= 1e-4), A[0] = o.p[0], A[1] = o.p[1], A[2] = o.p[2], A[3] = o.p[3], m = this.opt.movementFactor, A[0] *= m, A[1] *= m, A[2] *= m, A[3] *= m, o.dl && (m = o.dl, A[0] += m[0], A[1] += m[1], A[2] += m[2]), o.dw && (m = o.dw, w.set(
|
|
363
363
|
o.vBasis.x + A[0],
|
|
364
364
|
o.vBasis.y + A[1],
|
|
365
365
|
o.vBasis.z + A[2]
|
|
366
|
-
),
|
|
366
|
+
), w.applyMatrix4(J), w.x += m[0], w.y += m[1], w.z += m[2], w.applyMatrix4($), A[0] += w.x - o.vBasis.x, A[1] += w.y - o.vBasis.y, A[2] += w.z - o.vBasis.z), o.limits && this.opt.isLimits && (m = o.limits, m[0] && (m[0][0] !== null && A[0] < m[0][0] && (A[0] = m[0][0]), m[0][1] !== null && A[0] > m[0][1] && (A[0] = m[0][1])), m[1] && (m[1][0] !== null && A[1] < m[1][0] && (A[1] = m[1][0]), m[1][1] !== null && A[1] > m[1][1] && (A[1] = m[1][1])), m[2] && (m[2][0] !== null && A[2] < m[2][0] && (A[2] = m[2][0]), m[2][1] !== null && A[2] > m[2][1] && (A[2] = m[2][1])), m[3] && (m[3][0] !== null && A[3] < m[3][0] && (A[3] = m[3][0]), m[3][1] !== null && A[3] > m[3][1] && (A[3] = m[3][1]))), o.isPoint)
|
|
367
367
|
o.bone.position.set(
|
|
368
368
|
o.vBasis.x + A[0],
|
|
369
369
|
o.vBasis.y + A[1],
|
|
370
370
|
o.vBasis.z - A[2]
|
|
371
371
|
);
|
|
372
|
-
else if (o.boneParent.quaternion.copy(o.qBasis), o.pivot && this.opt.isPivots && (o.boneParent.updateWorldMatrix(!1, !1), o.boneParent.matrixWorld.decompose(
|
|
372
|
+
else if (o.boneParent.quaternion.copy(o.qBasis), o.pivot && this.opt.isPivots && (o.boneParent.updateWorldMatrix(!1, !1), o.boneParent.matrixWorld.decompose(w, Z, G), w.copy(me).applyQuaternion(Z).setY(0).normalize(), Z.premultiply(Ie.setFromUnitVectors(me, w).invert()).normalize(), o.boneParent.quaternion.multiply(Z.invert()), o.boneParent.quaternion.multiply(o.qWorldInverseYaw)), o.isZ && (m = Math.atan(A[0] / o.l), Z.setFromAxisAngle(We, -m), o.boneParent.quaternion.multiply(Z)), o.isY && (m = o.l / 3, m = m * Math.tanh(A[1] / m), o.bone.position.setLength(o.l + m)), o.isX && (m = Math.atan(A[2] / o.l), Z.setFromAxisAngle(Ne, -m), o.boneParent.quaternion.multiply(Z)), o.isT && (m = 1.5 * Math.tanh(A[3] * 1.5), Z.setFromAxisAngle(Ue, -m), o.boneParent.quaternion.multiply(Z)), o.boneParent.updateWorldMatrix(!1, !0), o.excludes && this.opt.isExcludes)
|
|
373
373
|
for (i = 0, s = o.excludes.length; i < s; i++)
|
|
374
|
-
m = o.excludes[i],
|
|
374
|
+
m = o.excludes[i], G.set(0, 0, 0), m.deltaLocal && (G.x += m.deltaLocal[0], G.y += m.deltaLocal[1], G.z += m.deltaLocal[2]), G.applyMatrix4(m.bone.matrixWorld), $.copy(o.boneParent.matrixWorld).invert(), G.applyMatrix4($), w.copy(o.bone.position), !(w.distanceToSquared(G) >= m.radiusSq) && (q = w.length(), j = G.length(), !(j > m.radius + q) && (j < Math.abs(m.radius - q) || (j = (j * j + q * q - m.radiusSq) / (2 * j), G.normalize(), ce.copy(G).multiplyScalar(j), j = Math.sqrt(q * q - j * j), w.subVectors(w, ce).projectOnPlane(G).normalize().multiplyScalar(j), de.subVectors(o.vBasis, ce).projectOnPlane(G).normalize(), q = de.dot(w), q < 0 && (q = Math.sqrt(j * j - q * q), de.multiplyScalar(q), w.add(de)), w.add(ce).normalize(), G.copy(o.bone.position).normalize(), Z.setFromUnitVectors(G, w), o.boneParent.quaternion.premultiply(Z), o.boneParent.updateWorldMatrix(!1, !0))));
|
|
375
375
|
}
|
|
376
376
|
this.helpers.isActive && this.updateHelpers();
|
|
377
377
|
}
|
|
@@ -408,9 +408,9 @@ class Ve {
|
|
|
408
408
|
);
|
|
409
409
|
}), m = this.helpers.points, m.bones.length) {
|
|
410
410
|
this.helpers.isActive = !0;
|
|
411
|
-
const e = new f.BufferGeometry(), i = m.bones.map((
|
|
411
|
+
const e = new f.BufferGeometry(), i = m.bones.map((u) => [0, 0, 0]).flat();
|
|
412
412
|
e.setAttribute("position", new f.Float32BufferAttribute(i, 3));
|
|
413
|
-
const n = new f.Color(this.opt.helperBoneColor1), s = new f.Color(this.opt.helperBoneColor2), o = m.pivots.map((
|
|
413
|
+
const n = new f.Color(this.opt.helperBoneColor1), s = new f.Color(this.opt.helperBoneColor2), o = m.pivots.map((u) => u && this.opt.isPivots ? [s.r, s.g, s.b] : [n.r, n.g, n.b]).flat();
|
|
414
414
|
e.setAttribute("color", new f.Float32BufferAttribute(o, 3));
|
|
415
415
|
const r = new f.PointsMaterial({
|
|
416
416
|
depthTest: !1,
|
|
@@ -423,9 +423,9 @@ class Ve {
|
|
|
423
423
|
m.object = new f.Points(e, r), m.object.renderOrder = 998, m.object.matrix = this.armature.matrixWorld, m.object.matrixAutoUpdate = !1, this.scene.add(m.object);
|
|
424
424
|
}
|
|
425
425
|
if (m = this.helpers.lines, m.bones.length) {
|
|
426
|
-
const e = new f.BufferGeometry(), i = m.bones.map((
|
|
426
|
+
const e = new f.BufferGeometry(), i = m.bones.map((u) => [0, 0, 0, 0, 0, 0]).flat();
|
|
427
427
|
e.setAttribute("position", new f.Float32BufferAttribute(i, 3));
|
|
428
|
-
const n = new f.Color(this.opt.helperLinkColor1), s = new f.Color(this.opt.helperLinkColor2), o = m.bones.map((
|
|
428
|
+
const n = new f.Color(this.opt.helperLinkColor1), s = new f.Color(this.opt.helperLinkColor2), o = m.bones.map((u) => [n.r, n.g, n.b, s.r, s.g, s.b]).flat();
|
|
429
429
|
e.setAttribute("color", new f.Float32BufferAttribute(o, 3));
|
|
430
430
|
const r = new f.LineBasicMaterial({
|
|
431
431
|
vertexColors: !0,
|
|
@@ -442,17 +442,17 @@ class Ve {
|
|
|
442
442
|
*/
|
|
443
443
|
updateHelpers() {
|
|
444
444
|
if (m = this.helpers.points, m.bones.length) {
|
|
445
|
-
|
|
445
|
+
$.copy(this.armature.matrixWorld).invert();
|
|
446
446
|
const t = m.object.geometry.getAttribute("position");
|
|
447
447
|
for (let e = 0, i = m.bones.length; e < i; e++)
|
|
448
|
-
|
|
448
|
+
J.multiplyMatrices($, m.bones[e].matrixWorld), w.setFromMatrixPosition(J), t.setXYZ(e, w.x, w.y, w.z);
|
|
449
449
|
t.needsUpdate = !0, m.object.updateMatrixWorld();
|
|
450
450
|
}
|
|
451
451
|
if (m = this.helpers.lines, m.bones.length) {
|
|
452
|
-
|
|
452
|
+
$.copy(this.armature.matrixWorld).invert();
|
|
453
453
|
const t = m.object.geometry.getAttribute("position");
|
|
454
454
|
for (let e = 0, i = 0, n = m.bones.length; e < n; e++, i += 2)
|
|
455
|
-
|
|
455
|
+
J.multiplyMatrices($, m.bones[e].matrixWorld), w.setFromMatrixPosition(J), t.setXYZ(i, w.x, w.y, w.z), J.multiplyMatrices($, m.bones[e].parent.matrixWorld), w.setFromMatrixPosition(J), t.setXYZ(i + 1, w.x, w.y, w.z);
|
|
456
456
|
t.needsUpdate = !0, m.object.updateMatrixWorld();
|
|
457
457
|
}
|
|
458
458
|
}
|
|
@@ -519,13 +519,13 @@ class Ge {
|
|
|
519
519
|
phonemeBoundaries: []
|
|
520
520
|
}, n = 1024, s = 512, o = Math.floor((t.length - n) / s) + 1;
|
|
521
521
|
for (let r = 0; r < o; r++) {
|
|
522
|
-
const
|
|
522
|
+
const u = r * s, a = Math.min(u + n, t.length), h = t.slice(u, a), l = this.calculateEnergy(h);
|
|
523
523
|
i.energy.push(l);
|
|
524
|
-
const
|
|
525
|
-
i.spectralCentroid.push(
|
|
526
|
-
const
|
|
527
|
-
i.zeroCrossingRate.push(
|
|
528
|
-
const g = this.calculateMFCC(
|
|
524
|
+
const d = this.calculateSpectralCentroid(h);
|
|
525
|
+
i.spectralCentroid.push(d);
|
|
526
|
+
const c = this.calculateZeroCrossingRate(h);
|
|
527
|
+
i.zeroCrossingRate.push(c);
|
|
528
|
+
const g = this.calculateMFCC(h);
|
|
529
529
|
i.mfcc.push(g);
|
|
530
530
|
}
|
|
531
531
|
return i.onsets = this.detectOnsets(i.energy), i.phonemeBoundaries = this.detectPhonemeBoundaries(i), i;
|
|
@@ -597,19 +597,19 @@ class Ge {
|
|
|
597
597
|
for (; s & o; )
|
|
598
598
|
s ^= o, o >>= 1;
|
|
599
599
|
if (s ^= o, n < s) {
|
|
600
|
-
const r = i[n * 2],
|
|
601
|
-
i[n * 2] = i[s * 2], i[n * 2 + 1] = i[s * 2 + 1], i[s * 2] = r, i[s * 2 + 1] =
|
|
600
|
+
const r = i[n * 2], u = i[n * 2 + 1];
|
|
601
|
+
i[n * 2] = i[s * 2], i[n * 2 + 1] = i[s * 2 + 1], i[s * 2] = r, i[s * 2 + 1] = u;
|
|
602
602
|
}
|
|
603
603
|
}
|
|
604
604
|
for (let n = 2; n <= e; n <<= 1) {
|
|
605
605
|
const s = -2 * Math.PI / n, o = Math.cos(s), r = Math.sin(s);
|
|
606
|
-
for (let
|
|
607
|
-
let a = 1,
|
|
606
|
+
for (let u = 0; u < e; u += n) {
|
|
607
|
+
let a = 1, h = 0;
|
|
608
608
|
for (let l = 0; l < n / 2; l++) {
|
|
609
|
-
const
|
|
610
|
-
i[(
|
|
611
|
-
const x = a * o -
|
|
612
|
-
a = x,
|
|
609
|
+
const d = i[(u + l) * 2], c = i[(u + l) * 2 + 1], g = i[(u + l + n / 2) * 2] * a - i[(u + l + n / 2) * 2 + 1] * h, y = i[(u + l + n / 2) * 2] * h + i[(u + l + n / 2) * 2 + 1] * a;
|
|
610
|
+
i[(u + l) * 2] = d + g, i[(u + l) * 2 + 1] = c + y, i[(u + l + n / 2) * 2] = d - g, i[(u + l + n / 2) * 2 + 1] = c - y;
|
|
611
|
+
const x = a * o - h * r, L = a * r + h * o;
|
|
612
|
+
a = x, h = L;
|
|
613
613
|
}
|
|
614
614
|
}
|
|
615
615
|
}
|
|
@@ -624,8 +624,8 @@ class Ge {
|
|
|
624
624
|
const e = [];
|
|
625
625
|
let s = -0.1;
|
|
626
626
|
for (let o = 1; o < t.length; o++) {
|
|
627
|
-
const r = t[o] - t[o - 1],
|
|
628
|
-
r > 0.1 &&
|
|
627
|
+
const r = t[o] - t[o - 1], u = o * 0.023;
|
|
628
|
+
r > 0.1 && u - s > 0.1 && (e.push(u), s = u);
|
|
629
629
|
}
|
|
630
630
|
return e;
|
|
631
631
|
}
|
|
@@ -637,8 +637,8 @@ class Ge {
|
|
|
637
637
|
detectPhonemeBoundaries(t) {
|
|
638
638
|
const e = [], { energy: i, spectralCentroid: n, zeroCrossingRate: s } = t;
|
|
639
639
|
for (let o = 1; o < i.length; o++) {
|
|
640
|
-
const r = o * 0.023,
|
|
641
|
-
|
|
640
|
+
const r = o * 0.023, u = Math.abs(i[o] - i[o - 1]), a = Math.abs(n[o] - n[o - 1]), h = Math.abs(s[o] - s[o - 1]);
|
|
641
|
+
u + a * 0.1 + h * 0.5 > 0.2 && e.push(r);
|
|
642
642
|
}
|
|
643
643
|
return e;
|
|
644
644
|
}
|
|
@@ -654,14 +654,14 @@ class Ge {
|
|
|
654
654
|
t.phonemeBoundaries, t.onsets;
|
|
655
655
|
const s = [];
|
|
656
656
|
let o = 0;
|
|
657
|
-
for (let
|
|
658
|
-
const a = n[
|
|
657
|
+
for (let u = 0; u < n.length; u++) {
|
|
658
|
+
const a = n[u], h = this.estimateWordDuration(a, i / n.length);
|
|
659
659
|
s.push({
|
|
660
660
|
word: a,
|
|
661
661
|
startTime: o,
|
|
662
|
-
endTime: o +
|
|
663
|
-
duration:
|
|
664
|
-
}), o +=
|
|
662
|
+
endTime: o + h,
|
|
663
|
+
duration: h
|
|
664
|
+
}), o += h;
|
|
665
665
|
}
|
|
666
666
|
const r = this.generateVisemeTimings(t, e, i);
|
|
667
667
|
return {
|
|
@@ -701,27 +701,27 @@ class Ge {
|
|
|
701
701
|
const n = [], s = t.phonemeBoundaries;
|
|
702
702
|
t.onsets;
|
|
703
703
|
const o = this.textToVisemes(e);
|
|
704
|
-
let r = 0,
|
|
704
|
+
let r = 0, u = 0;
|
|
705
705
|
for (let a = 0; a < s.length && r < o.length; a++) {
|
|
706
|
-
const
|
|
706
|
+
const h = s[a], l = o[r], d = t.energy[Math.floor(h / 0.023)] || 0, c = this.calculateVisemeDuration(l, d);
|
|
707
707
|
n.push({
|
|
708
708
|
viseme: l,
|
|
709
|
-
startTime:
|
|
710
|
-
endTime:
|
|
711
|
-
duration:
|
|
712
|
-
intensity: Math.min(1,
|
|
709
|
+
startTime: u,
|
|
710
|
+
endTime: u + c,
|
|
711
|
+
duration: c,
|
|
712
|
+
intensity: Math.min(1, d * 2)
|
|
713
713
|
// Map energy to viseme intensity
|
|
714
|
-
}),
|
|
714
|
+
}), u += c, r++;
|
|
715
715
|
}
|
|
716
716
|
for (; r < o.length; ) {
|
|
717
|
-
const a = o[r],
|
|
717
|
+
const a = o[r], h = this.calculateVisemeDuration(a, 0.5);
|
|
718
718
|
n.push({
|
|
719
719
|
viseme: a,
|
|
720
|
-
startTime:
|
|
721
|
-
endTime:
|
|
722
|
-
duration:
|
|
720
|
+
startTime: u,
|
|
721
|
+
endTime: u + h,
|
|
722
|
+
duration: h,
|
|
723
723
|
intensity: 0.6
|
|
724
|
-
}),
|
|
724
|
+
}), u += h, r++;
|
|
725
725
|
}
|
|
726
726
|
return n;
|
|
727
727
|
}
|
|
@@ -775,16 +775,16 @@ class Ge {
|
|
|
775
775
|
let o = 0;
|
|
776
776
|
for (; o < s.length; ) {
|
|
777
777
|
let r = !1;
|
|
778
|
-
for (let
|
|
779
|
-
const a = s.substr(o,
|
|
778
|
+
for (let u = 3; u >= 2; u--) {
|
|
779
|
+
const a = s.substr(o, u);
|
|
780
780
|
if (e[a]) {
|
|
781
|
-
i.push(e[a]), o +=
|
|
781
|
+
i.push(e[a]), o += u, r = !0;
|
|
782
782
|
break;
|
|
783
783
|
}
|
|
784
784
|
}
|
|
785
785
|
if (!r) {
|
|
786
|
-
const
|
|
787
|
-
e[
|
|
786
|
+
const u = s[o];
|
|
787
|
+
e[u] && i.push(e[u]), o++;
|
|
788
788
|
}
|
|
789
789
|
}
|
|
790
790
|
}
|
|
@@ -1206,11 +1206,11 @@ class Ze {
|
|
|
1206
1206
|
};
|
|
1207
1207
|
Object.keys(this.rules).forEach((e) => {
|
|
1208
1208
|
this.rules[e] = this.rules[e].map((i) => {
|
|
1209
|
-
const n = i.indexOf("["), s = i.indexOf("]"), o = i.indexOf("="), r = i.substring(0, n),
|
|
1210
|
-
let
|
|
1211
|
-
|
|
1212
|
-
const
|
|
1213
|
-
return
|
|
1209
|
+
const n = i.indexOf("["), s = i.indexOf("]"), o = i.indexOf("="), r = i.substring(0, n), u = i.substring(n + 1, s), a = i.substring(s + 1, o), h = i.substring(o + 1), l = { regex: "", move: 0, visemes: [] };
|
|
1210
|
+
let d = "";
|
|
1211
|
+
d += [...r].map((g) => t[g] || g).join("");
|
|
1212
|
+
const c = [...u];
|
|
1213
|
+
return c[0] = c[0].toLowerCase(), d += c.join(""), l.move = c.length, d += [...a].map((g) => t[g] || g).join(""), l.regex = new RegExp(d), h.length && h.split(" ").forEach((g) => {
|
|
1214
1214
|
l.visemes.push(g);
|
|
1215
1215
|
}), l;
|
|
1216
1216
|
});
|
|
@@ -1324,8 +1324,8 @@ class Ze {
|
|
|
1324
1324
|
*/
|
|
1325
1325
|
convertDecade(t) {
|
|
1326
1326
|
const e = parseInt(t), i = !isNaN(e) && t.length === 2, n = !isNaN(e) && t.length > 2 && e > 0 && e <= 3e3, s = n && e % 1e3 === 0 ? Math.floor(e / 1e3) : null, o = n && !s ? Math.floor(e / 100) : null, r = i || n ? Math.floor(e % 100 / 10) * 10 : null;
|
|
1327
|
-
let
|
|
1328
|
-
return s ?
|
|
1327
|
+
let u = [];
|
|
1328
|
+
return s ? u.push(this.convertNumberToWords(s).trim(), "thousands") : (o && u.push(this.convertNumberToWords(o).trim()), r ? u.push(this.decades[r] || this.convertNumberToWords(r).trim() + "s") : o ? u.push("hundreds") : u.push(t)), u.join(" ");
|
|
1329
1329
|
}
|
|
1330
1330
|
/**
|
|
1331
1331
|
* Convert ordinal number to text.
|
|
@@ -1376,17 +1376,17 @@ class Ze {
|
|
|
1376
1376
|
const s = n[e.i], o = this.rules[s];
|
|
1377
1377
|
if (o)
|
|
1378
1378
|
for (let r = 0; r < o.length; r++) {
|
|
1379
|
-
const
|
|
1380
|
-
if ((e.words.substring(0, e.i) + s.toLowerCase() + e.words.substring(e.i + 1)).match(
|
|
1381
|
-
|
|
1379
|
+
const u = o[r];
|
|
1380
|
+
if ((e.words.substring(0, e.i) + s.toLowerCase() + e.words.substring(e.i + 1)).match(u.regex)) {
|
|
1381
|
+
u.visemes.forEach((l) => {
|
|
1382
1382
|
if (e.visemes.length && e.visemes[e.visemes.length - 1] === l) {
|
|
1383
|
-
const
|
|
1384
|
-
e.durations[e.durations.length - 1] +=
|
|
1383
|
+
const d = 0.7 * (this.visemeDurations[l] || 1);
|
|
1384
|
+
e.durations[e.durations.length - 1] += d, i += d;
|
|
1385
1385
|
} else {
|
|
1386
|
-
const
|
|
1387
|
-
e.visemes.push(l), e.times.push(i), e.durations.push(
|
|
1386
|
+
const d = this.visemeDurations[l] || 1;
|
|
1387
|
+
e.visemes.push(l), e.times.push(i), e.durations.push(d), i += d;
|
|
1388
1388
|
}
|
|
1389
|
-
}), e.i +=
|
|
1389
|
+
}), e.i += u.move;
|
|
1390
1390
|
break;
|
|
1391
1391
|
}
|
|
1392
1392
|
}
|
|
@@ -1616,11 +1616,11 @@ class Ye {
|
|
|
1616
1616
|
};
|
|
1617
1617
|
Object.keys(this.rules).forEach((e) => {
|
|
1618
1618
|
this.rules[e] = this.rules[e].map((i) => {
|
|
1619
|
-
const n = i.indexOf("["), s = i.indexOf("]"), o = i.indexOf("="), r = i.substring(0, n),
|
|
1620
|
-
let
|
|
1621
|
-
|
|
1622
|
-
const
|
|
1623
|
-
return
|
|
1619
|
+
const n = i.indexOf("["), s = i.indexOf("]"), o = i.indexOf("="), r = i.substring(0, n), u = i.substring(n + 1, s), a = i.substring(s + 1, o), h = i.substring(o + 1), l = { regex: "", move: 0, visemes: [] };
|
|
1620
|
+
let d = "";
|
|
1621
|
+
d += [...r].map((g) => t[g] || g).join("");
|
|
1622
|
+
const c = [...u];
|
|
1623
|
+
return c[0] = c[0].toLowerCase(), d += c.join(""), l.move = c.length, d += [...a].map((g) => t[g] || g).join(""), l.regex = new RegExp(d), h.length && h.split(" ").forEach((g) => {
|
|
1624
1624
|
l.visemes.push(g);
|
|
1625
1625
|
}), l;
|
|
1626
1626
|
});
|
|
@@ -1732,16 +1732,16 @@ class Ye {
|
|
|
1732
1732
|
const s = n[e.i], o = this.rules[s];
|
|
1733
1733
|
if (o) {
|
|
1734
1734
|
let r = !1;
|
|
1735
|
-
for (let
|
|
1736
|
-
const a = o[
|
|
1735
|
+
for (let u = 0; u < o.length; u++) {
|
|
1736
|
+
const a = o[u];
|
|
1737
1737
|
if ((e.words.substring(0, e.i) + s.toLowerCase() + e.words.substring(e.i + 1)).match(a.regex)) {
|
|
1738
|
-
a.visemes.forEach((
|
|
1739
|
-
if (e.visemes.length && e.visemes[e.visemes.length - 1] ===
|
|
1740
|
-
const
|
|
1741
|
-
e.durations[e.durations.length - 1] +=
|
|
1738
|
+
a.visemes.forEach((d) => {
|
|
1739
|
+
if (e.visemes.length && e.visemes[e.visemes.length - 1] === d) {
|
|
1740
|
+
const c = 0.7 * (this.visemeDurations[d] || 1);
|
|
1741
|
+
e.durations[e.durations.length - 1] += c, i += c;
|
|
1742
1742
|
} else {
|
|
1743
|
-
const
|
|
1744
|
-
e.visemes.push(
|
|
1743
|
+
const c = this.visemeDurations[d] || 1;
|
|
1744
|
+
e.visemes.push(d), e.times.push(i), e.durations.push(c), i += c;
|
|
1745
1745
|
}
|
|
1746
1746
|
}), e.i += a.move, r = !0;
|
|
1747
1747
|
break;
|
|
@@ -2131,11 +2131,11 @@ class Qe {
|
|
|
2131
2131
|
};
|
|
2132
2132
|
Object.keys(this.rules).forEach((e) => {
|
|
2133
2133
|
this.rules[e] = this.rules[e].map((i) => {
|
|
2134
|
-
const n = i.indexOf("["), s = i.indexOf("]"), o = i.indexOf("="), r = i.substring(0, n),
|
|
2135
|
-
let
|
|
2136
|
-
|
|
2137
|
-
const
|
|
2138
|
-
return
|
|
2134
|
+
const n = i.indexOf("["), s = i.indexOf("]"), o = i.indexOf("="), r = i.substring(0, n), u = i.substring(n + 1, s), a = i.substring(s + 1, o), h = i.substring(o + 1), l = { regex: "", move: 0, visemes: [] };
|
|
2135
|
+
let d = "";
|
|
2136
|
+
d += [...r].map((g) => t[g] || g).join("");
|
|
2137
|
+
const c = [...u];
|
|
2138
|
+
return c[0] = c[0].toLowerCase(), d += c.join(""), l.move = c.length, d += [...a].map((g) => t[g] || g).join(""), l.regex = new RegExp(d, "i"), h.length && h.split(" ").forEach((g) => {
|
|
2139
2139
|
g && l.visemes.push(g);
|
|
2140
2140
|
}), l;
|
|
2141
2141
|
});
|
|
@@ -2267,16 +2267,16 @@ class Qe {
|
|
|
2267
2267
|
const s = n[e.i], o = this.rules[s];
|
|
2268
2268
|
if (o) {
|
|
2269
2269
|
let r = !1;
|
|
2270
|
-
for (let
|
|
2271
|
-
const a = o[
|
|
2270
|
+
for (let u = 0; u < o.length; u++) {
|
|
2271
|
+
const a = o[u];
|
|
2272
2272
|
if ((e.words.substring(0, e.i) + s.toLowerCase() + e.words.substring(e.i + 1)).match(a.regex)) {
|
|
2273
|
-
a.visemes.forEach((
|
|
2274
|
-
if (e.visemes.length && e.visemes[e.visemes.length - 1] ===
|
|
2275
|
-
const
|
|
2276
|
-
e.durations[e.durations.length - 1] +=
|
|
2273
|
+
a.visemes.forEach((d) => {
|
|
2274
|
+
if (e.visemes.length && e.visemes[e.visemes.length - 1] === d) {
|
|
2275
|
+
const c = 0.7 * (this.visemeDurations[d] || 1);
|
|
2276
|
+
e.durations[e.durations.length - 1] += c, i += c;
|
|
2277
2277
|
} else {
|
|
2278
|
-
const
|
|
2279
|
-
e.visemes.push(
|
|
2278
|
+
const c = this.visemeDurations[d] || 1;
|
|
2279
|
+
e.visemes.push(d), e.times.push(i), e.durations.push(c), i += c;
|
|
2280
2280
|
}
|
|
2281
2281
|
}), e.i += a.move, r = !0;
|
|
2282
2282
|
break;
|
|
@@ -2381,10 +2381,10 @@ class _e {
|
|
|
2381
2381
|
const e = [];
|
|
2382
2382
|
let i = parseFloat(t);
|
|
2383
2383
|
if (i === void 0) return t;
|
|
2384
|
-
let n = (s, o, r,
|
|
2384
|
+
let n = (s, o, r, u, a) => {
|
|
2385
2385
|
if (s < o) return s;
|
|
2386
|
-
const
|
|
2387
|
-
return e.push(r + (
|
|
2386
|
+
const h = Math.floor(s / o);
|
|
2387
|
+
return e.push(r + (h === 1 ? u : this.numberToFinnishWords(h.toString()) + a)), s - h * o;
|
|
2388
2388
|
};
|
|
2389
2389
|
if (i < 0 && (e.push("miinus "), i = Math.abs(i)), i = n(i, 1e9, " ", "miljardi", " miljardia"), i = n(i, 1e6, " ", "miljoona", " miljoonaa"), i = n(i, 1e3, "", "tuhat", "tuhatta"), i = n(i, 100, " ", "sata", "sataa"), i > 20 && (i = n(i, 10, "", "", "kymmentä")), i >= 1) {
|
|
2390
2390
|
let s = Math.floor(i);
|
|
@@ -2559,10 +2559,10 @@ class Je {
|
|
|
2559
2559
|
const e = [];
|
|
2560
2560
|
let i = parseFloat(t);
|
|
2561
2561
|
if (i === void 0) return t;
|
|
2562
|
-
let n = (s, o, r,
|
|
2562
|
+
let n = (s, o, r, u, a) => {
|
|
2563
2563
|
if (s < o) return s;
|
|
2564
|
-
const
|
|
2565
|
-
return
|
|
2564
|
+
const h = Math.floor(s / o);
|
|
2565
|
+
return h === 1 ? e.push(this.numbers[1]) : e.push(this.numberToLithuanianWords(h.toString())), h % 10 === 1 ? e.push(r) : h % 10 === 0 || h % 100 > 10 && h % 100 < 20 ? e.push(a) : e.push(u), s - h * o;
|
|
2566
2566
|
};
|
|
2567
2567
|
i < 0 && (e.push("minus"), i = Math.abs(i)), i = n(i, 1e9, "milijardas", "milijardai", "milijardų"), i = n(i, 1e6, "milijonas", "milijonai", "milijonų"), i = n(i, 1e3, "tūkstantis", "tūkstančiai", "tūkstančių"), i = n(i, 100, "šimtas", "šimtai", "šimtų");
|
|
2568
2568
|
for (let s = this.tens.length - 1; s >= 1; s--)
|
|
@@ -2608,11 +2608,11 @@ class Je {
|
|
|
2608
2608
|
const o = n[s].toLowerCase(), r = this.visemes[o];
|
|
2609
2609
|
if (r)
|
|
2610
2610
|
if (e.visemes.length && e.visemes[e.visemes.length - 1] === r) {
|
|
2611
|
-
const
|
|
2612
|
-
e.durations[e.durations.length - 1] +=
|
|
2611
|
+
const u = 0.7 * (this.durations[o] || 1);
|
|
2612
|
+
e.durations[e.durations.length - 1] += u, i += u;
|
|
2613
2613
|
} else {
|
|
2614
|
-
const
|
|
2615
|
-
e.visemes.push(r), e.times.push(i), e.durations.push(
|
|
2614
|
+
const u = this.durations[o] || 1;
|
|
2615
|
+
e.visemes.push(r), e.times.push(i), e.durations.push(u), i += u;
|
|
2616
2616
|
}
|
|
2617
2617
|
else
|
|
2618
2618
|
i += this.pauses[n[s]] || 0;
|
|
@@ -2623,13 +2623,13 @@ class Je {
|
|
|
2623
2623
|
const $e = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
2624
2624
|
__proto__: null,
|
|
2625
2625
|
LipsyncLt: Je
|
|
2626
|
-
}, Symbol.toStringTag, { value: "Module" })), et = new URL("data:text/javascript;base64,Y2xhc3MgUGxheWJhY2tXb3JrbGV0IGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHsKICBzdGF0aWMgRlNNID0gewogICAgSURMRTogMCwKICAgIFBMQVlJTkc6IDEsCiAgfTsKCiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoKTsKICAgIHRoaXMucG9ydC5vbm1lc3NhZ2UgPSB0aGlzLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzKTsKCiAgICB0aGlzLl9zYW1wbGVSYXRlID0gb3B0aW9ucz8ucHJvY2Vzc29yT3B0aW9ucz8uc2FtcGxlUmF0ZSB8fCBzYW1wbGVSYXRlOwogICAgdGhpcy5fc2NhbGUgPSAxIC8gMzI3Njg7IC8vIFBDTTE2IC0+IGZsb2F0CgogICAgLy8gU2lsZW5jZSBkZXRlY3Rpb24gdGhyZXNob2xkICgxIHNlY29uZCkgYXMgYSBmYWxsYmFjayBzYWZldHkgbmV0CiAgICBjb25zdCBzaWxlbmNlRHVyYXRpb25TZWNvbmRzID0gMS4wOwogICAgdGhpcy5fc2lsZW5jZVRocmVzaG9sZEJsb2NrcyA9IE1hdGguY2VpbCgodGhpcy5fc2FtcGxlUmF0ZSAqIHNpbGVuY2VEdXJhdGlvblNlY29uZHMpIC8gMTI4KTsKCiAgICAvLyBNZXRyaWNzIGNvbmZpZ3VyYXRpb24gdmlhIG9wdGlvbnMKICAgIGNvbnN0IG1ldHJpY3NDZmcgPSBvcHRpb25zPy5wcm9jZXNzb3JPcHRpb25zPy5tZXRyaWNzIHx8IHt9OwogICAgdGhpcy5fbWV0cmljc0VuYWJsZWQgPSBtZXRyaWNzQ2ZnLmVuYWJsZWQgIT09IGZhbHNlOwogICAgY29uc3QgaW50ZXJ2YWxIeiA9ICh0eXBlb2YgbWV0cmljc0NmZy5pbnRlcnZhbEh6ID09PSAibnVtYmVyIiAmJiBtZXRyaWNzQ2ZnLmludGVydmFsSHogPiAwKQogICAgICA/IG1ldHJpY3NDZmcuaW50ZXJ2YWxIeiA6IDI7CiAgICAvLyBNZXRyaWNzIHN0YXRlIChsb3ctb3ZlcmhlYWQpCiAgICB0aGlzLl9mcmFtZXNQcm9jZXNzZWQgPSAwOwogICAgdGhpcy5fdW5kZXJydW5CbG9ja3MgPSAwOwogICAgdGhpcy5fbWF4UXVldWVTYW1wbGVzID0gMDsKICAgIHRoaXMuX2xhc3RNZXRyaWNzU2VudEF0RnJhbWUgPSAwOwogICAgLy8gQ29udmVydCB0byBmcmFtZXMgYmV0d2VlbiByZXBvcnRzCiAgICB0aGlzLl9tZXRyaWNzSW50ZXJ2YWxGcmFtZXMgPSBNYXRoLm1heCgxMjgsIE1hdGgucm91bmQodGhpcy5fc2FtcGxlUmF0ZSAvIGludGVydmFsSHopKTsKCiAgICB0aGlzLnJlc2V0KCk7CiAgfQoKICAvKioKICAgKiBSZXNldHMgdGhlIHdvcmtsZXQgdG8gaXRzIGluaXRpYWwgSURMRSBzdGF0ZS4KICAgKi8KICByZXNldCgpIHsKICAgIHRoaXMuX2J1ZmZlclF1ZXVlID0gW107CiAgICB0aGlzLl9jdXJyZW50Q2h1bmsgPSBudWxsOwogICAgdGhpcy5fY3VycmVudENodW5rT2Zmc2V0ID0gMDsKICAgIHRoaXMuX3N0YXRlID0gUGxheWJhY2tXb3JrbGV0LkZTTS5JRExFOwoKICAgIHRoaXMuX25vTW9yZURhdGFSZWNlaXZlZCA9IGZhbHNlOwogICAgdGhpcy5fc2lsZW5jZUZyYW1lc0NvdW50ID0gMDsKICAgIHRoaXMuX2hhc1NlbnRFbmRlZCA9IGZhbHNlOwogICAgLy8gUmVzZXQgbWF4IHF1ZXVlIHRyYWNrZXIgb25seSB3aGVuIGdvaW5nIGlkbGUKICAgIHRoaXMuX21heFF1ZXVlU2FtcGxlcyA9IDA7CiAgfQoKICBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7CiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7CgogICAgLy8gSU5URVJSVVBUOiBUaGUgbWFpbiB0aHJlYWQgd2FudHMgdG8gc3RvcCBpbW1lZGlhdGVseS4KICAgIGlmICh0eXBlID09PSAic3RvcCIpIHsKICAgICAgdGhpcy5yZXNldCgpOwogICAgICAvLyBTZW5kIGZpbmFsIG1ldHJpY3Mgc2hvd2luZyBjbGVhcmVkIHN0YXRlCiAgICAgIGlmICh0aGlzLl9tZXRyaWNzRW5hYmxlZCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UoewogICAgICAgICAgICB0eXBlOiAibWV0cmljcyIsCiAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICBzdGF0ZTogUGxheWJhY2tXb3JrbGV0LkZTTS5JRExFLAogICAgICAgICAgICAgIHF1ZXVlZFNhbXBsZXM6IDAsCiAgICAgICAgICAgICAgcXVldWVkTXM6IDAsCiAgICAgICAgICAgICAgbWF4UXVldWVkTXM6IE1hdGgucm91bmQoKHRoaXMuX21heFF1ZXVlU2FtcGxlcyAvIHRoaXMuX3NhbXBsZVJhdGUpICogMTAwMCksCiAgICAgICAgICAgICAgdW5kZXJydW5CbG9ja3M6IHRoaXMuX3VuZGVycnVuQmxvY2tzLAogICAgICAgICAgICAgIGZyYW1lc1Byb2Nlc3NlZDogdGhpcy5fZnJhbWVzUHJvY2Vzc2VkCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gY2F0Y2ggKF8pIHsgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBNYWluIHRocmVhZCBoYXMgc2lnbmFsZWQgdGhhdCBubyBtb3JlIGF1ZGlvIGNodW5rcyB3aWxsIGJlIHNlbnQgZm9yIHRoaXMgdXR0ZXJhbmNlLgogICAgaWYgKHR5cGUgPT09ICJuby1tb3JlLWRhdGEiKSB7CiAgICAgIHRoaXMuX25vTW9yZURhdGFSZWNlaXZlZCA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBVcGRhdGUgbWV0cmljcyBjb25maWd1cmF0aW9uIGF0IHJ1bnRpbWUKICAgIGlmICh0eXBlID09PSAiY29uZmlnLW1ldHJpY3MiICYmIGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICJvYmplY3QiKSB7CiAgICAgIGlmICgiZW5hYmxlZCIgaW4gZGF0YSkgdGhpcy5fbWV0cmljc0VuYWJsZWQgPSAhIWRhdGEuZW5hYmxlZDsKICAgICAgaWYgKHR5cGVvZiBkYXRhLmludGVydmFsSHogPT09ICJudW1iZXIiICYmIGRhdGEuaW50ZXJ2YWxIeiA+IDApIHsKICAgICAgICBjb25zdCBpbnRlcnZhbEh6ID0gZGF0YS5pbnRlcnZhbEh6OwogICAgICAgIHRoaXMuX21ldHJpY3NJbnRlcnZhbEZyYW1lcyA9IE1hdGgubWF4KDEyOCwgTWF0aC5yb3VuZCh0aGlzLl9zYW1wbGVSYXRlIC8gaW50ZXJ2YWxIeikpOwogICAgICB9CiAgICAgIC8vIFJlc2V0IHBhY2luZyBzbyB0aGUgbmV4dCByZXBvcnQgYWxpZ25zIHdpdGggbmV3IGludGVydmFsCiAgICAgIHRoaXMuX2xhc3RNZXRyaWNzU2VudEF0RnJhbWUgPSB0aGlzLl9mcmFtZXNQcm9jZXNzZWQ7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBOZXcgYXVkaW8gZGF0YSBoYXMgYXJyaXZlZC4KICAgIGlmICh0eXBlID09PSAiYXVkaW9EYXRhIiAmJiBkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKICAgICAgdGhpcy5fbm9Nb3JlRGF0YVJlY2VpdmVkID0gZmFsc2U7CiAgICAgIC8vIElmIHdlIHdlcmUgaWRsZSwgdGhpcyBuZXcgZGF0YSBraWNrcyBvZmYgdGhlIHBsYXliYWNrLgogICAgICBpZiAodGhpcy5fc3RhdGUgPT09IFBsYXliYWNrV29ya2xldC5GU00uSURMRSkgewogICAgICAgIHRoaXMuX3N0YXRlID0gUGxheWJhY2tXb3JrbGV0LkZTTS5QTEFZSU5HOwogICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7IHR5cGU6ICJwbGF5YmFjay1zdGFydGVkIiB9KTsKICAgICAgfQoKICAgICAgLy8gV2Ugb25seSBxdWV1ZSBkYXRhIGlmIHdlIGFyZSBpbiB0aGUgUExBWUlORyBzdGF0ZS4gVGhpcyBwcmV2ZW50cwogICAgICAvLyBkYXRhIGZyb20gYSBwcmV2aW91cywgaW50ZXJydXB0ZWQgc3RyZWFtIGZyb20gbGluZ2VyaW5nLgogICAgICBpZiAodGhpcy5fc3RhdGUgPT09IFBsYXliYWNrV29ya2xldC5GU00uUExBWUlORykgewogICAgICAgIC8vIFN0b3JlIGFzIEludDE2QXJyYXkgdmlldyB0byBhdm9pZCBjb25zdHJ1Y3RpbmcgaXQgaW4gcHJvY2VzcygpCiAgICAgICAgdGhpcy5fYnVmZmVyUXVldWUucHVzaChuZXcgSW50MTZBcnJheShkYXRhKSk7CiAgICAgICAgdGhpcy5fc2lsZW5jZUZyYW1lc0NvdW50ID0gMDsgLy8gUmVzZXQgc2lsZW5jZSBjb3VudGVyIG9uIG5ldyBkYXRhCiAgICAgIH0KICAgIH0KICB9CgogIHByb2Nlc3MoaW5wdXRzLCBvdXRwdXRzLCBwYXJhbWV0ZXJzKSB7CiAgICBjb25zdCBvdXRwdXRDaGFubmVsID0gb3V0cHV0c1swXT8uWzBdOwogICAgaWYgKCFvdXRwdXRDaGFubmVsKSB7CiAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIGFsaXZlIGV2ZW4gaWYgb3V0cHV0IGlzIHRlbXBvcmFyaWx5IGRpc2Nvbm5lY3RlZAogICAgfQoKICAgIC8vIElmIHdlIGFyZSBub3QgcGxheWluZywganVzdCBvdXRwdXQgc2lsZW5jZSBhbmQgd2FpdC4KICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gUGxheWJhY2tXb3JrbGV0LkZTTS5QTEFZSU5HKSB7CiAgICAgIG91dHB1dENoYW5uZWwuZmlsbCgwKTsKICAgICAgcmV0dXJuIHRydWU7IC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSB0byBrZWVwIHRoZSBwcm9jZXNzb3IgYWxpdmUKICAgIH0KCiAgICAvLyBDb3JlIFBMQVlJTkcgTG9naWMKICAgIGNvbnN0IGJsb2NrU2l6ZSA9IG91dHB1dENoYW5uZWwubGVuZ3RoOwogICAgbGV0IHNhbXBsZXNDb3BpZWQgPSAwOwoKICAgIHdoaWxlIChzYW1wbGVzQ29waWVkIDwgYmxvY2tTaXplKSB7CiAgICAgIGlmICghdGhpcy5fY3VycmVudENodW5rIHx8IHRoaXMuX2N1cnJlbnRDaHVua09mZnNldCA+PSB0aGlzLl9jdXJyZW50Q2h1bmsubGVuZ3RoKSB7CiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlclF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuX2N1cnJlbnRDaHVuayA9IHRoaXMuX2J1ZmZlclF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICB0aGlzLl9jdXJyZW50Q2h1bmtPZmZzZXQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBCdWZmZXIgaXMgZW1wdHkuIENoZWNrIGZvciBlbmQgY29uZGl0aW9ucy4KICAgICAgICAgIGNvbnN0IGlzVGltZWRPdXQgPSB0aGlzLl9zaWxlbmNlRnJhbWVzQ291bnQgPiB0aGlzLl9zaWxlbmNlVGhyZXNob2xkQmxvY2tzOwoKICAgICAgICAgIGlmICh0aGlzLl9ub01vcmVEYXRhUmVjZWl2ZWQgfHwgaXNUaW1lZE91dCkgewogICAgICAgICAgICAvLyBFTkQgT0YgUExBWUJBQ0s6IEVpdGhlciBleHBsaWNpdGx5IHNpZ25hbGVkIG9yIHRpbWVkIG91dC4KICAgICAgICAgICAgaWYgKCF0aGlzLl9oYXNTZW50RW5kZWQpIHsKICAgICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAicGxheWJhY2stZW5kZWQiIH0pOwogICAgICAgICAgICAgIHRoaXMuX2hhc1NlbnRFbmRlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2VuZCBmaW5hbCBtZXRyaWNzIHNob3dpbmcgY2xlYXJlZCBzdGF0ZQogICAgICAgICAgICBpZiAodGhpcy5fbWV0cmljc0VuYWJsZWQpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgdHlwZTogIm1ldHJpY3MiLAogICAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IFBsYXliYWNrV29ya2xldC5GU00uSURMRSwKICAgICAgICAgICAgICAgICAgICBxdWV1ZWRTYW1wbGVzOiAwLAogICAgICAgICAgICAgICAgICAgIHF1ZXVlZE1zOiAwLAogICAgICAgICAgICAgICAgICAgIG1heFF1ZXVlZE1zOiBNYXRoLnJvdW5kKCh0aGlzLl9tYXhRdWV1ZVNhbXBsZXMgLyB0aGlzLl9zYW1wbGVSYXRlKSAqIDEwMDApLAogICAgICAgICAgICAgICAgICAgIHVuZGVycnVuQmxvY2tzOiB0aGlzLl91bmRlcnJ1bkJsb2NrcywKICAgICAgICAgICAgICAgICAgICBmcmFtZXNQcm9jZXNzZWQ6IHRoaXMuX2ZyYW1lc1Byb2Nlc3NlZAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGNhdGNoIChfKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlc2V0KCk7IC8vIFJlc2V0IHRvIElETEUgc3RhdGUgZm9yIHJldXNlCiAgICAgICAgICAgIGJyZWFrOyAvLyBFeGl0IHdoaWxlIGxvb3AKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEJVRkZFUiBVTkRFUlJVTiAoTEFHKTogUGxheSBzaWxlbmNlIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEuCiAgICAgICAgICAgIHRoaXMuX3NpbGVuY2VGcmFtZXNDb3VudCsrOwogICAgICAgICAgICBpZiAodGhpcy5fbWV0cmljc0VuYWJsZWQpIHRoaXMuX3VuZGVycnVuQmxvY2tzKys7CiAgICAgICAgICAgIGJyZWFrOyAvLyBFeGl0IHdoaWxlIGxvb3AKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIElmIHdlIGhhdmUgYSBjaHVuayAoY291bGQgYmUgYSBuZXcgb25lIGZyb20gdGhlIGxvZ2ljIGFib3ZlKSwgcHJvY2VzcyBpdC4KICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaHVuaykgewogICAgICAgIGNvbnN0IHNhbXBsZXNUb0NvcHkgPSBNYXRoLm1pbigKICAgICAgICAgIGJsb2NrU2l6ZSAtIHNhbXBsZXNDb3BpZWQsCiAgICAgICAgICB0aGlzLl9jdXJyZW50Q2h1bmsubGVuZ3RoIC0gdGhpcy5fY3VycmVudENodW5rT2Zmc2V0CiAgICAgICAgKTsKICAgICAgICAvLyBEaXJlY3RseSB3cml0ZSB0byBvdXRwdXRDaGFubmVsIHRvIGF2b2lkIGV4dHJhIGNvcHkKICAgICAgICBjb25zdCBzcmMgPSB0aGlzLl9jdXJyZW50Q2h1bms7CiAgICAgICAgY29uc3QgYmFzZVNyYyA9IHRoaXMuX2N1cnJlbnRDaHVua09mZnNldDsKICAgICAgICBjb25zdCBiYXNlRHN0ID0gc2FtcGxlc0NvcGllZDsKICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWxlOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlc1RvQ29weTsgaSsrKSB7CiAgICAgICAgICBvdXRwdXRDaGFubmVsW2Jhc2VEc3QgKyBpXSA9IHNyY1tiYXNlU3JjICsgaV0gKiBzY2FsZTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2N1cnJlbnRDaHVua09mZnNldCArPSBzYW1wbGVzVG9Db3B5OwogICAgICAgIHNhbXBsZXNDb3BpZWQgKz0gc2FtcGxlc1RvQ29weTsKICAgICAgfQogICAgfQoKICAgIC8vIFplcm8tZmlsbCB0aGUgcmVtYWluZGVyLCBpZiBhbnksIG9uY2UgcGVyIGJsb2NrCiAgICBpZiAoc2FtcGxlc0NvcGllZCA8IGJsb2NrU2l6ZSkgewogICAgICBvdXRwdXRDaGFubmVsLmZpbGwoMCwgc2FtcGxlc0NvcGllZCk7CiAgICB9CgogICAgLy8gVXBkYXRlIG1ldHJpY3MgKG9wdGlvbmFsKQogICAgaWYgKHRoaXMuX21ldHJpY3NFbmFibGVkKSB7CiAgICAgIHRoaXMuX2ZyYW1lc1Byb2Nlc3NlZCArPSBibG9ja1NpemU7CgogICAgICAvLyBUcmFjayBxdWV1ZSBkZXB0aCBpbiBzYW1wbGVzIChhcHByb3hpbWF0ZSkKICAgICAgbGV0IHF1ZXVlZFNhbXBsZXMgPSAwOwogICAgICBpZiAodGhpcy5fY3VycmVudENodW5rKSBxdWV1ZWRTYW1wbGVzICs9IE1hdGgubWF4KDAsIHRoaXMuX2N1cnJlbnRDaHVuay5sZW5ndGggLSB0aGlzLl9jdXJyZW50Q2h1bmtPZmZzZXQpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2J1ZmZlclF1ZXVlLmxlbmd0aDsgaSsrKSBxdWV1ZWRTYW1wbGVzICs9IHRoaXMuX2J1ZmZlclF1ZXVlW2ldLmxlbmd0aDsKICAgICAgaWYgKHF1ZXVlZFNhbXBsZXMgPiB0aGlzLl9tYXhRdWV1ZVNhbXBsZXMpIHRoaXMuX21heFF1ZXVlU2FtcGxlcyA9IHF1ZXVlZFNhbXBsZXM7CgogICAgICAvLyBQZXJpb2RpY2FsbHkgc2VuZCBtZXRyaWNzIHRvIG1haW4gdGhyZWFkCiAgICAgIGlmICh0aGlzLl9mcmFtZXNQcm9jZXNzZWQgLSB0aGlzLl9sYXN0TWV0cmljc1NlbnRBdEZyYW1lID49IHRoaXMuX21ldHJpY3NJbnRlcnZhbEZyYW1lcykgewogICAgICAgIHRoaXMuX2xhc3RNZXRyaWNzU2VudEF0RnJhbWUgPSB0aGlzLl9mcmFtZXNQcm9jZXNzZWQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHR5cGU6ICJtZXRyaWNzIiwKICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSwKICAgICAgICAgICAgICBxdWV1ZWRTYW1wbGVzLAogICAgICAgICAgICAgIHF1ZXVlZE1zOiBNYXRoLnJvdW5kKChxdWV1ZWRTYW1wbGVzIC8gdGhpcy5fc2FtcGxlUmF0ZSkgKiAxMDAwKSwKICAgICAgICAgICAgICBtYXhRdWV1ZWRNczogTWF0aC5yb3VuZCgodGhpcy5fbWF4UXVldWVTYW1wbGVzIC8gdGhpcy5fc2FtcGxlUmF0ZSkgKiAxMDAwKSwKICAgICAgICAgICAgICB1bmRlcnJ1bkJsb2NrczogdGhpcy5fdW5kZXJydW5CbG9ja3MsCiAgICAgICAgICAgICAgZnJhbWVzUHJvY2Vzc2VkOiB0aGlzLl9mcmFtZXNQcm9jZXNzZWQKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoXykgeyB9CiAgICAgICAgLy8gRG9uJ3QgcmVzZXQgbWF4IHRyYWNrZXIgLSBrZWVwIHNlc3Npb24gcGVhayB1bnRpbCBpZGxlCiAgICAgIH0KICAgIH0KCiAgICAvLyBBTFdBWVMgcmV0dXJuIHRydWUgdG8ga2VlcCB0aGUgcHJvY2Vzc29yIGFsaXZlIGZvciByZXVzZS4KICAgIHJldHVybiB0cnVlOwogIH0KfQoKcmVnaXN0ZXJQcm9jZXNzb3IoInBsYXliYWNrLXdvcmtsZXQiLCBQbGF5YmFja1dvcmtsZXQpOwo=", import.meta.url), Ae = {
|
|
2626
|
+
}, Symbol.toStringTag, { value: "Module" })), et = new URL("data:text/javascript;base64,Y2xhc3MgUGxheWJhY2tXb3JrbGV0IGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIHsKICBzdGF0aWMgRlNNID0gewogICAgSURMRTogMCwKICAgIFBMQVlJTkc6IDEsCiAgfTsKCiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoKTsKICAgIHRoaXMucG9ydC5vbm1lc3NhZ2UgPSB0aGlzLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzKTsKCiAgICB0aGlzLl9zYW1wbGVSYXRlID0gb3B0aW9ucz8ucHJvY2Vzc29yT3B0aW9ucz8uc2FtcGxlUmF0ZSB8fCBzYW1wbGVSYXRlOwogICAgdGhpcy5fc2NhbGUgPSAxIC8gMzI3Njg7IC8vIFBDTTE2IC0+IGZsb2F0CgogICAgLy8gU2lsZW5jZSBkZXRlY3Rpb24gdGhyZXNob2xkICgxIHNlY29uZCkgYXMgYSBmYWxsYmFjayBzYWZldHkgbmV0CiAgICBjb25zdCBzaWxlbmNlRHVyYXRpb25TZWNvbmRzID0gMS4wOwogICAgdGhpcy5fc2lsZW5jZVRocmVzaG9sZEJsb2NrcyA9IE1hdGguY2VpbCgodGhpcy5fc2FtcGxlUmF0ZSAqIHNpbGVuY2VEdXJhdGlvblNlY29uZHMpIC8gMTI4KTsKCiAgICAvLyBNZXRyaWNzIGNvbmZpZ3VyYXRpb24gdmlhIG9wdGlvbnMKICAgIGNvbnN0IG1ldHJpY3NDZmcgPSBvcHRpb25zPy5wcm9jZXNzb3JPcHRpb25zPy5tZXRyaWNzIHx8IHt9OwogICAgdGhpcy5fbWV0cmljc0VuYWJsZWQgPSBtZXRyaWNzQ2ZnLmVuYWJsZWQgIT09IGZhbHNlOwogICAgY29uc3QgaW50ZXJ2YWxIeiA9ICh0eXBlb2YgbWV0cmljc0NmZy5pbnRlcnZhbEh6ID09PSAibnVtYmVyIiAmJiBtZXRyaWNzQ2ZnLmludGVydmFsSHogPiAwKQogICAgICA/IG1ldHJpY3NDZmcuaW50ZXJ2YWxIeiA6IDI7CiAgICAvLyBNZXRyaWNzIHN0YXRlIChsb3ctb3ZlcmhlYWQpCiAgICB0aGlzLl9mcmFtZXNQcm9jZXNzZWQgPSAwOwogICAgdGhpcy5fdW5kZXJydW5CbG9ja3MgPSAwOwogICAgdGhpcy5fbWF4UXVldWVTYW1wbGVzID0gMDsKICAgIHRoaXMuX2xhc3RNZXRyaWNzU2VudEF0RnJhbWUgPSAwOwogICAgLy8gQ29udmVydCB0byBmcmFtZXMgYmV0d2VlbiByZXBvcnRzCiAgICB0aGlzLl9tZXRyaWNzSW50ZXJ2YWxGcmFtZXMgPSBNYXRoLm1heCgxMjgsIE1hdGgucm91bmQodGhpcy5fc2FtcGxlUmF0ZSAvIGludGVydmFsSHopKTsKCiAgICB0aGlzLnJlc2V0KCk7CiAgfQoKICAvKioKICAgKiBSZXNldHMgdGhlIHdvcmtsZXQgdG8gaXRzIGluaXRpYWwgSURMRSBzdGF0ZS4KICAgKi8KICByZXNldCgpIHsKICAgIHRoaXMuX2J1ZmZlclF1ZXVlID0gW107CiAgICB0aGlzLl9jdXJyZW50Q2h1bmsgPSBudWxsOwogICAgdGhpcy5fY3VycmVudENodW5rT2Zmc2V0ID0gMDsKICAgIHRoaXMuX3N0YXRlID0gUGxheWJhY2tXb3JrbGV0LkZTTS5JRExFOwoKICAgIHRoaXMuX25vTW9yZURhdGFSZWNlaXZlZCA9IGZhbHNlOwogICAgdGhpcy5fc2lsZW5jZUZyYW1lc0NvdW50ID0gMDsKICAgIHRoaXMuX2hhc1NlbnRFbmRlZCA9IGZhbHNlOwogICAgLy8gUmVzZXQgbWF4IHF1ZXVlIHRyYWNrZXIgb25seSB3aGVuIGdvaW5nIGlkbGUKICAgIHRoaXMuX21heFF1ZXVlU2FtcGxlcyA9IDA7CiAgfQoKICBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7CiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7CgogICAgLy8gSU5URVJSVVBUOiBUaGUgbWFpbiB0aHJlYWQgd2FudHMgdG8gc3RvcCBpbW1lZGlhdGVseS4KICAgIGlmICh0eXBlID09PSAic3RvcCIpIHsKICAgICAgdGhpcy5yZXNldCgpOwogICAgICAvLyBTZW5kIGZpbmFsIG1ldHJpY3Mgc2hvd2luZyBjbGVhcmVkIHN0YXRlCiAgICAgIGlmICh0aGlzLl9tZXRyaWNzRW5hYmxlZCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UoewogICAgICAgICAgICB0eXBlOiAibWV0cmljcyIsCiAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICBzdGF0ZTogUGxheWJhY2tXb3JrbGV0LkZTTS5JRExFLAogICAgICAgICAgICAgIHF1ZXVlZFNhbXBsZXM6IDAsCiAgICAgICAgICAgICAgcXVldWVkTXM6IDAsCiAgICAgICAgICAgICAgbWF4UXVldWVkTXM6IE1hdGgucm91bmQoKHRoaXMuX21heFF1ZXVlU2FtcGxlcyAvIHRoaXMuX3NhbXBsZVJhdGUpICogMTAwMCksCiAgICAgICAgICAgICAgdW5kZXJydW5CbG9ja3M6IHRoaXMuX3VuZGVycnVuQmxvY2tzLAogICAgICAgICAgICAgIGZyYW1lc1Byb2Nlc3NlZDogdGhpcy5fZnJhbWVzUHJvY2Vzc2VkCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gY2F0Y2ggKF8pIHsgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBNYWluIHRocmVhZCBoYXMgc2lnbmFsZWQgdGhhdCBubyBtb3JlIGF1ZGlvIGNodW5rcyB3aWxsIGJlIHNlbnQgZm9yIHRoaXMgdXR0ZXJhbmNlLgogICAgaWYgKHR5cGUgPT09ICJuby1tb3JlLWRhdGEiKSB7CiAgICAgIHRoaXMuX25vTW9yZURhdGFSZWNlaXZlZCA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBVcGRhdGUgbWV0cmljcyBjb25maWd1cmF0aW9uIGF0IHJ1bnRpbWUKICAgIGlmICh0eXBlID09PSAiY29uZmlnLW1ldHJpY3MiICYmIGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICJvYmplY3QiKSB7CiAgICAgIGlmICgiZW5hYmxlZCIgaW4gZGF0YSkgdGhpcy5fbWV0cmljc0VuYWJsZWQgPSAhIWRhdGEuZW5hYmxlZDsKICAgICAgaWYgKHR5cGVvZiBkYXRhLmludGVydmFsSHogPT09ICJudW1iZXIiICYmIGRhdGEuaW50ZXJ2YWxIeiA+IDApIHsKICAgICAgICBjb25zdCBpbnRlcnZhbEh6ID0gZGF0YS5pbnRlcnZhbEh6OwogICAgICAgIHRoaXMuX21ldHJpY3NJbnRlcnZhbEZyYW1lcyA9IE1hdGgubWF4KDEyOCwgTWF0aC5yb3VuZCh0aGlzLl9zYW1wbGVSYXRlIC8gaW50ZXJ2YWxIeikpOwogICAgICB9CiAgICAgIC8vIFJlc2V0IHBhY2luZyBzbyB0aGUgbmV4dCByZXBvcnQgYWxpZ25zIHdpdGggbmV3IGludGVydmFsCiAgICAgIHRoaXMuX2xhc3RNZXRyaWNzU2VudEF0RnJhbWUgPSB0aGlzLl9mcmFtZXNQcm9jZXNzZWQ7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBOZXcgYXVkaW8gZGF0YSBoYXMgYXJyaXZlZC4KICAgIGlmICh0eXBlID09PSAiYXVkaW9EYXRhIiAmJiBkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKICAgICAgdGhpcy5fbm9Nb3JlRGF0YVJlY2VpdmVkID0gZmFsc2U7CiAgICAgIC8vIElmIHdlIHdlcmUgaWRsZSwgdGhpcyBuZXcgZGF0YSBraWNrcyBvZmYgdGhlIHBsYXliYWNrLgogICAgICBpZiAodGhpcy5fc3RhdGUgPT09IFBsYXliYWNrV29ya2xldC5GU00uSURMRSkgewogICAgICAgIHRoaXMuX3N0YXRlID0gUGxheWJhY2tXb3JrbGV0LkZTTS5QTEFZSU5HOwogICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7IHR5cGU6ICJwbGF5YmFjay1zdGFydGVkIiB9KTsKICAgICAgfQoKICAgICAgLy8gV2Ugb25seSBxdWV1ZSBkYXRhIGlmIHdlIGFyZSBpbiB0aGUgUExBWUlORyBzdGF0ZS4gVGhpcyBwcmV2ZW50cwogICAgICAvLyBkYXRhIGZyb20gYSBwcmV2aW91cywgaW50ZXJydXB0ZWQgc3RyZWFtIGZyb20gbGluZ2VyaW5nLgogICAgICBpZiAodGhpcy5fc3RhdGUgPT09IFBsYXliYWNrV29ya2xldC5GU00uUExBWUlORykgewogICAgICAgIC8vIFN0b3JlIGFzIEludDE2QXJyYXkgdmlldyB0byBhdm9pZCBjb25zdHJ1Y3RpbmcgaXQgaW4gcHJvY2VzcygpCiAgICAgICAgdGhpcy5fYnVmZmVyUXVldWUucHVzaChuZXcgSW50MTZBcnJheShkYXRhKSk7CiAgICAgICAgdGhpcy5fc2lsZW5jZUZyYW1lc0NvdW50ID0gMDsgLy8gUmVzZXQgc2lsZW5jZSBjb3VudGVyIG9uIG5ldyBkYXRhCiAgICAgIH0KICAgIH0KICB9CgogIHByb2Nlc3MoaW5wdXRzLCBvdXRwdXRzLCBwYXJhbWV0ZXJzKSB7CiAgICBjb25zdCBvdXRwdXRDaGFubmVsID0gb3V0cHV0c1swXT8uWzBdOwogICAgaWYgKCFvdXRwdXRDaGFubmVsKSB7CiAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIGFsaXZlIGV2ZW4gaWYgb3V0cHV0IGlzIHRlbXBvcmFyaWx5IGRpc2Nvbm5lY3RlZAogICAgfQoKICAgIC8vIElmIHdlIGFyZSBub3QgcGxheWluZywganVzdCBvdXRwdXQgc2lsZW5jZSBhbmQgd2FpdC4KICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gUGxheWJhY2tXb3JrbGV0LkZTTS5QTEFZSU5HKSB7CiAgICAgIG91dHB1dENoYW5uZWwuZmlsbCgwKTsKICAgICAgcmV0dXJuIHRydWU7IC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSB0byBrZWVwIHRoZSBwcm9jZXNzb3IgYWxpdmUKICAgIH0KCiAgICAvLyBDb3JlIFBMQVlJTkcgTG9naWMKICAgIGNvbnN0IGJsb2NrU2l6ZSA9IG91dHB1dENoYW5uZWwubGVuZ3RoOwogICAgbGV0IHNhbXBsZXNDb3BpZWQgPSAwOwoKICAgIHdoaWxlIChzYW1wbGVzQ29waWVkIDwgYmxvY2tTaXplKSB7CiAgICAgIGlmICghdGhpcy5fY3VycmVudENodW5rIHx8IHRoaXMuX2N1cnJlbnRDaHVua09mZnNldCA+PSB0aGlzLl9jdXJyZW50Q2h1bmsubGVuZ3RoKSB7CiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlclF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuX2N1cnJlbnRDaHVuayA9IHRoaXMuX2J1ZmZlclF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICB0aGlzLl9jdXJyZW50Q2h1bmtPZmZzZXQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBCdWZmZXIgaXMgZW1wdHkuIENoZWNrIGZvciBlbmQgY29uZGl0aW9ucy4KICAgICAgICAgIGNvbnN0IGlzVGltZWRPdXQgPSB0aGlzLl9zaWxlbmNlRnJhbWVzQ291bnQgPiB0aGlzLl9zaWxlbmNlVGhyZXNob2xkQmxvY2tzOwoKICAgICAgICAgIGlmICh0aGlzLl9ub01vcmVEYXRhUmVjZWl2ZWQgfHwgaXNUaW1lZE91dCkgewogICAgICAgICAgICAvLyBFTkQgT0YgUExBWUJBQ0s6IEVpdGhlciBleHBsaWNpdGx5IHNpZ25hbGVkIG9yIHRpbWVkIG91dC4KICAgICAgICAgICAgaWYgKCF0aGlzLl9oYXNTZW50RW5kZWQpIHsKICAgICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAicGxheWJhY2stZW5kZWQiIH0pOwogICAgICAgICAgICAgIHRoaXMuX2hhc1NlbnRFbmRlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2VuZCBmaW5hbCBtZXRyaWNzIHNob3dpbmcgY2xlYXJlZCBzdGF0ZQogICAgICAgICAgICBpZiAodGhpcy5fbWV0cmljc0VuYWJsZWQpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgdHlwZTogIm1ldHJpY3MiLAogICAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IFBsYXliYWNrV29ya2xldC5GU00uSURMRSwKICAgICAgICAgICAgICAgICAgICBxdWV1ZWRTYW1wbGVzOiAwLAogICAgICAgICAgICAgICAgICAgIHF1ZXVlZE1zOiAwLAogICAgICAgICAgICAgICAgICAgIG1heFF1ZXVlZE1zOiBNYXRoLnJvdW5kKCh0aGlzLl9tYXhRdWV1ZVNhbXBsZXMgLyB0aGlzLl9zYW1wbGVSYXRlKSAqIDEwMDApLAogICAgICAgICAgICAgICAgICAgIHVuZGVycnVuQmxvY2tzOiB0aGlzLl91bmRlcnJ1bkJsb2NrcywKICAgICAgICAgICAgICAgICAgICBmcmFtZXNQcm9jZXNzZWQ6IHRoaXMuX2ZyYW1lc1Byb2Nlc3NlZAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGNhdGNoIChfKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlc2V0KCk7IC8vIFJlc2V0IHRvIElETEUgc3RhdGUgZm9yIHJldXNlCiAgICAgICAgICAgIGJyZWFrOyAvLyBFeGl0IHdoaWxlIGxvb3AKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEJVRkZFUiBVTkRFUlJVTiAoTEFHKTogUGxheSBzaWxlbmNlIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEuCiAgICAgICAgICAgIHRoaXMuX3NpbGVuY2VGcmFtZXNDb3VudCsrOwogICAgICAgICAgICBpZiAodGhpcy5fbWV0cmljc0VuYWJsZWQpIHRoaXMuX3VuZGVycnVuQmxvY2tzKys7CiAgICAgICAgICAgIGJyZWFrOyAvLyBFeGl0IHdoaWxlIGxvb3AKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIElmIHdlIGhhdmUgYSBjaHVuayAoY291bGQgYmUgYSBuZXcgb25lIGZyb20gdGhlIGxvZ2ljIGFib3ZlKSwgcHJvY2VzcyBpdC4KICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDaHVuaykgewogICAgICAgIGNvbnN0IHNhbXBsZXNUb0NvcHkgPSBNYXRoLm1pbigKICAgICAgICAgIGJsb2NrU2l6ZSAtIHNhbXBsZXNDb3BpZWQsCiAgICAgICAgICB0aGlzLl9jdXJyZW50Q2h1bmsubGVuZ3RoIC0gdGhpcy5fY3VycmVudENodW5rT2Zmc2V0CiAgICAgICAgKTsKICAgICAgICAvLyBEaXJlY3RseSB3cml0ZSB0byBvdXRwdXRDaGFubmVsIHRvIGF2b2lkIGV4dHJhIGNvcHkKICAgICAgICBjb25zdCBzcmMgPSB0aGlzLl9jdXJyZW50Q2h1bms7CiAgICAgICAgY29uc3QgYmFzZVNyYyA9IHRoaXMuX2N1cnJlbnRDaHVua09mZnNldDsKICAgICAgICBjb25zdCBiYXNlRHN0ID0gc2FtcGxlc0NvcGllZDsKICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuX3NjYWxlOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlc1RvQ29weTsgaSsrKSB7CiAgICAgICAgICBvdXRwdXRDaGFubmVsW2Jhc2VEc3QgKyBpXSA9IHNyY1tiYXNlU3JjICsgaV0gKiBzY2FsZTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2N1cnJlbnRDaHVua09mZnNldCArPSBzYW1wbGVzVG9Db3B5OwogICAgICAgIHNhbXBsZXNDb3BpZWQgKz0gc2FtcGxlc1RvQ29weTsKICAgICAgfQogICAgfQoKICAgIC8vIFplcm8tZmlsbCB0aGUgcmVtYWluZGVyLCBpZiBhbnksIG9uY2UgcGVyIGJsb2NrCiAgICBpZiAoc2FtcGxlc0NvcGllZCA8IGJsb2NrU2l6ZSkgewogICAgICBvdXRwdXRDaGFubmVsLmZpbGwoMCwgc2FtcGxlc0NvcGllZCk7CiAgICB9CgogICAgLy8gVXBkYXRlIG1ldHJpY3MgKG9wdGlvbmFsKQogICAgaWYgKHRoaXMuX21ldHJpY3NFbmFibGVkKSB7CiAgICAgIHRoaXMuX2ZyYW1lc1Byb2Nlc3NlZCArPSBibG9ja1NpemU7CgogICAgICAvLyBUcmFjayBxdWV1ZSBkZXB0aCBpbiBzYW1wbGVzIChhcHByb3hpbWF0ZSkKICAgICAgbGV0IHF1ZXVlZFNhbXBsZXMgPSAwOwogICAgICBpZiAodGhpcy5fY3VycmVudENodW5rKSBxdWV1ZWRTYW1wbGVzICs9IE1hdGgubWF4KDAsIHRoaXMuX2N1cnJlbnRDaHVuay5sZW5ndGggLSB0aGlzLl9jdXJyZW50Q2h1bmtPZmZzZXQpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2J1ZmZlclF1ZXVlLmxlbmd0aDsgaSsrKSBxdWV1ZWRTYW1wbGVzICs9IHRoaXMuX2J1ZmZlclF1ZXVlW2ldLmxlbmd0aDsKICAgICAgaWYgKHF1ZXVlZFNhbXBsZXMgPiB0aGlzLl9tYXhRdWV1ZVNhbXBsZXMpIHRoaXMuX21heFF1ZXVlU2FtcGxlcyA9IHF1ZXVlZFNhbXBsZXM7CgogICAgICAvLyBQZXJpb2RpY2FsbHkgc2VuZCBtZXRyaWNzIHRvIG1haW4gdGhyZWFkCiAgICAgIGlmICh0aGlzLl9mcmFtZXNQcm9jZXNzZWQgLSB0aGlzLl9sYXN0TWV0cmljc1NlbnRBdEZyYW1lID49IHRoaXMuX21ldHJpY3NJbnRlcnZhbEZyYW1lcykgewogICAgICAgIHRoaXMuX2xhc3RNZXRyaWNzU2VudEF0RnJhbWUgPSB0aGlzLl9mcmFtZXNQcm9jZXNzZWQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHR5cGU6ICJtZXRyaWNzIiwKICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSwKICAgICAgICAgICAgICBxdWV1ZWRTYW1wbGVzLAogICAgICAgICAgICAgIHF1ZXVlZE1zOiBNYXRoLnJvdW5kKChxdWV1ZWRTYW1wbGVzIC8gdGhpcy5fc2FtcGxlUmF0ZSkgKiAxMDAwKSwKICAgICAgICAgICAgICBtYXhRdWV1ZWRNczogTWF0aC5yb3VuZCgodGhpcy5fbWF4UXVldWVTYW1wbGVzIC8gdGhpcy5fc2FtcGxlUmF0ZSkgKiAxMDAwKSwKICAgICAgICAgICAgICB1bmRlcnJ1bkJsb2NrczogdGhpcy5fdW5kZXJydW5CbG9ja3MsCiAgICAgICAgICAgICAgZnJhbWVzUHJvY2Vzc2VkOiB0aGlzLl9mcmFtZXNQcm9jZXNzZWQKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoXykgeyB9CiAgICAgICAgLy8gRG9uJ3QgcmVzZXQgbWF4IHRyYWNrZXIgLSBrZWVwIHNlc3Npb24gcGVhayB1bnRpbCBpZGxlCiAgICAgIH0KICAgIH0KCiAgICAvLyBBTFdBWVMgcmV0dXJuIHRydWUgdG8ga2VlcCB0aGUgcHJvY2Vzc29yIGFsaXZlIGZvciByZXVzZS4KICAgIHJldHVybiB0cnVlOwogIH0KfQoKcmVnaXN0ZXJQcm9jZXNzb3IoInBsYXliYWNrLXdvcmtsZXQiLCBQbGF5YmFja1dvcmtsZXQpOwo=", import.meta.url), Le = {
|
|
2627
2627
|
en: Xe,
|
|
2628
2628
|
de: je,
|
|
2629
2629
|
fr: qe,
|
|
2630
2630
|
fi: Ke,
|
|
2631
2631
|
lt: $e
|
|
2632
|
-
},
|
|
2632
|
+
}, U = new f.Quaternion(), E = new f.Euler(), ee = new f.Vector3(), ie = new f.Vector3(), Ae = new f.Box3();
|
|
2633
2633
|
new f.Matrix4();
|
|
2634
2634
|
new f.Matrix4();
|
|
2635
2635
|
new f.Vector3();
|
|
@@ -3569,15 +3569,15 @@ class we {
|
|
|
3569
3569
|
"RightArm.scale": { x: 0, y: 0, z: 0 }
|
|
3570
3570
|
}
|
|
3571
3571
|
}, ["Left", "Right"].forEach((r) => {
|
|
3572
|
-
["Leg", "UpLeg", "Arm", "ForeArm", "Hand"].forEach((
|
|
3573
|
-
this.poseDelta.props[r +
|
|
3574
|
-
}), ["HandThumb", "HandIndex", "HandMiddle", "HandRing", "HandPinky"].forEach((
|
|
3575
|
-
this.poseDelta.props[r +
|
|
3572
|
+
["Leg", "UpLeg", "Arm", "ForeArm", "Hand"].forEach((u) => {
|
|
3573
|
+
this.poseDelta.props[r + u + ".quaternion"] = { x: 0, y: 0, z: 0 };
|
|
3574
|
+
}), ["HandThumb", "HandIndex", "HandMiddle", "HandRing", "HandPinky"].forEach((u) => {
|
|
3575
|
+
this.poseDelta.props[r + u + "1.quaternion"] = { x: 0, y: 0, z: 0 }, this.poseDelta.props[r + u + "2.quaternion"] = { x: 0, y: 0, z: 0 }, this.poseDelta.props[r + u + "3.quaternion"] = { x: 0, y: 0, z: 0 };
|
|
3576
3576
|
});
|
|
3577
3577
|
});
|
|
3578
3578
|
const i = /* @__PURE__ */ new Set();
|
|
3579
3579
|
Object.values(this.poseTemplates).forEach((r) => {
|
|
3580
|
-
Object.keys(this.propsToThreeObjects(r.props)).forEach((
|
|
3580
|
+
Object.keys(this.propsToThreeObjects(r.props)).forEach((u) => i.add(u));
|
|
3581
3581
|
}), Object.keys(this.poseDelta.props).forEach((r) => {
|
|
3582
3582
|
i.add(r);
|
|
3583
3583
|
}), this.posePropNames = [...i], this.poseName = "side", this.poseWeightOnLeft = !0, this.gesture = null, this.poseCurrentTemplate = this.poseTemplates[this.poseName], this.poseStraight = this.propsToThreeObjects(this.poseTemplates.straight.props), this.poseBase = this.poseFactory(this.poseCurrentTemplate), this.poseTarget = this.poseFactory(this.poseCurrentTemplate), this.poseAvatar = null, this.avatarHeight = 1.7, this.animTemplateEyes = {
|
|
@@ -4077,7 +4077,7 @@ class we {
|
|
|
4077
4077
|
RightHand: "RightForeArm",
|
|
4078
4078
|
RightHandMiddle1: "RightHand"
|
|
4079
4079
|
}, o = [];
|
|
4080
|
-
Object.entries(s).forEach((r,
|
|
4080
|
+
Object.entries(s).forEach((r, u) => {
|
|
4081
4081
|
const a = new f.Bone();
|
|
4082
4082
|
a.name = r[0], r[1] ? this.ikMesh.getObjectByName(r[1]).add(a) : this.ikMesh.add(a), o.push(a);
|
|
4083
4083
|
}), this.ikMesh.bind(new f.Skeleton(o)), this.dynamicbones = new Ve(), this.isStreaming = !1, this.streamWorkletNode = null, this.streamAudioStartTime = null, this.streamWaitForAudioChunks = !0, this.streamLipsyncLang = null, this.streamLipsyncType = "visemes", this.streamLipsyncQueue = [];
|
|
@@ -4126,9 +4126,9 @@ class we {
|
|
|
4126
4126
|
let e = 3 * t.length / 4;
|
|
4127
4127
|
t[t.length - 1] === "=" && (e--, t[t.length - 2] === "=" && e--);
|
|
4128
4128
|
const i = new ArrayBuffer(e), n = new Uint8Array(i);
|
|
4129
|
-
let s, o = 0, r,
|
|
4129
|
+
let s, o = 0, r, u, a, h;
|
|
4130
4130
|
for (s = 0; s < t.length; s += 4)
|
|
4131
|
-
r = this.b64Lookup[t.charCodeAt(s)],
|
|
4131
|
+
r = this.b64Lookup[t.charCodeAt(s)], u = this.b64Lookup[t.charCodeAt(s + 1)], a = this.b64Lookup[t.charCodeAt(s + 2)], h = this.b64Lookup[t.charCodeAt(s + 3)], n[o++] = r << 2 | u >> 4, n[o++] = (u & 15) << 4 | a >> 2, n[o++] = (a & 3) << 6 | h & 63;
|
|
4132
4132
|
return i;
|
|
4133
4133
|
}
|
|
4134
4134
|
/**
|
|
@@ -4169,8 +4169,8 @@ class we {
|
|
|
4169
4169
|
const e = {};
|
|
4170
4170
|
for (let [i, n] of Object.entries(t)) {
|
|
4171
4171
|
const s = i.split(".");
|
|
4172
|
-
let o = Array.isArray(n.x) ? this.gaussianRandom(...n.x) : n.x, r = Array.isArray(n.y) ? this.gaussianRandom(...n.y) : n.y,
|
|
4173
|
-
s[1] === "position" || s[1] === "scale" ? e[i] = new f.Vector3(o, r,
|
|
4172
|
+
let o = Array.isArray(n.x) ? this.gaussianRandom(...n.x) : n.x, r = Array.isArray(n.y) ? this.gaussianRandom(...n.y) : n.y, u = Array.isArray(n.z) ? this.gaussianRandom(...n.z) : n.z;
|
|
4173
|
+
s[1] === "position" || s[1] === "scale" ? e[i] = new f.Vector3(o, r, u) : s[1] === "rotation" ? (i = s[0] + ".quaternion", e[i] = new f.Quaternion().setFromEuler(new f.Euler(o, r, u, "XYZ")).normalize()) : s[1] === "quaternion" && (e[i] = new f.Quaternion(o, r, u, n.w).normalize());
|
|
4174
4174
|
}
|
|
4175
4175
|
return e;
|
|
4176
4176
|
}
|
|
@@ -4198,23 +4198,23 @@ class we {
|
|
|
4198
4198
|
t.forEach((s) => {
|
|
4199
4199
|
if (!n && s.morphTargetDictionary.hasOwnProperty(e)) return;
|
|
4200
4200
|
const o = s.geometry;
|
|
4201
|
-
let r = null,
|
|
4202
|
-
for (const [a,
|
|
4201
|
+
let r = null, u = null;
|
|
4202
|
+
for (const [a, h] of Object.entries(i))
|
|
4203
4203
|
if (s.morphTargetDictionary.hasOwnProperty(a)) {
|
|
4204
|
-
const l = s.morphTargetDictionary[a],
|
|
4205
|
-
r || (r = new f.Float32BufferAttribute(
|
|
4206
|
-
for (let g = 0; g <
|
|
4207
|
-
const y = r.getX(g) +
|
|
4208
|
-
r.setXYZ(g, y, x,
|
|
4204
|
+
const l = s.morphTargetDictionary[a], d = o.morphAttributes.position[l], c = o.morphAttributes.normal?.[l];
|
|
4205
|
+
r || (r = new f.Float32BufferAttribute(d.count * 3, 3), c && (u = new f.Float32BufferAttribute(d.count * 3, 3)));
|
|
4206
|
+
for (let g = 0; g < d.count; g++) {
|
|
4207
|
+
const y = r.getX(g) + d.getX(g) * h, x = r.getY(g) + d.getY(g) * h, L = r.getZ(g) + d.getZ(g) * h;
|
|
4208
|
+
r.setXYZ(g, y, x, L);
|
|
4209
4209
|
}
|
|
4210
|
-
if (
|
|
4211
|
-
for (let g = 0; g <
|
|
4212
|
-
const y =
|
|
4213
|
-
|
|
4210
|
+
if (c)
|
|
4211
|
+
for (let g = 0; g < d.count; g++) {
|
|
4212
|
+
const y = u.getX(g) + c.getX(g) * h, x = u.getY(g) + c.getY(g) * h, L = u.getZ(g) + c.getZ(g) * h;
|
|
4213
|
+
u.setXYZ(g, y, x, L);
|
|
4214
4214
|
}
|
|
4215
4215
|
}
|
|
4216
4216
|
if (r) {
|
|
4217
|
-
o.morphAttributes.position.push(r),
|
|
4217
|
+
o.morphAttributes.position.push(r), u && o.morphAttributes.normal.push(u);
|
|
4218
4218
|
const a = o.morphAttributes.position.length - 1;
|
|
4219
4219
|
s.morphTargetInfluences[a] = 0, s.morphTargetDictionary[e] = a;
|
|
4220
4220
|
}
|
|
@@ -4244,7 +4244,7 @@ class we {
|
|
|
4244
4244
|
throw new Error("Blend shapes not found");
|
|
4245
4245
|
const o = new Set(this.mtCustoms);
|
|
4246
4246
|
this.morphs.forEach((a) => {
|
|
4247
|
-
Object.keys(a.morphTargetDictionary).forEach((
|
|
4247
|
+
Object.keys(a.morphTargetDictionary).forEach((h) => o.add(h));
|
|
4248
4248
|
}), this.mtExtras.forEach((a) => {
|
|
4249
4249
|
o.has(a.key) || (this.addMixedMorphTarget(this.morphs, a.key, a.mix), o.add(a.key));
|
|
4250
4250
|
});
|
|
@@ -4271,16 +4271,16 @@ class we {
|
|
|
4271
4271
|
ms: [],
|
|
4272
4272
|
is: []
|
|
4273
4273
|
}, r[a].value = r[a].baseline, r[a].applied = r[a].baseline;
|
|
4274
|
-
const
|
|
4275
|
-
|
|
4276
|
-
r[a][l] =
|
|
4274
|
+
const h = this.mtAvatar[a];
|
|
4275
|
+
h && ["fixed", "system", "systemd", "realtime", "base", "v", "value", "applied"].forEach((l) => {
|
|
4276
|
+
r[a][l] = h[l];
|
|
4277
4277
|
}), this.morphs.forEach((l) => {
|
|
4278
|
-
const
|
|
4279
|
-
|
|
4278
|
+
const d = l.morphTargetDictionary[a];
|
|
4279
|
+
d !== void 0 && (r[a].ms.push(l.morphTargetInfluences), r[a].is.push(d), l.morphTargetInfluences[d] = r[a].applied);
|
|
4280
4280
|
});
|
|
4281
4281
|
}), this.mtAvatar = r, this.poseAvatar = { props: {} }, this.posePropNames.forEach((a) => {
|
|
4282
|
-
const
|
|
4283
|
-
this.poseAvatar.props[a] = l[
|
|
4282
|
+
const h = a.split("."), l = this.armature.getObjectByName(h[0]);
|
|
4283
|
+
this.poseAvatar.props[a] = l[h[1]], this.poseBase.props.hasOwnProperty(a) ? this.poseAvatar.props[a].copy(this.poseBase.props[a]) : this.poseBase.props[a] = this.poseAvatar.props[a].clone(), this.poseDelta.props.hasOwnProperty(a) && !this.poseTarget.props.hasOwnProperty(a) && (this.poseTarget.props[a] = this.poseAvatar.props[a].clone()), this.poseTarget.props[a].t = this.animClock, this.poseTarget.props[a].d = 2e3;
|
|
4284
4284
|
}), this.ikMesh.traverse((a) => {
|
|
4285
4285
|
a.isBone && a.position.copy(this.armature.getObjectByName(a.name).position);
|
|
4286
4286
|
}), this.isAvatarOnly ? this.scene && this.scene.add(this.armature) : (this.scene.add(n.scene), this.scene.add(this.lightAmbient), this.scene.add(this.lightDirect), this.scene.add(this.lightSpot), this.lightSpot.target = this.armature.getObjectByName("Head")), t.hasOwnProperty("modelDynamicBones"))
|
|
@@ -4290,8 +4290,8 @@ class we {
|
|
|
4290
4290
|
console.error("Dynamic bones setup failed: " + a);
|
|
4291
4291
|
}
|
|
4292
4292
|
this.objectLeftToeBase = this.armature.getObjectByName("LeftToeBase"), this.objectRightToeBase = this.armature.getObjectByName("RightToeBase"), this.objectLeftEye = this.armature.getObjectByName("LeftEye"), this.objectRightEye = this.armature.getObjectByName("RightEye"), this.objectLeftArm = this.armature.getObjectByName("LeftArm"), this.objectRightArm = this.armature.getObjectByName("RightArm"), this.objectHips = this.armature.getObjectByName("Hips"), this.objectHead = this.armature.getObjectByName("Head"), this.objectNeck = this.armature.getObjectByName("Neck");
|
|
4293
|
-
const
|
|
4294
|
-
this.objectLeftEye.getWorldPosition(
|
|
4293
|
+
const u = new f.Vector3();
|
|
4294
|
+
this.objectLeftEye.getWorldPosition(u), this.avatarHeight = u.y + 0.2, this.viewName || this.setView(this.opt.cameraView), this.setMood(this.avatar.avatarMood || this.moodName || this.opt.avatarMood), this.initializeFBXAnimationLoader(), this.bodyMovement && this.bodyMovement !== "idle" && this.applyBodyMovementAnimation(), this.start();
|
|
4295
4295
|
}
|
|
4296
4296
|
/**
|
|
4297
4297
|
* Get view names.
|
|
@@ -4319,22 +4319,22 @@ class we {
|
|
|
4319
4319
|
return;
|
|
4320
4320
|
}
|
|
4321
4321
|
if (this.viewName = t || this.viewName, e = e || {}, this.isAvatarOnly) return;
|
|
4322
|
-
const i = e.hasOwnProperty("cameraX") ? e.cameraX : this.opt.cameraX, n = e.hasOwnProperty("cameraY") ? e.cameraY : this.opt.cameraY, s = e.hasOwnProperty("cameraDistance") ? e.cameraDistance : this.opt.cameraDistance, o = e.hasOwnProperty("cameraRotateX") ? e.cameraRotateX : this.opt.cameraRotateX, r = e.hasOwnProperty("cameraRotateY") ? e.cameraRotateY : this.opt.cameraRotateY,
|
|
4323
|
-
let a = -i * Math.tan(
|
|
4322
|
+
const i = e.hasOwnProperty("cameraX") ? e.cameraX : this.opt.cameraX, n = e.hasOwnProperty("cameraY") ? e.cameraY : this.opt.cameraY, s = e.hasOwnProperty("cameraDistance") ? e.cameraDistance : this.opt.cameraDistance, o = e.hasOwnProperty("cameraRotateX") ? e.cameraRotateX : this.opt.cameraRotateX, r = e.hasOwnProperty("cameraRotateY") ? e.cameraRotateY : this.opt.cameraRotateY, u = this.camera.fov * (Math.PI / 180);
|
|
4323
|
+
let a = -i * Math.tan(u / 2), h = (1 - n) * Math.tan(u / 2), l = s;
|
|
4324
4324
|
switch (this.viewName) {
|
|
4325
4325
|
case "head":
|
|
4326
|
-
l += 2,
|
|
4326
|
+
l += 2, h = h * l + 4 * this.avatarHeight / 5;
|
|
4327
4327
|
break;
|
|
4328
4328
|
case "upper":
|
|
4329
|
-
l += 4.5,
|
|
4329
|
+
l += 4.5, h = h * l + 2 * this.avatarHeight / 3;
|
|
4330
4330
|
break;
|
|
4331
4331
|
case "mid":
|
|
4332
|
-
l += 8,
|
|
4332
|
+
l += 8, h = h * l + this.avatarHeight / 3;
|
|
4333
4333
|
break;
|
|
4334
4334
|
default:
|
|
4335
|
-
l += 12,
|
|
4335
|
+
l += 12, h = h * l;
|
|
4336
4336
|
}
|
|
4337
|
-
a = a * l, this.controlsEnd = new f.Vector3(a,
|
|
4337
|
+
a = a * l, this.controlsEnd = new f.Vector3(a, h, 0), this.cameraEnd = new f.Vector3(a, h, l).applyEuler(new f.Euler(o, r, 0)), this.cameraClock === null && (this.controls.target.copy(this.controlsEnd), this.camera.position.copy(this.cameraEnd)), this.controlsStart = this.controls.target.clone(), this.cameraStart = this.camera.position.clone(), this.cameraClock = 0;
|
|
4338
4338
|
}
|
|
4339
4339
|
/**
|
|
4340
4340
|
* Change light colors and intensities.
|
|
@@ -4374,9 +4374,9 @@ class we {
|
|
|
4374
4374
|
updatePoseDelta() {
|
|
4375
4375
|
for (const [t, e] of Object.entries(this.poseDelta.props)) {
|
|
4376
4376
|
if (e.x === 0 && e.y === 0 && e.z === 0) continue;
|
|
4377
|
-
|
|
4377
|
+
E.set(e.x, e.y, e.z);
|
|
4378
4378
|
const i = this.poseAvatar.props[t];
|
|
4379
|
-
i.isQuaternion ? (
|
|
4379
|
+
i.isQuaternion ? (U.setFromEuler(E), i.multiply(U)) : i.isVector3 && i.add(E);
|
|
4380
4380
|
}
|
|
4381
4381
|
}
|
|
4382
4382
|
/**
|
|
@@ -4431,17 +4431,17 @@ class we {
|
|
|
4431
4431
|
"HandMiddle",
|
|
4432
4432
|
"HandRing",
|
|
4433
4433
|
"HandPinky"
|
|
4434
|
-
].forEach((
|
|
4435
|
-
l === 0 ? (this.poseDelta.props[o +
|
|
4434
|
+
].forEach((h, l) => {
|
|
4435
|
+
l === 0 ? (this.poseDelta.props[o + h + "1.quaternion"].x = 0, this.poseDelta.props[o + h + "2.quaternion"].z = (o === "Left" ? -1 : 1) * i.applied, this.poseDelta.props[o + h + "3.quaternion"].z = (o === "Left" ? -1 : 1) * i.applied) : (this.poseDelta.props[o + h + "1.quaternion"].x = i.applied, this.poseDelta.props[o + h + "2.quaternion"].x = 1.5 * i.applied, this.poseDelta.props[o + h + "3.quaternion"].x = 1.5 * i.applied);
|
|
4436
4436
|
});
|
|
4437
4437
|
break;
|
|
4438
4438
|
case "chestInhale":
|
|
4439
|
-
const r = i.applied / 20,
|
|
4440
|
-
this.poseDelta.props["Spine1.scale"] =
|
|
4439
|
+
const r = i.applied / 20, u = { x: r, y: r / 2, z: 3 * r }, a = { x: 1 / (1 + r) - 1, y: 1 / (1 + r / 2) - 1, z: 1 / (1 + 3 * r) - 1 };
|
|
4440
|
+
this.poseDelta.props["Spine1.scale"] = u, this.poseDelta.props["Neck.scale"] = a, this.poseDelta.props["LeftArm.scale"] = a, this.poseDelta.props["RightArm.scale"] = a;
|
|
4441
4441
|
break;
|
|
4442
4442
|
default:
|
|
4443
|
-
for (let
|
|
4444
|
-
i.ms[
|
|
4443
|
+
for (let h = 0, l = i.ms.length; h < l; h++)
|
|
4444
|
+
i.ms[h][i.is[h]] = i.applied;
|
|
4445
4445
|
}
|
|
4446
4446
|
}
|
|
4447
4447
|
}
|
|
@@ -4456,8 +4456,8 @@ class we {
|
|
|
4456
4456
|
return Object.entries(t).forEach((n, s) => {
|
|
4457
4457
|
const o = n[0].split(".");
|
|
4458
4458
|
if (o[1] === "position" || o[1] === "rotation" || o[1] === "quaternion") {
|
|
4459
|
-
const r = o[1] === "quaternion" ? o[0] + ".rotation" : n[0],
|
|
4460
|
-
i += (s ? ", " : "") + "'" + r + "':{", i += "x:" + Math.round(
|
|
4459
|
+
const r = o[1] === "quaternion" ? o[0] + ".rotation" : n[0], u = n[1].isQuaternion ? new f.Euler().setFromQuaternion(n[1]) : n[1];
|
|
4460
|
+
i += (s ? ", " : "") + "'" + r + "':{", i += "x:" + Math.round(u.x * e) / e, i += ", y:" + Math.round(u.y * e) / e, i += ", z:" + Math.round(u.z * e) / e, i += "}";
|
|
4461
4461
|
}
|
|
4462
4462
|
}), i += "}", i;
|
|
4463
4463
|
}
|
|
@@ -4527,8 +4527,8 @@ class we {
|
|
|
4527
4527
|
if (i ? (this.poseCurrentTemplate = this.poseTemplates.oneknee, setTimeout(() => {
|
|
4528
4528
|
this.setPoseFromTemplate(t, e);
|
|
4529
4529
|
}, o)) : this.poseCurrentTemplate = t || this.poseCurrentTemplate, this.poseTarget = this.poseFactory(this.poseCurrentTemplate, o), this.poseWeightOnLeft = !0, (!n && !s || n && s) && (this.poseTarget.props = this.mirrorPose(this.poseTarget.props), this.poseWeightOnLeft = !this.poseWeightOnLeft), this.gesture)
|
|
4530
|
-
for (let [r,
|
|
4531
|
-
this.poseTarget.props.hasOwnProperty(r) && (this.poseTarget.props[r].copy(
|
|
4530
|
+
for (let [r, u] of Object.entries(this.gesture))
|
|
4531
|
+
this.poseTarget.props.hasOwnProperty(r) && (this.poseTarget.props[r].copy(u), this.poseTarget.props[r].t = u.t, this.poseTarget.props[r].d = u.d);
|
|
4532
4532
|
Object.keys(this.poseDelta.props).forEach((r) => {
|
|
4533
4533
|
this.poseTarget.props.hasOwnProperty(r) || (this.poseTarget.props[r] = this.poseBase.props[r].clone(), this.poseTarget.props[r].t = this.animClock, this.poseTarget.props[r].d = o);
|
|
4534
4534
|
});
|
|
@@ -4973,12 +4973,12 @@ class we {
|
|
|
4973
4973
|
else if (r.hasOwnProperty("alt")) {
|
|
4974
4974
|
let a = r.alt[0];
|
|
4975
4975
|
if (r.alt.length > 1) {
|
|
4976
|
-
const
|
|
4976
|
+
const h = Math.random();
|
|
4977
4977
|
let l = 0;
|
|
4978
|
-
for (let
|
|
4979
|
-
let
|
|
4980
|
-
if (l +=
|
|
4981
|
-
a = r.alt[
|
|
4978
|
+
for (let d = 0; d < r.alt.length; d++) {
|
|
4979
|
+
let c = this.valueFn(r.alt[d].p);
|
|
4980
|
+
if (l += c === void 0 ? (1 - l) / (r.alt.length - 1 - d) : c, h < l) {
|
|
4981
|
+
a = r.alt[d];
|
|
4982
4982
|
break;
|
|
4983
4983
|
}
|
|
4984
4984
|
}
|
|
@@ -4986,20 +4986,20 @@ class we {
|
|
|
4986
4986
|
r = a;
|
|
4987
4987
|
} else
|
|
4988
4988
|
break;
|
|
4989
|
-
let
|
|
4990
|
-
if (Array.isArray(
|
|
4991
|
-
r.dt.forEach((a,
|
|
4989
|
+
let u = this.valueFn(r.delay) || 0;
|
|
4990
|
+
if (Array.isArray(u) && (u = this.gaussianRandom(...u)), r.hasOwnProperty("dt"))
|
|
4991
|
+
r.dt.forEach((a, h) => {
|
|
4992
4992
|
let l = this.valueFn(a);
|
|
4993
|
-
Array.isArray(l) && (l = this.gaussianRandom(...l)), o.ts[
|
|
4993
|
+
Array.isArray(l) && (l = this.gaussianRandom(...l)), o.ts[h + 1] = o.ts[h] + l;
|
|
4994
4994
|
});
|
|
4995
4995
|
else {
|
|
4996
|
-
let a = Object.values(r.vs).reduce((
|
|
4996
|
+
let a = Object.values(r.vs).reduce((h, l) => l.length > h ? l.length : h, 0);
|
|
4997
4997
|
o.ts = Array(a + 1).fill(0);
|
|
4998
4998
|
}
|
|
4999
|
-
s ? o.ts = o.ts.map((a) =>
|
|
5000
|
-
for (let [a,
|
|
5001
|
-
const l = this.getBaselineValue(a),
|
|
5002
|
-
a === "eyesRotateY" ? (o.vs.eyeLookOutLeft = [null, ...
|
|
4999
|
+
s ? o.ts = o.ts.map((a) => u + a * i) : o.ts = o.ts.map((a) => this.animClock + u + a * i);
|
|
5000
|
+
for (let [a, h] of Object.entries(r.vs)) {
|
|
5001
|
+
const l = this.getBaselineValue(a), d = h.map((c) => (c = this.valueFn(c), c === null ? null : typeof c == "function" ? c : typeof c == "string" || c instanceof String ? c.slice() : Array.isArray(c) ? a === "gesture" ? c.slice() : (l === void 0 ? 0 : l) + n * this.gaussianRandom(...c) : typeof c == "boolean" ? c : c instanceof Object && c.constructor === Object ? Object.assign({}, c) : (l === void 0 ? 0 : l) + n * c));
|
|
5002
|
+
a === "eyesRotateY" ? (o.vs.eyeLookOutLeft = [null, ...d.map((c) => c > 0 ? c : 0)], o.vs.eyeLookInLeft = [null, ...d.map((c) => c > 0 ? 0 : -c)], o.vs.eyeLookOutRight = [null, ...d.map((c) => c > 0 ? 0 : -c)], o.vs.eyeLookInRight = [null, ...d.map((c) => c > 0 ? c : 0)]) : a === "eyesRotateX" ? (o.vs.eyesLookDown = [null, ...d.map((c) => c > 0 ? c : 0)], o.vs.eyesLookUp = [null, ...d.map((c) => c > 0 ? 0 : -c)]) : o.vs[a] = [null, ...d];
|
|
5003
5003
|
}
|
|
5004
5004
|
for (let a of Object.keys(o.vs))
|
|
5005
5005
|
for (; o.vs[a].length <= o.ts.length; ) o.vs[a].push(o.vs[a][o.vs[a].length - 1]);
|
|
@@ -5080,26 +5080,26 @@ class we {
|
|
|
5080
5080
|
if (this.isSpeaking)
|
|
5081
5081
|
for (r = 0, this.audioAnalyzerNode.getByteFrequencyData(this.volumeFrequencyData), i = 2, s = 10; i < s; i++)
|
|
5082
5082
|
this.volumeFrequencyData[i] > r && (r = this.volumeFrequencyData[i]);
|
|
5083
|
-
let
|
|
5084
|
-
const
|
|
5083
|
+
let u = null, a = null;
|
|
5084
|
+
const h = [];
|
|
5085
5085
|
for (i = 0, s = this.animQueue.length; i < s; i++) {
|
|
5086
5086
|
const l = this.animQueue[i];
|
|
5087
5087
|
if (!(!l || !l.ts || !l.ts.length || this.animClock < l.ts[0])) {
|
|
5088
5088
|
for (n = l.ndx || 0, o = l.ts.length; n < o && !(this.animClock < l.ts[n]); n++)
|
|
5089
|
-
for (let [
|
|
5090
|
-
if (this.mtAvatar.hasOwnProperty(
|
|
5091
|
-
if (
|
|
5092
|
-
const g = this.mtAvatar[
|
|
5093
|
-
if (
|
|
5094
|
-
g.newvalue =
|
|
5089
|
+
for (let [d, c] of Object.entries(l.vs))
|
|
5090
|
+
if (this.mtAvatar.hasOwnProperty(d)) {
|
|
5091
|
+
if (c[n + 1] === null) continue;
|
|
5092
|
+
const g = this.mtAvatar[d];
|
|
5093
|
+
if (c[n] === null && (c[n] = g.value), n === o - 1)
|
|
5094
|
+
g.newvalue = c[n];
|
|
5095
5095
|
else {
|
|
5096
|
-
g.newvalue =
|
|
5096
|
+
g.newvalue = c[n + 1];
|
|
5097
5097
|
const y = l.ts[n + 1] - l.ts[n];
|
|
5098
5098
|
let x = 1;
|
|
5099
|
-
y > 1e-4 && (x = (this.animClock - l.ts[n]) / y), x < 1 && (g.easing && (x = g.easing(x)), g.newvalue = (1 - x) *
|
|
5099
|
+
y > 1e-4 && (x = (this.animClock - l.ts[n]) / y), x < 1 && (g.easing && (x = g.easing(x)), g.newvalue = (1 - x) * c[n] + x * g.newvalue), g.ref && g.ref !== l.vs && g.ref.hasOwnProperty(d) && delete g.ref[d], g.ref = l.vs;
|
|
5100
5100
|
}
|
|
5101
5101
|
if (r)
|
|
5102
|
-
switch (
|
|
5102
|
+
switch (d) {
|
|
5103
5103
|
case "viseme_aa":
|
|
5104
5104
|
case "viseme_E":
|
|
5105
5105
|
case "viseme_I":
|
|
@@ -5108,12 +5108,12 @@ class we {
|
|
|
5108
5108
|
g.newvalue *= 1 + r / 255 - 0.5;
|
|
5109
5109
|
}
|
|
5110
5110
|
g.needsUpdate = !0;
|
|
5111
|
-
} else
|
|
5111
|
+
} else d === "eyeContact" && c[n] !== null && u !== !1 ? u = !!c[n] : d === "headMove" && c[n] !== null && a !== !1 ? c[n] === 0 ? a = !1 : (Math.random() < c[n] && (a = !0), c[n] = null) : c[n] !== null && (h.push({ mt: d, val: c[n] }), c[n] = null);
|
|
5112
5112
|
n === o ? (l.hasOwnProperty("mood") && this.setMood(l.mood), l.loop ? (o = this.isSpeaking && (l.template.name === "head" || l.template.name === "eyes") ? 4 : 1, this.animQueue[i] = this.animFactory(l.template, l.loop > 0 ? l.loop - 1 : l.loop, 1, 1 / o)) : (this.animQueue.splice(i--, 1), s--)) : l.ndx = n - 1;
|
|
5113
5113
|
}
|
|
5114
5114
|
}
|
|
5115
|
-
for (let l = 0,
|
|
5116
|
-
switch (n =
|
|
5115
|
+
for (let l = 0, d = h.length; l < d; l++)
|
|
5116
|
+
switch (n = h[l].val, h[l].mt) {
|
|
5117
5117
|
case "speak":
|
|
5118
5118
|
this.speakText(n);
|
|
5119
5119
|
break;
|
|
@@ -5130,8 +5130,8 @@ class we {
|
|
|
5130
5130
|
n && typeof n == "function" && n();
|
|
5131
5131
|
break;
|
|
5132
5132
|
case "moveto":
|
|
5133
|
-
Object.entries(n.props).forEach((
|
|
5134
|
-
|
|
5133
|
+
Object.entries(n.props).forEach((c) => {
|
|
5134
|
+
c[1] ? this.poseTarget.props[c[0]].copy(c[1]) : this.poseTarget.props[c[0]].copy(this.getPoseTemplateProp(c[0])), this.poseTarget.props[c[0]].t = this.animClock, this.poseTarget.props[c[0]].d = c[1] && c[1].d ? c[1].d : c.duration || 2e3;
|
|
5135
5135
|
});
|
|
5136
5136
|
break;
|
|
5137
5137
|
case "handLeft":
|
|
@@ -5159,7 +5159,7 @@ class we {
|
|
|
5159
5159
|
}, n.x ? new f.Vector3(n.x, n.y, n.z) : null, !0, n.d);
|
|
5160
5160
|
break;
|
|
5161
5161
|
}
|
|
5162
|
-
if ((
|
|
5162
|
+
if ((u || a) && (E.setFromQuaternion(this.poseAvatar.props["Head.quaternion"]), E.x = Math.max(-0.9, Math.min(0.9, 2 * E.x - 0.5)), E.y = Math.max(-0.9, Math.min(0.9, -2.5 * E.y)), u ? (Object.assign(this.mtAvatar.eyesLookDown, { system: E.x < 0 ? -E.x : 0, needsUpdate: !0 }), Object.assign(this.mtAvatar.eyesLookUp, { system: E.x < 0 ? 0 : E.x, needsUpdate: !0 }), Object.assign(this.mtAvatar.eyeLookInLeft, { system: E.y < 0 ? -E.y : 0, needsUpdate: !0 }), Object.assign(this.mtAvatar.eyeLookOutLeft, { system: E.y < 0 ? 0 : E.y, needsUpdate: !0 }), Object.assign(this.mtAvatar.eyeLookInRight, { system: E.y < 0 ? 0 : E.y, needsUpdate: !0 }), Object.assign(this.mtAvatar.eyeLookOutRight, { system: E.y < 0 ? -E.y : 0, needsUpdate: !0 }), a && (i = -this.mtAvatar.bodyRotateY.value, n = this.gaussianRandom(-0.2, 0.2), this.animQueue.push(this.animFactory({
|
|
5163
5163
|
name: "headmove",
|
|
5164
5164
|
dt: [[1e3, 2e3], [1e3, 2e3, 1, 2], [1e3, 2e3], [1e3, 2e3, 1, 2]],
|
|
5165
5165
|
vs: {
|
|
@@ -5180,13 +5180,13 @@ class we {
|
|
|
5180
5180
|
eyeLookOutRight: [null, 0],
|
|
5181
5181
|
eyeContact: [0]
|
|
5182
5182
|
}
|
|
5183
|
-
})))), e > 2 * this.animFrameDur && (e = 2 * this.animFrameDur), (this.viewName !== "full" || this.isAvatarOnly) && (i = this.mtRandomized[Math.floor(Math.random() * this.mtRandomized.length)], n = this.mtAvatar[i], n.needsUpdate || Object.assign(n, { base: (this.mood.baseline[i] || 0) + (1 + r / 255) * Math.random() / 5, needsUpdate: !0 })), this.updatePoseBase(this.animClock), this.mixer && this.mixer.update(e / 1e3 * this.mixer.timeScale), this.updatePoseDelta(), (this.isSpeaking || this.isListening) &&
|
|
5183
|
+
})))), e > 2 * this.animFrameDur && (e = 2 * this.animFrameDur), (this.viewName !== "full" || this.isAvatarOnly) && (i = this.mtRandomized[Math.floor(Math.random() * this.mtRandomized.length)], n = this.mtAvatar[i], n.needsUpdate || Object.assign(n, { base: (this.mood.baseline[i] || 0) + (1 + r / 255) * Math.random() / 5, needsUpdate: !0 })), this.updatePoseBase(this.animClock), this.mixer && this.mixer.update(e / 1e3 * this.mixer.timeScale), this.updatePoseDelta(), (this.isSpeaking || this.isListening) && u ? r > this.volumeMax ? (this.volumeHeadBase = 0.05, Math.random() > 0.6 && (this.volumeHeadTarget = -0.05 - Math.random() / 15), this.volumeMax = r) : (this.volumeMax *= 0.92, this.volumeHeadTarget = this.volumeHeadBase - 0.9 * (this.volumeHeadBase - this.volumeHeadTarget)) : (this.volumeHeadTarget = 0, this.volumeMax = 0), i = this.volumeHeadTarget - this.volumeHeadCurrent, n = Math.abs(i), n > 1e-4 && (o = n * (this.volumeHeadEasing(Math.min(1, this.volumeHeadVelocity * e / 1e3 / n) / 2 + 0.5) - 0.5), this.volumeHeadCurrent += Math.sign(i) * Math.min(n, o)), Math.abs(this.volumeHeadCurrent) > 1e-4 && (U.setFromAxisAngle(tt, this.volumeHeadCurrent), this.objectNeck.quaternion.multiply(U)), Ae.setFromObject(this.armature), this.objectLeftToeBase.getWorldPosition(ee), ee.sub(this.armature.position), this.objectRightToeBase.getWorldPosition(ie), ie.sub(this.armature.position), this.objectHips.position.y -= Ae.min.y / 2, this.objectHips.position.x -= (ee.x + ie.x) / 4, this.objectHips.position.z -= (ee.z + ie.z) / 2, this.dynamicbones.update(e), this.fbxAnimationLoader && this.fbxAnimationLoader.update(), this.opt.update && this.opt.update(e), this.updateMorphTargets(e), this.isAvatarOnly)
|
|
5184
5184
|
this.stats && this.stats.end();
|
|
5185
5185
|
else {
|
|
5186
5186
|
if (this.cameraClock !== null && this.cameraClock < 1e3) {
|
|
5187
5187
|
this.cameraClock += e, this.cameraClock > 1e3 && (this.cameraClock = 1e3);
|
|
5188
|
-
let l = new f.Spherical().setFromVector3(this.cameraStart),
|
|
5189
|
-
l.phi += this.easing(this.cameraClock / 1e3) * (
|
|
5188
|
+
let l = new f.Spherical().setFromVector3(this.cameraStart), d = new f.Spherical().setFromVector3(this.cameraEnd);
|
|
5189
|
+
l.phi += this.easing(this.cameraClock / 1e3) * (d.phi - l.phi), l.theta += this.easing(this.cameraClock / 1e3) * (d.theta - l.theta), l.radius += this.easing(this.cameraClock / 1e3) * (d.radius - l.radius), l.makeSafe(), this.camera.position.setFromSpherical(l), this.controlsStart.x !== this.controlsEnd.x ? this.controls.target.copy(this.controlsStart.lerp(this.controlsEnd, this.easing(this.cameraClock / 1e3))) : (l.setFromVector3(this.controlsStart), d.setFromVector3(this.controlsEnd), l.phi += this.easing(this.cameraClock / 1e3) * (d.phi - l.phi), l.theta += this.easing(this.cameraClock / 1e3) * (d.theta - l.theta), l.radius += this.easing(this.cameraClock / 1e3) * (d.radius - l.radius), l.makeSafe(), this.controls.target.setFromSpherical(l)), this.controls.update();
|
|
5190
5190
|
}
|
|
5191
5191
|
this.controls.autoRotate && this.controls.update(), this.stats && this.stats.end(), this.render();
|
|
5192
5192
|
}
|
|
@@ -5211,8 +5211,8 @@ class we {
|
|
|
5211
5211
|
if (!this.lipsync.hasOwnProperty(t)) {
|
|
5212
5212
|
const i = t.toLowerCase(), n = "Lipsync" + t.charAt(0).toUpperCase() + t.slice(1);
|
|
5213
5213
|
try {
|
|
5214
|
-
const s =
|
|
5215
|
-
s && s[n] ? (this.lipsync[t] = new s[n](), console.log(`Loaded lip-sync module for ${t}`)) : console.warn(`Lip-sync module for ${t} not found. Available modules:`, Object.keys(
|
|
5214
|
+
const s = Le[i];
|
|
5215
|
+
s && s[n] ? (this.lipsync[t] = new s[n](), console.log(`Loaded lip-sync module for ${t}`)) : console.warn(`Lip-sync module for ${t} not found. Available modules:`, Object.keys(Le));
|
|
5216
5216
|
} catch (s) {
|
|
5217
5217
|
console.warn(`Failed to load lip-sync module for ${t}:`, s);
|
|
5218
5218
|
}
|
|
@@ -5247,49 +5247,49 @@ class we {
|
|
|
5247
5247
|
*/
|
|
5248
5248
|
speakText(t, e = null, i = null, n = null) {
|
|
5249
5249
|
e = e || {};
|
|
5250
|
-
const s = /[!\.\?\n\p{Extended_Pictographic}]/ug, o = /[ ]/ug, r = /[\p{L}\p{N},\.\p{Quotation_Mark}!€\$\+\p{Dash_Punctuation}%&\?]/ug,
|
|
5251
|
-
let
|
|
5250
|
+
const s = /[!\.\?\n\p{Extended_Pictographic}]/ug, o = /[ ]/ug, r = /[\p{L}\p{N},\.\p{Quotation_Mark}!€\$\+\p{Dash_Punctuation}%&\?]/ug, u = /[\p{Extended_Pictographic}]/ug, a = e.lipsyncLang || this.avatar.lipsyncLang || this.opt.lipsyncLang;
|
|
5251
|
+
let h = "", l = "", d = 0, c = [], g = [];
|
|
5252
5252
|
const y = Array.from(this.segmenter.segment(t), (x) => x.segment);
|
|
5253
5253
|
for (let x = 0; x < y.length; x++) {
|
|
5254
|
-
const
|
|
5254
|
+
const L = x === y.length - 1, F = y[x].match(r);
|
|
5255
5255
|
let p = y[x].match(s);
|
|
5256
|
-
const z = y[x].match(
|
|
5257
|
-
if (p && !
|
|
5258
|
-
mark:
|
|
5256
|
+
const z = y[x].match(u), C = y[x].match(o);
|
|
5257
|
+
if (p && !L && !z && y[x + 1].match(s) && (p = !1), i && (h += y[x]), F && (!n || n.every((I) => x < I[0] || x > I[1])) && (l += y[x]), (C || p || L) && (l.length && (l = this.lipsyncPreProcessText(l, a), l.length && c.push({
|
|
5258
|
+
mark: d,
|
|
5259
5259
|
word: l
|
|
5260
|
-
})),
|
|
5261
|
-
mark:
|
|
5260
|
+
})), h.length && (g.push({
|
|
5261
|
+
mark: d,
|
|
5262
5262
|
template: { name: "subtitles" },
|
|
5263
5263
|
ts: [0],
|
|
5264
5264
|
vs: {
|
|
5265
|
-
subtitles: [
|
|
5265
|
+
subtitles: [h]
|
|
5266
5266
|
}
|
|
5267
|
-
}),
|
|
5268
|
-
const
|
|
5269
|
-
if (
|
|
5270
|
-
const
|
|
5271
|
-
for (let
|
|
5267
|
+
}), h = ""), l.length)) {
|
|
5268
|
+
const I = this.lipsyncWordsToVisemes(l, a);
|
|
5269
|
+
if (I && I.visemes && I.visemes.length) {
|
|
5270
|
+
const B = I.times[I.visemes.length - 1] + I.durations[I.visemes.length - 1];
|
|
5271
|
+
for (let D = 0; D < I.visemes.length; D++)
|
|
5272
5272
|
g.push({
|
|
5273
|
-
mark:
|
|
5273
|
+
mark: d,
|
|
5274
5274
|
template: { name: "viseme" },
|
|
5275
|
-
ts: [(
|
|
5275
|
+
ts: [(I.times[D] - 0.6) / B, (I.times[D] + 0.5) / B, (I.times[D] + I.durations[D] + 0.5) / B],
|
|
5276
5276
|
vs: {
|
|
5277
|
-
["viseme_" +
|
|
5277
|
+
["viseme_" + I.visemes[D]]: [null, I.visemes[D] === "PP" || I.visemes[D] === "FF" ? 0.9 : 0.6, 0]
|
|
5278
5278
|
}
|
|
5279
5279
|
});
|
|
5280
5280
|
}
|
|
5281
|
-
l = "",
|
|
5281
|
+
l = "", d++;
|
|
5282
5282
|
}
|
|
5283
|
-
if (p ||
|
|
5284
|
-
if (
|
|
5285
|
-
const
|
|
5283
|
+
if (p || L) {
|
|
5284
|
+
if (c.length || L && g.length) {
|
|
5285
|
+
const I = {
|
|
5286
5286
|
anim: g
|
|
5287
5287
|
};
|
|
5288
|
-
i && (
|
|
5288
|
+
i && (I.onSubtitles = i), c.length && !e.avatarMute && (I.text = c, e.avatarMood && (I.mood = e.avatarMood), e.ttsLang && (I.lang = e.ttsLang), e.ttsVoice && (I.voice = e.ttsVoice), e.ttsRate && (I.rate = e.ttsRate), e.ttsVoice && (I.pitch = e.ttsPitch), e.ttsVolume && (I.volume = e.ttsVolume)), this.speechQueue.push(I), c = [], l = "", d = 0, g = [];
|
|
5289
5289
|
}
|
|
5290
5290
|
if (z) {
|
|
5291
|
-
let
|
|
5292
|
-
|
|
5291
|
+
let I = this.animEmojis[y[x]];
|
|
5292
|
+
I && I.link && (I = this.animEmojis[I.link]), I && this.speechQueue.push({ emoji: I });
|
|
5293
5293
|
}
|
|
5294
5294
|
this.speechQueue.push({ break: 100 });
|
|
5295
5295
|
}
|
|
@@ -5370,27 +5370,27 @@ class we {
|
|
|
5370
5370
|
if (t.words) {
|
|
5371
5371
|
let o = [];
|
|
5372
5372
|
for (let r = 0; r < t.words.length; r++) {
|
|
5373
|
-
const
|
|
5374
|
-
let
|
|
5375
|
-
if (
|
|
5373
|
+
const u = t.words[r], a = t.wtimes[r];
|
|
5374
|
+
let h = t.wdurations[r];
|
|
5375
|
+
if (u.length && (i && o.push({
|
|
5376
5376
|
template: { name: "subtitles" },
|
|
5377
5377
|
ts: [a],
|
|
5378
5378
|
vs: {
|
|
5379
|
-
subtitles: [" " +
|
|
5379
|
+
subtitles: [" " + u]
|
|
5380
5380
|
}
|
|
5381
5381
|
}), !t.visemes)) {
|
|
5382
|
-
const l = this.lipsyncPreProcessText(
|
|
5383
|
-
if (
|
|
5384
|
-
const
|
|
5385
|
-
let y = 0.6 + this.convertRange(g, [0,
|
|
5386
|
-
if (
|
|
5387
|
-
for (let x = 0; x <
|
|
5388
|
-
const
|
|
5382
|
+
const l = this.lipsyncPreProcessText(u, n), d = this.lipsyncWordsToVisemes(l, n);
|
|
5383
|
+
if (d && d.visemes && d.visemes.length) {
|
|
5384
|
+
const c = d.times[d.visemes.length - 1] + d.durations[d.visemes.length - 1], g = Math.min(h, Math.max(0, h - d.visemes.length * 150));
|
|
5385
|
+
let y = 0.6 + this.convertRange(g, [0, h], [0, 0.4]);
|
|
5386
|
+
if (h = Math.min(h, d.visemes.length * 200), c > 0)
|
|
5387
|
+
for (let x = 0; x < d.visemes.length; x++) {
|
|
5388
|
+
const L = a + d.times[x] / c * h, F = d.durations[x] / c * h;
|
|
5389
5389
|
o.push({
|
|
5390
5390
|
template: { name: "viseme" },
|
|
5391
|
-
ts: [
|
|
5391
|
+
ts: [L - Math.min(60, 2 * F / 3), L + Math.min(25, F / 2), L + F + Math.min(60, F / 2)],
|
|
5392
5392
|
vs: {
|
|
5393
|
-
["viseme_" +
|
|
5393
|
+
["viseme_" + d.visemes[x]]: [null, d.visemes[x] === "PP" || d.visemes[x] === "FF" ? 0.9 : y, 0]
|
|
5394
5394
|
}
|
|
5395
5395
|
});
|
|
5396
5396
|
}
|
|
@@ -5399,22 +5399,22 @@ class we {
|
|
|
5399
5399
|
}
|
|
5400
5400
|
if (t.visemes)
|
|
5401
5401
|
for (let r = 0; r < t.visemes.length; r++) {
|
|
5402
|
-
const
|
|
5402
|
+
const u = t.visemes[r], a = t.vtimes[r], h = t.vdurations[r];
|
|
5403
5403
|
o.push({
|
|
5404
5404
|
template: { name: "viseme" },
|
|
5405
|
-
ts: [a - 2 *
|
|
5405
|
+
ts: [a - 2 * h / 3, a + h / 2, a + h + h / 2],
|
|
5406
5406
|
vs: {
|
|
5407
|
-
["viseme_" +
|
|
5407
|
+
["viseme_" + u]: [null, u === "PP" || u === "FF" ? 0.9 : 0.6, 0]
|
|
5408
5408
|
}
|
|
5409
5409
|
});
|
|
5410
5410
|
}
|
|
5411
5411
|
if (t.markers)
|
|
5412
5412
|
for (let r = 0; r < t.markers.length; r++) {
|
|
5413
|
-
const
|
|
5413
|
+
const u = t.markers[r], a = t.mtimes[r];
|
|
5414
5414
|
o.push({
|
|
5415
5415
|
template: { name: "markers" },
|
|
5416
5416
|
ts: [a],
|
|
5417
|
-
vs: { function: [
|
|
5417
|
+
vs: { function: [u] }
|
|
5418
5418
|
});
|
|
5419
5419
|
}
|
|
5420
5420
|
o.length && (s.anim = o);
|
|
@@ -5434,7 +5434,7 @@ class we {
|
|
|
5434
5434
|
if (this.isAudioPlaying = !0, this.audioPlaylist.length) {
|
|
5435
5435
|
const e = this.audioPlaylist.shift();
|
|
5436
5436
|
if (this.audioCtx.state === "suspended" || this.audioCtx.state === "interrupted") {
|
|
5437
|
-
const s = this.audioCtx.resume(), o = new Promise((r,
|
|
5437
|
+
const s = this.audioCtx.resume(), o = new Promise((r, u) => setTimeout(() => u("p2"), 1e3));
|
|
5438
5438
|
try {
|
|
5439
5439
|
await Promise.race([s, o]);
|
|
5440
5440
|
} catch {
|
|
@@ -5466,38 +5466,38 @@ class we {
|
|
|
5466
5466
|
*/
|
|
5467
5467
|
async synthesizeWithBrowserTTS(t) {
|
|
5468
5468
|
return new Promise((e, i) => {
|
|
5469
|
-
const n = t.text.map((p) => p.word).join(" "), s = new SpeechSynthesisUtterance(n), o = t.lang || this.avatar.ttsLang || this.opt.ttsLang || "en-US", r = (t.rate || this.avatar.ttsRate || this.opt.ttsRate || 1) + this.mood.speech.deltaRate,
|
|
5470
|
-
s.lang = o, s.rate = Math.max(0.1, Math.min(10, r)), s.pitch = Math.max(0, Math.min(2,
|
|
5471
|
-
const
|
|
5472
|
-
if (l &&
|
|
5473
|
-
const p =
|
|
5469
|
+
const n = t.text.map((p) => p.word).join(" "), s = new SpeechSynthesisUtterance(n), o = t.lang || this.avatar.ttsLang || this.opt.ttsLang || "en-US", r = (t.rate || this.avatar.ttsRate || this.opt.ttsRate || 1) + this.mood.speech.deltaRate, u = (t.pitch || this.avatar.ttsPitch || this.opt.ttsPitch || 1) + this.mood.speech.deltaPitch, a = (t.volume || this.avatar.ttsVolume || this.opt.ttsVolume || 1) + this.mood.speech.deltaVolume;
|
|
5470
|
+
s.lang = o, s.rate = Math.max(0.1, Math.min(10, r)), s.pitch = Math.max(0, Math.min(2, u)), s.volume = Math.max(0, Math.min(1, a));
|
|
5471
|
+
const h = speechSynthesis.getVoices(), l = t.voice || this.avatar.ttsVoice || this.opt.ttsVoice;
|
|
5472
|
+
if (l && h.length > 0) {
|
|
5473
|
+
const p = h.find((z) => z.name.includes(l) || z.lang === o);
|
|
5474
5474
|
p && (s.voice = p);
|
|
5475
5475
|
}
|
|
5476
|
-
const
|
|
5476
|
+
const d = n.length * 100 / s.rate, c = this.audioCtx.createBuffer(1, this.audioCtx.sampleRate * (d / 1e3), this.audioCtx.sampleRate), g = this.avatar.lipsyncLang || this.opt.lipsyncLang || "en", y = this.lipsyncPreProcessText(n, g), x = this.lipsyncWordsToVisemes(y, g);
|
|
5477
5477
|
console.log("Browser TTS Lip-sync Debug:", {
|
|
5478
5478
|
text: n,
|
|
5479
5479
|
lipsyncLang: g,
|
|
5480
5480
|
processedText: y,
|
|
5481
5481
|
lipsyncData: x,
|
|
5482
5482
|
hasVisemes: x && x.visemes && x.visemes.length > 0,
|
|
5483
|
-
estimatedDuration:
|
|
5483
|
+
estimatedDuration: d
|
|
5484
5484
|
});
|
|
5485
|
-
const
|
|
5485
|
+
const L = [];
|
|
5486
5486
|
if (x && x.visemes && x.visemes.length > 0) {
|
|
5487
5487
|
const p = x.times[x.visemes.length - 1] + x.durations[x.visemes.length - 1];
|
|
5488
5488
|
for (let z = 0; z < x.visemes.length; z++) {
|
|
5489
|
-
const C = x.visemes[z],
|
|
5490
|
-
|
|
5489
|
+
const C = x.visemes[z], I = x.times[z] / p, B = x.durations[z] / p, D = I * d, X = B * d;
|
|
5490
|
+
L.push({
|
|
5491
5491
|
template: { name: "viseme" },
|
|
5492
|
-
ts: [
|
|
5492
|
+
ts: [D - Math.min(60, 2 * X / 3), D + Math.min(25, X / 2), D + X + Math.min(60, X / 2)],
|
|
5493
5493
|
vs: {
|
|
5494
5494
|
["viseme_" + C]: [null, C === "PP" || C === "FF" ? 0.9 : 0.6, 0]
|
|
5495
5495
|
}
|
|
5496
5496
|
});
|
|
5497
5497
|
}
|
|
5498
5498
|
}
|
|
5499
|
-
const
|
|
5500
|
-
this.audioPlaylist.push({ anim:
|
|
5499
|
+
const F = [...t.anim, ...L];
|
|
5500
|
+
this.audioPlaylist.push({ anim: F, audio: c }), this.onSubtitles = t.onSubtitles || null, this.resetLips(), t.mood && this.setMood(t.mood), this.playAudio(), s.onend = () => {
|
|
5501
5501
|
e();
|
|
5502
5502
|
}, s.onerror = (p) => {
|
|
5503
5503
|
console.error("Speech synthesis error:", p.error), i(p.error);
|
|
@@ -5509,7 +5509,7 @@ class we {
|
|
|
5509
5509
|
* @param {Object} line Speech line object
|
|
5510
5510
|
*/
|
|
5511
5511
|
async synthesizeWithElevenLabsTTS(t) {
|
|
5512
|
-
const e = t.text.map((
|
|
5512
|
+
const e = t.text.map((d) => d.word).join(" "), i = t.voice || this.avatar.ttsVoice || this.opt.ttsVoice || "21m00Tcm4TlvDq8ikWAM", n = {
|
|
5513
5513
|
text: e,
|
|
5514
5514
|
model_id: "eleven_monolingual_v1",
|
|
5515
5515
|
voice_settings: {
|
|
@@ -5531,26 +5531,26 @@ class we {
|
|
|
5531
5531
|
throw new Error(`ElevenLabs TTS error: ${s.status} ${s.statusText}`);
|
|
5532
5532
|
const o = await s.arrayBuffer(), r = await this.audioCtx.decodeAudioData(o);
|
|
5533
5533
|
console.log("Using text-based lip-sync for debugging...");
|
|
5534
|
-
const
|
|
5534
|
+
const u = this.avatar.lipsyncLang || this.opt.lipsyncLang || "en";
|
|
5535
5535
|
let a;
|
|
5536
5536
|
try {
|
|
5537
5537
|
console.log("Lip-sync modules available:", {
|
|
5538
5538
|
hasLipsync: !!this.lipsync,
|
|
5539
5539
|
lipsyncKeys: this.lipsync ? Object.keys(this.lipsync) : [],
|
|
5540
|
-
lipsyncLang:
|
|
5540
|
+
lipsyncLang: u
|
|
5541
5541
|
});
|
|
5542
|
-
const
|
|
5542
|
+
const d = this.lipsyncPreProcessText(e, u), c = this.lipsyncWordsToVisemes(d, u);
|
|
5543
5543
|
if (console.log("Lip-sync data:", {
|
|
5544
|
-
processedText:
|
|
5545
|
-
lipsyncData:
|
|
5546
|
-
hasVisemes:
|
|
5547
|
-
}),
|
|
5544
|
+
processedText: d,
|
|
5545
|
+
lipsyncData: c,
|
|
5546
|
+
hasVisemes: c && c.visemes && c.visemes.length > 0
|
|
5547
|
+
}), c && c.visemes && c.visemes.length > 0)
|
|
5548
5548
|
a = {
|
|
5549
|
-
visemes:
|
|
5549
|
+
visemes: c.visemes.map((g, y) => ({
|
|
5550
5550
|
viseme: g,
|
|
5551
|
-
startTime: y * r.duration /
|
|
5552
|
-
endTime: (y + 1) * r.duration /
|
|
5553
|
-
duration: r.duration /
|
|
5551
|
+
startTime: y * r.duration / c.visemes.length,
|
|
5552
|
+
endTime: (y + 1) * r.duration / c.visemes.length,
|
|
5553
|
+
duration: r.duration / c.visemes.length,
|
|
5554
5554
|
intensity: 0.7
|
|
5555
5555
|
})),
|
|
5556
5556
|
words: [],
|
|
@@ -5559,13 +5559,13 @@ class we {
|
|
|
5559
5559
|
};
|
|
5560
5560
|
else
|
|
5561
5561
|
throw new Error("No visemes generated from text");
|
|
5562
|
-
} catch (
|
|
5563
|
-
console.error("Text-based lip-sync failed, using fallback:",
|
|
5564
|
-
const
|
|
5565
|
-
for (const y of
|
|
5562
|
+
} catch (d) {
|
|
5563
|
+
console.error("Text-based lip-sync failed, using fallback:", d);
|
|
5564
|
+
const c = e.toLowerCase().split(/\s+/), g = [];
|
|
5565
|
+
for (const y of c)
|
|
5566
5566
|
for (const x of y) {
|
|
5567
|
-
let
|
|
5568
|
-
"aeiou".includes(x) ?
|
|
5567
|
+
let L = "aa";
|
|
5568
|
+
"aeiou".includes(x) ? L = "aa" : "bp".includes(x) ? L = "PP" : "fv".includes(x) ? L = "FF" : "st".includes(x) ? L = "SS" : "dln".includes(x) ? L = "DD" : "kg".includes(x) ? L = "kk" : "rw".includes(x) && (L = "RR"), g.push(L);
|
|
5569
5569
|
}
|
|
5570
5570
|
a = {
|
|
5571
5571
|
visemes: g.map((y, x) => ({
|
|
@@ -5592,31 +5592,31 @@ class we {
|
|
|
5592
5592
|
visemes: a.visemes ? a.visemes.slice(0, 3) : []
|
|
5593
5593
|
// Show first 3 visemes for debugging
|
|
5594
5594
|
});
|
|
5595
|
-
const
|
|
5595
|
+
const h = [];
|
|
5596
5596
|
if (a.visemes && a.visemes.length > 0) {
|
|
5597
5597
|
console.log("ElevenLabs: Generating lip-sync animation from", a.visemes.length, "visemes");
|
|
5598
|
-
for (let
|
|
5599
|
-
const
|
|
5600
|
-
|
|
5598
|
+
for (let d = 0; d < a.visemes.length; d++) {
|
|
5599
|
+
const c = a.visemes[d], g = c.startTime * 1e3, y = c.duration * 1e3, x = c.intensity;
|
|
5600
|
+
h.push({
|
|
5601
5601
|
template: { name: "viseme" },
|
|
5602
5602
|
ts: [g - Math.min(60, 2 * y / 3), g + Math.min(25, y / 2), g + y + Math.min(60, y / 2)],
|
|
5603
5603
|
vs: {
|
|
5604
|
-
["viseme_" +
|
|
5604
|
+
["viseme_" + c.viseme]: [null, x, 0]
|
|
5605
5605
|
}
|
|
5606
5606
|
});
|
|
5607
5607
|
}
|
|
5608
|
-
console.log("ElevenLabs: Generated",
|
|
5608
|
+
console.log("ElevenLabs: Generated", h.length, "lip-sync animation frames");
|
|
5609
5609
|
} else
|
|
5610
5610
|
console.warn("ElevenLabs: No visemes available for lip-sync animation");
|
|
5611
|
-
const l = [...t.anim, ...
|
|
5612
|
-
console.log("ElevenLabs: Combined animation frames:", l.length, "(original:", t.anim.length, "+ lipsync:",
|
|
5611
|
+
const l = [...t.anim, ...h];
|
|
5612
|
+
console.log("ElevenLabs: Combined animation frames:", l.length, "(original:", t.anim.length, "+ lipsync:", h.length, ")"), this.audioPlaylist.push({ anim: l, audio: r }), this.onSubtitles = t.onSubtitles || null, this.resetLips(), t.mood && this.setMood(t.mood), this.playAudio();
|
|
5613
5613
|
}
|
|
5614
5614
|
/**
|
|
5615
5615
|
* Synthesize speech using Deepgram Aura-2 TTS
|
|
5616
5616
|
* @param {Object} line Speech line object
|
|
5617
5617
|
*/
|
|
5618
5618
|
async synthesizeWithDeepgramTTS(t) {
|
|
5619
|
-
const e = t.text.map((
|
|
5619
|
+
const e = t.text.map((d) => d.word).join(" "), i = t.voice || this.avatar.ttsVoice || this.opt.ttsVoice || "aura-2-thalia-en", n = `${this.opt.ttsEndpoint}?model=${i}`, s = await fetch(n, {
|
|
5620
5620
|
method: "POST",
|
|
5621
5621
|
headers: {
|
|
5622
5622
|
Authorization: `Token ${this.opt.ttsApikey}`,
|
|
@@ -5629,26 +5629,26 @@ class we {
|
|
|
5629
5629
|
throw new Error(`Deepgram TTS error: ${s.status} ${s.statusText}`);
|
|
5630
5630
|
const o = await s.arrayBuffer(), r = await this.audioCtx.decodeAudioData(o);
|
|
5631
5631
|
console.log("Using text-based lip-sync for Deepgram...");
|
|
5632
|
-
const
|
|
5632
|
+
const u = this.avatar.lipsyncLang || this.opt.lipsyncLang || "en";
|
|
5633
5633
|
let a;
|
|
5634
5634
|
try {
|
|
5635
5635
|
console.log("Lip-sync modules available:", {
|
|
5636
5636
|
hasLipsync: !!this.lipsync,
|
|
5637
5637
|
lipsyncKeys: this.lipsync ? Object.keys(this.lipsync) : [],
|
|
5638
|
-
lipsyncLang:
|
|
5638
|
+
lipsyncLang: u
|
|
5639
5639
|
});
|
|
5640
|
-
const
|
|
5640
|
+
const d = this.lipsyncPreProcessText(e, u), c = this.lipsyncWordsToVisemes(d, u);
|
|
5641
5641
|
if (console.log("Lip-sync data:", {
|
|
5642
|
-
processedText:
|
|
5643
|
-
lipsyncData:
|
|
5644
|
-
hasVisemes:
|
|
5645
|
-
}),
|
|
5642
|
+
processedText: d,
|
|
5643
|
+
lipsyncData: c,
|
|
5644
|
+
hasVisemes: c && c.visemes && c.visemes.length > 0
|
|
5645
|
+
}), c && c.visemes && c.visemes.length > 0)
|
|
5646
5646
|
a = {
|
|
5647
|
-
visemes:
|
|
5647
|
+
visemes: c.visemes.map((g, y) => ({
|
|
5648
5648
|
viseme: g,
|
|
5649
|
-
startTime: y * r.duration /
|
|
5650
|
-
endTime: (y + 1) * r.duration /
|
|
5651
|
-
duration: r.duration /
|
|
5649
|
+
startTime: y * r.duration / c.visemes.length,
|
|
5650
|
+
endTime: (y + 1) * r.duration / c.visemes.length,
|
|
5651
|
+
duration: r.duration / c.visemes.length,
|
|
5652
5652
|
intensity: 0.7
|
|
5653
5653
|
})),
|
|
5654
5654
|
words: [],
|
|
@@ -5657,13 +5657,13 @@ class we {
|
|
|
5657
5657
|
};
|
|
5658
5658
|
else
|
|
5659
5659
|
throw new Error("No visemes generated from text");
|
|
5660
|
-
} catch (
|
|
5661
|
-
console.error("Text-based lip-sync failed, using fallback:",
|
|
5662
|
-
const
|
|
5663
|
-
for (const y of
|
|
5660
|
+
} catch (d) {
|
|
5661
|
+
console.error("Text-based lip-sync failed, using fallback:", d);
|
|
5662
|
+
const c = e.toLowerCase().split(/\s+/), g = [];
|
|
5663
|
+
for (const y of c)
|
|
5664
5664
|
for (const x of y) {
|
|
5665
|
-
let
|
|
5666
|
-
"aeiou".includes(x) ?
|
|
5665
|
+
let L = "aa";
|
|
5666
|
+
"aeiou".includes(x) ? L = "aa" : "bp".includes(x) ? L = "PP" : "fv".includes(x) ? L = "FF" : "st".includes(x) ? L = "SS" : "dln".includes(x) ? L = "DD" : "kg".includes(x) ? L = "kk" : "rw".includes(x) && (L = "RR"), g.push(L);
|
|
5667
5667
|
}
|
|
5668
5668
|
a = {
|
|
5669
5669
|
visemes: g.map((y, x) => ({
|
|
@@ -5690,24 +5690,24 @@ class we {
|
|
|
5690
5690
|
visemes: a.visemes ? a.visemes.slice(0, 3) : []
|
|
5691
5691
|
// Show first 3 visemes for debugging
|
|
5692
5692
|
});
|
|
5693
|
-
const
|
|
5693
|
+
const h = [];
|
|
5694
5694
|
if (a.visemes && a.visemes.length > 0) {
|
|
5695
5695
|
console.log("Deepgram: Generating lip-sync animation from", a.visemes.length, "visemes");
|
|
5696
|
-
for (let
|
|
5697
|
-
const
|
|
5698
|
-
|
|
5696
|
+
for (let d = 0; d < a.visemes.length; d++) {
|
|
5697
|
+
const c = a.visemes[d], g = c.startTime * 1e3, y = c.duration * 1e3, x = c.intensity;
|
|
5698
|
+
h.push({
|
|
5699
5699
|
template: { name: "viseme" },
|
|
5700
5700
|
ts: [g - Math.min(60, 2 * y / 3), g + Math.min(25, y / 2), g + y + Math.min(60, y / 2)],
|
|
5701
5701
|
vs: {
|
|
5702
|
-
["viseme_" +
|
|
5702
|
+
["viseme_" + c.viseme]: [null, x, 0]
|
|
5703
5703
|
}
|
|
5704
5704
|
});
|
|
5705
5705
|
}
|
|
5706
|
-
console.log("Deepgram: Generated",
|
|
5706
|
+
console.log("Deepgram: Generated", h.length, "lip-sync animation frames");
|
|
5707
5707
|
} else
|
|
5708
5708
|
console.warn("Deepgram: No visemes available for lip-sync animation");
|
|
5709
|
-
const l = [...t.anim, ...
|
|
5710
|
-
console.log("Deepgram: Combined animation frames:", l.length, "(original:", t.anim.length, "+ lipsync:",
|
|
5709
|
+
const l = [...t.anim, ...h];
|
|
5710
|
+
console.log("Deepgram: Combined animation frames:", l.length, "(original:", t.anim.length, "+ lipsync:", h.length, ")"), this.audioPlaylist.push({ anim: l, audio: r }), this.onSubtitles = t.onSubtitles || null, this.resetLips(), t.mood && this.setMood(t.mood), this.playAudio();
|
|
5711
5711
|
}
|
|
5712
5712
|
/**
|
|
5713
5713
|
* Synthesize speech using Azure TTS
|
|
@@ -5733,30 +5733,30 @@ class we {
|
|
|
5733
5733
|
throw new Error(`Azure TTS error: ${s.status} ${s.statusText}`);
|
|
5734
5734
|
const o = await s.arrayBuffer(), r = await this.audioCtx.decodeAudioData(o);
|
|
5735
5735
|
console.log("Analyzing audio for precise lip-sync...");
|
|
5736
|
-
const
|
|
5736
|
+
const u = await this.audioAnalyzer.analyzeAudio(r, e);
|
|
5737
5737
|
console.log("Azure TTS Audio Analysis:", {
|
|
5738
5738
|
text: e,
|
|
5739
5739
|
audioDuration: r.duration,
|
|
5740
|
-
visemeCount:
|
|
5741
|
-
wordCount:
|
|
5740
|
+
visemeCount: u.visemes.length,
|
|
5741
|
+
wordCount: u.words.length,
|
|
5742
5742
|
features: {
|
|
5743
|
-
onsets:
|
|
5744
|
-
boundaries:
|
|
5743
|
+
onsets: u.features.onsets.length,
|
|
5744
|
+
boundaries: u.features.phonemeBoundaries.length
|
|
5745
5745
|
}
|
|
5746
5746
|
});
|
|
5747
5747
|
const a = [];
|
|
5748
|
-
for (let l = 0; l <
|
|
5749
|
-
const
|
|
5748
|
+
for (let l = 0; l < u.visemes.length; l++) {
|
|
5749
|
+
const d = u.visemes[l], c = d.startTime * 1e3, g = d.duration * 1e3, y = d.intensity;
|
|
5750
5750
|
a.push({
|
|
5751
5751
|
template: { name: "viseme" },
|
|
5752
|
-
ts: [
|
|
5752
|
+
ts: [c - Math.min(60, 2 * g / 3), c + Math.min(25, g / 2), c + g + Math.min(60, g / 2)],
|
|
5753
5753
|
vs: {
|
|
5754
|
-
["viseme_" +
|
|
5754
|
+
["viseme_" + d.viseme]: [null, y, 0]
|
|
5755
5755
|
}
|
|
5756
5756
|
});
|
|
5757
5757
|
}
|
|
5758
|
-
const
|
|
5759
|
-
this.audioPlaylist.push({ anim:
|
|
5758
|
+
const h = [...t.anim, ...a];
|
|
5759
|
+
this.audioPlaylist.push({ anim: h, audio: r }), this.onSubtitles = t.onSubtitles || null, this.resetLips(), t.mood && this.setMood(t.mood), this.playAudio();
|
|
5760
5760
|
}
|
|
5761
5761
|
/**
|
|
5762
5762
|
* Synthesize speech using external TTS service (Google Cloud, etc.)
|
|
@@ -5795,27 +5795,27 @@ class we {
|
|
|
5795
5795
|
if (n.status === 200 && s && s.audioContent) {
|
|
5796
5796
|
const o = this.b64ToArrayBuffer(s.audioContent), r = await this.audioCtx.decodeAudioData(o);
|
|
5797
5797
|
this.speakWithHands();
|
|
5798
|
-
const
|
|
5798
|
+
const u = [0];
|
|
5799
5799
|
let a = 0;
|
|
5800
|
-
t.text.forEach((
|
|
5801
|
-
if (
|
|
5802
|
-
let g =
|
|
5803
|
-
s.timepoints[a] && (g = s.timepoints[a].timeSeconds * 1e3, s.timepoints[a].markName === "" +
|
|
5800
|
+
t.text.forEach((d, c) => {
|
|
5801
|
+
if (c > 0) {
|
|
5802
|
+
let g = u[u.length - 1];
|
|
5803
|
+
s.timepoints[a] && (g = s.timepoints[a].timeSeconds * 1e3, s.timepoints[a].markName === "" + d.mark && a++), u.push(g);
|
|
5804
5804
|
}
|
|
5805
5805
|
});
|
|
5806
|
-
const
|
|
5807
|
-
|
|
5808
|
-
if (
|
|
5809
|
-
let g =
|
|
5810
|
-
|
|
5806
|
+
const h = [{ mark: 0, time: 0 }];
|
|
5807
|
+
u.forEach((d, c) => {
|
|
5808
|
+
if (c > 0) {
|
|
5809
|
+
let g = d - u[c - 1];
|
|
5810
|
+
h[c - 1].duration = g, h.push({ mark: c, time: d });
|
|
5811
5811
|
}
|
|
5812
5812
|
});
|
|
5813
5813
|
let l = 1e3 * r.duration;
|
|
5814
|
-
l > this.opt.ttsTrimEnd && (l = l - this.opt.ttsTrimEnd),
|
|
5815
|
-
const
|
|
5816
|
-
if (
|
|
5817
|
-
for (let g = 0; g <
|
|
5818
|
-
|
|
5814
|
+
l > this.opt.ttsTrimEnd && (l = l - this.opt.ttsTrimEnd), h[h.length - 1].duration = l - h[h.length - 1].time, t.anim.forEach((d) => {
|
|
5815
|
+
const c = h[d.mark];
|
|
5816
|
+
if (c)
|
|
5817
|
+
for (let g = 0; g < d.ts.length; g++)
|
|
5818
|
+
d.ts[g] = c.time + d.ts[g] * c.duration + this.opt.ttsTrimStart;
|
|
5819
5819
|
}), this.audioPlaylist.push({ anim: t.anim, audio: r }), this.onSubtitles = t.onSubtitles || null, this.resetLips(), t.mood && this.setMood(t.mood), this.playAudio();
|
|
5820
5820
|
} else
|
|
5821
5821
|
this.startSpeaking(!0);
|
|
@@ -5895,10 +5895,10 @@ class we {
|
|
|
5895
5895
|
}
|
|
5896
5896
|
if (!this.workletLoaded)
|
|
5897
5897
|
try {
|
|
5898
|
-
const r = this.audioCtx.audioWorklet.addModule(et.href),
|
|
5899
|
-
(a,
|
|
5898
|
+
const r = this.audioCtx.audioWorklet.addModule(et.href), u = new Promise(
|
|
5899
|
+
(a, h) => setTimeout(() => h(new Error("Worklet loading timed out")), 5e3)
|
|
5900
5900
|
);
|
|
5901
|
-
await Promise.race([r,
|
|
5901
|
+
await Promise.race([r, u]), this.workletLoaded = !0;
|
|
5902
5902
|
} catch (r) {
|
|
5903
5903
|
throw console.error("Failed to load audio worklet:", r), new Error("Failed to initialize streaming speech");
|
|
5904
5904
|
}
|
|
@@ -5911,8 +5911,8 @@ class we {
|
|
|
5911
5911
|
if (r.data.type === "playback-started" && (this.isSpeaking = !0, this.stateName = "speaking", this.streamWaitForAudioChunks && (this.streamAudioStartTime = this.animClock), this._processStreamLipsyncQueue(), this.speakWithHands(), this.onAudioStart))
|
|
5912
5912
|
try {
|
|
5913
5913
|
this.onAudioStart?.();
|
|
5914
|
-
} catch (
|
|
5915
|
-
console.error(
|
|
5914
|
+
} catch (u) {
|
|
5915
|
+
console.error(u);
|
|
5916
5916
|
}
|
|
5917
5917
|
if (r.data.type === "playback-ended" && (this._streamPause(), this.onAudioEnd))
|
|
5918
5918
|
try {
|
|
@@ -5932,9 +5932,9 @@ class we {
|
|
|
5932
5932
|
} catch {
|
|
5933
5933
|
}
|
|
5934
5934
|
if (this.resetLips(), this.lookAtCamera(500), t.mood && this.setMood(t.mood), this.onSubtitles = n || null, this.audioCtx.state === "suspended" || this.audioCtx.state === "interrupted") {
|
|
5935
|
-
const r = this.audioCtx.resume(),
|
|
5935
|
+
const r = this.audioCtx.resume(), u = new Promise((a, h) => setTimeout(() => h("p2"), 1e3));
|
|
5936
5936
|
try {
|
|
5937
|
-
await Promise.race([r,
|
|
5937
|
+
await Promise.race([r, u]);
|
|
5938
5938
|
} catch {
|
|
5939
5939
|
console.warn("Can't play audio. Web Audio API suspended. This is often due to calling some speak method before the first user action, which is typically prevented by the browser.");
|
|
5940
5940
|
return;
|
|
@@ -6031,18 +6031,18 @@ class we {
|
|
|
6031
6031
|
subtitles: [" " + n]
|
|
6032
6032
|
}
|
|
6033
6033
|
}), this.streamLipsyncType == "words")) {
|
|
6034
|
-
const r = this.streamLipsyncLang || this.avatar.lipsyncLang || this.opt.lipsyncLang,
|
|
6034
|
+
const r = this.streamLipsyncLang || this.avatar.lipsyncLang || this.opt.lipsyncLang, u = this.lipsyncPreProcessText(n, r), a = this.lipsyncWordsToVisemes(u, r);
|
|
6035
6035
|
if (a && a.visemes && a.visemes.length) {
|
|
6036
|
-
const
|
|
6037
|
-
let
|
|
6038
|
-
if (o = Math.min(o, a.visemes.length * 200),
|
|
6039
|
-
for (let
|
|
6040
|
-
const g = e + s + a.times[
|
|
6036
|
+
const h = a.times[a.visemes.length - 1] + a.durations[a.visemes.length - 1], l = Math.min(o, Math.max(0, o - a.visemes.length * 150));
|
|
6037
|
+
let d = 0.6 + this.convertRange(l, [0, o], [0, 0.4]);
|
|
6038
|
+
if (o = Math.min(o, a.visemes.length * 200), h > 0)
|
|
6039
|
+
for (let c = 0; c < a.visemes.length; c++) {
|
|
6040
|
+
const g = e + s + a.times[c] / h * o, y = a.durations[c] / h * o;
|
|
6041
6041
|
this.animQueue.push({
|
|
6042
6042
|
template: { name: "viseme" },
|
|
6043
6043
|
ts: [g - Math.min(60, 2 * y / 3), g + Math.min(25, y / 2), g + y + Math.min(60, y / 2)],
|
|
6044
6044
|
vs: {
|
|
6045
|
-
["viseme_" + a.visemes[
|
|
6045
|
+
["viseme_" + a.visemes[c]]: [null, a.visemes[c] === "PP" || a.visemes[c] === "FF" ? 0.9 : d, 0]
|
|
6046
6046
|
}
|
|
6047
6047
|
});
|
|
6048
6048
|
}
|
|
@@ -6133,7 +6133,7 @@ class we {
|
|
|
6133
6133
|
*/
|
|
6134
6134
|
lookAtCamera(t) {
|
|
6135
6135
|
let e;
|
|
6136
|
-
if (this.speakTo && (e = new f.Vector3(), this.speakTo.objectLeftEye?.isObject3D ? (this.speakTo.armature.objectHead, this.speakTo.objectLeftEye.updateMatrixWorld(!0), this.speakTo.objectRightEye.updateMatrixWorld(!0),
|
|
6136
|
+
if (this.speakTo && (e = new f.Vector3(), this.speakTo.objectLeftEye?.isObject3D ? (this.speakTo.armature.objectHead, this.speakTo.objectLeftEye.updateMatrixWorld(!0), this.speakTo.objectRightEye.updateMatrixWorld(!0), ee.setFromMatrixPosition(this.speakTo.objectLeftEye.matrixWorld), ie.setFromMatrixPosition(this.speakTo.objectRightEye.matrixWorld), e.addVectors(ee, ie).divideScalar(2)) : this.speakTo.isObject3D ? this.speakTo.getWorldPosition(e) : this.speakTo.isVector3 ? e.set(this.speakTo) : this.speakTo.x && this.speakTo.y && this.speakTo.z && e.set(this.speakTo.x, this.speakTo.y, this.speakTo.z)), !e) {
|
|
6137
6137
|
if (this.avatar.hasOwnProperty("avatarIgnoreCamera")) {
|
|
6138
6138
|
if (this.avatar.avatarIgnoreCamera) {
|
|
6139
6139
|
this.lookAhead(t);
|
|
@@ -6146,22 +6146,22 @@ class we {
|
|
|
6146
6146
|
this.lookAt(null, null, t);
|
|
6147
6147
|
return;
|
|
6148
6148
|
}
|
|
6149
|
-
this.objectLeftEye.updateMatrixWorld(!0), this.objectRightEye.updateMatrixWorld(!0),
|
|
6150
|
-
const i = new f.Vector3().subVectors(e,
|
|
6151
|
-
|
|
6152
|
-
const r = new f.Quaternion().setFromEuler(
|
|
6153
|
-
|
|
6154
|
-
let a =
|
|
6149
|
+
this.objectLeftEye.updateMatrixWorld(!0), this.objectRightEye.updateMatrixWorld(!0), ee.setFromMatrixPosition(this.objectLeftEye.matrixWorld), ie.setFromMatrixPosition(this.objectRightEye.matrixWorld), ee.add(ie).divideScalar(2), U.copy(this.armature.quaternion), U.multiply(this.poseTarget.props["Hips.quaternion"]), U.multiply(this.poseTarget.props["Spine.quaternion"]), U.multiply(this.poseTarget.props["Spine1.quaternion"]), U.multiply(this.poseTarget.props["Spine2.quaternion"]), U.multiply(this.poseTarget.props["Neck.quaternion"]), U.multiply(this.poseTarget.props["Head.quaternion"]);
|
|
6150
|
+
const i = new f.Vector3().subVectors(e, ee).normalize(), n = Math.atan2(i.x, i.z), s = Math.asin(-i.y);
|
|
6151
|
+
E.set(s, n, 0, "YXZ");
|
|
6152
|
+
const r = new f.Quaternion().setFromEuler(E), u = new f.Quaternion().copy(r).multiply(U.clone().invert());
|
|
6153
|
+
E.setFromQuaternion(u, "YXZ");
|
|
6154
|
+
let a = E.x / (40 / 24) + 0.2, h = E.y / (9 / 4), l = Math.min(0.6, Math.max(-0.3, a)), d = Math.min(0.8, Math.max(-0.8, h)), c = (Math.random() - 0.5) / 4, g = (Math.random() - 0.5) / 4;
|
|
6155
6155
|
if (t) {
|
|
6156
|
-
let y = this.animQueue.findIndex((
|
|
6156
|
+
let y = this.animQueue.findIndex((L) => L.template.name === "lookat");
|
|
6157
6157
|
y !== -1 && this.animQueue.splice(y, 1);
|
|
6158
6158
|
const x = {
|
|
6159
6159
|
name: "lookat",
|
|
6160
6160
|
dt: [750, t],
|
|
6161
6161
|
vs: {
|
|
6162
|
-
bodyRotateX: [l +
|
|
6163
|
-
bodyRotateY: [
|
|
6164
|
-
eyesRotateX: [-3 *
|
|
6162
|
+
bodyRotateX: [l + c],
|
|
6163
|
+
bodyRotateY: [d + g],
|
|
6164
|
+
eyesRotateX: [-3 * c + 0.1],
|
|
6165
6165
|
eyesRotateY: [-5 * g],
|
|
6166
6166
|
browInnerUp: [[0, 0.7]],
|
|
6167
6167
|
mouthLeft: [[0, 0.7]],
|
|
@@ -6185,21 +6185,21 @@ class we {
|
|
|
6185
6185
|
this.objectLeftEye.updateMatrixWorld(!0), this.objectRightEye.updateMatrixWorld(!0);
|
|
6186
6186
|
const s = new f.Vector3().setFromMatrixPosition(this.objectLeftEye.matrixWorld), o = new f.Vector3().setFromMatrixPosition(this.objectRightEye.matrixWorld), r = new f.Vector3().addVectors(s, o).divideScalar(2);
|
|
6187
6187
|
r.project(this.camera);
|
|
6188
|
-
let
|
|
6189
|
-
t === null && (t =
|
|
6190
|
-
let
|
|
6191
|
-
x = Math.min(0.6, Math.max(-0.3, x)),
|
|
6192
|
-
let
|
|
6188
|
+
let u = (r.x + 1) / 2 * n.width + n.left, a = -(r.y - 1) / 2 * n.height + n.top;
|
|
6189
|
+
t === null && (t = u), e === null && (e = a), U.copy(this.armature.quaternion), U.multiply(this.poseTarget.props["Hips.quaternion"]), U.multiply(this.poseTarget.props["Spine.quaternion"]), U.multiply(this.poseTarget.props["Spine1.quaternion"]), U.multiply(this.poseTarget.props["Spine2.quaternion"]), U.multiply(this.poseTarget.props["Neck.quaternion"]), U.multiply(this.poseTarget.props["Head.quaternion"]), E.setFromQuaternion(U);
|
|
6190
|
+
let h = E.x / (40 / 24), l = E.y / (9 / 4), d = Math.min(0.4, Math.max(-0.4, this.camera.rotation.x)), c = Math.min(0.4, Math.max(-0.4, this.camera.rotation.y)), g = Math.max(window.innerWidth - u, u), y = Math.max(window.innerHeight - a, a), x = this.convertRange(e, [a - y, a + y], [-0.3, 0.6]) - h + d, L = this.convertRange(t, [u - g, u + g], [-0.8, 0.8]) - l + c;
|
|
6191
|
+
x = Math.min(0.6, Math.max(-0.3, x)), L = Math.min(0.8, Math.max(-0.8, L));
|
|
6192
|
+
let F = (Math.random() - 0.5) / 4, p = (Math.random() - 0.5) / 4;
|
|
6193
6193
|
if (i) {
|
|
6194
|
-
let z = this.animQueue.findIndex((
|
|
6194
|
+
let z = this.animQueue.findIndex((I) => I.template.name === "lookat");
|
|
6195
6195
|
z !== -1 && this.animQueue.splice(z, 1);
|
|
6196
6196
|
const C = {
|
|
6197
6197
|
name: "lookat",
|
|
6198
6198
|
dt: [750, i],
|
|
6199
6199
|
vs: {
|
|
6200
|
-
bodyRotateX: [x +
|
|
6201
|
-
bodyRotateY: [
|
|
6202
|
-
eyesRotateX: [-3 *
|
|
6200
|
+
bodyRotateX: [x + F],
|
|
6201
|
+
bodyRotateY: [L + p],
|
|
6202
|
+
eyesRotateX: [-3 * F + 0.1],
|
|
6203
6203
|
eyesRotateY: [-5 * p],
|
|
6204
6204
|
browInnerUp: [[0, 0.7]],
|
|
6205
6205
|
mouthLeft: [[0, 0.7]],
|
|
@@ -6226,10 +6226,10 @@ class we {
|
|
|
6226
6226
|
s.setFromCamera(n, this.camera);
|
|
6227
6227
|
const o = s.intersectObject(this.armature);
|
|
6228
6228
|
if (o.length > 0) {
|
|
6229
|
-
const r = o[0].point,
|
|
6230
|
-
this.objectLeftArm.getWorldPosition(
|
|
6231
|
-
const
|
|
6232
|
-
|
|
6229
|
+
const r = o[0].point, u = new f.Vector3(), a = new f.Vector3();
|
|
6230
|
+
this.objectLeftArm.getWorldPosition(u), this.objectRightArm.getWorldPosition(a);
|
|
6231
|
+
const h = u.distanceToSquared(r), l = a.distanceToSquared(r);
|
|
6232
|
+
h < l ? (this.ikSolve({
|
|
6233
6233
|
iterations: 20,
|
|
6234
6234
|
root: "LeftShoulder",
|
|
6235
6235
|
effector: "LeftHandMiddle1",
|
|
@@ -6250,8 +6250,8 @@ class we {
|
|
|
6250
6250
|
}, r, !1, 1e3), this.setValue("handFistRight", 0));
|
|
6251
6251
|
} else
|
|
6252
6252
|
["LeftArm", "LeftForeArm", "LeftHand", "RightArm", "RightForeArm", "RightHand"].forEach((r) => {
|
|
6253
|
-
let
|
|
6254
|
-
this.poseTarget.props[
|
|
6253
|
+
let u = r + ".quaternion";
|
|
6254
|
+
this.poseTarget.props[u].copy(this.getPoseTemplateProp(u)), this.poseTarget.props[u].t = this.animClock, this.poseTarget.props[u].d = 1e3;
|
|
6255
6255
|
});
|
|
6256
6256
|
return o.length > 0;
|
|
6257
6257
|
}
|
|
@@ -6370,21 +6370,21 @@ class we {
|
|
|
6370
6370
|
async playAnimation(t, e = null, i = 10, n = 0, s = 0.01, o = !1) {
|
|
6371
6371
|
if (!this.armature) return;
|
|
6372
6372
|
this.positionWasLocked = !o, o ? console.log("Position locking disabled for FBX animation:", t) : (this.lockAvatarPosition(), console.log("Position locked immediately before FBX animation:", t));
|
|
6373
|
-
let r = this.animClips.find((
|
|
6373
|
+
let r = this.animClips.find((u) => u.url === t + "-" + n);
|
|
6374
6374
|
if (r) {
|
|
6375
|
-
let
|
|
6376
|
-
|
|
6375
|
+
let u = this.animQueue.find((l) => l.template.name === "pose");
|
|
6376
|
+
u && (u.ts[0] = 1 / 0), Object.entries(r.pose.props).forEach((l) => {
|
|
6377
6377
|
this.poseBase.props[l[0]] = l[1].clone(), this.poseTarget.props[l[0]] = l[1].clone(), this.poseTarget.props[l[0]].t = 0, this.poseTarget.props[l[0]].d = 1e3;
|
|
6378
6378
|
}), this.mixer ? console.log("Using existing mixer for FBX animation, preserving morph targets") : (this.mixer = new f.AnimationMixer(this.armature), console.log("Created new mixer for FBX animation")), this.mixer.addEventListener("finished", this.stopAnimation.bind(this), { once: !0 });
|
|
6379
|
-
const a = Math.ceil(i / r.clip.duration),
|
|
6380
|
-
|
|
6379
|
+
const a = Math.ceil(i / r.clip.duration), h = this.mixer.clipAction(r.clip);
|
|
6380
|
+
h.setLoop(f.LoopRepeat, a), h.clampWhenFinished = !0, this.currentFBXAction = h;
|
|
6381
6381
|
try {
|
|
6382
|
-
|
|
6382
|
+
h.fadeIn(0.5).play(), console.log("FBX animation started successfully:", t);
|
|
6383
6383
|
} catch (l) {
|
|
6384
6384
|
console.warn("FBX animation failed to start:", l), this.stopAnimation();
|
|
6385
6385
|
return;
|
|
6386
6386
|
}
|
|
6387
|
-
if (
|
|
6387
|
+
if (h.getClip().tracks.length === 0) {
|
|
6388
6388
|
console.warn("FBX animation has no valid tracks, stopping"), this.stopAnimation();
|
|
6389
6389
|
return;
|
|
6390
6390
|
}
|
|
@@ -6395,58 +6395,58 @@ class we {
|
|
|
6395
6395
|
}
|
|
6396
6396
|
let a = !1;
|
|
6397
6397
|
try {
|
|
6398
|
-
const
|
|
6399
|
-
if (a =
|
|
6400
|
-
console.error(`FBX file not found at ${t}. Status: ${
|
|
6398
|
+
const d = await fetch(t, { method: "HEAD" });
|
|
6399
|
+
if (a = d.ok, !a) {
|
|
6400
|
+
console.error(`FBX file not found at ${t}. Status: ${d.status}`), console.error("Please check:"), console.error("1. File path is correct (note: path is case-sensitive)"), console.error("2. File exists in your public folder"), console.error("3. File is accessible (not blocked by server)");
|
|
6401
6401
|
return;
|
|
6402
6402
|
}
|
|
6403
|
-
} catch (
|
|
6404
|
-
console.warn(`Could not verify file existence for ${t}, attempting to load anyway:`,
|
|
6403
|
+
} catch (d) {
|
|
6404
|
+
console.warn(`Could not verify file existence for ${t}, attempting to load anyway:`, d);
|
|
6405
6405
|
}
|
|
6406
|
-
const
|
|
6406
|
+
const h = new ve();
|
|
6407
6407
|
let l;
|
|
6408
6408
|
try {
|
|
6409
|
-
l = await
|
|
6410
|
-
} catch (
|
|
6411
|
-
console.error(`Failed to load FBX animation from ${t}:`,
|
|
6412
|
-
message:
|
|
6409
|
+
l = await h.loadAsync(t, e);
|
|
6410
|
+
} catch (d) {
|
|
6411
|
+
console.error(`Failed to load FBX animation from ${t}:`, d), console.error("Error details:", {
|
|
6412
|
+
message: d.message,
|
|
6413
6413
|
url: t,
|
|
6414
6414
|
suggestion: "Make sure the file is a valid FBX file and the path is correct"
|
|
6415
|
-
}),
|
|
6415
|
+
}), d.message && d.message.includes("version number") && (console.error("FBX Loader Error: Cannot find version number"), console.error("This error usually means:"), console.error("1. The file is not a valid FBX file (might be GLB, corrupted, or wrong format)"), console.error("2. The file might be corrupted"), console.error("3. The file path might be incorrect"), console.error("4. The server returned an HTML error page instead of the FBX file"), console.error("5. The file might not exist at that path"), console.error(""), console.error("Solution: Please verify:"), console.error(` - File exists at: ${t}`), console.error(" - File is a valid FBX binary file"), console.error(" - File path matches your public folder structure"), console.error(" - File is not corrupted"));
|
|
6416
6416
|
try {
|
|
6417
|
-
const
|
|
6417
|
+
const c = await fetch(t), g = c.headers.get("content-type"), y = await c.text();
|
|
6418
6418
|
console.error("Response details:", {
|
|
6419
|
-
status:
|
|
6419
|
+
status: c.status,
|
|
6420
6420
|
contentType: g,
|
|
6421
6421
|
firstBytes: y.substring(0, 100),
|
|
6422
6422
|
isHTML: y.trim().startsWith("<!DOCTYPE") || y.trim().startsWith("<html")
|
|
6423
6423
|
}), (y.trim().startsWith("<!DOCTYPE") || y.trim().startsWith("<html")) && console.error("The server returned an HTML page instead of an FBX file. The file path is likely incorrect.");
|
|
6424
|
-
} catch (
|
|
6425
|
-
console.error("Could not fetch file for debugging:",
|
|
6424
|
+
} catch (c) {
|
|
6425
|
+
console.error("Could not fetch file for debugging:", c);
|
|
6426
6426
|
}
|
|
6427
6427
|
return;
|
|
6428
6428
|
}
|
|
6429
6429
|
if (l && l.animations && l.animations[n]) {
|
|
6430
|
-
let
|
|
6431
|
-
const
|
|
6432
|
-
|
|
6430
|
+
let d = l.animations[n];
|
|
6431
|
+
const c = {};
|
|
6432
|
+
d.tracks.forEach((y) => {
|
|
6433
6433
|
y.name = y.name.replaceAll("mixamorig", "");
|
|
6434
6434
|
const x = y.name.split(".");
|
|
6435
6435
|
if (x[1] === "position") {
|
|
6436
|
-
for (let
|
|
6437
|
-
y.values[
|
|
6438
|
-
|
|
6439
|
-
} else x[1] === "quaternion" ?
|
|
6436
|
+
for (let L = 0; L < y.values.length; L++)
|
|
6437
|
+
y.values[L] = y.values[L] * s;
|
|
6438
|
+
c[y.name] = new f.Vector3(y.values[0], y.values[1], y.values[2]);
|
|
6439
|
+
} else x[1] === "quaternion" ? c[y.name] = new f.Quaternion(y.values[0], y.values[1], y.values[2], y.values[3]) : x[1] === "rotation" && (c[x[0] + ".quaternion"] = new f.Quaternion().setFromEuler(new f.Euler(y.values[0], y.values[1], y.values[2], "XYZ")).normalize());
|
|
6440
6440
|
});
|
|
6441
|
-
const g = { props:
|
|
6442
|
-
|
|
6441
|
+
const g = { props: c };
|
|
6442
|
+
c["Hips.position"] && (c["Hips.position"].y < 0.5 ? g.lying = !0 : g.standing = !0), this.animClips.push({
|
|
6443
6443
|
url: t + "-" + n,
|
|
6444
|
-
clip:
|
|
6444
|
+
clip: d,
|
|
6445
6445
|
pose: g
|
|
6446
6446
|
}), this.playAnimation(t, e, i, n, s);
|
|
6447
6447
|
} else {
|
|
6448
|
-
const
|
|
6449
|
-
console.error(
|
|
6448
|
+
const d = "Animation " + t + " (ndx=" + n + ") not found";
|
|
6449
|
+
console.error(d), l && l.animations ? console.error(`FBX file loaded but has ${l.animations.length} animation(s), requested index ${n}`) : console.error(l ? "FBX file loaded but contains no animations" : "FBX file failed to load or is invalid");
|
|
6450
6450
|
}
|
|
6451
6451
|
}
|
|
6452
6452
|
}
|
|
@@ -6472,25 +6472,25 @@ class we {
|
|
|
6472
6472
|
if (!this.armature) return;
|
|
6473
6473
|
let o = this.poseTemplates[t];
|
|
6474
6474
|
if (!o) {
|
|
6475
|
-
const r = this.animPoses.find((
|
|
6475
|
+
const r = this.animPoses.find((u) => u.url === t + "-" + n);
|
|
6476
6476
|
r && (o = r.pose);
|
|
6477
6477
|
}
|
|
6478
6478
|
if (o) {
|
|
6479
6479
|
this.poseName = t, this.mixer = null;
|
|
6480
|
-
let r = this.animQueue.find((
|
|
6480
|
+
let r = this.animQueue.find((u) => u.template.name === "pose");
|
|
6481
6481
|
r && (r.ts[0] = this.animClock + i * 1e3 + 2e3), this.setPoseFromTemplate(o);
|
|
6482
6482
|
} else {
|
|
6483
|
-
let
|
|
6484
|
-
if (
|
|
6485
|
-
let a =
|
|
6486
|
-
const
|
|
6487
|
-
a.tracks.forEach((
|
|
6488
|
-
|
|
6489
|
-
const
|
|
6490
|
-
|
|
6483
|
+
let u = await new ve().loadAsync(t, e);
|
|
6484
|
+
if (u && u.animations && u.animations[n]) {
|
|
6485
|
+
let a = u.animations[n];
|
|
6486
|
+
const h = {};
|
|
6487
|
+
a.tracks.forEach((d) => {
|
|
6488
|
+
d.name = d.name.replaceAll("mixamorig", "");
|
|
6489
|
+
const c = d.name.split(".");
|
|
6490
|
+
c[1] === "position" ? h[d.name] = new f.Vector3(d.values[0] * s, d.values[1] * s, d.values[2] * s) : c[1] === "quaternion" ? h[d.name] = new f.Quaternion(d.values[0], d.values[1], d.values[2], d.values[3]) : c[1] === "rotation" && (h[c[0] + ".quaternion"] = new f.Quaternion().setFromEuler(new f.Euler(d.values[0], d.values[1], d.values[2], "XYZ")).normalize());
|
|
6491
6491
|
});
|
|
6492
|
-
const l = { props:
|
|
6493
|
-
|
|
6492
|
+
const l = { props: h };
|
|
6493
|
+
h["Hips.position"] && (h["Hips.position"].y < 0.5 ? l.lying = !0 : l.standing = !0), this.animPoses.push({
|
|
6494
6494
|
url: t + "-" + n,
|
|
6495
6495
|
pose: l
|
|
6496
6496
|
}), this.playPose(t, e, i, n, s);
|
|
@@ -6519,10 +6519,10 @@ class we {
|
|
|
6519
6519
|
let s = this.gestureTemplates[t];
|
|
6520
6520
|
if (s) {
|
|
6521
6521
|
this.gestureTimeout && (clearTimeout(this.gestureTimeout), this.gestureTimeout = null);
|
|
6522
|
-
let r = this.animQueue.findIndex((
|
|
6523
|
-
r !== -1 && (this.animQueue[r].ts = this.animQueue[r].ts.map((
|
|
6524
|
-
for (let [
|
|
6525
|
-
a.t = this.animClock, a.d = n, this.poseTarget.props.hasOwnProperty(
|
|
6522
|
+
let r = this.animQueue.findIndex((u) => u.template.name === "talkinghands");
|
|
6523
|
+
r !== -1 && (this.animQueue[r].ts = this.animQueue[r].ts.map((u) => 0)), this.gesture = this.propsToThreeObjects(s), i && (this.gesture = this.mirrorPose(this.gesture)), t === "namaste" && this.avatar.body === "M" && (this.gesture["RightArm.quaternion"].rotateTowards(new f.Quaternion(0, 1, 0, 0), -0.25), this.gesture["LeftArm.quaternion"].rotateTowards(new f.Quaternion(0, 1, 0, 0), -0.25));
|
|
6524
|
+
for (let [u, a] of Object.entries(this.gesture))
|
|
6525
|
+
a.t = this.animClock, a.d = n, this.poseTarget.props.hasOwnProperty(u) && (this.poseTarget.props[u].copy(a), this.poseTarget.props[u].t = this.animClock, this.poseTarget.props[u].d = n);
|
|
6526
6526
|
e && Number.isFinite(e) && (this.gestureTimeout = setTimeout(this.stopGesture.bind(this, n), 1e3 * e));
|
|
6527
6527
|
}
|
|
6528
6528
|
let o = this.animEmojis[t];
|
|
@@ -6530,15 +6530,15 @@ class we {
|
|
|
6530
6530
|
this.lookAtCamera(500);
|
|
6531
6531
|
const r = this.animFactory(o);
|
|
6532
6532
|
if (r.gesture = !0, e && Number.isFinite(e)) {
|
|
6533
|
-
const
|
|
6534
|
-
if (e * 1e3 -
|
|
6535
|
-
const
|
|
6536
|
-
for (let y = 1; y < r.ts.length; y++)
|
|
6537
|
-
const
|
|
6538
|
-
r.ts = r.ts.map((y, x,
|
|
6533
|
+
const u = r.ts[0], h = r.ts[r.ts.length - 1] - u;
|
|
6534
|
+
if (e * 1e3 - h > 0) {
|
|
6535
|
+
const d = [];
|
|
6536
|
+
for (let y = 1; y < r.ts.length; y++) d.push(r.ts[y] - r.ts[y - 1]);
|
|
6537
|
+
const c = o.template?.rescale || d.map((y) => y / h), g = e * 1e3 - h;
|
|
6538
|
+
r.ts = r.ts.map((y, x, L) => x === 0 ? u : L[x - 1] + d[x - 1] + c[x - 1] * g);
|
|
6539
6539
|
} else {
|
|
6540
|
-
const
|
|
6541
|
-
r.ts = r.ts.map((
|
|
6540
|
+
const d = e * 1e3 / h;
|
|
6541
|
+
r.ts = r.ts.map((c) => u + d * (c - u));
|
|
6542
6542
|
}
|
|
6543
6543
|
}
|
|
6544
6544
|
this.animQueue.push(r);
|
|
@@ -6568,21 +6568,21 @@ class we {
|
|
|
6568
6568
|
* @param {numeric} [d=null] If set, apply in d milliseconds
|
|
6569
6569
|
*/
|
|
6570
6570
|
ikSolve(t, e = null, i = !1, n = null) {
|
|
6571
|
-
const s = new f.Vector3(), o = new f.Vector3(), r = new f.Vector3(),
|
|
6572
|
-
|
|
6571
|
+
const s = new f.Vector3(), o = new f.Vector3(), r = new f.Vector3(), u = new f.Vector3(), a = new f.Quaternion(), h = new f.Vector3(), l = new f.Vector3(), d = new f.Vector3(), c = this.ikMesh.getObjectByName(t.root);
|
|
6572
|
+
c.position.setFromMatrixPosition(this.armature.getObjectByName(t.root).matrixWorld), c.quaternion.setFromRotationMatrix(this.armature.getObjectByName(t.root).matrixWorld), e && i && e.applyQuaternion(this.armature.quaternion).add(c.position);
|
|
6573
6573
|
const g = this.ikMesh.getObjectByName(t.effector), y = t.links;
|
|
6574
|
-
y.forEach((
|
|
6575
|
-
|
|
6576
|
-
}),
|
|
6574
|
+
y.forEach((L) => {
|
|
6575
|
+
L.bone = this.ikMesh.getObjectByName(L.link), L.bone.quaternion.copy(this.getPoseTemplateProp(L.link + ".quaternion"));
|
|
6576
|
+
}), c.updateMatrixWorld(!0);
|
|
6577
6577
|
const x = t.iterations || 10;
|
|
6578
6578
|
if (e)
|
|
6579
|
-
for (let
|
|
6580
|
-
let
|
|
6579
|
+
for (let L = 0; L < x; L++) {
|
|
6580
|
+
let F = !1;
|
|
6581
6581
|
for (let p = 0, z = y.length; p < z; p++) {
|
|
6582
6582
|
const C = y[p].bone;
|
|
6583
|
-
C.matrixWorld.decompose(
|
|
6584
|
-
let
|
|
6585
|
-
|
|
6583
|
+
C.matrixWorld.decompose(u, a, h), a.invert(), o.setFromMatrixPosition(g.matrixWorld), r.subVectors(o, u), r.applyQuaternion(a), r.normalize(), s.subVectors(e, u), s.applyQuaternion(a), s.normalize();
|
|
6584
|
+
let I = s.dot(r);
|
|
6585
|
+
I > 1 ? I = 1 : I < -1 && (I = -1), I = Math.acos(I), !(I < 1e-5) && (y[p].minAngle !== void 0 && I < y[p].minAngle && (I = y[p].minAngle), y[p].maxAngle !== void 0 && I > y[p].maxAngle && (I = y[p].maxAngle), l.crossVectors(r, s), l.normalize(), U.setFromAxisAngle(l, I), C.quaternion.multiply(U), C.rotation.setFromVector3(d.setFromEuler(C.rotation).clamp(new f.Vector3(
|
|
6586
6586
|
y[p].minx !== void 0 ? y[p].minx : -1 / 0,
|
|
6587
6587
|
y[p].miny !== void 0 ? y[p].miny : -1 / 0,
|
|
6588
6588
|
y[p].minz !== void 0 ? y[p].minz : -1 / 0
|
|
@@ -6590,12 +6590,12 @@ class we {
|
|
|
6590
6590
|
y[p].maxx !== void 0 ? y[p].maxx : 1 / 0,
|
|
6591
6591
|
y[p].maxy !== void 0 ? y[p].maxy : 1 / 0,
|
|
6592
6592
|
y[p].maxz !== void 0 ? y[p].maxz : 1 / 0
|
|
6593
|
-
))), C.updateMatrixWorld(!0),
|
|
6593
|
+
))), C.updateMatrixWorld(!0), F = !0);
|
|
6594
6594
|
}
|
|
6595
|
-
if (!
|
|
6595
|
+
if (!F) break;
|
|
6596
6596
|
}
|
|
6597
|
-
n && y.forEach((
|
|
6598
|
-
this.poseTarget.props[
|
|
6597
|
+
n && y.forEach((L) => {
|
|
6598
|
+
this.poseTarget.props[L.link + ".quaternion"].copy(L.bone.quaternion), this.poseTarget.props[L.link + ".quaternion"].t = this.animClock, this.poseTarget.props[L.link + ".quaternion"].d = n;
|
|
6599
6599
|
});
|
|
6600
6600
|
}
|
|
6601
6601
|
/**
|
|
@@ -6605,7 +6605,7 @@ class we {
|
|
|
6605
6605
|
this.isRunning = !1, this.stop(), this.stopSpeaking(), this.streamStop(), this.isAvatarOnly ? this.armature && (this.armature.parent && this.armature.parent.remove(this.armature), this.clearThree(this.armature)) : (this.clearThree(this.scene), this.resizeobserver.disconnect(), this.renderer && (this.renderer.dispose(), this.renderer.domElement && this.renderer.domElement.parentNode && this.renderer.domElement.parentNode.removeChild(this.renderer.domElement), this.renderer = null)), this.clearThree(this.ikMesh), this.dynamicbones.dispose();
|
|
6606
6606
|
}
|
|
6607
6607
|
}
|
|
6608
|
-
const
|
|
6608
|
+
const ae = {
|
|
6609
6609
|
apiKey: "sk_ace57ef3ef65a92b9d3bee2a00183b78ca790bc3e10964f2",
|
|
6610
6610
|
// Replace with your actual API key (should start with sk_)
|
|
6611
6611
|
endpoint: "https://api.elevenlabs.io/v1/text-to-speech",
|
|
@@ -6645,26 +6645,26 @@ const le = {
|
|
|
6645
6645
|
// Male, English - Powerful
|
|
6646
6646
|
}
|
|
6647
6647
|
};
|
|
6648
|
-
function
|
|
6648
|
+
function be() {
|
|
6649
6649
|
return {
|
|
6650
6650
|
service: "elevenlabs",
|
|
6651
|
-
endpoint:
|
|
6652
|
-
apiKey:
|
|
6653
|
-
defaultVoice:
|
|
6654
|
-
voices:
|
|
6651
|
+
endpoint: ae.endpoint,
|
|
6652
|
+
apiKey: ae.apiKey,
|
|
6653
|
+
defaultVoice: ae.defaultVoice,
|
|
6654
|
+
voices: ae.voices
|
|
6655
6655
|
};
|
|
6656
6656
|
}
|
|
6657
6657
|
function mt() {
|
|
6658
|
-
const
|
|
6659
|
-
return Object.entries(
|
|
6658
|
+
const N = be(), t = [];
|
|
6659
|
+
return Object.entries(N.voices).forEach(([e, i]) => {
|
|
6660
6660
|
t.push({
|
|
6661
6661
|
value: i,
|
|
6662
|
-
label: `${e.charAt(0).toUpperCase() + e.slice(1)} (${
|
|
6662
|
+
label: `${e.charAt(0).toUpperCase() + e.slice(1)} (${N.service})`
|
|
6663
6663
|
});
|
|
6664
6664
|
}), t;
|
|
6665
6665
|
}
|
|
6666
|
-
const ze =
|
|
6667
|
-
avatarUrl:
|
|
6666
|
+
const ze = fe(({
|
|
6667
|
+
avatarUrl: N = "/avatars/brunette.glb",
|
|
6668
6668
|
avatarBody: t = "F",
|
|
6669
6669
|
mood: e = "neutral",
|
|
6670
6670
|
ttsLang: i = "en",
|
|
@@ -6672,135 +6672,135 @@ const ze = ye(({
|
|
|
6672
6672
|
ttsVoice: s = null,
|
|
6673
6673
|
ttsApiKey: o = null,
|
|
6674
6674
|
bodyMovement: r = "idle",
|
|
6675
|
-
movementIntensity:
|
|
6675
|
+
movementIntensity: u = 0.5,
|
|
6676
6676
|
showFullAvatar: a = !0,
|
|
6677
|
-
cameraView:
|
|
6677
|
+
cameraView: h = "upper",
|
|
6678
6678
|
onReady: l = () => {
|
|
6679
6679
|
},
|
|
6680
|
-
onLoading:
|
|
6680
|
+
onLoading: d = () => {
|
|
6681
6681
|
},
|
|
6682
|
-
onError:
|
|
6682
|
+
onError: c = () => {
|
|
6683
6683
|
},
|
|
6684
6684
|
className: g = "",
|
|
6685
6685
|
style: y = {},
|
|
6686
6686
|
animations: x = {}
|
|
6687
|
-
},
|
|
6688
|
-
const
|
|
6689
|
-
|
|
6687
|
+
}, L) => {
|
|
6688
|
+
const F = V(null), p = V(null), z = V(a), [C, I] = re(!0), [B, D] = re(null), [X, oe] = re(!1);
|
|
6689
|
+
le(() => {
|
|
6690
6690
|
z.current = a;
|
|
6691
6691
|
}, [a]);
|
|
6692
|
-
const
|
|
6693
|
-
let
|
|
6694
|
-
|
|
6692
|
+
const S = be(), P = n || S.service;
|
|
6693
|
+
let O;
|
|
6694
|
+
P === "browser" ? O = {
|
|
6695
6695
|
service: "browser",
|
|
6696
6696
|
endpoint: "",
|
|
6697
6697
|
apiKey: null,
|
|
6698
6698
|
defaultVoice: "Google US English"
|
|
6699
|
-
} :
|
|
6699
|
+
} : P === "elevenlabs" ? O = {
|
|
6700
6700
|
service: "elevenlabs",
|
|
6701
6701
|
endpoint: "https://api.elevenlabs.io/v1/text-to-speech",
|
|
6702
|
-
apiKey: o ||
|
|
6703
|
-
defaultVoice: s ||
|
|
6704
|
-
voices:
|
|
6705
|
-
} :
|
|
6702
|
+
apiKey: o || S.apiKey,
|
|
6703
|
+
defaultVoice: s || S.defaultVoice || ae.defaultVoice,
|
|
6704
|
+
voices: S.voices || ae.voices
|
|
6705
|
+
} : P === "deepgram" ? O = {
|
|
6706
6706
|
service: "deepgram",
|
|
6707
6707
|
endpoint: "https://api.deepgram.com/v1/speak",
|
|
6708
|
-
apiKey: o ||
|
|
6709
|
-
defaultVoice: s ||
|
|
6710
|
-
voices:
|
|
6711
|
-
} :
|
|
6712
|
-
...
|
|
6708
|
+
apiKey: o || S.apiKey,
|
|
6709
|
+
defaultVoice: s || S.defaultVoice || Se.defaultVoice,
|
|
6710
|
+
voices: S.voices || Se.voices
|
|
6711
|
+
} : O = {
|
|
6712
|
+
...S,
|
|
6713
6713
|
// Override API key if provided via props
|
|
6714
|
-
apiKey: o !== null ? o :
|
|
6714
|
+
apiKey: o !== null ? o : S.apiKey
|
|
6715
6715
|
};
|
|
6716
6716
|
const W = {
|
|
6717
|
-
url:
|
|
6717
|
+
url: N,
|
|
6718
6718
|
body: t,
|
|
6719
6719
|
avatarMood: e,
|
|
6720
|
-
ttsLang:
|
|
6721
|
-
ttsVoice: s ||
|
|
6720
|
+
ttsLang: P === "browser" ? "en-US" : i,
|
|
6721
|
+
ttsVoice: s || O.defaultVoice,
|
|
6722
6722
|
lipsyncLang: "en",
|
|
6723
6723
|
showFullAvatar: a,
|
|
6724
6724
|
bodyMovement: r,
|
|
6725
|
-
movementIntensity:
|
|
6726
|
-
},
|
|
6727
|
-
ttsEndpoint:
|
|
6728
|
-
ttsApikey:
|
|
6729
|
-
ttsService:
|
|
6725
|
+
movementIntensity: u
|
|
6726
|
+
}, _ = {
|
|
6727
|
+
ttsEndpoint: O.endpoint,
|
|
6728
|
+
ttsApikey: O.apiKey,
|
|
6729
|
+
ttsService: P,
|
|
6730
6730
|
lipsyncModules: ["en"],
|
|
6731
|
-
cameraView:
|
|
6732
|
-
},
|
|
6733
|
-
if (!(!
|
|
6731
|
+
cameraView: h
|
|
6732
|
+
}, K = M(async () => {
|
|
6733
|
+
if (!(!F.current || p.current))
|
|
6734
6734
|
try {
|
|
6735
|
-
if (
|
|
6736
|
-
if (
|
|
6737
|
-
const T = Math.min(100, Math.round(
|
|
6738
|
-
|
|
6735
|
+
if (I(!0), D(null), p.current = new we(F.current, _), p.current.controls && (p.current.controls.enableRotate = !1, p.current.controls.enableZoom = !1, p.current.controls.enablePan = !1, p.current.controls.enableDamping = !1), x && Object.keys(x).length > 0 && (p.current.customAnimations = x), await p.current.showAvatar(W, (H) => {
|
|
6736
|
+
if (H.lengthComputable) {
|
|
6737
|
+
const T = Math.min(100, Math.round(H.loaded / H.total * 100));
|
|
6738
|
+
d(T);
|
|
6739
6739
|
}
|
|
6740
|
-
}), await new Promise((
|
|
6740
|
+
}), await new Promise((H) => {
|
|
6741
6741
|
const T = () => {
|
|
6742
|
-
p.current.lipsync && Object.keys(p.current.lipsync).length > 0 ?
|
|
6742
|
+
p.current.lipsync && Object.keys(p.current.lipsync).length > 0 ? H() : setTimeout(T, 100);
|
|
6743
6743
|
};
|
|
6744
6744
|
T();
|
|
6745
6745
|
}), p.current && p.current.setShowFullAvatar)
|
|
6746
6746
|
try {
|
|
6747
6747
|
p.current.setShowFullAvatar(a);
|
|
6748
|
-
} catch (
|
|
6749
|
-
console.warn("Error setting full body mode on initialization:",
|
|
6748
|
+
} catch (H) {
|
|
6749
|
+
console.warn("Error setting full body mode on initialization:", H);
|
|
6750
6750
|
}
|
|
6751
|
-
p.current && p.current.controls && (p.current.controls.enableRotate = !1, p.current.controls.enableZoom = !1, p.current.controls.enablePan = !1, p.current.controls.enableDamping = !1, p.current.controls.update()),
|
|
6752
|
-
const
|
|
6751
|
+
p.current && p.current.controls && (p.current.controls.enableRotate = !1, p.current.controls.enableZoom = !1, p.current.controls.enablePan = !1, p.current.controls.enableDamping = !1, p.current.controls.update()), I(!1), oe(!0), l(p.current);
|
|
6752
|
+
const k = () => {
|
|
6753
6753
|
document.visibilityState === "visible" ? p.current?.start() : p.current?.stop();
|
|
6754
6754
|
};
|
|
6755
|
-
return document.addEventListener("visibilitychange",
|
|
6756
|
-
document.removeEventListener("visibilitychange",
|
|
6755
|
+
return document.addEventListener("visibilitychange", k), () => {
|
|
6756
|
+
document.removeEventListener("visibilitychange", k);
|
|
6757
6757
|
};
|
|
6758
|
-
} catch (
|
|
6759
|
-
console.error("Error initializing TalkingHead:",
|
|
6758
|
+
} catch (R) {
|
|
6759
|
+
console.error("Error initializing TalkingHead:", R), D(R.message || "Failed to initialize avatar"), I(!1), c(R);
|
|
6760
6760
|
}
|
|
6761
|
-
}, [
|
|
6762
|
-
|
|
6761
|
+
}, [N, t, e, i, n, s, o, a, r, u, h]);
|
|
6762
|
+
le(() => (K(), () => {
|
|
6763
6763
|
p.current && (p.current.stop(), p.current.dispose(), p.current = null);
|
|
6764
|
-
}), [
|
|
6765
|
-
if (!
|
|
6766
|
-
const
|
|
6767
|
-
for (const T of
|
|
6764
|
+
}), [K]), le(() => {
|
|
6765
|
+
if (!F.current || !p.current) return;
|
|
6766
|
+
const R = new ResizeObserver((H) => {
|
|
6767
|
+
for (const T of H)
|
|
6768
6768
|
p.current && p.current.onResize && p.current.onResize();
|
|
6769
6769
|
});
|
|
6770
|
-
|
|
6771
|
-
const
|
|
6770
|
+
R.observe(F.current);
|
|
6771
|
+
const k = () => {
|
|
6772
6772
|
p.current && p.current.onResize && p.current.onResize();
|
|
6773
6773
|
};
|
|
6774
|
-
return window.addEventListener("resize",
|
|
6775
|
-
|
|
6774
|
+
return window.addEventListener("resize", k), () => {
|
|
6775
|
+
R.disconnect(), window.removeEventListener("resize", k);
|
|
6776
6776
|
};
|
|
6777
|
-
}, [
|
|
6778
|
-
const
|
|
6777
|
+
}, [X]);
|
|
6778
|
+
const se = M(async () => {
|
|
6779
6779
|
if (p.current && p.current.audioCtx)
|
|
6780
6780
|
try {
|
|
6781
6781
|
(p.current.audioCtx.state === "suspended" || p.current.audioCtx.state === "interrupted") && (await p.current.audioCtx.resume(), console.log("Audio context resumed"));
|
|
6782
|
-
} catch (
|
|
6783
|
-
console.warn("Failed to resume audio context:",
|
|
6782
|
+
} catch (R) {
|
|
6783
|
+
console.warn("Failed to resume audio context:", R);
|
|
6784
6784
|
}
|
|
6785
|
-
}, []),
|
|
6786
|
-
if (p.current &&
|
|
6785
|
+
}, []), pe = M(async (R, k = {}) => {
|
|
6786
|
+
if (p.current && X)
|
|
6787
6787
|
try {
|
|
6788
|
-
await
|
|
6789
|
-
const
|
|
6790
|
-
...
|
|
6791
|
-
lipsyncLang:
|
|
6788
|
+
await se();
|
|
6789
|
+
const H = {
|
|
6790
|
+
...k,
|
|
6791
|
+
lipsyncLang: k.lipsyncLang || W.lipsyncLang || "en"
|
|
6792
6792
|
};
|
|
6793
|
-
if (
|
|
6793
|
+
if (k.onSpeechEnd && p.current) {
|
|
6794
6794
|
const T = p.current;
|
|
6795
|
-
let
|
|
6796
|
-
const
|
|
6797
|
-
let
|
|
6798
|
-
|
|
6799
|
-
if (
|
|
6800
|
-
if (
|
|
6801
|
-
|
|
6795
|
+
let Y = null, te = 0;
|
|
6796
|
+
const ye = 1200;
|
|
6797
|
+
let he = !1;
|
|
6798
|
+
Y = setInterval(() => {
|
|
6799
|
+
if (te++, te > ye) {
|
|
6800
|
+
if (Y && (clearInterval(Y), Y = null), !he) {
|
|
6801
|
+
he = !0;
|
|
6802
6802
|
try {
|
|
6803
|
-
|
|
6803
|
+
k.onSpeechEnd();
|
|
6804
6804
|
} catch (Re) {
|
|
6805
6805
|
console.error("Error in onSpeechEnd callback (timeout):", Re);
|
|
6806
6806
|
}
|
|
@@ -6808,11 +6808,11 @@ const ze = ye(({
|
|
|
6808
6808
|
return;
|
|
6809
6809
|
}
|
|
6810
6810
|
const He = !T.speechQueue || T.speechQueue.length === 0, Te = !T.audioPlaylist || T.audioPlaylist.length === 0;
|
|
6811
|
-
T && T.isSpeaking === !1 && He && Te && T.isAudioPlaying === !1 && !
|
|
6812
|
-
if (T && T.isSpeaking === !1 && (!T.speechQueue || T.speechQueue.length === 0) && (!T.audioPlaylist || T.audioPlaylist.length === 0) && T.isAudioPlaying === !1 && !
|
|
6813
|
-
|
|
6811
|
+
T && T.isSpeaking === !1 && He && Te && T.isAudioPlaying === !1 && !he && setTimeout(() => {
|
|
6812
|
+
if (T && T.isSpeaking === !1 && (!T.speechQueue || T.speechQueue.length === 0) && (!T.audioPlaylist || T.audioPlaylist.length === 0) && T.isAudioPlaying === !1 && !he) {
|
|
6813
|
+
he = !0, Y && (clearInterval(Y), Y = null);
|
|
6814
6814
|
try {
|
|
6815
|
-
|
|
6815
|
+
k.onSpeechEnd();
|
|
6816
6816
|
} catch (Me) {
|
|
6817
6817
|
console.error("Error in onSpeechEnd callback:", Me);
|
|
6818
6818
|
}
|
|
@@ -6820,124 +6820,124 @@ const ze = ye(({
|
|
|
6820
6820
|
}, 100);
|
|
6821
6821
|
}, 100);
|
|
6822
6822
|
}
|
|
6823
|
-
p.current.lipsync && Object.keys(p.current.lipsync).length > 0 ? (p.current.setSlowdownRate && p.current.setSlowdownRate(1.05), p.current.speakText(
|
|
6824
|
-
await
|
|
6823
|
+
p.current.lipsync && Object.keys(p.current.lipsync).length > 0 ? (p.current.setSlowdownRate && p.current.setSlowdownRate(1.05), p.current.speakText(R, H)) : setTimeout(async () => {
|
|
6824
|
+
await se(), p.current && p.current.lipsync && (p.current.setSlowdownRate && p.current.setSlowdownRate(1.05), p.current.speakText(R, H));
|
|
6825
6825
|
}, 100);
|
|
6826
|
-
} catch (
|
|
6827
|
-
console.error("Error speaking text:",
|
|
6826
|
+
} catch (H) {
|
|
6827
|
+
console.error("Error speaking text:", H), D(H.message || "Failed to speak text");
|
|
6828
6828
|
}
|
|
6829
|
-
}, [
|
|
6829
|
+
}, [X, se, W.lipsyncLang]), ue = M(() => {
|
|
6830
6830
|
p.current && (p.current.stopSpeaking(), p.current.setSlowdownRate && p.current.setSlowdownRate(1));
|
|
6831
|
-
}, []),
|
|
6832
|
-
p.current && p.current.setMood(
|
|
6833
|
-
}, []),
|
|
6834
|
-
p.current && p.current.setSlowdownRate && p.current.setSlowdownRate(
|
|
6835
|
-
}, []),
|
|
6831
|
+
}, []), ge = M((R) => {
|
|
6832
|
+
p.current && p.current.setMood(R);
|
|
6833
|
+
}, []), Q = M((R) => {
|
|
6834
|
+
p.current && p.current.setSlowdownRate && p.current.setSlowdownRate(R);
|
|
6835
|
+
}, []), b = M((R, k = !1) => {
|
|
6836
6836
|
if (p.current && p.current.playAnimation) {
|
|
6837
|
-
if (x && x[
|
|
6837
|
+
if (x && x[R] && (R = x[R]), p.current.setShowFullAvatar)
|
|
6838
6838
|
try {
|
|
6839
6839
|
p.current.setShowFullAvatar(z.current);
|
|
6840
6840
|
} catch (T) {
|
|
6841
6841
|
console.warn("Error setting full body mode:", T);
|
|
6842
6842
|
}
|
|
6843
|
-
if (
|
|
6843
|
+
if (R.includes("."))
|
|
6844
6844
|
try {
|
|
6845
|
-
p.current.playAnimation(
|
|
6845
|
+
p.current.playAnimation(R, null, 10, 0, 0.01, k);
|
|
6846
6846
|
} catch (T) {
|
|
6847
|
-
console.warn(`Failed to play ${
|
|
6847
|
+
console.warn(`Failed to play ${R}:`, T);
|
|
6848
6848
|
try {
|
|
6849
6849
|
p.current.setBodyMovement("idle");
|
|
6850
|
-
} catch (
|
|
6851
|
-
console.warn("Fallback animation also failed:",
|
|
6850
|
+
} catch (Y) {
|
|
6851
|
+
console.warn("Fallback animation also failed:", Y);
|
|
6852
6852
|
}
|
|
6853
6853
|
}
|
|
6854
6854
|
else {
|
|
6855
6855
|
const T = [".fbx", ".glb", ".gltf"];
|
|
6856
|
-
let
|
|
6857
|
-
for (const
|
|
6856
|
+
let Y = !1;
|
|
6857
|
+
for (const te of T)
|
|
6858
6858
|
try {
|
|
6859
|
-
p.current.playAnimation(
|
|
6859
|
+
p.current.playAnimation(R + te, null, 10, 0, 0.01, k), Y = !0;
|
|
6860
6860
|
break;
|
|
6861
6861
|
} catch {
|
|
6862
6862
|
}
|
|
6863
|
-
if (!
|
|
6864
|
-
console.warn("Animation not found:",
|
|
6863
|
+
if (!Y) {
|
|
6864
|
+
console.warn("Animation not found:", R);
|
|
6865
6865
|
try {
|
|
6866
6866
|
p.current.setBodyMovement("idle");
|
|
6867
|
-
} catch (
|
|
6868
|
-
console.warn("Fallback animation also failed:",
|
|
6867
|
+
} catch (te) {
|
|
6868
|
+
console.warn("Fallback animation also failed:", te);
|
|
6869
6869
|
}
|
|
6870
6870
|
}
|
|
6871
6871
|
}
|
|
6872
6872
|
}
|
|
6873
|
-
}, [x]),
|
|
6873
|
+
}, [x]), v = M(() => {
|
|
6874
6874
|
p.current && p.current.onResize && p.current.onResize();
|
|
6875
6875
|
}, []);
|
|
6876
|
-
return
|
|
6877
|
-
speakText:
|
|
6878
|
-
stopSpeaking:
|
|
6879
|
-
resumeAudioContext:
|
|
6880
|
-
setMood:
|
|
6881
|
-
setTimingAdjustment:
|
|
6882
|
-
playAnimation:
|
|
6883
|
-
isReady:
|
|
6876
|
+
return xe(L, () => ({
|
|
6877
|
+
speakText: pe,
|
|
6878
|
+
stopSpeaking: ue,
|
|
6879
|
+
resumeAudioContext: se,
|
|
6880
|
+
setMood: ge,
|
|
6881
|
+
setTimingAdjustment: Q,
|
|
6882
|
+
playAnimation: b,
|
|
6883
|
+
isReady: X,
|
|
6884
6884
|
talkingHead: p.current,
|
|
6885
|
-
handleResize:
|
|
6886
|
-
setBodyMovement: (
|
|
6885
|
+
handleResize: v,
|
|
6886
|
+
setBodyMovement: (R) => {
|
|
6887
6887
|
if (p.current && p.current.setShowFullAvatar && p.current.setBodyMovement)
|
|
6888
6888
|
try {
|
|
6889
|
-
p.current.setShowFullAvatar(z.current), p.current.setBodyMovement(
|
|
6890
|
-
} catch (
|
|
6891
|
-
console.warn("Error setting body movement:",
|
|
6889
|
+
p.current.setShowFullAvatar(z.current), p.current.setBodyMovement(R);
|
|
6890
|
+
} catch (k) {
|
|
6891
|
+
console.warn("Error setting body movement:", k);
|
|
6892
6892
|
}
|
|
6893
6893
|
},
|
|
6894
|
-
setMovementIntensity: (
|
|
6894
|
+
setMovementIntensity: (R) => p.current?.setMovementIntensity(R),
|
|
6895
6895
|
playRandomDance: () => {
|
|
6896
6896
|
if (p.current && p.current.setShowFullAvatar && p.current.playRandomDance)
|
|
6897
6897
|
try {
|
|
6898
6898
|
p.current.setShowFullAvatar(z.current), p.current.playRandomDance();
|
|
6899
|
-
} catch (
|
|
6900
|
-
console.warn("Error playing random dance:",
|
|
6899
|
+
} catch (R) {
|
|
6900
|
+
console.warn("Error playing random dance:", R);
|
|
6901
6901
|
}
|
|
6902
6902
|
},
|
|
6903
|
-
playReaction: (
|
|
6903
|
+
playReaction: (R) => {
|
|
6904
6904
|
if (p.current && p.current.setShowFullAvatar && p.current.playReaction)
|
|
6905
6905
|
try {
|
|
6906
|
-
p.current.setShowFullAvatar(z.current), p.current.playReaction(
|
|
6907
|
-
} catch (
|
|
6908
|
-
console.warn("Error playing reaction:",
|
|
6906
|
+
p.current.setShowFullAvatar(z.current), p.current.playReaction(R);
|
|
6907
|
+
} catch (k) {
|
|
6908
|
+
console.warn("Error playing reaction:", k);
|
|
6909
6909
|
}
|
|
6910
6910
|
},
|
|
6911
6911
|
playCelebration: () => {
|
|
6912
6912
|
if (p.current && p.current.setShowFullAvatar && p.current.playCelebration)
|
|
6913
6913
|
try {
|
|
6914
6914
|
p.current.setShowFullAvatar(z.current), p.current.playCelebration();
|
|
6915
|
-
} catch (
|
|
6916
|
-
console.warn("Error playing celebration:",
|
|
6915
|
+
} catch (R) {
|
|
6916
|
+
console.warn("Error playing celebration:", R);
|
|
6917
6917
|
}
|
|
6918
6918
|
},
|
|
6919
|
-
setShowFullAvatar: (
|
|
6919
|
+
setShowFullAvatar: (R) => {
|
|
6920
6920
|
if (p.current && p.current.setShowFullAvatar)
|
|
6921
6921
|
try {
|
|
6922
|
-
z.current =
|
|
6923
|
-
} catch (
|
|
6924
|
-
console.warn("Error setting showFullAvatar:",
|
|
6922
|
+
z.current = R, p.current.setShowFullAvatar(R);
|
|
6923
|
+
} catch (k) {
|
|
6924
|
+
console.warn("Error setting showFullAvatar:", k);
|
|
6925
6925
|
}
|
|
6926
6926
|
},
|
|
6927
6927
|
lockAvatarPosition: () => {
|
|
6928
6928
|
if (p.current && p.current.lockAvatarPosition)
|
|
6929
6929
|
try {
|
|
6930
6930
|
p.current.lockAvatarPosition();
|
|
6931
|
-
} catch (
|
|
6932
|
-
console.warn("Error locking avatar position:",
|
|
6931
|
+
} catch (R) {
|
|
6932
|
+
console.warn("Error locking avatar position:", R);
|
|
6933
6933
|
}
|
|
6934
6934
|
},
|
|
6935
6935
|
unlockAvatarPosition: () => {
|
|
6936
6936
|
if (p.current && p.current.unlockAvatarPosition)
|
|
6937
6937
|
try {
|
|
6938
6938
|
p.current.unlockAvatarPosition();
|
|
6939
|
-
} catch (
|
|
6940
|
-
console.warn("Error unlocking avatar position:",
|
|
6939
|
+
} catch (R) {
|
|
6940
|
+
console.warn("Error unlocking avatar position:", R);
|
|
6941
6941
|
}
|
|
6942
6942
|
}
|
|
6943
6943
|
})), /* @__PURE__ */ ke(
|
|
@@ -6951,10 +6951,10 @@ const ze = ye(({
|
|
|
6951
6951
|
...y
|
|
6952
6952
|
},
|
|
6953
6953
|
children: [
|
|
6954
|
-
/* @__PURE__ */
|
|
6954
|
+
/* @__PURE__ */ ne(
|
|
6955
6955
|
"div",
|
|
6956
6956
|
{
|
|
6957
|
-
ref:
|
|
6957
|
+
ref: F,
|
|
6958
6958
|
className: "talking-head-viewer",
|
|
6959
6959
|
style: {
|
|
6960
6960
|
width: "100%",
|
|
@@ -6963,7 +6963,7 @@ const ze = ye(({
|
|
|
6963
6963
|
}
|
|
6964
6964
|
}
|
|
6965
6965
|
),
|
|
6966
|
-
C && /* @__PURE__ */
|
|
6966
|
+
C && /* @__PURE__ */ ne("div", { className: "loading-overlay", style: {
|
|
6967
6967
|
position: "absolute",
|
|
6968
6968
|
top: "50%",
|
|
6969
6969
|
left: "50%",
|
|
@@ -6972,7 +6972,7 @@ const ze = ye(({
|
|
|
6972
6972
|
fontSize: "18px",
|
|
6973
6973
|
zIndex: 10
|
|
6974
6974
|
}, children: "Loading avatar..." }),
|
|
6975
|
-
|
|
6975
|
+
B && /* @__PURE__ */ ne("div", { className: "error-overlay", style: {
|
|
6976
6976
|
position: "absolute",
|
|
6977
6977
|
top: "50%",
|
|
6978
6978
|
left: "50%",
|
|
@@ -6983,14 +6983,14 @@ const ze = ye(({
|
|
|
6983
6983
|
zIndex: 10,
|
|
6984
6984
|
padding: "20px",
|
|
6985
6985
|
borderRadius: "8px"
|
|
6986
|
-
}, children:
|
|
6986
|
+
}, children: B })
|
|
6987
6987
|
]
|
|
6988
6988
|
}
|
|
6989
6989
|
);
|
|
6990
6990
|
});
|
|
6991
6991
|
ze.displayName = "TalkingHeadAvatar";
|
|
6992
|
-
const it =
|
|
6993
|
-
text:
|
|
6992
|
+
const it = fe(({
|
|
6993
|
+
text: N = "Hello! I'm a talking avatar. How are you today?",
|
|
6994
6994
|
onLoading: t = () => {
|
|
6995
6995
|
},
|
|
6996
6996
|
onError: e = () => {
|
|
@@ -7001,7 +7001,7 @@ const it = ye(({
|
|
|
7001
7001
|
style: s = {},
|
|
7002
7002
|
avatarConfig: o = {}
|
|
7003
7003
|
}, r) => {
|
|
7004
|
-
const
|
|
7004
|
+
const u = V(null), a = V(null), [h, l] = re(!0), [d, c] = re(null), [g, y] = re(!1), x = be(), L = o.ttsService || x.service, F = L === "browser" ? {
|
|
7005
7005
|
endpoint: "",
|
|
7006
7006
|
apiKey: null,
|
|
7007
7007
|
defaultVoice: "Google US English"
|
|
@@ -7010,14 +7010,14 @@ const it = ye(({
|
|
|
7010
7010
|
// Override API key if provided via avatarConfig
|
|
7011
7011
|
apiKey: o.ttsApiKey !== void 0 && o.ttsApiKey !== null ? o.ttsApiKey : x.apiKey,
|
|
7012
7012
|
// Override endpoint for ElevenLabs if service is explicitly set
|
|
7013
|
-
endpoint:
|
|
7013
|
+
endpoint: L === "elevenlabs" && o.ttsApiKey ? "https://api.elevenlabs.io/v1/text-to-speech" : x.endpoint
|
|
7014
7014
|
}, p = {
|
|
7015
7015
|
url: "/avatars/brunette.glb",
|
|
7016
7016
|
// Use brunette avatar (working glTF file)
|
|
7017
7017
|
body: "F",
|
|
7018
7018
|
avatarMood: "neutral",
|
|
7019
|
-
ttsLang:
|
|
7020
|
-
ttsVoice: o.ttsVoice ||
|
|
7019
|
+
ttsLang: L === "browser" ? "en-US" : "en",
|
|
7020
|
+
ttsVoice: o.ttsVoice || F.defaultVoice,
|
|
7021
7021
|
lipsyncLang: "en",
|
|
7022
7022
|
// English lip-sync
|
|
7023
7023
|
showFullAvatar: !0,
|
|
@@ -7026,68 +7026,68 @@ const it = ye(({
|
|
|
7026
7026
|
movementIntensity: 0.5,
|
|
7027
7027
|
...o
|
|
7028
7028
|
}, z = {
|
|
7029
|
-
ttsEndpoint:
|
|
7030
|
-
ttsApikey:
|
|
7031
|
-
ttsService:
|
|
7029
|
+
ttsEndpoint: F.endpoint,
|
|
7030
|
+
ttsApikey: F.apiKey,
|
|
7031
|
+
ttsService: L,
|
|
7032
7032
|
lipsyncModules: ["en"],
|
|
7033
7033
|
cameraView: "upper"
|
|
7034
|
-
}, C =
|
|
7035
|
-
if (!(!
|
|
7034
|
+
}, C = M(async () => {
|
|
7035
|
+
if (!(!u.current || a.current))
|
|
7036
7036
|
try {
|
|
7037
|
-
if (l(!0),
|
|
7038
|
-
if (
|
|
7039
|
-
const W = Math.min(100, Math.round(
|
|
7037
|
+
if (l(!0), c(null), a.current = new we(u.current, z), await a.current.showAvatar(p, (O) => {
|
|
7038
|
+
if (O.lengthComputable) {
|
|
7039
|
+
const W = Math.min(100, Math.round(O.loaded / O.total * 100));
|
|
7040
7040
|
t(W);
|
|
7041
7041
|
}
|
|
7042
7042
|
}), a.current.morphs && a.current.morphs.length > 0) {
|
|
7043
|
-
const
|
|
7044
|
-
console.log("Available morph targets:", Object.keys(
|
|
7045
|
-
const W = Object.keys(
|
|
7043
|
+
const O = a.current.morphs[0].morphTargetDictionary;
|
|
7044
|
+
console.log("Available morph targets:", Object.keys(O));
|
|
7045
|
+
const W = Object.keys(O).filter((_) => _.startsWith("viseme_"));
|
|
7046
7046
|
console.log("Viseme morph targets found:", W), W.length === 0 && (console.warn("No viseme morph targets found! Lip-sync will not work properly."), console.log("Expected viseme targets: viseme_aa, viseme_E, viseme_I, viseme_O, viseme_U, viseme_PP, viseme_SS, viseme_TH, viseme_DD, viseme_FF, viseme_kk, viseme_nn, viseme_RR, viseme_CH, viseme_sil"));
|
|
7047
7047
|
}
|
|
7048
|
-
if (await new Promise((
|
|
7048
|
+
if (await new Promise((O) => {
|
|
7049
7049
|
const W = () => {
|
|
7050
|
-
a.current.lipsync && Object.keys(a.current.lipsync).length > 0 ? (console.log("Lip-sync modules loaded:", Object.keys(a.current.lipsync)),
|
|
7050
|
+
a.current.lipsync && Object.keys(a.current.lipsync).length > 0 ? (console.log("Lip-sync modules loaded:", Object.keys(a.current.lipsync)), O()) : (console.log("Waiting for lip-sync modules to load..."), setTimeout(W, 100));
|
|
7051
7051
|
};
|
|
7052
7052
|
W();
|
|
7053
7053
|
}), a.current && a.current.setShowFullAvatar)
|
|
7054
7054
|
try {
|
|
7055
7055
|
a.current.setShowFullAvatar(!0), console.log("Avatar initialized in full body mode");
|
|
7056
|
-
} catch (
|
|
7057
|
-
console.warn("Error setting full body mode on initialization:",
|
|
7056
|
+
} catch (O) {
|
|
7057
|
+
console.warn("Error setting full body mode on initialization:", O);
|
|
7058
7058
|
}
|
|
7059
7059
|
l(!1), y(!0), i(a.current);
|
|
7060
|
-
const
|
|
7060
|
+
const P = () => {
|
|
7061
7061
|
document.visibilityState === "visible" ? a.current?.start() : a.current?.stop();
|
|
7062
7062
|
};
|
|
7063
|
-
return document.addEventListener("visibilitychange",
|
|
7064
|
-
document.removeEventListener("visibilitychange",
|
|
7063
|
+
return document.addEventListener("visibilitychange", P), () => {
|
|
7064
|
+
document.removeEventListener("visibilitychange", P);
|
|
7065
7065
|
};
|
|
7066
|
-
} catch (
|
|
7067
|
-
console.error("Error initializing TalkingHead:",
|
|
7066
|
+
} catch (S) {
|
|
7067
|
+
console.error("Error initializing TalkingHead:", S), c(S.message || "Failed to initialize avatar"), l(!1), e(S);
|
|
7068
7068
|
}
|
|
7069
7069
|
}, []);
|
|
7070
|
-
|
|
7070
|
+
le(() => (C(), () => {
|
|
7071
7071
|
a.current && (a.current.stop(), a.current.dispose(), a.current = null);
|
|
7072
7072
|
}), [C]);
|
|
7073
|
-
const
|
|
7073
|
+
const I = M((S) => {
|
|
7074
7074
|
if (a.current && g)
|
|
7075
7075
|
try {
|
|
7076
|
-
console.log("Speaking text:",
|
|
7077
|
-
a.current && a.current.lipsync ? (console.log("Lip-sync now ready, speaking..."), a.current.setSlowdownRate && (a.current.setSlowdownRate(1.05), console.log("Applied timing adjustment for better lip-sync")), a.current.speakText(
|
|
7076
|
+
console.log("Speaking text:", S), console.log("Avatar config:", p), console.log("TalkingHead instance:", a.current), a.current.lipsync && Object.keys(a.current.lipsync).length > 0 ? (console.log("Lip-sync modules loaded:", Object.keys(a.current.lipsync)), a.current.setSlowdownRate && (a.current.setSlowdownRate(1.05), console.log("Applied timing adjustment for better lip-sync")), a.current.speakText(S)) : (console.warn("Lip-sync modules not ready, waiting..."), setTimeout(() => {
|
|
7077
|
+
a.current && a.current.lipsync ? (console.log("Lip-sync now ready, speaking..."), a.current.setSlowdownRate && (a.current.setSlowdownRate(1.05), console.log("Applied timing adjustment for better lip-sync")), a.current.speakText(S)) : console.error("Lip-sync still not ready after waiting");
|
|
7078
7078
|
}, 500));
|
|
7079
|
-
} catch (
|
|
7080
|
-
console.error("Error speaking text:",
|
|
7079
|
+
} catch (P) {
|
|
7080
|
+
console.error("Error speaking text:", P), c(P.message || "Failed to speak text");
|
|
7081
7081
|
}
|
|
7082
7082
|
else
|
|
7083
7083
|
console.warn("Avatar not ready for speaking. isReady:", g, "talkingHeadRef:", !!a.current);
|
|
7084
|
-
}, [g, p]),
|
|
7084
|
+
}, [g, p]), B = M(() => {
|
|
7085
7085
|
a.current && (a.current.stopSpeaking(), a.current.setSlowdownRate && (a.current.setSlowdownRate(1), console.log("Reset timing to normal")));
|
|
7086
|
-
}, []),
|
|
7087
|
-
a.current && a.current.setMood(
|
|
7088
|
-
}, []),
|
|
7089
|
-
a.current && a.current.setSlowdownRate && (a.current.setSlowdownRate(
|
|
7090
|
-
}, []),
|
|
7086
|
+
}, []), D = M((S) => {
|
|
7087
|
+
a.current && a.current.setMood(S);
|
|
7088
|
+
}, []), X = M((S) => {
|
|
7089
|
+
a.current && a.current.setSlowdownRate && (a.current.setSlowdownRate(S), console.log("Timing adjustment set to:", S));
|
|
7090
|
+
}, []), oe = M((S, P = !1) => {
|
|
7091
7091
|
if (a.current && a.current.playAnimation) {
|
|
7092
7092
|
if (a.current.setShowFullAvatar)
|
|
7093
7093
|
try {
|
|
@@ -7095,109 +7095,109 @@ const it = ye(({
|
|
|
7095
7095
|
} catch (W) {
|
|
7096
7096
|
console.warn("Error setting full body mode:", W);
|
|
7097
7097
|
}
|
|
7098
|
-
if (
|
|
7098
|
+
if (S.includes("."))
|
|
7099
7099
|
try {
|
|
7100
|
-
a.current.playAnimation(
|
|
7100
|
+
a.current.playAnimation(S, null, 10, 0, 0.01, P), console.log("Playing animation:", S);
|
|
7101
7101
|
} catch (W) {
|
|
7102
|
-
console.log(`Failed to play ${
|
|
7102
|
+
console.log(`Failed to play ${S}:`, W);
|
|
7103
7103
|
try {
|
|
7104
7104
|
a.current.setBodyMovement("idle"), console.log("Fallback to idle animation");
|
|
7105
|
-
} catch (
|
|
7106
|
-
console.warn("Fallback animation also failed:",
|
|
7105
|
+
} catch (_) {
|
|
7106
|
+
console.warn("Fallback animation also failed:", _);
|
|
7107
7107
|
}
|
|
7108
7108
|
}
|
|
7109
7109
|
else {
|
|
7110
7110
|
const W = [".fbx", ".glb", ".gltf"];
|
|
7111
|
-
let
|
|
7112
|
-
for (const
|
|
7111
|
+
let _ = !1;
|
|
7112
|
+
for (const K of W)
|
|
7113
7113
|
try {
|
|
7114
|
-
a.current.playAnimation(
|
|
7114
|
+
a.current.playAnimation(S + K, null, 10, 0, 0.01, P), console.log("Playing animation:", S + K), _ = !0;
|
|
7115
7115
|
break;
|
|
7116
7116
|
} catch {
|
|
7117
|
-
console.log(`Failed to play ${
|
|
7117
|
+
console.log(`Failed to play ${S}${K}, trying next format...`);
|
|
7118
7118
|
}
|
|
7119
|
-
if (!
|
|
7120
|
-
console.warn("Animation system not available or animation not found:",
|
|
7119
|
+
if (!_) {
|
|
7120
|
+
console.warn("Animation system not available or animation not found:", S);
|
|
7121
7121
|
try {
|
|
7122
7122
|
a.current.setBodyMovement("idle"), console.log("Fallback to idle animation");
|
|
7123
|
-
} catch (
|
|
7124
|
-
console.warn("Fallback animation also failed:",
|
|
7123
|
+
} catch (K) {
|
|
7124
|
+
console.warn("Fallback animation also failed:", K);
|
|
7125
7125
|
}
|
|
7126
7126
|
}
|
|
7127
7127
|
}
|
|
7128
7128
|
} else
|
|
7129
|
-
console.warn("Animation system not available or animation not found:",
|
|
7129
|
+
console.warn("Animation system not available or animation not found:", S);
|
|
7130
7130
|
}, []);
|
|
7131
|
-
return
|
|
7132
|
-
speakText:
|
|
7133
|
-
stopSpeaking:
|
|
7134
|
-
setMood:
|
|
7135
|
-
setTimingAdjustment:
|
|
7136
|
-
playAnimation:
|
|
7131
|
+
return xe(r, () => ({
|
|
7132
|
+
speakText: I,
|
|
7133
|
+
stopSpeaking: B,
|
|
7134
|
+
setMood: D,
|
|
7135
|
+
setTimingAdjustment: X,
|
|
7136
|
+
playAnimation: oe,
|
|
7137
7137
|
isReady: g,
|
|
7138
7138
|
talkingHead: a.current,
|
|
7139
|
-
setBodyMovement: (
|
|
7139
|
+
setBodyMovement: (S) => {
|
|
7140
7140
|
if (a.current && a.current.setShowFullAvatar && a.current.setBodyMovement)
|
|
7141
7141
|
try {
|
|
7142
|
-
a.current.setShowFullAvatar(!0), a.current.setBodyMovement(
|
|
7143
|
-
} catch (
|
|
7144
|
-
console.warn("Error setting body movement:",
|
|
7142
|
+
a.current.setShowFullAvatar(!0), a.current.setBodyMovement(S), console.log("Body movement set with full body mode:", S);
|
|
7143
|
+
} catch (P) {
|
|
7144
|
+
console.warn("Error setting body movement:", P);
|
|
7145
7145
|
}
|
|
7146
7146
|
},
|
|
7147
|
-
setMovementIntensity: (
|
|
7147
|
+
setMovementIntensity: (S) => a.current?.setMovementIntensity(S),
|
|
7148
7148
|
playRandomDance: () => {
|
|
7149
7149
|
if (a.current && a.current.setShowFullAvatar && a.current.playRandomDance)
|
|
7150
7150
|
try {
|
|
7151
7151
|
a.current.setShowFullAvatar(!0), a.current.playRandomDance(), console.log("Random dance played with full body mode");
|
|
7152
|
-
} catch (
|
|
7153
|
-
console.warn("Error playing random dance:",
|
|
7152
|
+
} catch (S) {
|
|
7153
|
+
console.warn("Error playing random dance:", S);
|
|
7154
7154
|
}
|
|
7155
7155
|
},
|
|
7156
|
-
playReaction: (
|
|
7156
|
+
playReaction: (S) => {
|
|
7157
7157
|
if (a.current && a.current.setShowFullAvatar && a.current.playReaction)
|
|
7158
7158
|
try {
|
|
7159
|
-
a.current.setShowFullAvatar(!0), a.current.playReaction(
|
|
7160
|
-
} catch (
|
|
7161
|
-
console.warn("Error playing reaction:",
|
|
7159
|
+
a.current.setShowFullAvatar(!0), a.current.playReaction(S), console.log("Reaction played with full body mode:", S);
|
|
7160
|
+
} catch (P) {
|
|
7161
|
+
console.warn("Error playing reaction:", P);
|
|
7162
7162
|
}
|
|
7163
7163
|
},
|
|
7164
7164
|
playCelebration: () => {
|
|
7165
7165
|
if (a.current && a.current.setShowFullAvatar && a.current.playCelebration)
|
|
7166
7166
|
try {
|
|
7167
7167
|
a.current.setShowFullAvatar(!0), a.current.playCelebration(), console.log("Celebration played with full body mode");
|
|
7168
|
-
} catch (
|
|
7169
|
-
console.warn("Error playing celebration:",
|
|
7168
|
+
} catch (S) {
|
|
7169
|
+
console.warn("Error playing celebration:", S);
|
|
7170
7170
|
}
|
|
7171
7171
|
},
|
|
7172
|
-
setShowFullAvatar: (
|
|
7172
|
+
setShowFullAvatar: (S) => {
|
|
7173
7173
|
if (a.current && a.current.setShowFullAvatar)
|
|
7174
7174
|
try {
|
|
7175
|
-
a.current.setShowFullAvatar(
|
|
7176
|
-
} catch (
|
|
7177
|
-
console.warn("Error setting showFullAvatar:",
|
|
7175
|
+
a.current.setShowFullAvatar(S), console.log("Show full avatar set to:", S);
|
|
7176
|
+
} catch (P) {
|
|
7177
|
+
console.warn("Error setting showFullAvatar:", P);
|
|
7178
7178
|
}
|
|
7179
7179
|
},
|
|
7180
7180
|
lockAvatarPosition: () => {
|
|
7181
7181
|
if (a.current && a.current.lockAvatarPosition)
|
|
7182
7182
|
try {
|
|
7183
7183
|
a.current.lockAvatarPosition();
|
|
7184
|
-
} catch (
|
|
7185
|
-
console.warn("Error locking avatar position:",
|
|
7184
|
+
} catch (S) {
|
|
7185
|
+
console.warn("Error locking avatar position:", S);
|
|
7186
7186
|
}
|
|
7187
7187
|
},
|
|
7188
7188
|
unlockAvatarPosition: () => {
|
|
7189
7189
|
if (a.current && a.current.unlockAvatarPosition)
|
|
7190
7190
|
try {
|
|
7191
7191
|
a.current.unlockAvatarPosition();
|
|
7192
|
-
} catch (
|
|
7193
|
-
console.warn("Error unlocking avatar position:",
|
|
7192
|
+
} catch (S) {
|
|
7193
|
+
console.warn("Error unlocking avatar position:", S);
|
|
7194
7194
|
}
|
|
7195
7195
|
}
|
|
7196
7196
|
})), /* @__PURE__ */ ke("div", { className: `talking-head-container ${n}`, style: s, children: [
|
|
7197
|
-
/* @__PURE__ */
|
|
7197
|
+
/* @__PURE__ */ ne(
|
|
7198
7198
|
"div",
|
|
7199
7199
|
{
|
|
7200
|
-
ref:
|
|
7200
|
+
ref: u,
|
|
7201
7201
|
className: "talking-head-viewer",
|
|
7202
7202
|
style: {
|
|
7203
7203
|
width: "100%",
|
|
@@ -7206,7 +7206,7 @@ const it = ye(({
|
|
|
7206
7206
|
}
|
|
7207
7207
|
}
|
|
7208
7208
|
),
|
|
7209
|
-
|
|
7209
|
+
h && /* @__PURE__ */ ne("div", { className: "loading-overlay", style: {
|
|
7210
7210
|
position: "absolute",
|
|
7211
7211
|
top: "50%",
|
|
7212
7212
|
left: "50%",
|
|
@@ -7215,7 +7215,7 @@ const it = ye(({
|
|
|
7215
7215
|
fontSize: "18px",
|
|
7216
7216
|
zIndex: 10
|
|
7217
7217
|
}, children: "Loading avatar..." }),
|
|
7218
|
-
|
|
7218
|
+
d && /* @__PURE__ */ ne("div", { className: "error-overlay", style: {
|
|
7219
7219
|
position: "absolute",
|
|
7220
7220
|
top: "50%",
|
|
7221
7221
|
left: "50%",
|
|
@@ -7226,12 +7226,12 @@ const it = ye(({
|
|
|
7226
7226
|
zIndex: 10,
|
|
7227
7227
|
padding: "20px",
|
|
7228
7228
|
borderRadius: "8px"
|
|
7229
|
-
}, children:
|
|
7229
|
+
}, children: d })
|
|
7230
7230
|
] });
|
|
7231
7231
|
});
|
|
7232
7232
|
it.displayName = "TalkingHeadComponent";
|
|
7233
|
-
const nt =
|
|
7234
|
-
curriculumData:
|
|
7233
|
+
const nt = fe(({
|
|
7234
|
+
curriculumData: N = null,
|
|
7235
7235
|
avatarConfig: t = {},
|
|
7236
7236
|
animations: e = {},
|
|
7237
7237
|
onLessonStart: i = () => {
|
|
@@ -7244,9 +7244,9 @@ const nt = ye(({
|
|
|
7244
7244
|
},
|
|
7245
7245
|
onCustomAction: r = () => {
|
|
7246
7246
|
},
|
|
7247
|
-
autoStart:
|
|
7247
|
+
autoStart: u = !1
|
|
7248
7248
|
}, a) => {
|
|
7249
|
-
const
|
|
7249
|
+
const h = V(null), l = V({
|
|
7250
7250
|
currentModuleIndex: 0,
|
|
7251
7251
|
currentLessonIndex: 0,
|
|
7252
7252
|
currentQuestionIndex: 0,
|
|
@@ -7256,18 +7256,18 @@ const nt = ye(({
|
|
|
7256
7256
|
curriculumCompleted: !1,
|
|
7257
7257
|
score: 0,
|
|
7258
7258
|
totalQuestions: 0
|
|
7259
|
-
}),
|
|
7259
|
+
}), d = V({
|
|
7260
7260
|
onLessonStart: i,
|
|
7261
7261
|
onLessonComplete: n,
|
|
7262
7262
|
onQuestionAnswer: s,
|
|
7263
7263
|
onCurriculumComplete: o,
|
|
7264
7264
|
onCustomAction: r
|
|
7265
|
-
}),
|
|
7265
|
+
}), c = V(null), g = V(null), y = V(null), x = V(null), L = V(null), F = V(null), p = V(null), z = V(N?.curriculum || {
|
|
7266
7266
|
title: "Default Curriculum",
|
|
7267
7267
|
description: "No curriculum data provided",
|
|
7268
7268
|
language: "en",
|
|
7269
7269
|
modules: []
|
|
7270
|
-
}), C =
|
|
7270
|
+
}), C = V({
|
|
7271
7271
|
avatarUrl: t.avatarUrl || "/avatars/brunette.glb",
|
|
7272
7272
|
avatarBody: t.avatarBody || "F",
|
|
7273
7273
|
mood: t.mood || "happy",
|
|
@@ -7281,16 +7281,16 @@ const nt = ye(({
|
|
|
7281
7281
|
animations: e,
|
|
7282
7282
|
lipsyncLang: "en"
|
|
7283
7283
|
});
|
|
7284
|
-
|
|
7285
|
-
|
|
7284
|
+
le(() => {
|
|
7285
|
+
d.current = {
|
|
7286
7286
|
onLessonStart: i,
|
|
7287
7287
|
onLessonComplete: n,
|
|
7288
7288
|
onQuestionAnswer: s,
|
|
7289
7289
|
onCurriculumComplete: o,
|
|
7290
7290
|
onCustomAction: r
|
|
7291
7291
|
};
|
|
7292
|
-
}, [i, n, s, o, r]),
|
|
7293
|
-
z.current =
|
|
7292
|
+
}, [i, n, s, o, r]), le(() => {
|
|
7293
|
+
z.current = N?.curriculum || {
|
|
7294
7294
|
title: "Default Curriculum",
|
|
7295
7295
|
description: "No curriculum data provided",
|
|
7296
7296
|
language: "en",
|
|
@@ -7309,256 +7309,277 @@ const nt = ye(({
|
|
|
7309
7309
|
animations: e,
|
|
7310
7310
|
lipsyncLang: "en"
|
|
7311
7311
|
};
|
|
7312
|
-
}, [
|
|
7313
|
-
const
|
|
7312
|
+
}, [N, t, e]);
|
|
7313
|
+
const I = M(() => (z.current || { modules: [] }).modules[l.current.currentModuleIndex]?.lessons[l.current.currentLessonIndex], []), B = M(() => I()?.questions[l.current.currentQuestionIndex], [I]), D = M((b, v) => v.type === "multiple_choice" || v.type === "true_false" ? b === v.answer : v.type === "code_test" && typeof b == "object" && b !== null ? b.passed === !0 : !1, []), X = M(() => {
|
|
7314
7314
|
l.current.lessonCompleted = !0, l.current.isQuestionMode = !1;
|
|
7315
|
-
const
|
|
7315
|
+
const b = l.current.totalQuestions > 0 ? Math.round(l.current.score / l.current.totalQuestions * 100) : 100;
|
|
7316
7316
|
let v = "Congratulations! You've completed this lesson";
|
|
7317
|
-
if (l.current.totalQuestions > 0 ? v += ` with a score of ${l.current.score} out of ${l.current.totalQuestions} (${
|
|
7317
|
+
if (l.current.totalQuestions > 0 ? v += ` with a score of ${l.current.score} out of ${l.current.totalQuestions} (${b}%). ` : v += "! ", b >= 80 ? v += "Excellent work! You have a great understanding of this topic." : b >= 60 ? v += "Good job! You understand most of the concepts." : v += "Keep practicing! You're making progress.", d.current.onLessonComplete({
|
|
7318
7318
|
moduleIndex: l.current.currentModuleIndex,
|
|
7319
7319
|
lessonIndex: l.current.currentLessonIndex,
|
|
7320
7320
|
score: l.current.score,
|
|
7321
7321
|
totalQuestions: l.current.totalQuestions,
|
|
7322
|
-
percentage:
|
|
7323
|
-
}),
|
|
7322
|
+
percentage: b
|
|
7323
|
+
}), d.current.onCustomAction({
|
|
7324
7324
|
type: "lessonComplete",
|
|
7325
7325
|
moduleIndex: l.current.currentModuleIndex,
|
|
7326
7326
|
lessonIndex: l.current.currentLessonIndex,
|
|
7327
7327
|
score: l.current.score,
|
|
7328
7328
|
totalQuestions: l.current.totalQuestions,
|
|
7329
|
-
percentage:
|
|
7330
|
-
}),
|
|
7331
|
-
if (
|
|
7329
|
+
percentage: b
|
|
7330
|
+
}), h.current) {
|
|
7331
|
+
if (h.current.setMood("happy"), e.lessonComplete)
|
|
7332
7332
|
try {
|
|
7333
|
-
|
|
7333
|
+
h.current.playAnimation(e.lessonComplete, !0);
|
|
7334
7334
|
} catch {
|
|
7335
|
-
|
|
7335
|
+
h.current.playCelebration();
|
|
7336
7336
|
}
|
|
7337
|
-
const
|
|
7338
|
-
|
|
7339
|
-
lipsyncLang:
|
|
7337
|
+
const R = z.current || { modules: [] }, k = R.modules[l.current.currentModuleIndex], H = l.current.currentLessonIndex < (k?.lessons?.length || 0) - 1, T = l.current.currentModuleIndex < (R.modules?.length || 0) - 1, Y = H || T, te = C.current || { lipsyncLang: "en" };
|
|
7338
|
+
h.current.speakText(v, {
|
|
7339
|
+
lipsyncLang: te.lipsyncLang,
|
|
7340
7340
|
onSpeechEnd: () => {
|
|
7341
|
-
|
|
7341
|
+
d.current.onCustomAction({
|
|
7342
7342
|
type: "lessonCompleteFeedbackDone",
|
|
7343
7343
|
moduleIndex: l.current.currentModuleIndex,
|
|
7344
7344
|
lessonIndex: l.current.currentLessonIndex,
|
|
7345
7345
|
score: l.current.score,
|
|
7346
7346
|
totalQuestions: l.current.totalQuestions,
|
|
7347
|
-
percentage:
|
|
7348
|
-
hasNextLesson:
|
|
7347
|
+
percentage: b,
|
|
7348
|
+
hasNextLesson: Y
|
|
7349
7349
|
});
|
|
7350
7350
|
}
|
|
7351
7351
|
});
|
|
7352
7352
|
}
|
|
7353
|
-
}, [e.lessonComplete]),
|
|
7353
|
+
}, [e.lessonComplete]), oe = M(() => {
|
|
7354
7354
|
l.current.curriculumCompleted = !0;
|
|
7355
|
-
const
|
|
7356
|
-
if (
|
|
7357
|
-
modules:
|
|
7358
|
-
totalLessons:
|
|
7359
|
-
}),
|
|
7360
|
-
if (
|
|
7355
|
+
const b = z.current || { modules: [] };
|
|
7356
|
+
if (d.current.onCurriculumComplete({
|
|
7357
|
+
modules: b.modules.length,
|
|
7358
|
+
totalLessons: b.modules.reduce((v, R) => v + R.lessons.length, 0)
|
|
7359
|
+
}), h.current) {
|
|
7360
|
+
if (h.current.setMood("celebrating"), e.curriculumComplete)
|
|
7361
7361
|
try {
|
|
7362
|
-
|
|
7362
|
+
h.current.playAnimation(e.curriculumComplete, !0);
|
|
7363
7363
|
} catch {
|
|
7364
|
-
|
|
7364
|
+
h.current.playCelebration();
|
|
7365
7365
|
}
|
|
7366
7366
|
const v = C.current || { lipsyncLang: "en" };
|
|
7367
|
-
|
|
7367
|
+
h.current.speakText("Amazing! You've completed the entire curriculum! You're now ready to move on to more advanced topics. Well done!", { lipsyncLang: v.lipsyncLang });
|
|
7368
7368
|
}
|
|
7369
|
-
}, [e.curriculumComplete]),
|
|
7370
|
-
const
|
|
7371
|
-
l.current.isQuestionMode = !0, l.current.currentQuestionIndex = 0, l.current.totalQuestions =
|
|
7372
|
-
const v =
|
|
7373
|
-
|
|
7369
|
+
}, [e.curriculumComplete]), S = M(() => {
|
|
7370
|
+
const b = I();
|
|
7371
|
+
l.current.isQuestionMode = !0, l.current.currentQuestionIndex = 0, l.current.totalQuestions = b?.questions?.length || 0;
|
|
7372
|
+
const v = B();
|
|
7373
|
+
v && d.current.onCustomAction({
|
|
7374
7374
|
type: "questionStart",
|
|
7375
7375
|
moduleIndex: l.current.currentModuleIndex,
|
|
7376
7376
|
lessonIndex: l.current.currentLessonIndex,
|
|
7377
7377
|
questionIndex: l.current.currentQuestionIndex,
|
|
7378
7378
|
totalQuestions: l.current.totalQuestions,
|
|
7379
7379
|
question: v
|
|
7380
|
-
})
|
|
7381
|
-
|
|
7380
|
+
});
|
|
7381
|
+
const R = () => {
|
|
7382
|
+
if (!h.current || !v) return;
|
|
7383
|
+
if (h.current.setMood("happy"), e.questionStart)
|
|
7382
7384
|
try {
|
|
7383
|
-
|
|
7384
|
-
} catch (
|
|
7385
|
-
console.warn("Failed to play questionStart animation:",
|
|
7385
|
+
h.current.playAnimation(e.questionStart, !0);
|
|
7386
|
+
} catch (H) {
|
|
7387
|
+
console.warn("Failed to play questionStart animation:", H);
|
|
7386
7388
|
}
|
|
7387
|
-
const
|
|
7388
|
-
v.type === "code_test" ?
|
|
7389
|
-
}
|
|
7390
|
-
|
|
7391
|
-
|
|
7392
|
-
|
|
7393
|
-
|
|
7394
|
-
|
|
7389
|
+
const k = C.current || { lipsyncLang: "en" };
|
|
7390
|
+
v.type === "code_test" ? h.current.speakText(`Let's test your coding skills! Here's your first challenge: ${v.question}`, { lipsyncLang: k.lipsyncLang }) : v.type === "multiple_choice" ? h.current.speakText(`Now let me ask you some questions. Here's the first one: ${v.question}`, { lipsyncLang: k.lipsyncLang }) : v.type === "true_false" ? h.current.speakText(`Let's start with some true or false questions. First question: ${v.question}`, { lipsyncLang: k.lipsyncLang }) : h.current.speakText(`Now let me ask you some questions. Here's the first one: ${v.question}`, { lipsyncLang: k.lipsyncLang });
|
|
7391
|
+
};
|
|
7392
|
+
if (h.current && h.current.isReady && v)
|
|
7393
|
+
R();
|
|
7394
|
+
else if (h.current && h.current.isReady) {
|
|
7395
|
+
const k = C.current || { lipsyncLang: "en" };
|
|
7396
|
+
h.current.speakText("Now let me ask you some questions to test your understanding.", { lipsyncLang: k.lipsyncLang });
|
|
7397
|
+
} else {
|
|
7398
|
+
const k = setInterval(() => {
|
|
7399
|
+
h.current && h.current.isReady && (clearInterval(k), v && R());
|
|
7395
7400
|
}, 100);
|
|
7396
|
-
|
|
7397
|
-
|
|
7398
|
-
|
|
7401
|
+
setTimeout(() => {
|
|
7402
|
+
clearInterval(k);
|
|
7403
|
+
}, 5e3);
|
|
7404
|
+
}
|
|
7405
|
+
}, [e.questionStart, I, B]), P = M(() => {
|
|
7406
|
+
const b = I();
|
|
7407
|
+
if (l.current.currentQuestionIndex < (b?.questions?.length || 0) - 1) {
|
|
7399
7408
|
l.current.currentQuestionIndex += 1;
|
|
7400
|
-
const v =
|
|
7401
|
-
|
|
7409
|
+
const v = B();
|
|
7410
|
+
v && d.current.onCustomAction({
|
|
7402
7411
|
type: "nextQuestion",
|
|
7403
7412
|
moduleIndex: l.current.currentModuleIndex,
|
|
7404
7413
|
lessonIndex: l.current.currentLessonIndex,
|
|
7405
7414
|
questionIndex: l.current.currentQuestionIndex,
|
|
7406
7415
|
totalQuestions: l.current.totalQuestions,
|
|
7407
7416
|
question: v
|
|
7408
|
-
})
|
|
7409
|
-
|
|
7417
|
+
});
|
|
7418
|
+
const R = () => {
|
|
7419
|
+
if (!h.current || !v) return;
|
|
7420
|
+
if (h.current.setMood("happy"), h.current.setBodyMovement("idle"), e.nextQuestion)
|
|
7410
7421
|
try {
|
|
7411
|
-
|
|
7412
|
-
} catch (
|
|
7413
|
-
console.warn("Failed to play nextQuestion animation:",
|
|
7422
|
+
h.current.playAnimation(e.nextQuestion, !0);
|
|
7423
|
+
} catch (H) {
|
|
7424
|
+
console.warn("Failed to play nextQuestion animation:", H);
|
|
7414
7425
|
}
|
|
7415
|
-
const
|
|
7416
|
-
v.type === "code_test" ?
|
|
7417
|
-
lipsyncLang:
|
|
7418
|
-
}) : v.type === "multiple_choice" ?
|
|
7419
|
-
lipsyncLang:
|
|
7420
|
-
}) : v.type === "true_false" ?
|
|
7421
|
-
lipsyncLang:
|
|
7422
|
-
}) :
|
|
7423
|
-
lipsyncLang:
|
|
7426
|
+
const k = C.current || { lipsyncLang: "en" };
|
|
7427
|
+
v.type === "code_test" ? h.current.speakText(`Great! Now let's move on to your next coding challenge: ${v.question}`, {
|
|
7428
|
+
lipsyncLang: k.lipsyncLang
|
|
7429
|
+
}) : v.type === "multiple_choice" ? h.current.speakText(`Alright! Here's your next question: ${v.question}`, {
|
|
7430
|
+
lipsyncLang: k.lipsyncLang
|
|
7431
|
+
}) : v.type === "true_false" ? h.current.speakText(`Now let's try this one: ${v.question}`, {
|
|
7432
|
+
lipsyncLang: k.lipsyncLang
|
|
7433
|
+
}) : h.current.speakText(`Here's the next question: ${v.question}`, {
|
|
7434
|
+
lipsyncLang: k.lipsyncLang
|
|
7424
7435
|
});
|
|
7436
|
+
};
|
|
7437
|
+
if (h.current && h.current.isReady && v)
|
|
7438
|
+
R();
|
|
7439
|
+
else if (v) {
|
|
7440
|
+
const k = setInterval(() => {
|
|
7441
|
+
h.current && h.current.isReady && (clearInterval(k), R());
|
|
7442
|
+
}, 100);
|
|
7443
|
+
setTimeout(() => {
|
|
7444
|
+
clearInterval(k);
|
|
7445
|
+
}, 5e3);
|
|
7425
7446
|
}
|
|
7426
7447
|
} else
|
|
7427
|
-
|
|
7448
|
+
d.current.onCustomAction({
|
|
7428
7449
|
type: "allQuestionsComplete",
|
|
7429
7450
|
moduleIndex: l.current.currentModuleIndex,
|
|
7430
7451
|
lessonIndex: l.current.currentLessonIndex,
|
|
7431
7452
|
totalQuestions: l.current.totalQuestions,
|
|
7432
7453
|
score: l.current.score
|
|
7433
7454
|
});
|
|
7434
|
-
}, [e.nextQuestion,
|
|
7435
|
-
const
|
|
7436
|
-
l.current.currentLessonIndex < (v?.lessons?.length || 0) - 1 ? (l.current.currentLessonIndex += 1, l.current.currentQuestionIndex = 0, l.current.lessonCompleted = !1, l.current.isQuestionMode = !1, l.current.isTeaching = !1, l.current.score = 0, l.current.totalQuestions = 0,
|
|
7455
|
+
}, [e.nextQuestion, I, B]), O = M(() => {
|
|
7456
|
+
const b = z.current || { modules: [] }, v = b.modules[l.current.currentModuleIndex];
|
|
7457
|
+
l.current.currentLessonIndex < (v?.lessons?.length || 0) - 1 ? (l.current.currentLessonIndex += 1, l.current.currentQuestionIndex = 0, l.current.lessonCompleted = !1, l.current.isQuestionMode = !1, l.current.isTeaching = !1, l.current.score = 0, l.current.totalQuestions = 0, d.current.onCustomAction({
|
|
7437
7458
|
type: "lessonStart",
|
|
7438
7459
|
moduleIndex: l.current.currentModuleIndex,
|
|
7439
7460
|
lessonIndex: l.current.currentLessonIndex
|
|
7440
|
-
}),
|
|
7461
|
+
}), d.current.onLessonStart({
|
|
7441
7462
|
moduleIndex: l.current.currentModuleIndex,
|
|
7442
7463
|
lessonIndex: l.current.currentLessonIndex,
|
|
7443
|
-
lesson:
|
|
7444
|
-
}),
|
|
7464
|
+
lesson: I()
|
|
7465
|
+
}), h.current && (h.current.setMood("happy"), h.current.setBodyMovement("idle"))) : l.current.currentModuleIndex < (b.modules?.length || 0) - 1 ? (l.current.currentModuleIndex += 1, l.current.currentLessonIndex = 0, l.current.currentQuestionIndex = 0, l.current.lessonCompleted = !1, l.current.isQuestionMode = !1, l.current.isTeaching = !1, l.current.score = 0, l.current.totalQuestions = 0, d.current.onCustomAction({
|
|
7445
7466
|
type: "lessonStart",
|
|
7446
7467
|
moduleIndex: l.current.currentModuleIndex,
|
|
7447
7468
|
lessonIndex: l.current.currentLessonIndex
|
|
7448
|
-
}),
|
|
7469
|
+
}), d.current.onLessonStart({
|
|
7449
7470
|
moduleIndex: l.current.currentModuleIndex,
|
|
7450
7471
|
lessonIndex: l.current.currentLessonIndex,
|
|
7451
|
-
lesson:
|
|
7452
|
-
}),
|
|
7453
|
-
}, []), W =
|
|
7454
|
-
const
|
|
7472
|
+
lesson: I()
|
|
7473
|
+
}), h.current && (h.current.setMood("happy"), h.current.setBodyMovement("idle"))) : L.current && L.current();
|
|
7474
|
+
}, []), W = M(() => {
|
|
7475
|
+
const b = I();
|
|
7455
7476
|
let v = null;
|
|
7456
|
-
if (
|
|
7457
|
-
const
|
|
7458
|
-
v = `${
|
|
7477
|
+
if (b?.avatar_script && b?.body) {
|
|
7478
|
+
const R = b.avatar_script.trim(), k = b.body.trim(), H = R.match(/[.!?]$/) ? " " : ". ";
|
|
7479
|
+
v = `${R}${H}${k}`;
|
|
7459
7480
|
} else
|
|
7460
|
-
v =
|
|
7461
|
-
if (
|
|
7462
|
-
l.current.isTeaching = !0, l.current.isQuestionMode = !1,
|
|
7463
|
-
let
|
|
7481
|
+
v = b?.avatar_script || b?.body || null;
|
|
7482
|
+
if (h.current && h.current.isReady && v) {
|
|
7483
|
+
l.current.isTeaching = !0, l.current.isQuestionMode = !1, h.current.setMood("happy");
|
|
7484
|
+
let R = !1;
|
|
7464
7485
|
if (e.teaching)
|
|
7465
7486
|
try {
|
|
7466
|
-
|
|
7467
|
-
} catch (
|
|
7468
|
-
console.warn("Failed to play teaching animation:",
|
|
7487
|
+
h.current.playAnimation(e.teaching, !0), R = !0;
|
|
7488
|
+
} catch (H) {
|
|
7489
|
+
console.warn("Failed to play teaching animation:", H);
|
|
7469
7490
|
}
|
|
7470
|
-
|
|
7471
|
-
const
|
|
7472
|
-
|
|
7491
|
+
R || h.current.setBodyMovement("gesturing");
|
|
7492
|
+
const k = C.current || { lipsyncLang: "en" };
|
|
7493
|
+
d.current.onLessonStart({
|
|
7473
7494
|
moduleIndex: l.current.currentModuleIndex,
|
|
7474
7495
|
lessonIndex: l.current.currentLessonIndex,
|
|
7475
|
-
lesson:
|
|
7476
|
-
}),
|
|
7496
|
+
lesson: b
|
|
7497
|
+
}), d.current.onCustomAction({
|
|
7477
7498
|
type: "teachingStart",
|
|
7478
7499
|
moduleIndex: l.current.currentModuleIndex,
|
|
7479
7500
|
lessonIndex: l.current.currentLessonIndex,
|
|
7480
|
-
lesson:
|
|
7481
|
-
}),
|
|
7482
|
-
lipsyncLang:
|
|
7501
|
+
lesson: b
|
|
7502
|
+
}), h.current.speakText(v, {
|
|
7503
|
+
lipsyncLang: k.lipsyncLang,
|
|
7483
7504
|
onSpeechEnd: () => {
|
|
7484
|
-
l.current.isTeaching = !1,
|
|
7505
|
+
l.current.isTeaching = !1, d.current.onCustomAction({
|
|
7485
7506
|
type: "teachingComplete",
|
|
7486
7507
|
moduleIndex: l.current.currentModuleIndex,
|
|
7487
7508
|
lessonIndex: l.current.currentLessonIndex,
|
|
7488
|
-
lesson:
|
|
7489
|
-
hasQuestions:
|
|
7509
|
+
lesson: b,
|
|
7510
|
+
hasQuestions: b.questions && b.questions.length > 0
|
|
7490
7511
|
});
|
|
7491
7512
|
}
|
|
7492
7513
|
});
|
|
7493
7514
|
}
|
|
7494
|
-
}, [e.teaching,
|
|
7495
|
-
const v =
|
|
7496
|
-
if (
|
|
7515
|
+
}, [e.teaching, I]), _ = M((b) => {
|
|
7516
|
+
const v = B(), R = D(b, v);
|
|
7517
|
+
if (R && (l.current.score += 1), d.current.onQuestionAnswer({
|
|
7497
7518
|
moduleIndex: l.current.currentModuleIndex,
|
|
7498
7519
|
lessonIndex: l.current.currentLessonIndex,
|
|
7499
7520
|
questionIndex: l.current.currentQuestionIndex,
|
|
7500
|
-
answer:
|
|
7501
|
-
isCorrect:
|
|
7521
|
+
answer: b,
|
|
7522
|
+
isCorrect: R,
|
|
7502
7523
|
question: v
|
|
7503
|
-
}),
|
|
7504
|
-
if (
|
|
7505
|
-
if (
|
|
7524
|
+
}), h.current)
|
|
7525
|
+
if (R) {
|
|
7526
|
+
if (h.current.setMood("happy"), e.correct)
|
|
7506
7527
|
try {
|
|
7507
|
-
|
|
7528
|
+
h.current.playReaction("happy");
|
|
7508
7529
|
} catch {
|
|
7509
|
-
|
|
7530
|
+
h.current.setBodyMovement("happy");
|
|
7510
7531
|
}
|
|
7511
|
-
|
|
7512
|
-
const
|
|
7513
|
-
|
|
7514
|
-
lipsyncLang:
|
|
7532
|
+
h.current.setBodyMovement("gesturing");
|
|
7533
|
+
const k = v.type === "code_test" ? `Great job! Your code passed all the tests! ${v.explanation || ""}` : `Excellent! That's correct! ${v.explanation || ""}`, H = C.current || { lipsyncLang: "en" };
|
|
7534
|
+
h.current.speakText(k, {
|
|
7535
|
+
lipsyncLang: H.lipsyncLang,
|
|
7515
7536
|
onSpeechEnd: () => {
|
|
7516
|
-
|
|
7537
|
+
d.current.onCustomAction({
|
|
7517
7538
|
type: "answerFeedbackComplete",
|
|
7518
7539
|
moduleIndex: l.current.currentModuleIndex,
|
|
7519
7540
|
lessonIndex: l.current.currentLessonIndex,
|
|
7520
7541
|
questionIndex: l.current.currentQuestionIndex,
|
|
7521
7542
|
isCorrect: !0,
|
|
7522
|
-
hasNextQuestion: l.current.currentQuestionIndex < (
|
|
7543
|
+
hasNextQuestion: l.current.currentQuestionIndex < (I()?.questions?.length || 0) - 1
|
|
7523
7544
|
});
|
|
7524
7545
|
}
|
|
7525
7546
|
});
|
|
7526
7547
|
} else {
|
|
7527
|
-
if (
|
|
7548
|
+
if (h.current.setMood("sad"), e.incorrect)
|
|
7528
7549
|
try {
|
|
7529
|
-
|
|
7550
|
+
h.current.playAnimation(e.incorrect, !0);
|
|
7530
7551
|
} catch {
|
|
7531
|
-
|
|
7552
|
+
h.current.setBodyMovement("idle");
|
|
7532
7553
|
}
|
|
7533
|
-
|
|
7534
|
-
const
|
|
7535
|
-
|
|
7536
|
-
lipsyncLang:
|
|
7554
|
+
h.current.setBodyMovement("gesturing");
|
|
7555
|
+
const k = v.type === "code_test" ? `Your code didn't pass all the tests. ${v.explanation || "Try again!"}` : `Not quite right, but don't worry! ${v.explanation || ""} Let's move on to the next question.`, H = C.current || { lipsyncLang: "en" };
|
|
7556
|
+
h.current.speakText(k, {
|
|
7557
|
+
lipsyncLang: H.lipsyncLang,
|
|
7537
7558
|
onSpeechEnd: () => {
|
|
7538
|
-
|
|
7559
|
+
d.current.onCustomAction({
|
|
7539
7560
|
type: "answerFeedbackComplete",
|
|
7540
7561
|
moduleIndex: l.current.currentModuleIndex,
|
|
7541
7562
|
lessonIndex: l.current.currentLessonIndex,
|
|
7542
7563
|
questionIndex: l.current.currentQuestionIndex,
|
|
7543
7564
|
isCorrect: !1,
|
|
7544
|
-
hasNextQuestion: l.current.currentQuestionIndex < (
|
|
7565
|
+
hasNextQuestion: l.current.currentQuestionIndex < (I()?.questions?.length || 0) - 1
|
|
7545
7566
|
});
|
|
7546
7567
|
}
|
|
7547
7568
|
});
|
|
7548
7569
|
}
|
|
7549
7570
|
else
|
|
7550
|
-
|
|
7571
|
+
d.current.onCustomAction({
|
|
7551
7572
|
type: "answerFeedbackComplete",
|
|
7552
7573
|
moduleIndex: l.current.currentModuleIndex,
|
|
7553
7574
|
lessonIndex: l.current.currentLessonIndex,
|
|
7554
7575
|
questionIndex: l.current.currentQuestionIndex,
|
|
7555
|
-
isCorrect:
|
|
7556
|
-
hasNextQuestion: l.current.currentQuestionIndex < (
|
|
7576
|
+
isCorrect: R,
|
|
7577
|
+
hasNextQuestion: l.current.currentQuestionIndex < (I()?.questions?.length || 0) - 1,
|
|
7557
7578
|
avatarNotReady: !0
|
|
7558
7579
|
});
|
|
7559
|
-
}, [e.correct, e.incorrect,
|
|
7560
|
-
const v =
|
|
7561
|
-
if (!
|
|
7580
|
+
}, [e.correct, e.incorrect, B, I, D]), K = M((b) => {
|
|
7581
|
+
const v = B();
|
|
7582
|
+
if (!b || typeof b != "object") {
|
|
7562
7583
|
console.error("Invalid code test result format. Expected object with {passed: boolean, ...}");
|
|
7563
7584
|
return;
|
|
7564
7585
|
}
|
|
@@ -7566,98 +7587,157 @@ const nt = ye(({
|
|
|
7566
7587
|
console.warn("Current question is not a code test. Use handleAnswerSelect for other question types.");
|
|
7567
7588
|
return;
|
|
7568
7589
|
}
|
|
7569
|
-
const
|
|
7570
|
-
passed:
|
|
7571
|
-
results:
|
|
7572
|
-
output:
|
|
7573
|
-
error:
|
|
7574
|
-
executionTime:
|
|
7575
|
-
testCount:
|
|
7576
|
-
passedCount:
|
|
7577
|
-
failedCount:
|
|
7590
|
+
const R = {
|
|
7591
|
+
passed: b.passed === !0,
|
|
7592
|
+
results: b.results || [],
|
|
7593
|
+
output: b.output || "",
|
|
7594
|
+
error: b.error || null,
|
|
7595
|
+
executionTime: b.executionTime || null,
|
|
7596
|
+
testCount: b.testCount || 0,
|
|
7597
|
+
passedCount: b.passedCount || 0,
|
|
7598
|
+
failedCount: b.failedCount || 0
|
|
7578
7599
|
};
|
|
7579
|
-
|
|
7600
|
+
d.current.onCustomAction({
|
|
7580
7601
|
type: "codeTestSubmitted",
|
|
7581
7602
|
moduleIndex: l.current.currentModuleIndex,
|
|
7582
7603
|
lessonIndex: l.current.currentLessonIndex,
|
|
7583
7604
|
questionIndex: l.current.currentQuestionIndex,
|
|
7584
|
-
testResult:
|
|
7605
|
+
testResult: R,
|
|
7585
7606
|
question: v
|
|
7586
|
-
}), p.current && p.current(
|
|
7587
|
-
}, [
|
|
7607
|
+
}), p.current && p.current(R);
|
|
7608
|
+
}, [B, D]), se = M(() => {
|
|
7609
|
+
if (l.current.currentQuestionIndex > 0) {
|
|
7610
|
+
l.current.currentQuestionIndex -= 1;
|
|
7611
|
+
const b = B();
|
|
7612
|
+
b && d.current.onCustomAction({
|
|
7613
|
+
type: "questionStart",
|
|
7614
|
+
moduleIndex: l.current.currentModuleIndex,
|
|
7615
|
+
lessonIndex: l.current.currentLessonIndex,
|
|
7616
|
+
questionIndex: l.current.currentQuestionIndex,
|
|
7617
|
+
totalQuestions: l.current.totalQuestions,
|
|
7618
|
+
question: b
|
|
7619
|
+
});
|
|
7620
|
+
const v = () => {
|
|
7621
|
+
if (!h.current || !b) return;
|
|
7622
|
+
h.current.setMood("happy"), h.current.setBodyMovement("idle");
|
|
7623
|
+
const R = C.current || { lipsyncLang: "en" };
|
|
7624
|
+
b.type === "code_test" ? h.current.speakText(`Let's go back to this coding challenge: ${b.question}`, {
|
|
7625
|
+
lipsyncLang: R.lipsyncLang
|
|
7626
|
+
}) : h.current.speakText(`Going back to: ${b.question}`, {
|
|
7627
|
+
lipsyncLang: R.lipsyncLang
|
|
7628
|
+
});
|
|
7629
|
+
};
|
|
7630
|
+
if (h.current && h.current.isReady && b)
|
|
7631
|
+
v();
|
|
7632
|
+
else if (b) {
|
|
7633
|
+
const R = setInterval(() => {
|
|
7634
|
+
h.current && h.current.isReady && (clearInterval(R), v());
|
|
7635
|
+
}, 100);
|
|
7636
|
+
setTimeout(() => {
|
|
7637
|
+
clearInterval(R);
|
|
7638
|
+
}, 5e3);
|
|
7639
|
+
}
|
|
7640
|
+
}
|
|
7641
|
+
}, [B]), pe = M(() => {
|
|
7642
|
+
const b = z.current || { modules: [] };
|
|
7643
|
+
if (b.modules[l.current.currentModuleIndex], l.current.currentLessonIndex > 0)
|
|
7644
|
+
l.current.currentLessonIndex -= 1, l.current.currentQuestionIndex = 0, l.current.lessonCompleted = !1, l.current.isQuestionMode = !1, l.current.isTeaching = !1, l.current.score = 0, l.current.totalQuestions = 0, d.current.onCustomAction({
|
|
7645
|
+
type: "lessonStart",
|
|
7646
|
+
moduleIndex: l.current.currentModuleIndex,
|
|
7647
|
+
lessonIndex: l.current.currentLessonIndex
|
|
7648
|
+
}), d.current.onLessonStart({
|
|
7649
|
+
moduleIndex: l.current.currentModuleIndex,
|
|
7650
|
+
lessonIndex: l.current.currentLessonIndex,
|
|
7651
|
+
lesson: I()
|
|
7652
|
+
}), h.current && (h.current.setMood("happy"), h.current.setBodyMovement("idle"));
|
|
7653
|
+
else if (l.current.currentModuleIndex > 0) {
|
|
7654
|
+
const k = b.modules[l.current.currentModuleIndex - 1];
|
|
7655
|
+
l.current.currentModuleIndex -= 1, l.current.currentLessonIndex = (k?.lessons?.length || 1) - 1, l.current.currentQuestionIndex = 0, l.current.lessonCompleted = !1, l.current.isQuestionMode = !1, l.current.isTeaching = !1, l.current.score = 0, l.current.totalQuestions = 0, d.current.onCustomAction({
|
|
7656
|
+
type: "lessonStart",
|
|
7657
|
+
moduleIndex: l.current.currentModuleIndex,
|
|
7658
|
+
lessonIndex: l.current.currentLessonIndex
|
|
7659
|
+
}), d.current.onLessonStart({
|
|
7660
|
+
moduleIndex: l.current.currentModuleIndex,
|
|
7661
|
+
lessonIndex: l.current.currentLessonIndex,
|
|
7662
|
+
lesson: I()
|
|
7663
|
+
}), h.current && (h.current.setMood("happy"), h.current.setBodyMovement("idle"));
|
|
7664
|
+
}
|
|
7665
|
+
}, [I]), ue = M(() => {
|
|
7588
7666
|
l.current.currentModuleIndex = 0, l.current.currentLessonIndex = 0, l.current.currentQuestionIndex = 0, l.current.isTeaching = !1, l.current.isQuestionMode = !1, l.current.lessonCompleted = !1, l.current.curriculumCompleted = !1, l.current.score = 0, l.current.totalQuestions = 0;
|
|
7589
|
-
}, []), ge =
|
|
7590
|
-
console.log("Avatar is ready!",
|
|
7591
|
-
const v =
|
|
7592
|
-
|
|
7593
|
-
|
|
7667
|
+
}, []), ge = M((b) => {
|
|
7668
|
+
console.log("Avatar is ready!", b);
|
|
7669
|
+
const v = I(), R = v?.avatar_script || v?.body;
|
|
7670
|
+
u && R && setTimeout(() => {
|
|
7671
|
+
c.current && c.current();
|
|
7594
7672
|
}, 10);
|
|
7595
|
-
}, [
|
|
7673
|
+
}, [u, I]);
|
|
7596
7674
|
Ee(() => {
|
|
7597
|
-
|
|
7598
|
-
}),
|
|
7675
|
+
c.current = W, g.current = O, y.current = X, x.current = P, L.current = oe, F.current = S, p.current = _;
|
|
7676
|
+
}), xe(a, () => ({
|
|
7599
7677
|
// Curriculum control methods
|
|
7600
7678
|
startTeaching: W,
|
|
7601
|
-
startQuestions:
|
|
7602
|
-
handleAnswerSelect:
|
|
7603
|
-
handleCodeTestResult:
|
|
7604
|
-
nextQuestion:
|
|
7605
|
-
|
|
7606
|
-
|
|
7607
|
-
|
|
7608
|
-
|
|
7679
|
+
startQuestions: S,
|
|
7680
|
+
handleAnswerSelect: _,
|
|
7681
|
+
handleCodeTestResult: K,
|
|
7682
|
+
nextQuestion: P,
|
|
7683
|
+
previousQuestion: se,
|
|
7684
|
+
nextLesson: O,
|
|
7685
|
+
previousLesson: pe,
|
|
7686
|
+
completeLesson: X,
|
|
7687
|
+
completeCurriculum: oe,
|
|
7688
|
+
resetCurriculum: ue,
|
|
7609
7689
|
getState: () => ({ ...l.current }),
|
|
7610
|
-
getCurrentQuestion: () =>
|
|
7611
|
-
getCurrentLesson: () =>
|
|
7690
|
+
getCurrentQuestion: () => B(),
|
|
7691
|
+
getCurrentLesson: () => I(),
|
|
7612
7692
|
// Direct access to avatar ref (always returns current value)
|
|
7613
|
-
getAvatarRef: () =>
|
|
7693
|
+
getAvatarRef: () => h.current,
|
|
7614
7694
|
// Convenience methods that delegate to avatar (always check current ref)
|
|
7615
|
-
speakText: async (
|
|
7616
|
-
await
|
|
7617
|
-
const
|
|
7618
|
-
|
|
7695
|
+
speakText: async (b, v = {}) => {
|
|
7696
|
+
await h.current?.resumeAudioContext?.();
|
|
7697
|
+
const R = C.current || { lipsyncLang: "en" };
|
|
7698
|
+
h.current?.speakText(b, { ...v, lipsyncLang: v.lipsyncLang || R.lipsyncLang });
|
|
7619
7699
|
},
|
|
7620
7700
|
resumeAudioContext: async () => {
|
|
7621
|
-
if (
|
|
7622
|
-
return await
|
|
7623
|
-
const
|
|
7624
|
-
if (
|
|
7625
|
-
const v =
|
|
7701
|
+
if (h.current?.resumeAudioContext)
|
|
7702
|
+
return await h.current.resumeAudioContext();
|
|
7703
|
+
const b = h.current?.talkingHead;
|
|
7704
|
+
if (b?.audioCtx) {
|
|
7705
|
+
const v = b.audioCtx;
|
|
7626
7706
|
if (v.state === "suspended" || v.state === "interrupted")
|
|
7627
7707
|
try {
|
|
7628
7708
|
await v.resume(), console.log("Audio context resumed via talkingHead");
|
|
7629
|
-
} catch (
|
|
7630
|
-
console.warn("Failed to resume audio context:",
|
|
7709
|
+
} catch (R) {
|
|
7710
|
+
console.warn("Failed to resume audio context:", R);
|
|
7631
7711
|
}
|
|
7632
7712
|
} else
|
|
7633
7713
|
console.warn("Audio context not available yet");
|
|
7634
7714
|
},
|
|
7635
|
-
stopSpeaking: () =>
|
|
7636
|
-
setMood: (
|
|
7637
|
-
playAnimation: (
|
|
7638
|
-
setBodyMovement: (
|
|
7639
|
-
setMovementIntensity: (
|
|
7640
|
-
playRandomDance: () =>
|
|
7641
|
-
playReaction: (
|
|
7642
|
-
playCelebration: () =>
|
|
7643
|
-
setShowFullAvatar: (
|
|
7644
|
-
setTimingAdjustment: (
|
|
7645
|
-
lockAvatarPosition: () =>
|
|
7646
|
-
unlockAvatarPosition: () =>
|
|
7715
|
+
stopSpeaking: () => h.current?.stopSpeaking(),
|
|
7716
|
+
setMood: (b) => h.current?.setMood(b),
|
|
7717
|
+
playAnimation: (b, v) => h.current?.playAnimation(b, v),
|
|
7718
|
+
setBodyMovement: (b) => h.current?.setBodyMovement(b),
|
|
7719
|
+
setMovementIntensity: (b) => h.current?.setMovementIntensity(b),
|
|
7720
|
+
playRandomDance: () => h.current?.playRandomDance(),
|
|
7721
|
+
playReaction: (b) => h.current?.playReaction(b),
|
|
7722
|
+
playCelebration: () => h.current?.playCelebration(),
|
|
7723
|
+
setShowFullAvatar: (b) => h.current?.setShowFullAvatar(b),
|
|
7724
|
+
setTimingAdjustment: (b) => h.current?.setTimingAdjustment(b),
|
|
7725
|
+
lockAvatarPosition: () => h.current?.lockAvatarPosition(),
|
|
7726
|
+
unlockAvatarPosition: () => h.current?.unlockAvatarPosition(),
|
|
7647
7727
|
// Custom action trigger
|
|
7648
|
-
triggerCustomAction: (
|
|
7649
|
-
|
|
7650
|
-
type:
|
|
7728
|
+
triggerCustomAction: (b, v) => {
|
|
7729
|
+
d.current.onCustomAction({
|
|
7730
|
+
type: b,
|
|
7651
7731
|
...v,
|
|
7652
7732
|
state: { ...l.current }
|
|
7653
7733
|
});
|
|
7654
7734
|
},
|
|
7655
7735
|
// Responsive resize handler
|
|
7656
|
-
handleResize: () =>
|
|
7736
|
+
handleResize: () => h.current?.handleResize(),
|
|
7657
7737
|
// Avatar readiness check (always returns current value)
|
|
7658
|
-
isAvatarReady: () =>
|
|
7659
|
-
}), [W,
|
|
7660
|
-
const
|
|
7738
|
+
isAvatarReady: () => h.current?.isReady || !1
|
|
7739
|
+
}), [W, S, _, K, P, O, X, oe, ue, B, I]);
|
|
7740
|
+
const Q = C.current || {
|
|
7661
7741
|
avatarUrl: "/avatars/brunette.glb",
|
|
7662
7742
|
avatarBody: "F",
|
|
7663
7743
|
mood: "happy",
|
|
@@ -7670,27 +7750,27 @@ const nt = ye(({
|
|
|
7670
7750
|
showFullAvatar: !1,
|
|
7671
7751
|
animations: e
|
|
7672
7752
|
};
|
|
7673
|
-
return /* @__PURE__ */
|
|
7753
|
+
return /* @__PURE__ */ ne("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ ne(
|
|
7674
7754
|
ze,
|
|
7675
7755
|
{
|
|
7676
|
-
ref:
|
|
7677
|
-
avatarUrl:
|
|
7678
|
-
avatarBody:
|
|
7679
|
-
mood:
|
|
7680
|
-
ttsLang:
|
|
7681
|
-
ttsService:
|
|
7682
|
-
ttsVoice:
|
|
7683
|
-
ttsApiKey:
|
|
7684
|
-
bodyMovement:
|
|
7685
|
-
movementIntensity:
|
|
7686
|
-
showFullAvatar:
|
|
7756
|
+
ref: h,
|
|
7757
|
+
avatarUrl: Q.avatarUrl,
|
|
7758
|
+
avatarBody: Q.avatarBody,
|
|
7759
|
+
mood: Q.mood,
|
|
7760
|
+
ttsLang: Q.ttsLang,
|
|
7761
|
+
ttsService: Q.ttsService,
|
|
7762
|
+
ttsVoice: Q.ttsVoice,
|
|
7763
|
+
ttsApiKey: Q.ttsApiKey,
|
|
7764
|
+
bodyMovement: Q.bodyMovement,
|
|
7765
|
+
movementIntensity: Q.movementIntensity,
|
|
7766
|
+
showFullAvatar: Q.showFullAvatar,
|
|
7687
7767
|
cameraView: "upper",
|
|
7688
|
-
animations:
|
|
7768
|
+
animations: Q.animations,
|
|
7689
7769
|
onReady: ge,
|
|
7690
7770
|
onLoading: () => {
|
|
7691
7771
|
},
|
|
7692
|
-
onError: (
|
|
7693
|
-
console.error("Avatar error:",
|
|
7772
|
+
onError: (b) => {
|
|
7773
|
+
console.error("Avatar error:", b);
|
|
7694
7774
|
}
|
|
7695
7775
|
}
|
|
7696
7776
|
) });
|
|
@@ -7799,13 +7879,13 @@ const Ce = {
|
|
|
7799
7879
|
duration: 5e3,
|
|
7800
7880
|
description: "Excited, energetic movement"
|
|
7801
7881
|
}
|
|
7802
|
-
}, pt = (
|
|
7882
|
+
}, pt = (N) => Ce[N] || null, gt = (N) => Ce.hasOwnProperty(N);
|
|
7803
7883
|
export {
|
|
7804
7884
|
nt as CurriculumLearning,
|
|
7805
7885
|
ze as TalkingHeadAvatar,
|
|
7806
7886
|
it as TalkingHeadComponent,
|
|
7807
7887
|
Ce as animations,
|
|
7808
|
-
|
|
7888
|
+
be as getActiveTTSConfig,
|
|
7809
7889
|
pt as getAnimation,
|
|
7810
7890
|
mt as getVoiceOptions,
|
|
7811
7891
|
gt as hasAnimation
|