Files
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

86 lines
3.1 KiB
TypeScript

/**
* Tests for the shared speaker-encoder surface: the stored model-id /
* dimension constants and the pure `averageEmbeddings` centroid helper (the
* heart of first-run centroid construction).
*
* The speaker encoder itself runs EXCLUSIVELY through the fused
* `libelizainference` `eliza_inference_speaker_*` ABI (`FusedSpeakerEncoder`);
* its real-FFI coverage lives in `src/services/voice/speaker/encoder-fused.real.test.ts`
* (gated on a built `libelizainference`). There is no standalone encoder to
* smoke-test here.
*/
import { describe, expect, it } from "vitest";
import {
averageEmbeddings,
SpeakerEncoderUnavailableError,
WESPEAKER_EMBEDDING_DIM,
WESPEAKER_MIN_SAMPLES,
WESPEAKER_RESNET34_LM_FP32_MODEL_ID,
WESPEAKER_RESNET34_LM_INT8_MODEL_ID,
WESPEAKER_SAMPLE_RATE,
} from "../src/services/voice/speaker/encoder";
describe("Speaker encoder — shared module constants", () => {
it("declares 256-dim embedding output", () => {
expect(WESPEAKER_EMBEDDING_DIM).toBe(256);
});
it("declares 16 kHz input sample rate", () => {
expect(WESPEAKER_SAMPLE_RATE).toBe(16_000);
});
it("requires ≥ 1.0s of audio (16_000 samples)", () => {
expect(WESPEAKER_MIN_SAMPLES).toBe(16_000);
});
it("declares stable int8 + fp32 model ids", () => {
expect(WESPEAKER_RESNET34_LM_INT8_MODEL_ID).toBe("wespeaker-resnet34-lm-int8");
expect(WESPEAKER_RESNET34_LM_FP32_MODEL_ID).toBe("wespeaker-resnet34-lm-fp32");
});
});
describe("averageEmbeddings", () => {
function unit(values: number[]): Float32Array {
const out = new Float32Array(values.length);
let sumSq = 0;
for (const v of values) sumSq += v * v;
const inv = sumSq > 0 ? 1 / Math.sqrt(sumSq) : 1;
for (let i = 0; i < values.length; i += 1) out[i] = values[i] * inv;
return out;
}
it("returns a single L2-normalized centroid", () => {
const out = averageEmbeddings([unit([1, 0, 0]), unit([0, 1, 0]), unit([0, 0, 1])]);
let sumSq = 0;
for (const v of out) sumSq += v * v;
expect(sumSq).toBeCloseTo(1, 6);
// Centroid should be uniformly close to ((1/√3)/√3) on each dim.
expect(out[0]).toBeCloseTo(out[1], 6);
expect(out[1]).toBeCloseTo(out[2], 6);
});
it("equals the single input when called with N=1", () => {
const a = unit([1, 2, 3, 4]);
const out = averageEmbeddings([a]);
expect(Array.from(out)).toEqual(Array.from(a));
});
it("rejects empty input", () => {
expect(() => averageEmbeddings([])).toThrow(SpeakerEncoderUnavailableError);
});
it("rejects dim-mismatched inputs", () => {
expect(() =>
averageEmbeddings([new Float32Array([1, 0, 0]), new Float32Array([1, 0])]),
).toThrow(SpeakerEncoderUnavailableError);
});
it("centroid of near-identical samples is nearly identical to the prototype", () => {
const proto = unit([1, 1, 1, 1, 1, 1, 1, 1]);
const perturbed = [proto, unit([1.01, 0.99, 1, 1, 1, 1, 1, 1]), unit([0.99, 1.01, 1, 1, 1, 1, 1, 1])];
const centroid = averageEmbeddings(perturbed);
// Cosine similarity between the centroid and the prototype is ≈1.
let dot = 0;
for (let i = 0; i < centroid.length; i += 1) dot += centroid[i] * proto[i];
expect(dot).toBeGreaterThan(0.999);
});
});