@elizaos/plugin-local-inference 2.0.3-beta.2 → 2.0.3-beta.4
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/README.md +84 -10
- package/dist/actions/generate-media.d.ts.map +1 -0
- package/dist/actions/identify-speaker.d.ts.map +1 -0
- package/dist/actions/transcription-control.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
- package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.d.ts +18 -0
- package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
- package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/types.d.ts +338 -0
- package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
- package/dist/backends/apple-foundation.d.ts +56 -0
- package/dist/backends/apple-foundation.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39647 -0
- package/dist/index.js.map +217 -0
- package/{src → dist}/local-inference-routes.d.ts +9 -0
- package/dist/local-inference-routes.d.ts.map +1 -0
- package/dist/provider.d.ts.map +1 -0
- package/{src → dist}/routes/compat-helpers.d.ts +1 -1
- package/dist/routes/compat-helpers.d.ts.map +1 -0
- package/dist/routes/family-member-route.d.ts.map +1 -0
- package/{src → dist}/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +42040 -0
- package/dist/routes/index.js.map +236 -0
- package/{src → dist}/routes/live-diarization-route.d.ts +7 -0
- package/dist/routes/live-diarization-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
- package/dist/routes/native-pcm-turn-route.d.ts +3 -0
- package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
- package/dist/routes/transcript-audio-store.d.ts.map +1 -0
- package/{src → dist}/routes/transcripts-routes.d.ts +8 -0
- package/dist/routes/transcripts-routes.d.ts.map +1 -0
- package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
- package/dist/routes/voice-models-routes.d.ts.map +1 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
- package/dist/runtime/embedding-presets.d.ts.map +1 -0
- package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/{src → dist}/runtime/ensure-local-inference-handler.d.ts +8 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/{src → dist}/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +38768 -0
- package/dist/runtime/index.js.map +217 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/{src → dist}/runtime/voice-entity-binding.d.ts +10 -0
- package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
- package/{src → dist}/services/active-model.d.ts +28 -0
- package/dist/services/active-model.d.ts.map +1 -0
- package/dist/services/asr-provenance.d.ts +5 -0
- package/dist/services/asr-provenance.d.ts.map +1 -0
- package/{src → dist}/services/assignments.d.ts +16 -3
- package/dist/services/assignments.d.ts.map +1 -0
- package/dist/services/backend-selector.d.ts +55 -0
- package/dist/services/backend-selector.d.ts.map +1 -0
- package/{src → dist}/services/backend.d.ts +110 -16
- package/dist/services/backend.d.ts.map +1 -0
- package/{src → dist}/services/bionic-host-loader.d.ts +21 -0
- package/dist/services/bionic-host-loader.d.ts.map +1 -0
- package/dist/services/bundled-models.d.ts.map +1 -0
- package/dist/services/cache-bridge.d.ts.map +1 -0
- package/dist/services/catalog.d.ts +10 -0
- package/dist/services/catalog.d.ts.map +1 -0
- package/dist/services/checkpoint-client.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.d.ts +217 -0
- package/dist/services/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/cloud-fallback.d.ts.map +1 -0
- package/dist/services/context-fit.d.ts +36 -0
- package/dist/services/context-fit.d.ts.map +1 -0
- package/dist/services/conversation-registry.d.ts.map +1 -0
- package/{src → dist}/services/desktop-fused-ffi-backend-runtime.d.ts +22 -6
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/dist/services/device-bridge.d.ts.map +1 -0
- package/dist/services/device-resource-metrics.d.ts.map +1 -0
- package/{src → dist}/services/device-tier.d.ts +19 -1
- package/dist/services/device-tier.d.ts.map +1 -0
- package/{src → dist}/services/downloader.d.ts +16 -4
- package/dist/services/downloader.d.ts.map +1 -0
- package/{src → dist}/services/engine.d.ts +43 -4
- package/dist/services/engine.d.ts.map +1 -0
- package/dist/services/ensure-local-artifacts.d.ts +82 -0
- package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
- package/dist/services/external-scanner.d.ts.map +1 -0
- package/dist/services/ffi-llm-mock.d.ts +90 -0
- package/dist/services/ffi-llm-mock.d.ts.map +1 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-backend.d.ts +28 -7
- package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-runner.d.ts +24 -0
- package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
- package/dist/services/gpu-autotune.d.ts +150 -0
- package/dist/services/gpu-autotune.d.ts.map +1 -0
- package/dist/services/gpu-detect.d.ts.map +1 -0
- package/dist/services/handler-registry.d.ts.map +1 -0
- package/dist/services/hardware.d.ts.map +1 -0
- package/dist/services/image-description-runtime.d.ts.map +1 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/errors.d.ts.map +1 -0
- package/dist/services/imagegen/index.d.ts.map +1 -0
- package/dist/services/imagegen/mflux.d.ts.map +1 -0
- package/{src → dist}/services/imagegen/sd-cpp.d.ts +1 -0
- package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/types.d.ts.map +1 -0
- package/{src → dist}/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39453 -0
- package/dist/services/index.js.map +227 -0
- package/dist/services/inference-capabilities.d.ts.map +1 -0
- package/dist/services/inference-telemetry.d.ts.map +1 -0
- package/dist/services/ios-llama-streaming.d.ts +119 -0
- package/dist/services/ios-llama-streaming.d.ts.map +1 -0
- package/dist/services/kv-spill.d.ts.map +1 -0
- package/dist/services/latency-trace.d.ts.map +1 -0
- package/dist/services/lib-target.d.ts +55 -0
- package/dist/services/lib-target.d.ts.map +1 -0
- package/dist/services/live-signals.d.ts +86 -0
- package/dist/services/live-signals.d.ts.map +1 -0
- package/dist/services/llama-server-metrics.d.ts +114 -0
- package/dist/services/llama-server-metrics.d.ts.map +1 -0
- package/dist/services/llm-streaming-binding.d.ts.map +1 -0
- package/dist/services/load-args.d.ts.map +1 -0
- package/dist/services/manifest/index.d.ts +4 -0
- package/dist/services/manifest/index.d.ts.map +1 -0
- package/{src → dist}/services/manifest/schema.d.ts +196 -6
- package/dist/services/manifest/schema.d.ts.map +1 -0
- package/{src → dist}/services/manifest/types.d.ts +3 -1
- package/dist/services/manifest/types.d.ts.map +1 -0
- package/dist/services/manifest/validator.d.ts.map +1 -0
- package/{src → dist}/services/memory-arbiter.d.ts +33 -3
- package/dist/services/memory-arbiter.d.ts.map +1 -0
- package/dist/services/memory-benchmark.d.ts +76 -0
- package/dist/services/memory-benchmark.d.ts.map +1 -0
- package/{src → dist}/services/memory-monitor.d.ts +6 -0
- package/dist/services/memory-monitor.d.ts.map +1 -0
- package/dist/services/memory-pressure.d.ts.map +1 -0
- package/dist/services/mtp-doctor.d.ts.map +1 -0
- package/dist/services/network-policy.d.ts.map +1 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/planner-skeleton.d.ts.map +1 -0
- package/dist/services/providers.d.ts.map +1 -0
- package/dist/services/ram-budget.d.ts.map +1 -0
- package/dist/services/readiness.d.ts.map +1 -0
- package/dist/services/recommendation.d.ts.map +1 -0
- package/{src → dist}/services/registry.d.ts +11 -13
- package/dist/services/registry.d.ts.map +1 -0
- package/{src → dist}/services/router-handler.d.ts +2 -2
- package/dist/services/router-handler.d.ts.map +1 -0
- package/{src → dist}/services/routing-policy.d.ts +32 -9
- package/dist/services/routing-policy.d.ts.map +1 -0
- package/dist/services/routing-preferences.d.ts.map +1 -0
- package/dist/services/runtime-target.d.ts.map +1 -0
- package/{src → dist}/services/service.d.ts +1 -1
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/session-pool.d.ts.map +1 -0
- package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/dist/services/structured-output/index.d.ts +2 -0
- package/dist/services/structured-output/index.d.ts.map +1 -0
- package/dist/services/structured-output.d.ts.map +1 -0
- package/dist/services/system-memory.d.ts.map +1 -0
- package/{src → dist}/services/types.d.ts +1 -1
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/verify-on-device.d.ts.map +1 -0
- package/dist/services/verify.d.ts.map +1 -0
- package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
- package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
- package/dist/services/vision/hash.d.ts.map +1 -0
- package/{src → dist}/services/vision/index.d.ts +1 -1
- package/dist/services/vision/index.d.ts.map +1 -0
- package/dist/services/vision/llama-server.d.ts.map +1 -0
- package/{src → dist}/services/vision/types.d.ts +13 -4
- package/dist/services/vision/types.d.ts.map +1 -0
- package/dist/services/vision/vast-fallback.d.ts.map +1 -0
- package/{src → dist}/services/vision-embedding-cache.d.ts +1 -1
- package/dist/services/vision-embedding-cache.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/audio-frame-consumer.d.ts +82 -0
- package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/dist/services/voice/barge-in.d.ts.map +1 -0
- package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-policy.d.ts +178 -0
- package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
- package/dist/services/voice/corpus-augment.d.ts +111 -0
- package/dist/services/voice/corpus-augment.d.ts.map +1 -0
- package/dist/services/voice/corpus-generator.d.ts +134 -0
- package/dist/services/voice/corpus-generator.d.ts.map +1 -0
- package/dist/services/voice/diarization-error-rate.d.ts +40 -0
- package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
- package/dist/services/voice/e2e-harness.d.ts +297 -0
- package/dist/services/voice/e2e-harness.d.ts.map +1 -0
- package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
- package/dist/services/voice/echo-delay.d.ts +67 -0
- package/dist/services/voice/echo-delay.d.ts.map +1 -0
- package/dist/services/voice/echo-metrics.d.ts +7 -0
- package/dist/services/voice/echo-metrics.d.ts.map +1 -0
- package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
- package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
- package/{src → dist}/services/voice/eliza1-eot-scorer.d.ts +8 -8
- package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/dist/services/voice/embedding-server.d.ts +37 -0
- package/dist/services/voice/embedding-server.d.ts.map +1 -0
- package/{src → dist}/services/voice/embedding.d.ts +2 -3
- package/dist/services/voice/embedding.d.ts.map +1 -0
- package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/engine-bridge.d.ts +8 -5
- package/dist/services/voice/engine-bridge.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier-ggml.d.ts +22 -22
- package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier.d.ts +9 -12
- package/dist/services/voice/eot-classifier.d.ts.map +1 -0
- package/{src → dist}/services/voice/errors.d.ts +1 -1
- package/dist/services/voice/errors.d.ts.map +1 -0
- package/{src → dist}/services/voice/expressive-tags.d.ts +5 -5
- package/dist/services/voice/expressive-tags.d.ts.map +1 -0
- package/{src → dist}/services/voice/ffi-bindings.d.ts +26 -4
- package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
- package/dist/services/voice/first-line-cache.d.ts.map +1 -0
- package/{src → dist}/services/voice/fused-eot-scorer.d.ts +6 -6
- package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/{src → dist}/services/voice/index.d.ts +8 -3
- package/dist/services/voice/index.d.ts.map +1 -0
- package/dist/services/voice/kokoro/index.d.ts +24 -0
- package/dist/services/voice/kokoro/index.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-backend.d.ts +15 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-engine-discovery.d.ts +1 -1
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-ffi-runtime.d.ts +3 -3
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/pick-runtime.d.ts +1 -1
- package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/dist/services/voice/kokoro/types.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
- package/dist/services/voice/lifecycle.d.ts.map +1 -0
- package/dist/services/voice/live-diarization-session.d.ts +196 -0
- package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
- package/dist/services/voice/metric-math.d.ts +10 -0
- package/dist/services/voice/metric-math.d.ts.map +1 -0
- package/{src → dist}/services/voice/mic-source.d.ts +1 -1
- package/dist/services/voice/mic-source.d.ts.map +1 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
- package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
- package/dist/services/voice/optimistic-rollback.d.ts +151 -0
- package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
- package/{src → dist}/services/voice/partial-stabilizer.d.ts +1 -1
- package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/dist/services/voice/phrase-cache.d.ts.map +1 -0
- package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
- package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
- package/dist/services/voice/pipeline.d.ts.map +1 -0
- package/dist/services/voice/prefill-client.d.ts.map +1 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/dist/services/voice/profile-store.d.ts.map +1 -0
- package/dist/services/voice/ring-buffer.d.ts.map +1 -0
- package/dist/services/voice/rollback-queue.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/dist/services/voice/scheduler.d.ts.map +1 -0
- package/dist/services/voice/self-voice-imprint.d.ts +33 -0
- package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
- package/{src → dist}/services/voice/shared-resources.d.ts +14 -0
- package/dist/services/voice/shared-resources.d.ts.map +1 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
- package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
- package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
- package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcriber.d.ts +4 -4
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-service.d.ts +20 -1
- package/dist/services/voice/transcript-service.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-store.d.ts +12 -1
- package/dist/services/voice/transcript-store.d.ts.map +1 -0
- package/dist/services/voice/turn-controller.d.ts.map +1 -0
- package/{src → dist}/services/voice/types.d.ts +6 -6
- package/dist/services/voice/types.d.ts.map +1 -0
- package/{src → dist}/services/voice/vad.d.ts +6 -5
- package/dist/services/voice/vad.d.ts.map +1 -0
- package/dist/services/voice/voice-budget.d.ts.map +1 -0
- package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
- package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
- package/{src → dist}/services/voice/voice-preset-format.d.ts +2 -2
- package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/dist/services/voice/voice-scenario.d.ts +131 -0
- package/dist/services/voice/voice-scenario.d.ts.map +1 -0
- package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
- package/dist/services/voice/voice-workbench-report.d.ts +117 -0
- package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
- package/{src → dist}/services/voice/wake-word-ggml.d.ts +8 -9
- package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/dist/services/voice/wake-word.d.ts.map +1 -0
- package/dist/services/voice/wav-codec.d.ts +11 -0
- package/dist/services/voice/wav-codec.d.ts.map +1 -0
- package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
- package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
- package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
- package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
- package/dist/services/voice/workbench-logic-services.d.ts +36 -0
- package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-real-services.d.ts +17 -0
- package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-scenarios.d.ts +24 -0
- package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
- package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/dist/services/voice-model-updater.d.ts.map +1 -0
- package/dist/services/voice-prewarm.d.ts.map +1 -0
- package/dist/voice-workbench.d.ts +18 -0
- package/dist/voice-workbench.d.ts.map +1 -0
- package/dist/voice-workbench.js +5259 -0
- package/dist/voice-workbench.js.map +34 -0
- package/package.json +28 -9
- package/registry-entry.json +137 -0
- package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
- package/src/adapters/capacitor-llama/environment.ts +1 -1
- package/src/adapters/capacitor-llama/index.ts +28 -4
- package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +2 -2
- package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
- package/src/backends/apple-foundation.ts +1 -1
- package/src/local-inference-routes.test.ts +57 -11
- package/src/local-inference-routes.ts +90 -8
- package/src/provider.ts +32 -3
- package/src/routes/compat-helpers.ts +2 -1
- package/src/routes/index.ts +1 -0
- package/src/routes/live-diarization-route.test.ts +134 -0
- package/src/routes/live-diarization-route.ts +79 -3
- package/src/routes/local-inference-asr-route.test.ts +43 -2
- package/src/routes/local-inference-asr-route.ts +7 -4
- package/src/routes/local-inference-asr-transcribe.test.ts +4 -4
- package/src/routes/local-inference-asr-transcribe.ts +1 -1
- package/src/routes/local-inference-compat-routes.test.ts +3 -3
- package/src/routes/local-inference-compat-routes.ts +23 -56
- package/src/routes/native-pcm-turn-route.test.ts +136 -0
- package/src/routes/native-pcm-turn-route.ts +121 -0
- package/src/routes/transcripts-routes.test.ts +51 -0
- package/src/routes/transcripts-routes.ts +35 -3
- package/src/runtime/bionic-wire-encoding.test.ts +147 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +203 -5
- package/src/runtime/ensure-local-inference-handler.ts +203 -11
- package/src/runtime/index.ts +4 -1
- package/src/runtime/mobile-local-inference-gate.test.ts +85 -2
- package/src/runtime/mobile-local-inference-gate.ts +60 -5
- package/src/runtime/voice-entity-binding.transcript.test.ts +29 -0
- package/src/runtime/voice-entity-binding.ts +46 -6
- package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
- package/src/services/README.md +2 -2
- package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
- package/src/services/active-model-context-fit.test.ts +125 -0
- package/src/services/active-model.ts +211 -8
- package/src/services/asr-provenance.ts +68 -0
- package/src/services/assignment-validation.test.ts +118 -0
- package/src/services/assignments.test.ts +26 -0
- package/src/services/assignments.ts +52 -4
- package/src/services/backend.test.ts +84 -0
- package/src/services/backend.ts +198 -19
- package/src/services/bionic-host-loader.test.ts +94 -1
- package/src/services/bionic-host-loader.ts +72 -0
- package/src/services/cache-bridge.test.ts +7 -7
- package/src/services/catalog.test.ts +32 -11
- package/src/services/catalog.ts +6 -0
- package/src/services/cloud-fallback.ts +1 -1
- package/src/services/context-fit.test.ts +121 -0
- package/src/services/context-fit.ts +113 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +99 -7
- package/src/services/device-tier.test.ts +89 -2
- package/src/services/device-tier.ts +103 -11
- package/src/services/downloader.test.ts +199 -58
- package/src/services/downloader.ts +141 -27
- package/src/services/engine-direct-bundle.test.ts +38 -6
- package/src/services/engine.ts +291 -104
- package/src/services/ensure-local-artifacts.ts +1 -1
- package/src/services/ffi-llm-streaming-abi.ts +6 -3
- package/src/services/ffi-streaming-backend.ts +44 -8
- package/src/services/ffi-streaming-runner.test.ts +163 -3
- package/src/services/ffi-streaming-runner.ts +54 -1
- package/src/services/ffi-unload-ordering.test.ts +5 -1
- package/src/services/fused-eliza1-no-regression.test.ts +144 -0
- package/src/services/hardware.test.ts +7 -2
- package/src/services/hardware.ts +28 -0
- package/src/services/imagegen/backend-selector.test.ts +190 -0
- package/src/services/imagegen/sd-cpp.ts +6 -9
- package/src/services/index.ts +18 -0
- package/src/services/ios-llama-streaming.ts +1 -1
- package/src/services/kv-spill.ts +6 -5
- package/src/services/lib-target.test.ts +145 -0
- package/src/services/lib-target.ts +102 -0
- package/src/services/live-signals.test.ts +132 -0
- package/src/services/live-signals.ts +177 -0
- package/src/services/llama-server-metrics.test.ts +168 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +84 -2
- package/src/services/manifest/index.ts +6 -0
- package/src/services/manifest/manifest.test.ts +156 -54
- package/src/services/manifest/schema.ts +160 -52
- package/src/services/manifest/types.ts +6 -0
- package/src/services/manifest/validator.ts +91 -25
- package/src/services/memory-arbiter.test.ts +139 -0
- package/src/services/memory-arbiter.ts +81 -15
- package/src/services/memory-benchmark.test.ts +91 -0
- package/src/services/memory-benchmark.ts +354 -0
- package/src/services/memory-monitor.test.ts +24 -0
- package/src/services/memory-monitor.ts +12 -0
- package/src/services/mtp-doctor.ts +10 -2
- package/src/services/network-policy.ts +5 -5
- package/src/services/ram-budget-cache.test.ts +2 -1
- package/src/services/ram-budget.ts +0 -0
- package/src/services/recommendation.test.ts +216 -0
- package/src/services/registry.ts +25 -19
- package/src/services/required-kernels-gate.test.ts +64 -0
- package/src/services/router-handler.ts +43 -24
- package/src/services/routing-policy.test.ts +211 -23
- package/src/services/routing-policy.ts +92 -22
- package/src/services/service.test.ts +3 -3
- package/src/services/service.ts +22 -7
- package/src/services/transcription-priority.test.ts +2 -2
- package/src/services/types.ts +4 -0
- package/src/services/verify-on-device.test.ts +2 -2
- package/src/services/vision/hash.ts +1 -1
- package/src/services/vision/index.ts +2 -2
- package/src/services/vision/llama-server.ts +1 -1
- package/src/services/vision/types.ts +13 -4
- package/src/services/vision-embedding-cache.ts +1 -1
- package/src/services/voice/VOICE_WORKBENCH.md +71 -26
- package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +72 -2
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +29 -29
- package/src/services/voice/__tests__/streaming-asr.test.ts +1 -1
- package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
- package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
- package/src/services/voice/asr-timed.real.test.ts +6 -8
- package/src/services/voice/audio-frame-consumer.test.ts +327 -1
- package/src/services/voice/audio-frame-consumer.ts +165 -5
- package/src/services/voice/barge-in.ts +2 -3
- package/src/services/voice/corpus-augment.test.ts +276 -0
- package/src/services/voice/corpus-augment.ts +451 -0
- package/src/services/voice/corpus-generator.test.ts +201 -0
- package/src/services/voice/corpus-generator.ts +413 -0
- package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
- package/src/services/voice/diarization-error-rate.test.ts +100 -0
- package/src/services/voice/diarization-error-rate.ts +249 -0
- package/src/services/voice/e2e-harness.der.test.ts +94 -0
- package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
- package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
- package/src/services/voice/e2e-harness.test.ts +2 -2
- package/src/services/voice/e2e-harness.ts +175 -16
- package/src/services/voice/echo-delay.test.ts +118 -0
- package/src/services/voice/echo-delay.ts +135 -0
- package/src/services/voice/echo-metrics.test.ts +17 -0
- package/src/services/voice/echo-metrics.ts +20 -0
- package/src/services/voice/echo-reference-buffer.test.ts +86 -0
- package/src/services/voice/echo-reference-buffer.ts +165 -0
- package/src/services/voice/eliza1-eot-scorer.ts +22 -22
- package/src/services/voice/embedding.ts +2 -3
- package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
- package/src/services/voice/engine-bridge.ts +151 -110
- package/src/services/voice/eot-classifier-ggml.ts +42 -39
- package/src/services/voice/eot-classifier.test.ts +98 -0
- package/src/services/voice/eot-classifier.ts +11 -122
- package/src/services/voice/errors.ts +2 -0
- package/src/services/voice/expressive-tags.asr.test.ts +77 -0
- package/src/services/voice/expressive-tags.test.ts +102 -0
- package/src/services/voice/expressive-tags.ts +8 -8
- package/src/services/voice/ffi-bindings.test.ts +10 -3
- package/src/services/voice/ffi-bindings.ts +177 -15
- package/src/services/voice/fused-eot-scorer.ts +17 -13
- package/src/services/voice/index.ts +33 -12
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +112 -1
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +88 -3
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +37 -201
- package/src/services/voice/kokoro/kokoro-backend.ts +16 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +1 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +3 -3
- package/src/services/voice/kokoro/pick-runtime.ts +1 -1
- package/src/services/voice/kokoro/runtime-selection.ts +28 -201
- package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
- package/src/services/voice/live-diarization-session.ts +335 -2
- package/src/services/voice/metric-math.test.ts +61 -0
- package/src/services/voice/metric-math.ts +25 -0
- package/src/services/voice/mic-source.ts +1 -1
- package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
- package/src/services/voice/nlms-echo-canceller.ts +317 -0
- package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
- package/src/services/voice/partial-stabilizer.ts +1 -1
- package/src/services/voice/pipeline.ts +3 -4
- package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
- package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
- package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
- package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
- package/src/services/voice/self-voice-imprint.test.ts +59 -0
- package/src/services/voice/self-voice-imprint.ts +102 -0
- package/src/services/voice/shared-resources.ts +23 -0
- package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +85 -22
- package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
- package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
- package/src/services/voice/transcriber.ts +4 -4
- package/src/services/voice/transcript-service.test.ts +58 -0
- package/src/services/voice/transcript-service.ts +64 -0
- package/src/services/voice/transcript-store.test.ts +36 -0
- package/src/services/voice/transcript-store.ts +32 -0
- package/src/services/voice/types.ts +7 -7
- package/src/services/voice/vad.test.ts +33 -15
- package/src/services/voice/vad.ts +25 -20
- package/src/services/voice/voice-budget.test.ts +0 -3
- package/src/services/voice/voice-budget.ts +6 -6
- package/src/services/voice/voice-duet.test.ts +1 -1
- package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
- package/src/services/voice/voice-preload-predictor.test.ts +130 -0
- package/src/services/voice/voice-preload-predictor.ts +113 -0
- package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
- package/src/services/voice/voice-preset-format.test.ts +75 -0
- package/src/services/voice/voice-preset-format.ts +17 -4
- package/src/services/voice/voice-scenario.test.ts +159 -0
- package/src/services/voice/voice-scenario.ts +133 -7
- package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
- package/src/services/voice/voice-workbench-report.ts +58 -17
- package/src/services/voice/wake-word-ggml.ts +12 -13
- package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
- package/src/services/voice/wav-codec.test.ts +32 -0
- package/src/services/voice/wav-codec.ts +101 -0
- package/src/services/voice/workbench-entrypoint.test.ts +55 -0
- package/src/services/voice/workbench-entrypoint.ts +88 -0
- package/src/services/voice/workbench-headless-runner.test.ts +162 -0
- package/src/services/voice/workbench-headless-runner.ts +396 -0
- package/src/services/voice/workbench-logic-services.test.ts +225 -0
- package/src/services/voice/workbench-logic-services.ts +184 -0
- package/src/services/voice/workbench-real-services.ts +629 -0
- package/src/services/voice/workbench-scenarios.ts +407 -0
- package/src/services/voice-prewarm.ts +1 -1
- package/src/voice-workbench.ts +71 -0
- package/src/actions/generate-media.d.ts.map +0 -1
- package/src/actions/identify-speaker.d.ts.map +0 -1
- package/src/actions/transcription-control.d.ts.map +0 -1
- package/src/index.d.ts.map +0 -1
- package/src/local-inference-routes.d.ts.map +0 -1
- package/src/provider.d.ts.map +0 -1
- package/src/routes/compat-helpers.d.ts.map +0 -1
- package/src/routes/family-member-route.d.ts.map +0 -1
- package/src/routes/index.d.ts.map +0 -1
- package/src/routes/live-diarization-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-transcribe.d.ts.map +0 -1
- package/src/routes/local-inference-compat-routes.d.ts.map +0 -1
- package/src/routes/local-inference-tts-route.d.ts.map +0 -1
- package/src/routes/transcript-audio-store.d.ts.map +0 -1
- package/src/routes/transcripts-routes.d.ts.map +0 -1
- package/src/routes/voice-first-run-routes.d.ts.map +0 -1
- package/src/routes/voice-models-routes.d.ts.map +0 -1
- package/src/routes/voice-profile-plugin-routes.d.ts.map +0 -1
- package/src/routes/voice-profiles-management-routes.d.ts.map +0 -1
- package/src/routes/voice-speaker-profile-routes.d.ts.map +0 -1
- package/src/runtime/embedding-manager-support.d.ts.map +0 -1
- package/src/runtime/embedding-presets.d.ts.map +0 -1
- package/src/runtime/embedding-warmup-policy.d.ts.map +0 -1
- package/src/runtime/ensure-local-inference-handler.d.ts.map +0 -1
- package/src/runtime/index.d.ts.map +0 -1
- package/src/runtime/mobile-local-inference-gate.d.ts +0 -31
- package/src/runtime/mobile-local-inference-gate.d.ts.map +0 -1
- package/src/runtime/voice-entity-binding.d.ts.map +0 -1
- package/src/services/active-model.d.ts.map +0 -1
- package/src/services/assignments.d.ts.map +0 -1
- package/src/services/backend.d.ts.map +0 -1
- package/src/services/bionic-host-loader.d.ts.map +0 -1
- package/src/services/bundled-models.d.ts.map +0 -1
- package/src/services/cache-bridge.d.ts.map +0 -1
- package/src/services/catalog.d.ts +0 -10
- package/src/services/catalog.d.ts.map +0 -1
- package/src/services/checkpoint-client.d.ts.map +0 -1
- package/src/services/cloud-fallback.d.ts.map +0 -1
- package/src/services/conversation-registry.d.ts.map +0 -1
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +0 -1
- package/src/services/device-bridge.d.ts.map +0 -1
- package/src/services/device-resource-metrics.d.ts.map +0 -1
- package/src/services/device-tier.d.ts.map +0 -1
- package/src/services/downloader.d.ts.map +0 -1
- package/src/services/engine.d.ts.map +0 -1
- package/src/services/external-scanner.d.ts.map +0 -1
- package/src/services/ffi-streaming-backend.d.ts.map +0 -1
- package/src/services/ffi-streaming-runner.d.ts.map +0 -1
- package/src/services/gpu-detect.d.ts.map +0 -1
- package/src/services/handler-registry.d.ts.map +0 -1
- package/src/services/hardware.d.ts.map +0 -1
- package/src/services/hf-search.d.ts +0 -26
- package/src/services/hf-search.d.ts.map +0 -1
- package/src/services/hf-search.test.ts +0 -69
- package/src/services/hf-search.ts +0 -420
- package/src/services/image-description-runtime.d.ts.map +0 -1
- package/src/services/imagegen/aosp-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/backend-selector.d.ts.map +0 -1
- package/src/services/imagegen/coreml-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/errors.d.ts.map +0 -1
- package/src/services/imagegen/index.d.ts.map +0 -1
- package/src/services/imagegen/mflux.d.ts.map +0 -1
- package/src/services/imagegen/sd-cpp.d.ts.map +0 -1
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/types.d.ts.map +0 -1
- package/src/services/index.d.ts.map +0 -1
- package/src/services/inference-capabilities.d.ts.map +0 -1
- package/src/services/inference-telemetry.d.ts.map +0 -1
- package/src/services/kv-spill.d.ts.map +0 -1
- package/src/services/latency-trace.d.ts.map +0 -1
- package/src/services/llm-streaming-binding.d.ts.map +0 -1
- package/src/services/load-args.d.ts.map +0 -1
- package/src/services/manifest/index.d.ts +0 -4
- package/src/services/manifest/index.d.ts.map +0 -1
- package/src/services/manifest/schema.d.ts.map +0 -1
- package/src/services/manifest/types.d.ts.map +0 -1
- package/src/services/manifest/validator.d.ts.map +0 -1
- package/src/services/memory-arbiter.d.ts.map +0 -1
- package/src/services/memory-monitor.d.ts.map +0 -1
- package/src/services/memory-pressure.d.ts.map +0 -1
- package/src/services/mtp-doctor.d.ts.map +0 -1
- package/src/services/network-policy.d.ts.map +0 -1
- package/src/services/paths.d.ts.map +0 -1
- package/src/services/planner-skeleton.d.ts.map +0 -1
- package/src/services/providers.d.ts.map +0 -1
- package/src/services/ram-budget.d.ts.map +0 -1
- package/src/services/readiness.d.ts.map +0 -1
- package/src/services/recommendation.d.ts.map +0 -1
- package/src/services/registry.d.ts.map +0 -1
- package/src/services/router-handler.d.ts.map +0 -1
- package/src/services/routing-policy.d.ts.map +0 -1
- package/src/services/routing-preferences.d.ts.map +0 -1
- package/src/services/runtime-target.d.ts.map +0 -1
- package/src/services/service.d.ts.map +0 -1
- package/src/services/session-pool.d.ts.map +0 -1
- package/src/services/structured-output/deterministic-repair.d.ts.map +0 -1
- package/src/services/structured-output.d.ts.map +0 -1
- package/src/services/system-memory.d.ts.map +0 -1
- package/src/services/types.d.ts.map +0 -1
- package/src/services/verify-on-device.d.ts.map +0 -1
- package/src/services/verify.d.ts.map +0 -1
- package/src/services/vision/aosp-unavailable.d.ts.map +0 -1
- package/src/services/vision/capacitor-llama.d.ts.map +0 -1
- package/src/services/vision/cloud-fallback.d.ts.map +0 -1
- package/src/services/vision/hash.d.ts.map +0 -1
- package/src/services/vision/index.d.ts.map +0 -1
- package/src/services/vision/llama-server.d.ts.map +0 -1
- package/src/services/vision/types.d.ts.map +0 -1
- package/src/services/vision/vast-fallback.d.ts.map +0 -1
- package/src/services/vision-embedding-cache.d.ts.map +0 -1
- package/src/services/voice/audio-frame-consumer.d.ts.map +0 -1
- package/src/services/voice/barge-in.d.ts.map +0 -1
- package/src/services/voice/cancellation-coordinator.d.ts.map +0 -1
- package/src/services/voice/checkpoint-manager.d.ts.map +0 -1
- package/src/services/voice/eager-context-builder.d.ts.map +0 -1
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/embedding.d.ts.map +0 -1
- package/src/services/voice/emotion-attribution.d.ts.map +0 -1
- package/src/services/voice/engine-bridge.d.ts.map +0 -1
- package/src/services/voice/eot-classifier-ggml.d.ts.map +0 -1
- package/src/services/voice/eot-classifier.d.ts.map +0 -1
- package/src/services/voice/errors.d.ts.map +0 -1
- package/src/services/voice/expressive-tags.d.ts.map +0 -1
- package/src/services/voice/ffi-bindings.d.ts.map +0 -1
- package/src/services/voice/first-line-cache.d.ts.map +0 -1
- package/src/services/voice/fused-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/index.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/phonemizer.d.ts.map +0 -1
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/runtime-selection.d.ts +0 -92
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +0 -1
- package/src/services/voice/kokoro/types.d.ts.map +0 -1
- package/src/services/voice/kokoro/voice-presets.d.ts.map +0 -1
- package/src/services/voice/kokoro/voices.d.ts.map +0 -1
- package/src/services/voice/lifecycle.d.ts.map +0 -1
- package/src/services/voice/live-diarization-session.d.ts +0 -96
- package/src/services/voice/live-diarization-session.d.ts.map +0 -1
- package/src/services/voice/mic-source.d.ts.map +0 -1
- package/src/services/voice/optimistic-policy.d.ts.map +0 -1
- package/src/services/voice/partial-stabilizer.d.ts.map +0 -1
- package/src/services/voice/phoneme-tokenizer.d.ts.map +0 -1
- package/src/services/voice/phrase-cache.d.ts.map +0 -1
- package/src/services/voice/phrase-chunker.d.ts.map +0 -1
- package/src/services/voice/pipeline-impls.d.ts.map +0 -1
- package/src/services/voice/pipeline.d.ts.map +0 -1
- package/src/services/voice/prefill-client.d.ts.map +0 -1
- package/src/services/voice/prefix-preserving-queue.d.ts.map +0 -1
- package/src/services/voice/profile-store.d.ts.map +0 -1
- package/src/services/voice/ring-buffer.d.ts.map +0 -1
- package/src/services/voice/rollback-queue.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +0 -1
- package/src/services/voice/scheduler.d.ts.map +0 -1
- package/src/services/voice/shared-resources.d.ts.map +0 -1
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder.d.ts.map +0 -1
- package/src/services/voice/speaker-imprint.d.ts.map +0 -1
- package/src/services/voice/speaker-preset-cache.d.ts.map +0 -1
- package/src/services/voice/system-audio-sink.d.ts.map +0 -1
- package/src/services/voice/transcriber.d.ts.map +0 -1
- package/src/services/voice/transcript-knowledge.d.ts.map +0 -1
- package/src/services/voice/transcript-service.d.ts.map +0 -1
- package/src/services/voice/transcript-store.d.ts.map +0 -1
- package/src/services/voice/turn-controller.d.ts.map +0 -1
- package/src/services/voice/types.d.ts.map +0 -1
- package/src/services/voice/vad.d.ts.map +0 -1
- package/src/services/voice/voice-budget.d.ts.map +0 -1
- package/src/services/voice/voice-emotion-classifier.d.ts.map +0 -1
- package/src/services/voice/voice-preset-format.d.ts.map +0 -1
- package/src/services/voice/voice-profile-artifact.d.ts.map +0 -1
- package/src/services/voice/voice-profile-routes.d.ts.map +0 -1
- package/src/services/voice/voice-settings.d.ts +0 -82
- package/src/services/voice/voice-settings.d.ts.map +0 -1
- package/src/services/voice/voice-settings.ts +0 -172
- package/src/services/voice/voice-state-machine.d.ts.map +0 -1
- package/src/services/voice/wake-word-ggml.d.ts.map +0 -1
- package/src/services/voice/wake-word.d.ts.map +0 -1
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +0 -1
- package/src/services/voice-model-updater.d.ts.map +0 -1
- package/src/services/voice-prewarm.d.ts.map +0 -1
- /package/{src → dist}/actions/generate-media.d.ts +0 -0
- /package/{src → dist}/actions/identify-speaker.d.ts +0 -0
- /package/{src → dist}/actions/transcription-control.d.ts +0 -0
- /package/{src → dist}/index.d.ts +0 -0
- /package/{src → dist}/provider.d.ts +0 -0
- /package/{src → dist}/routes/family-member-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-transcribe.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-compat-routes.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-tts-route.d.ts +0 -0
- /package/{src → dist}/routes/transcript-audio-store.d.ts +0 -0
- /package/{src → dist}/routes/voice-first-run-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-models-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profile-plugin-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profiles-management-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-speaker-profile-routes.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-manager-support.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-presets.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-warmup-policy.d.ts +0 -0
- /package/{src → dist}/services/bundled-models.d.ts +0 -0
- /package/{src → dist}/services/cache-bridge.d.ts +0 -0
- /package/{src → dist}/services/checkpoint-client.d.ts +0 -0
- /package/{src → dist}/services/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/conversation-registry.d.ts +0 -0
- /package/{src → dist}/services/device-bridge.d.ts +0 -0
- /package/{src → dist}/services/device-resource-metrics.d.ts +0 -0
- /package/{src → dist}/services/external-scanner.d.ts +0 -0
- /package/{src → dist}/services/gpu-detect.d.ts +0 -0
- /package/{src → dist}/services/handler-registry.d.ts +0 -0
- /package/{src → dist}/services/hardware.d.ts +0 -0
- /package/{src → dist}/services/image-description-runtime.d.ts +0 -0
- /package/{src → dist}/services/imagegen/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/backend-selector.d.ts +0 -0
- /package/{src → dist}/services/imagegen/coreml-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/errors.d.ts +0 -0
- /package/{src → dist}/services/imagegen/index.d.ts +0 -0
- /package/{src → dist}/services/imagegen/mflux.d.ts +0 -0
- /package/{src → dist}/services/imagegen/tensorrt-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/types.d.ts +0 -0
- /package/{src → dist}/services/inference-capabilities.d.ts +0 -0
- /package/{src → dist}/services/inference-telemetry.d.ts +0 -0
- /package/{src → dist}/services/kv-spill.d.ts +0 -0
- /package/{src → dist}/services/latency-trace.d.ts +0 -0
- /package/{src → dist}/services/llm-streaming-binding.d.ts +0 -0
- /package/{src → dist}/services/load-args.d.ts +0 -0
- /package/{src → dist}/services/manifest/validator.d.ts +0 -0
- /package/{src → dist}/services/memory-pressure.d.ts +0 -0
- /package/{src → dist}/services/mtp-doctor.d.ts +0 -0
- /package/{src → dist}/services/network-policy.d.ts +0 -0
- /package/{src → dist}/services/paths.d.ts +0 -0
- /package/{src → dist}/services/planner-skeleton.d.ts +0 -0
- /package/{src → dist}/services/providers.d.ts +0 -0
- /package/{src → dist}/services/ram-budget.d.ts +0 -0
- /package/{src → dist}/services/readiness.d.ts +0 -0
- /package/{src → dist}/services/recommendation.d.ts +0 -0
- /package/{src → dist}/services/routing-preferences.d.ts +0 -0
- /package/{src → dist}/services/runtime-target.d.ts +0 -0
- /package/{src → dist}/services/session-pool.d.ts +0 -0
- /package/{src → dist}/services/structured-output/deterministic-repair.d.ts +0 -0
- /package/{src → dist}/services/structured-output.d.ts +0 -0
- /package/{src → dist}/services/system-memory.d.ts +0 -0
- /package/{src → dist}/services/verify-on-device.d.ts +0 -0
- /package/{src → dist}/services/verify.d.ts +0 -0
- /package/{src → dist}/services/vision/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/vision/capacitor-llama.d.ts +0 -0
- /package/{src → dist}/services/vision/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/vision/hash.d.ts +0 -0
- /package/{src → dist}/services/vision/llama-server.d.ts +0 -0
- /package/{src → dist}/services/vision/vast-fallback.d.ts +0 -0
- /package/{src → dist}/services/voice/barge-in.d.ts +0 -0
- /package/{src → dist}/services/voice/cancellation-coordinator.d.ts +0 -0
- /package/{src → dist}/services/voice/checkpoint-manager.d.ts +0 -0
- /package/{src → dist}/services/voice/eager-context-builder.d.ts +0 -0
- /package/{src → dist}/services/voice/emotion-attribution.d.ts +0 -0
- /package/{src → dist}/services/voice/first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/kokoro-runtime.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/phonemizer.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/types.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voice-presets.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voices.d.ts +0 -0
- /package/{src → dist}/services/voice/lifecycle.d.ts +0 -0
- /package/{src → dist}/services/voice/optimistic-policy.d.ts +0 -0
- /package/{src → dist}/services/voice/phoneme-tokenizer.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-chunker.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline-impls.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/prefill-client.d.ts +0 -0
- /package/{src → dist}/services/voice/prefix-preserving-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/profile-store.d.ts +0 -0
- /package/{src → dist}/services/voice/ring-buffer.d.ts +0 -0
- /package/{src → dist}/services/voice/rollback-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-placeholder.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-regenerator.d.ts +0 -0
- /package/{src → dist}/services/voice/scheduler.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/attribution-pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-ggml.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-imprint.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-preset-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/system-audio-sink.d.ts +0 -0
- /package/{src → dist}/services/voice/transcript-knowledge.d.ts +0 -0
- /package/{src → dist}/services/voice/turn-controller.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-budget.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-emotion-classifier.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-artifact.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-routes.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-state-machine.d.ts +0 -0
- /package/{src → dist}/services/voice/wake-word.d.ts +0 -0
- /package/{src → dist}/services/voice/wrap-with-first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice-model-updater.d.ts +0 -0
- /package/{src → dist}/services/voice-prewarm.d.ts +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Coverage for the pure VoiceScenario validator + turn helpers (#9147). The
|
|
2
|
+
// validator gates every test-matrix scenario before the corpus build, so its
|
|
3
|
+
// id/participant/turn/agent/environment checks are worth pinning directly.
|
|
4
|
+
|
|
5
|
+
import { describe, expect, it } from "vitest";
|
|
6
|
+
import {
|
|
7
|
+
resolveTurnEnvironment,
|
|
8
|
+
turnReferenceTranscript,
|
|
9
|
+
turnSpeakerLabel,
|
|
10
|
+
type VoiceEnvironment,
|
|
11
|
+
type VoiceScenario,
|
|
12
|
+
validateVoiceScenario,
|
|
13
|
+
} from "./voice-scenario";
|
|
14
|
+
|
|
15
|
+
function validScenario(): VoiceScenario {
|
|
16
|
+
return {
|
|
17
|
+
id: "s1",
|
|
18
|
+
classes: ["diarization"],
|
|
19
|
+
participants: [{ label: "alice" }, { label: "bob" }],
|
|
20
|
+
turns: [
|
|
21
|
+
{ speaker: "alice", text: "hello", expectRespond: true },
|
|
22
|
+
{ speaker: "bob", text: "hi there", expectRespond: false },
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe("validateVoiceScenario", () => {
|
|
28
|
+
it("accepts a well-formed scenario", () => {
|
|
29
|
+
expect(validateVoiceScenario(validScenario())).toEqual({
|
|
30
|
+
valid: true,
|
|
31
|
+
errors: [],
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("requires id, a non-empty classes array, participants, and turns", () => {
|
|
36
|
+
const r = validateVoiceScenario({
|
|
37
|
+
id: " ",
|
|
38
|
+
classes: [],
|
|
39
|
+
participants: [],
|
|
40
|
+
turns: [],
|
|
41
|
+
});
|
|
42
|
+
expect(r.valid).toBe(false);
|
|
43
|
+
expect(r.errors).toContain("scenario.id is required");
|
|
44
|
+
expect(r.errors).toContain("scenario.classes must be a non-empty array");
|
|
45
|
+
expect(r.errors).toContain("scenario.participants must be non-empty");
|
|
46
|
+
expect(r.errors).toContain("scenario.turns must be a non-empty array");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("flags duplicate participant labels", () => {
|
|
50
|
+
const s = validScenario();
|
|
51
|
+
s.participants = [{ label: "alice" }, { label: "alice" }];
|
|
52
|
+
expect(validateVoiceScenario(s).errors).toContain(
|
|
53
|
+
"duplicate participant label: alice",
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("flags a turn whose speaker is not a participant", () => {
|
|
58
|
+
const s = validScenario();
|
|
59
|
+
s.turns = [{ speaker: "carol", text: "hi", expectRespond: true }];
|
|
60
|
+
expect(validateVoiceScenario(s).errors).toContain(
|
|
61
|
+
'turn[0].speaker "carol" is not a participant',
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("requires each turn to carry text or audioRef and a boolean expectRespond", () => {
|
|
66
|
+
const s = validScenario();
|
|
67
|
+
// @ts-expect-error — exercising the runtime guard for a missing expectRespond
|
|
68
|
+
s.turns = [{ speaker: "alice" }];
|
|
69
|
+
const errors = validateVoiceScenario(s).errors;
|
|
70
|
+
expect(errors).toContain("turn[0] must have either text or audioRef");
|
|
71
|
+
expect(errors).toContain("turn[0].expectRespond must be a boolean");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("flags an agent label that is not a participant", () => {
|
|
75
|
+
const s = validScenario();
|
|
76
|
+
s.agents = ["ghost"];
|
|
77
|
+
expect(validateVoiceScenario(s).errors).toContain(
|
|
78
|
+
'agent "ghost" is not a participant',
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("validates acoustic environment ranges (reverb in [0,1], far-field >= 0)", () => {
|
|
83
|
+
const s = validScenario();
|
|
84
|
+
s.environment = { reverb: 2, farFieldDb: -3 } as VoiceEnvironment;
|
|
85
|
+
const errors = validateVoiceScenario(s).errors;
|
|
86
|
+
expect(errors).toContain("scenario.environment.reverb must be in [0, 1]");
|
|
87
|
+
expect(errors).toContain(
|
|
88
|
+
"scenario.environment.farFieldDb must be a non-negative dB attenuation",
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("collects every error at once instead of throwing on the first", () => {
|
|
93
|
+
const r = validateVoiceScenario({
|
|
94
|
+
id: "",
|
|
95
|
+
classes: [],
|
|
96
|
+
participants: [{ label: "alice" }],
|
|
97
|
+
turns: [{ speaker: "nope", text: "x", expectRespond: true }],
|
|
98
|
+
});
|
|
99
|
+
expect(r.valid).toBe(false);
|
|
100
|
+
expect(r.errors.length).toBeGreaterThanOrEqual(3);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe("turn helpers", () => {
|
|
105
|
+
it("resolveTurnEnvironment merges turn over scenario (turn wins)", () => {
|
|
106
|
+
const s = validScenario();
|
|
107
|
+
s.environment = { reverb: 0.2, noiseSnrDb: 10 } as VoiceEnvironment;
|
|
108
|
+
const turn = {
|
|
109
|
+
speaker: "alice",
|
|
110
|
+
text: "hi",
|
|
111
|
+
expectRespond: true,
|
|
112
|
+
environment: { reverb: 0.8 } as VoiceEnvironment,
|
|
113
|
+
};
|
|
114
|
+
expect(resolveTurnEnvironment(s, turn)).toEqual({
|
|
115
|
+
reverb: 0.8,
|
|
116
|
+
noiseSnrDb: 10,
|
|
117
|
+
});
|
|
118
|
+
// Both absent → undefined.
|
|
119
|
+
expect(
|
|
120
|
+
resolveTurnEnvironment(validScenario(), {
|
|
121
|
+
speaker: "alice",
|
|
122
|
+
text: "hi",
|
|
123
|
+
expectRespond: true,
|
|
124
|
+
}),
|
|
125
|
+
).toBeUndefined();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("turnReferenceTranscript prefers the explicit override, else the text", () => {
|
|
129
|
+
expect(
|
|
130
|
+
turnReferenceTranscript({
|
|
131
|
+
speaker: "a",
|
|
132
|
+
text: "spoken",
|
|
133
|
+
expectedTranscript: " override ",
|
|
134
|
+
expectRespond: true,
|
|
135
|
+
}),
|
|
136
|
+
).toBe("override");
|
|
137
|
+
expect(
|
|
138
|
+
turnReferenceTranscript({
|
|
139
|
+
speaker: "a",
|
|
140
|
+
text: " just text ",
|
|
141
|
+
expectRespond: true,
|
|
142
|
+
}),
|
|
143
|
+
).toBe("just text");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("turnSpeakerLabel prefers the explicit diarization label, else the speaker", () => {
|
|
147
|
+
expect(
|
|
148
|
+
turnSpeakerLabel({
|
|
149
|
+
speaker: "alice",
|
|
150
|
+
text: "x",
|
|
151
|
+
expectedSpeakerLabel: "SPEAKER_01",
|
|
152
|
+
expectRespond: true,
|
|
153
|
+
}),
|
|
154
|
+
).toBe("SPEAKER_01");
|
|
155
|
+
expect(
|
|
156
|
+
turnSpeakerLabel({ speaker: "alice", text: "x", expectRespond: true }),
|
|
157
|
+
).toBe("alice");
|
|
158
|
+
});
|
|
159
|
+
});
|
|
@@ -13,6 +13,17 @@
|
|
|
13
13
|
* import from the runner, the player, and tests alike.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import type { AugmentationSpec } from "./corpus-augment";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Acoustic environment for a scenario or a single turn: room noise, reverb,
|
|
20
|
+
* far-field attenuation, low-quality line, background talkers. Drives the
|
|
21
|
+
* corpus generator's degradation chain ({@link AugmentationSpec}). A turn's
|
|
22
|
+
* environment is merged over the scenario's, so a scenario can declare a noisy
|
|
23
|
+
* room once and an individual turn can override it (e.g. one talker steps away).
|
|
24
|
+
*/
|
|
25
|
+
export type VoiceEnvironment = AugmentationSpec;
|
|
26
|
+
|
|
16
27
|
/** A named voice/entity participating in the scenario. */
|
|
17
28
|
export interface VoiceScenarioParticipant {
|
|
18
29
|
/** Stable label used in turns + diarization ground truth (e.g. "alice"). */
|
|
@@ -39,12 +50,33 @@ export interface VoiceScenarioTurn {
|
|
|
39
50
|
pausesMs?: number[];
|
|
40
51
|
/** Ground truth: SHOULD the agent respond to this turn? */
|
|
41
52
|
expectRespond: boolean;
|
|
53
|
+
/** Ground truth: is this segment a real end-of-turn boundary? */
|
|
54
|
+
expectEndOfTurn?: boolean;
|
|
42
55
|
/** Expected ASR transcript (for WER scoring); defaults to `text`. */
|
|
43
56
|
expectedTranscript?: string;
|
|
44
57
|
/** Expected diarization label (defaults to `speaker`). */
|
|
45
58
|
expectedSpeakerLabel?: string;
|
|
46
59
|
/** Expected entity inferred/recognized from this turn (name extraction). */
|
|
47
60
|
expectedEntity?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Acoustic degradation for THIS turn, merged over the scenario environment.
|
|
63
|
+
* Use it to model one talker stepping away (far-field) or onto a bad line
|
|
64
|
+
* while the rest of the room stays clean.
|
|
65
|
+
*/
|
|
66
|
+
environment?: VoiceEnvironment;
|
|
67
|
+
/**
|
|
68
|
+
* Ground truth for echo/self-voice rejection: this "turn" is the agent's own
|
|
69
|
+
* TTS bleeding back into the mic (not a real user turn). The respond gate
|
|
70
|
+
* MUST suppress it. Always implies `expectRespond: false`.
|
|
71
|
+
*/
|
|
72
|
+
isAgentEcho?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* The agent's spoken reply to THIS turn (when it responds). The real-decision
|
|
75
|
+
* logic adapter uses it as the "recent agent reply" the echo gate compares a
|
|
76
|
+
* following `isAgentEcho` turn against — so echo rejection is tested against a
|
|
77
|
+
* genuine reply string, not a circular self-reference.
|
|
78
|
+
*/
|
|
79
|
+
agentReplyText?: string;
|
|
48
80
|
}
|
|
49
81
|
|
|
50
82
|
/** Scenario-level pass/fail thresholds the benchmark layer enforces. */
|
|
@@ -62,6 +94,10 @@ export interface VoiceScenarioAssertions {
|
|
|
62
94
|
/** Latency budgets (ms) — first-audio / time-to-first-token, etc. */
|
|
63
95
|
maxFirstAudioMs?: number;
|
|
64
96
|
maxTtftMs?: number;
|
|
97
|
+
/** Min echo/self-voice rejection rate (agent-echo turns correctly suppressed). */
|
|
98
|
+
minEchoRejectionRate?: number;
|
|
99
|
+
/** Min owner-vs-intruder accuracy for security scenarios. */
|
|
100
|
+
minOwnerAccuracy?: number;
|
|
65
101
|
}
|
|
66
102
|
|
|
67
103
|
export type VoiceScenarioClass =
|
|
@@ -75,7 +111,15 @@ export type VoiceScenarioClass =
|
|
|
75
111
|
| "eot"
|
|
76
112
|
| "transcription-mode"
|
|
77
113
|
| "multi-agent-room"
|
|
78
|
-
| "long-form-monologue"
|
|
114
|
+
| "long-form-monologue"
|
|
115
|
+
// Robustness: degraded acoustics (noise / reverb / far-field / low-quality).
|
|
116
|
+
| "robustness"
|
|
117
|
+
// Self-echo: the agent's own TTS must not be treated as a user turn.
|
|
118
|
+
| "echo-rejection"
|
|
119
|
+
// Security: owner vs. intruder / non-owner voice gating.
|
|
120
|
+
| "owner-security"
|
|
121
|
+
// Two voices overlapping / interrupting each other.
|
|
122
|
+
| "overlapping-speech";
|
|
79
123
|
|
|
80
124
|
export interface VoiceScenario {
|
|
81
125
|
/** Stable id (also the corpus subdirectory name). */
|
|
@@ -89,6 +133,15 @@ export interface VoiceScenario {
|
|
|
89
133
|
assertions?: VoiceScenarioAssertions;
|
|
90
134
|
/** Agent labels present in a multi-agent room (subset of participants). */
|
|
91
135
|
agents?: string[];
|
|
136
|
+
/** Scenario-wide acoustic environment; per-turn `environment` overrides it. */
|
|
137
|
+
environment?: VoiceEnvironment;
|
|
138
|
+
/**
|
|
139
|
+
* Entity ids the agent answers WITHOUT a wake word (owner + enrolled
|
|
140
|
+
* speakers). The respond gate suppresses a confident speaker NOT in this set
|
|
141
|
+
* as a bystander. Defaults (in the runner) to every participant that has an
|
|
142
|
+
* `entityId`; set it explicitly to mark some bound voices as strangers.
|
|
143
|
+
*/
|
|
144
|
+
knownSpeakerEntityIds?: string[];
|
|
92
145
|
}
|
|
93
146
|
|
|
94
147
|
export interface VoiceScenarioValidation {
|
|
@@ -102,17 +155,37 @@ export interface VoiceScenarioValidation {
|
|
|
102
155
|
* exist as participants. Returns all errors (does not throw) so a corpus build
|
|
103
156
|
* can report every problem at once.
|
|
104
157
|
*/
|
|
158
|
+
/** True when a value is not a non-empty string (so `.trim()` is never called on a non-string). */
|
|
159
|
+
function isBlank(v: unknown): boolean {
|
|
160
|
+
return typeof v !== "string" || v.trim().length === 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
105
163
|
export function validateVoiceScenario(
|
|
106
164
|
scenario: VoiceScenario,
|
|
107
165
|
): VoiceScenarioValidation {
|
|
108
166
|
const errors: string[] = [];
|
|
109
|
-
|
|
167
|
+
// A malformed/empty scenario file can deserialize to a non-object; guard the
|
|
168
|
+
// boundary so the validator reports an error instead of throwing.
|
|
169
|
+
if (!scenario || typeof scenario !== "object" || Array.isArray(scenario)) {
|
|
170
|
+
return { valid: false, errors: ["scenario must be an object"] };
|
|
171
|
+
}
|
|
172
|
+
if (isBlank(scenario.id)) errors.push("scenario.id is required");
|
|
110
173
|
if (!Array.isArray(scenario.classes) || scenario.classes.length === 0) {
|
|
111
174
|
errors.push("scenario.classes must be a non-empty array");
|
|
112
175
|
}
|
|
176
|
+
// Iterate defensively: a malformed scenario may carry non-array fields.
|
|
177
|
+
const participants = Array.isArray(scenario.participants)
|
|
178
|
+
? scenario.participants
|
|
179
|
+
: [];
|
|
180
|
+
const turns = Array.isArray(scenario.turns) ? scenario.turns : [];
|
|
181
|
+
const agents = Array.isArray(scenario.agents) ? scenario.agents : [];
|
|
113
182
|
const labels = new Set<string>();
|
|
114
|
-
for (const p of
|
|
115
|
-
if (!p
|
|
183
|
+
for (const p of participants) {
|
|
184
|
+
if (!p || typeof p !== "object") {
|
|
185
|
+
errors.push("participant must be an object");
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (isBlank(p.label)) {
|
|
116
189
|
errors.push("participant.label is required");
|
|
117
190
|
continue;
|
|
118
191
|
}
|
|
@@ -124,25 +197,78 @@ export function validateVoiceScenario(
|
|
|
124
197
|
if (!Array.isArray(scenario.turns) || scenario.turns.length === 0) {
|
|
125
198
|
errors.push("scenario.turns must be a non-empty array");
|
|
126
199
|
}
|
|
127
|
-
|
|
200
|
+
turns.forEach((t, i) => {
|
|
201
|
+
if (!t || typeof t !== "object") {
|
|
202
|
+
errors.push(`turn[${i}] must be an object`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
128
205
|
if (!labels.has(t.speaker)) {
|
|
129
206
|
errors.push(`turn[${i}].speaker "${t.speaker}" is not a participant`);
|
|
130
207
|
}
|
|
131
|
-
if (
|
|
208
|
+
if (isBlank(t.text) && isBlank(t.audioRef)) {
|
|
132
209
|
errors.push(`turn[${i}] must have either text or audioRef`);
|
|
133
210
|
}
|
|
134
211
|
if (typeof t.expectRespond !== "boolean") {
|
|
135
212
|
errors.push(`turn[${i}].expectRespond must be a boolean`);
|
|
136
213
|
}
|
|
214
|
+
if (
|
|
215
|
+
t.expectEndOfTurn !== undefined &&
|
|
216
|
+
typeof t.expectEndOfTurn !== "boolean"
|
|
217
|
+
) {
|
|
218
|
+
errors.push(`turn[${i}].expectEndOfTurn must be a boolean`);
|
|
219
|
+
}
|
|
137
220
|
});
|
|
138
|
-
for (const agent of
|
|
221
|
+
for (const agent of agents) {
|
|
139
222
|
if (!labels.has(agent)) {
|
|
140
223
|
errors.push(`agent "${agent}" is not a participant`);
|
|
141
224
|
}
|
|
142
225
|
}
|
|
226
|
+
validateEnvironment(scenario.environment, "scenario.environment", errors);
|
|
227
|
+
turns.forEach((t, i) => {
|
|
228
|
+
validateEnvironment(t?.environment, `turn[${i}].environment`, errors);
|
|
229
|
+
});
|
|
143
230
|
return { valid: errors.length === 0, errors };
|
|
144
231
|
}
|
|
145
232
|
|
|
233
|
+
/** Validate an acoustic environment's ranges (pure; appends to `errors`). */
|
|
234
|
+
function validateEnvironment(
|
|
235
|
+
env: VoiceEnvironment | undefined,
|
|
236
|
+
where: string,
|
|
237
|
+
errors: string[],
|
|
238
|
+
): void {
|
|
239
|
+
if (!env) return;
|
|
240
|
+
if (
|
|
241
|
+
env.reverb !== undefined &&
|
|
242
|
+
(!Number.isFinite(env.reverb) || env.reverb < 0 || env.reverb > 1)
|
|
243
|
+
) {
|
|
244
|
+
errors.push(`${where}.reverb must be in [0, 1]`);
|
|
245
|
+
}
|
|
246
|
+
if (env.noiseSnrDb !== undefined && !Number.isFinite(env.noiseSnrDb)) {
|
|
247
|
+
errors.push(`${where}.noiseSnrDb must be a finite number`);
|
|
248
|
+
}
|
|
249
|
+
if (
|
|
250
|
+
env.farFieldDb !== undefined &&
|
|
251
|
+
(!Number.isFinite(env.farFieldDb) || env.farFieldDb < 0)
|
|
252
|
+
) {
|
|
253
|
+
errors.push(`${where}.farFieldDb must be a non-negative dB attenuation`);
|
|
254
|
+
}
|
|
255
|
+
if (
|
|
256
|
+
env.backgroundTalkersDb !== undefined &&
|
|
257
|
+
!Number.isFinite(env.backgroundTalkersDb)
|
|
258
|
+
) {
|
|
259
|
+
errors.push(`${where}.backgroundTalkersDb must be a finite number`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** Merge a turn's environment over the scenario's (turn wins, field by field). */
|
|
264
|
+
export function resolveTurnEnvironment(
|
|
265
|
+
scenario: VoiceScenario,
|
|
266
|
+
turn: VoiceScenarioTurn,
|
|
267
|
+
): VoiceEnvironment | undefined {
|
|
268
|
+
if (!scenario.environment && !turn.environment) return undefined;
|
|
269
|
+
return { ...scenario.environment, ...turn.environment };
|
|
270
|
+
}
|
|
271
|
+
|
|
146
272
|
/** The expected ASR reference for a turn (explicit override or its text). */
|
|
147
273
|
export function turnReferenceTranscript(turn: VoiceScenarioTurn): string {
|
|
148
274
|
return (turn.expectedTranscript ?? turn.text ?? "").trim();
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit coverage for the voice-scenario per-turn resolvers (#9147 voice).
|
|
3
|
+
*
|
|
4
|
+
* resolveTurnEnvironment / turnReferenceTranscript / turnSpeakerLabel are the
|
|
5
|
+
* pure helpers that resolve a scenario turn's augmentation environment, its
|
|
6
|
+
* reference transcript, and its expected speaker label — the inputs the
|
|
7
|
+
* multi-speaker / noise-music / self-rejection scenario harness scores against.
|
|
8
|
+
* They were untested. No GGUF / audio.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, expect, it } from "vitest";
|
|
12
|
+
import {
|
|
13
|
+
resolveTurnEnvironment,
|
|
14
|
+
turnReferenceTranscript,
|
|
15
|
+
turnSpeakerLabel,
|
|
16
|
+
type VoiceScenario,
|
|
17
|
+
type VoiceScenarioTurn,
|
|
18
|
+
} from "./voice-scenario";
|
|
19
|
+
|
|
20
|
+
const turn = (over: Partial<VoiceScenarioTurn>): VoiceScenarioTurn =>
|
|
21
|
+
({ speaker: "alice", text: "hi", ...over }) as VoiceScenarioTurn;
|
|
22
|
+
const scenario = (over: Partial<VoiceScenario>): VoiceScenario =>
|
|
23
|
+
({ ...over }) as VoiceScenario;
|
|
24
|
+
|
|
25
|
+
describe("resolveTurnEnvironment", () => {
|
|
26
|
+
it("returns undefined when neither scenario nor turn set an environment", () => {
|
|
27
|
+
expect(resolveTurnEnvironment(scenario({}), turn({}))).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("merges scenario + turn environment with the turn winning", () => {
|
|
31
|
+
const merged = resolveTurnEnvironment(
|
|
32
|
+
scenario({ environment: { noiseSnrDb: 20, reverb: 0.3 } }),
|
|
33
|
+
turn({ environment: { noiseSnrDb: 5 } }),
|
|
34
|
+
);
|
|
35
|
+
expect(merged).toEqual({ noiseSnrDb: 5, reverb: 0.3 });
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("uses the scenario environment alone when the turn has none", () => {
|
|
39
|
+
expect(
|
|
40
|
+
resolveTurnEnvironment(
|
|
41
|
+
scenario({ environment: { noiseSnrDb: 12 } }),
|
|
42
|
+
turn({}),
|
|
43
|
+
),
|
|
44
|
+
).toEqual({ noiseSnrDb: 12 });
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("turnReferenceTranscript", () => {
|
|
49
|
+
it("prefers expectedTranscript, then text, then empty — trimmed", () => {
|
|
50
|
+
expect(
|
|
51
|
+
turnReferenceTranscript(turn({ expectedTranscript: " hello " })),
|
|
52
|
+
).toBe("hello");
|
|
53
|
+
expect(
|
|
54
|
+
turnReferenceTranscript(
|
|
55
|
+
turn({ expectedTranscript: undefined, text: " hey " }),
|
|
56
|
+
),
|
|
57
|
+
).toBe("hey");
|
|
58
|
+
expect(
|
|
59
|
+
turnReferenceTranscript(
|
|
60
|
+
turn({ expectedTranscript: undefined, text: undefined }),
|
|
61
|
+
),
|
|
62
|
+
).toBe("");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe("turnSpeakerLabel", () => {
|
|
67
|
+
it("prefers expectedSpeakerLabel, falls back to speaker", () => {
|
|
68
|
+
expect(
|
|
69
|
+
turnSpeakerLabel(turn({ speaker: "bob", expectedSpeakerLabel: "Bob" })),
|
|
70
|
+
).toBe("Bob");
|
|
71
|
+
expect(
|
|
72
|
+
turnSpeakerLabel(
|
|
73
|
+
turn({ speaker: "carol", expectedSpeakerLabel: undefined }),
|
|
74
|
+
),
|
|
75
|
+
).toBe("carol");
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -13,11 +13,30 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import type { VoiceE2eCaseResult } from "./e2e-harness";
|
|
16
|
+
import { percentile, round4 } from "./metric-math";
|
|
16
17
|
import type { VoiceScenarioClass } from "./voice-scenario";
|
|
17
18
|
|
|
18
19
|
export type VoiceWorkbenchStatus = "ran" | "skipped";
|
|
19
20
|
export type VoiceWorkbenchVerdict = "pass" | "fail" | "skipped";
|
|
20
21
|
|
|
22
|
+
/**
|
|
23
|
+
* A `.wav` artifact written for one scenario run when a capture sink is active.
|
|
24
|
+
* `path` is RELATIVE to the run dir the headless runner was told to write under,
|
|
25
|
+
* so the scenario run viewer (served from that dir) can reference it directly.
|
|
26
|
+
*/
|
|
27
|
+
export interface VoiceAudioArtifact {
|
|
28
|
+
/** Turn index this artifact belongs to; the full corpus uses turn 0. */
|
|
29
|
+
turnIndex: number;
|
|
30
|
+
/** `generated` = the full synthesized corpus; `consumed` = a per-turn slice. */
|
|
31
|
+
kind: "generated" | "consumed";
|
|
32
|
+
/** Path to the `.wav`, relative to the run dir (forward-slash separated). */
|
|
33
|
+
path: string;
|
|
34
|
+
sampleRate: number;
|
|
35
|
+
durationMs?: number;
|
|
36
|
+
/** Diarization ground-truth speaker label for a consumed per-turn slice. */
|
|
37
|
+
speakerLabel?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
21
40
|
/** One scenario's outcome in a workbench run. */
|
|
22
41
|
export interface VoiceWorkbenchScenarioRun {
|
|
23
42
|
scenarioId: string;
|
|
@@ -28,6 +47,8 @@ export interface VoiceWorkbenchScenarioRun {
|
|
|
28
47
|
cases: VoiceE2eCaseResult[];
|
|
29
48
|
/** Why the scenario was skipped (artifact/backend absence), if it was. */
|
|
30
49
|
skipReason?: string;
|
|
50
|
+
/** `.wav` artifacts written when a capture sink was active (else absent). */
|
|
51
|
+
audioArtifacts?: VoiceAudioArtifact[];
|
|
31
52
|
}
|
|
32
53
|
|
|
33
54
|
export interface VoiceWorkbenchScenarioReport {
|
|
@@ -64,6 +85,12 @@ export interface VoiceWorkbenchMetrics {
|
|
|
64
85
|
voiceEntityMatchRate: MetricRollup;
|
|
65
86
|
/** First-audio latency ms (`worst` = max). */
|
|
66
87
|
firstAudioMs: MetricRollup;
|
|
88
|
+
/** Self-echo rejection rate (`worst` = min). */
|
|
89
|
+
echoRejectionRate: MetricRollup;
|
|
90
|
+
/** Owner-vs-intruder accuracy (`worst` = min). */
|
|
91
|
+
ownerAccuracy: MetricRollup;
|
|
92
|
+
/** Impostor-accept rate (`worst` = max) — non-owner accepted as owner. */
|
|
93
|
+
impostorAcceptRate: MetricRollup;
|
|
67
94
|
}
|
|
68
95
|
|
|
69
96
|
export interface VoiceWorkbenchReport {
|
|
@@ -82,23 +109,6 @@ function mean(values: ReadonlyArray<number>): number | null {
|
|
|
82
109
|
return round4(sum / values.length);
|
|
83
110
|
}
|
|
84
111
|
|
|
85
|
-
function round4(n: number): number {
|
|
86
|
-
return Math.round(n * 1e4) / 1e4;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function round1(n: number): number {
|
|
90
|
-
return Math.round(n * 10) / 10;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** Nearest-rank percentile over a sample (null when empty). */
|
|
94
|
-
function percentile(values: ReadonlyArray<number>, p: number): number | null {
|
|
95
|
-
const finite = values.filter((v) => Number.isFinite(v));
|
|
96
|
-
if (finite.length === 0) return null;
|
|
97
|
-
const sorted = [...finite].sort((a, b) => a - b);
|
|
98
|
-
const rank = Math.ceil((p / 100) * sorted.length);
|
|
99
|
-
return round1(sorted[Math.min(sorted.length - 1, Math.max(0, rank - 1))]);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
112
|
function rollupMax(values: ReadonlyArray<number>): MetricRollup {
|
|
103
113
|
return {
|
|
104
114
|
count: values.length,
|
|
@@ -154,6 +164,9 @@ export function buildVoiceWorkbenchReport(
|
|
|
154
164
|
const entityF1: number[] = [];
|
|
155
165
|
const voiceEntityMatchRate: number[] = [];
|
|
156
166
|
const firstAudioMs: number[] = [];
|
|
167
|
+
const echoRejectionRate: number[] = [];
|
|
168
|
+
const ownerAccuracy: number[] = [];
|
|
169
|
+
const impostorAcceptRate: number[] = [];
|
|
157
170
|
|
|
158
171
|
for (const c of allCases) {
|
|
159
172
|
switch (c.kind) {
|
|
@@ -180,6 +193,13 @@ export function buildVoiceWorkbenchReport(
|
|
|
180
193
|
case "first-response-latency":
|
|
181
194
|
firstAudioMs.push(c.firstAudioMs);
|
|
182
195
|
break;
|
|
196
|
+
case "echo-rejection":
|
|
197
|
+
echoRejectionRate.push(c.rejectionRate);
|
|
198
|
+
break;
|
|
199
|
+
case "owner-security":
|
|
200
|
+
ownerAccuracy.push(c.accuracy);
|
|
201
|
+
impostorAcceptRate.push(c.impostorAcceptRate);
|
|
202
|
+
break;
|
|
183
203
|
default:
|
|
184
204
|
break;
|
|
185
205
|
}
|
|
@@ -211,6 +231,9 @@ export function buildVoiceWorkbenchReport(
|
|
|
211
231
|
entityF1: rollupMin(entityF1),
|
|
212
232
|
voiceEntityMatchRate: rollupMin(voiceEntityMatchRate),
|
|
213
233
|
firstAudioMs: rollupMax(firstAudioMs),
|
|
234
|
+
echoRejectionRate: rollupMin(echoRejectionRate),
|
|
235
|
+
ownerAccuracy: rollupMin(ownerAccuracy),
|
|
236
|
+
impostorAcceptRate: rollupMax(impostorAcceptRate),
|
|
214
237
|
},
|
|
215
238
|
};
|
|
216
239
|
}
|
|
@@ -242,6 +265,9 @@ export function formatVoiceWorkbenchMarkdown(
|
|
|
242
265
|
`| Entity F1 | ${fmt(m.entityF1.mean)} | ${fmt(m.entityF1.worst)} | ${m.entityF1.count} |`,
|
|
243
266
|
`| Voice→entity match | ${fmt(m.voiceEntityMatchRate.mean)} | ${fmt(m.voiceEntityMatchRate.worst)} | ${m.voiceEntityMatchRate.count} |`,
|
|
244
267
|
`| First-audio (ms) | ${fmt(m.firstAudioMs.mean)} | ${fmt(m.firstAudioMs.worst)} | ${m.firstAudioMs.count} |`,
|
|
268
|
+
`| Echo rejection rate | ${fmt(m.echoRejectionRate.mean)} | ${fmt(m.echoRejectionRate.worst)} | ${m.echoRejectionRate.count} |`,
|
|
269
|
+
`| Owner accuracy | ${fmt(m.ownerAccuracy.mean)} | ${fmt(m.ownerAccuracy.worst)} | ${m.ownerAccuracy.count} |`,
|
|
270
|
+
`| Impostor-accept rate | ${fmt(m.impostorAcceptRate.mean)} | ${fmt(m.impostorAcceptRate.worst)} | ${m.impostorAcceptRate.count} |`,
|
|
245
271
|
"",
|
|
246
272
|
"## Scenarios",
|
|
247
273
|
"",
|
|
@@ -295,6 +321,11 @@ export function regressionsAgainstBaseline(
|
|
|
295
321
|
current.metrics.firstAudioMs.mean,
|
|
296
322
|
baseline.metrics.firstAudioMs.mean,
|
|
297
323
|
],
|
|
324
|
+
[
|
|
325
|
+
"impostorAcceptRate",
|
|
326
|
+
current.metrics.impostorAcceptRate.mean,
|
|
327
|
+
baseline.metrics.impostorAcceptRate.mean,
|
|
328
|
+
],
|
|
298
329
|
];
|
|
299
330
|
const higherBetter: Array<[string, number | null, number | null]> = [
|
|
300
331
|
[
|
|
@@ -308,6 +339,16 @@ export function regressionsAgainstBaseline(
|
|
|
308
339
|
current.metrics.voiceEntityMatchRate.mean,
|
|
309
340
|
baseline.metrics.voiceEntityMatchRate.mean,
|
|
310
341
|
],
|
|
342
|
+
[
|
|
343
|
+
"echoRejectionRate",
|
|
344
|
+
current.metrics.echoRejectionRate.mean,
|
|
345
|
+
baseline.metrics.echoRejectionRate.mean,
|
|
346
|
+
],
|
|
347
|
+
[
|
|
348
|
+
"ownerAccuracy",
|
|
349
|
+
current.metrics.ownerAccuracy.mean,
|
|
350
|
+
baseline.metrics.ownerAccuracy.mean,
|
|
351
|
+
],
|
|
311
352
|
];
|
|
312
353
|
const out: MetricRegression[] = [];
|
|
313
354
|
for (const [metric, cur, base] of lowerBetter) {
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
* Wake-word detection — native runtime binding.
|
|
3
3
|
*
|
|
4
4
|
* Loads the standalone `packages/native/plugins/wakeword-cpp/`
|
|
5
|
-
* library directly via `bun:ffi` and exposes the
|
|
6
|
-
* interface as
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* library directly via `bun:ffi` and exposes the `WakeWordModel`
|
|
6
|
+
* interface as `OpenWakeWordGgmlModel`. The sibling `./wake-word.ts`
|
|
7
|
+
* is the fused-`libelizainference` path (`GgmlWakeWordModel`, the
|
|
8
|
+
* `eliza_inference_wakeword_*` FFI surface) and selects between the two
|
|
9
|
+
* native backends; both implement the same interface so the voice
|
|
10
|
+
* lifecycle can swap them without changing anything upstream. There is
|
|
11
|
+
* NO ONNX path on either — `onnxruntime-node` was removed.
|
|
9
12
|
*
|
|
10
|
-
*
|
|
13
|
+
* This binding is the standalone-library backend, used when the
|
|
11
14
|
* `libwakeword.{so,dylib,dll}` shared library and three converted
|
|
12
15
|
* GGUFs are present. The C runtime is a pure-fp32 reference
|
|
13
16
|
* implementation of the openWakeWord three-stage pipeline (melspec
|
|
@@ -16,10 +19,6 @@
|
|
|
16
19
|
* upstream openWakeWord ONNX graphs is gated by
|
|
17
20
|
* `packages/native/plugins/wakeword-cpp/test/wakeword_parity_test.py`.
|
|
18
21
|
*
|
|
19
|
-
* The ONNX path in `./wake-word.ts` stays as the fallback while the
|
|
20
|
-
* native binding shakes out. Once the migration is complete the ONNX
|
|
21
|
-
* path can be removed alongside the `onnxruntime-node` dependency.
|
|
22
|
-
*
|
|
23
22
|
* Three GGUFs back one session, mirroring openWakeWord's three ONNX
|
|
24
23
|
* graphs (the C library is the single source of truth on shapes —
|
|
25
24
|
* see `packages/native/plugins/wakeword-cpp/include/wakeword/wakeword.h`):
|
|
@@ -112,11 +111,11 @@ interface BoundLibrary {
|
|
|
112
111
|
|
|
113
112
|
/** Minimal shape of the bun:ffi module we use here. */
|
|
114
113
|
interface BunFfiModule {
|
|
115
|
-
dlopen(
|
|
114
|
+
dlopen<TSymbols>(
|
|
116
115
|
path: string,
|
|
117
116
|
def: Record<string, { args: number[]; returns: number }>,
|
|
118
117
|
): {
|
|
119
|
-
symbols:
|
|
118
|
+
symbols: TSymbols;
|
|
120
119
|
close(): void;
|
|
121
120
|
};
|
|
122
121
|
ptr(value: ArrayBufferView): unknown;
|
|
@@ -169,7 +168,7 @@ function loadLibrary(libraryPath: string): BoundLibrary {
|
|
|
169
168
|
}
|
|
170
169
|
const bunFfi = loadBunFfiModule();
|
|
171
170
|
const T = bunFfi.FFIType;
|
|
172
|
-
const lib = bunFfi.dlopen(libraryPath, {
|
|
171
|
+
const lib = bunFfi.dlopen<WakeWordBindings>(libraryPath, {
|
|
173
172
|
wakeword_open: {
|
|
174
173
|
args: [T.ptr, T.ptr, T.ptr, T.ptr],
|
|
175
174
|
returns: T.i32,
|
|
@@ -192,7 +191,7 @@ function loadLibrary(libraryPath: string): BoundLibrary {
|
|
|
192
191
|
},
|
|
193
192
|
});
|
|
194
193
|
return {
|
|
195
|
-
bindings: lib.symbols
|
|
194
|
+
bindings: lib.symbols,
|
|
196
195
|
close: () => lib.close(),
|
|
197
196
|
libraryPath,
|
|
198
197
|
ptr: (v: ArrayBufferView) => bunFfi.ptr(v),
|