@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,103 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
type EchoRejectionSample,
|
|
4
|
+
type OwnerSecuritySample,
|
|
5
|
+
scoreEchoRejection,
|
|
6
|
+
scoreOwnerSecurity,
|
|
7
|
+
} from "./e2e-harness";
|
|
8
|
+
|
|
9
|
+
// #9147 — self-echo rejection ("did the agent talk to itself?") and owner-vs-
|
|
10
|
+
// impostor gating are two of the three heavy voice cases the issue calls out as
|
|
11
|
+
// having scorers that "do not run anywhere that gates merges". These scorers are
|
|
12
|
+
// pure + GGUF-independent, so pin their decision math here so the gate runs.
|
|
13
|
+
|
|
14
|
+
const echo = (
|
|
15
|
+
isAgentEcho: boolean,
|
|
16
|
+
responded: boolean,
|
|
17
|
+
): EchoRejectionSample => ({
|
|
18
|
+
isAgentEcho,
|
|
19
|
+
responded,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe("scoreEchoRejection (#9147)", () => {
|
|
23
|
+
it("passes when every agent-echo turn is suppressed", () => {
|
|
24
|
+
const r = scoreEchoRejection([echo(true, false), echo(true, false)]);
|
|
25
|
+
expect(r.total).toBe(2);
|
|
26
|
+
expect(r.rejected).toBe(2);
|
|
27
|
+
expect(r.rejectionRate).toBe(1);
|
|
28
|
+
expect(r.passed).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("scores ONLY agent-echo turns (real turns are ignored here)", () => {
|
|
32
|
+
// 2 echo (one leaked) + 2 real turns the agent answered (must not count).
|
|
33
|
+
const r = scoreEchoRejection([
|
|
34
|
+
echo(true, false),
|
|
35
|
+
echo(true, true),
|
|
36
|
+
echo(false, true),
|
|
37
|
+
echo(false, true),
|
|
38
|
+
]);
|
|
39
|
+
expect(r.total).toBe(2);
|
|
40
|
+
expect(r.rejected).toBe(1);
|
|
41
|
+
expect(r.rejectionRate).toBe(0.5);
|
|
42
|
+
expect(r.passed).toBe(false); // 0.5 < default 0.9 floor
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("fails closed when there are no echo samples to prove rejection", () => {
|
|
46
|
+
const r = scoreEchoRejection([echo(false, true)]);
|
|
47
|
+
expect(r.total).toBe(0);
|
|
48
|
+
expect(r.rejectionRate).toBe(0);
|
|
49
|
+
expect(r.passed).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("honors a custom minRejectionRate floor", () => {
|
|
53
|
+
const samples = [echo(true, false), echo(true, false), echo(true, true)];
|
|
54
|
+
expect(scoreEchoRejection(samples).passed).toBe(false); // 0.6667 < 0.9
|
|
55
|
+
expect(scoreEchoRejection(samples, { minRejectionRate: 0.6 }).passed).toBe(
|
|
56
|
+
true,
|
|
57
|
+
); // 0.6667 >= 0.6
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const sec = (
|
|
62
|
+
predictedOwner: boolean,
|
|
63
|
+
expectedOwner: boolean,
|
|
64
|
+
): OwnerSecuritySample => ({
|
|
65
|
+
predictedOwner,
|
|
66
|
+
expectedOwner,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe("scoreOwnerSecurity (#9147)", () => {
|
|
70
|
+
it("passes only when accuracy is high AND no impostor is accepted", () => {
|
|
71
|
+
const r = scoreOwnerSecurity([sec(true, true), sec(false, false)]);
|
|
72
|
+
expect(r.accuracy).toBe(1);
|
|
73
|
+
expect(r.impostorAcceptRate).toBe(0);
|
|
74
|
+
expect(r.passed).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("FAILS on a single impostor-accept even at high overall accuracy", () => {
|
|
78
|
+
// 9 correct + 1 stranger let in as owner → accuracy 0.9 but a real breach.
|
|
79
|
+
const samples = [
|
|
80
|
+
...Array.from({ length: 9 }, () => sec(true, true)),
|
|
81
|
+
sec(true, false),
|
|
82
|
+
];
|
|
83
|
+
const r = scoreOwnerSecurity(samples);
|
|
84
|
+
expect(r.accuracy).toBe(0.9);
|
|
85
|
+
expect(r.impostorAcceptRate).toBeGreaterThan(0);
|
|
86
|
+
expect(r.passed).toBe(false); // default maxImpostorAcceptRate is 0
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("treats rejecting the real owner as friction, not a security failure", () => {
|
|
90
|
+
// owner rejected once (friction) but no impostor accepted.
|
|
91
|
+
const r = scoreOwnerSecurity(
|
|
92
|
+
[sec(false, true), sec(false, false), sec(false, false)],
|
|
93
|
+
{ minAccuracy: 0.6 },
|
|
94
|
+
);
|
|
95
|
+
expect(r.ownerRejectRate).toBe(1);
|
|
96
|
+
expect(r.impostorAcceptRate).toBe(0);
|
|
97
|
+
expect(r.passed).toBe(true); // 2/3 accuracy >= 0.6 floor, no impostor in
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("fails closed on an empty sample set", () => {
|
|
101
|
+
expect(scoreOwnerSecurity([]).passed).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -44,10 +44,10 @@ describe("voice E2E harness artifact validation", () => {
|
|
|
44
44
|
expect(() =>
|
|
45
45
|
assertRequiredVoiceArtifacts(
|
|
46
46
|
[
|
|
47
|
-
{ kind: "bundle-root", path: "/models/eliza-1-
|
|
47
|
+
{ kind: "bundle-root", path: "/models/eliza-1-2b.bundle" },
|
|
48
48
|
{
|
|
49
49
|
kind: "asr-model",
|
|
50
|
-
path: "/models/eliza-1-
|
|
50
|
+
path: "/models/eliza-1-2b.bundle/asr/eliza-1-asr.gguf",
|
|
51
51
|
magic: "GGUF",
|
|
52
52
|
},
|
|
53
53
|
],
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
export { normalizeWerText, wordErrorRate } from "@elizaos/shared/voice-wer";
|
|
14
14
|
|
|
15
15
|
import { normalizeWerText, wordErrorRate } from "@elizaos/shared/voice-wer";
|
|
16
|
+
import {
|
|
17
|
+
computeDiarizationErrorRate,
|
|
18
|
+
type DiarizationSegment,
|
|
19
|
+
} from "./diarization-error-rate";
|
|
20
|
+
import { percentile, round1, round4 } from "./metric-math";
|
|
16
21
|
|
|
17
22
|
export type VoiceE2eHarnessErrorCode =
|
|
18
23
|
| "missing-artifact"
|
|
@@ -572,6 +577,66 @@ export function scoreDiarization(
|
|
|
572
577
|
};
|
|
573
578
|
}
|
|
574
579
|
|
|
580
|
+
/** One scored turn for timeline DER: its speech span + predicted/true speaker. */
|
|
581
|
+
export interface DiarizationTurnSample {
|
|
582
|
+
/** Ground-truth speaker label (the diarization reference). */
|
|
583
|
+
expectedLabel: string;
|
|
584
|
+
/** Predicted speaker label from a real attributor, or null when it missed. */
|
|
585
|
+
predictedLabel: string | null;
|
|
586
|
+
/** Speech-region start of this turn (ms into the stream). */
|
|
587
|
+
startMs: number;
|
|
588
|
+
/** Speech-region end of this turn (ms; must be ≥ startMs). */
|
|
589
|
+
endMs: number;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Score diarization with the frame-based, label-agnostic {@link
|
|
594
|
+
* computeDiarizationErrorRate} (#9147) rather than a per-turn string compare.
|
|
595
|
+
* The predicted labels are an arbitrary cluster-id space (the attributor never
|
|
596
|
+
* knows the ground-truth names) — DER finds the optimal cluster→speaker mapping,
|
|
597
|
+
* so a correct partition scores 0 no matter how clusters are named, and a merged
|
|
598
|
+
* or swapped speaker shows up as real error. `confusions`/`misses` are turn-level
|
|
599
|
+
* tallies derived from that optimal mapping, for the report.
|
|
600
|
+
*/
|
|
601
|
+
export function scoreDiarizationTimeline(
|
|
602
|
+
turns: ReadonlyArray<DiarizationTurnSample>,
|
|
603
|
+
opts: { maxDer?: number } = {},
|
|
604
|
+
): DiarizationResult {
|
|
605
|
+
const maxDer = opts.maxDer ?? 0.2;
|
|
606
|
+
const reference: DiarizationSegment[] = turns.map((t) => ({
|
|
607
|
+
speaker: t.expectedLabel,
|
|
608
|
+
startMs: t.startMs,
|
|
609
|
+
endMs: t.endMs,
|
|
610
|
+
}));
|
|
611
|
+
const hypothesis: DiarizationSegment[] = turns
|
|
612
|
+
.filter((t) => t.predictedLabel !== null)
|
|
613
|
+
.map((t) => ({
|
|
614
|
+
speaker: t.predictedLabel as string,
|
|
615
|
+
startMs: t.startMs,
|
|
616
|
+
endMs: t.endMs,
|
|
617
|
+
}));
|
|
618
|
+
const result = computeDiarizationErrorRate(reference, hypothesis);
|
|
619
|
+
// Turn-level tallies under the optimal mapping (the report's headline is `der`).
|
|
620
|
+
let confusions = 0;
|
|
621
|
+
let misses = 0;
|
|
622
|
+
for (const t of turns) {
|
|
623
|
+
if (t.predictedLabel === null) {
|
|
624
|
+
misses += 1;
|
|
625
|
+
} else if (result.mapping[t.predictedLabel] !== t.expectedLabel) {
|
|
626
|
+
confusions += 1;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return {
|
|
630
|
+
kind: "diarization",
|
|
631
|
+
total: turns.length,
|
|
632
|
+
der: round4(result.der),
|
|
633
|
+
confusions,
|
|
634
|
+
misses,
|
|
635
|
+
maxDer,
|
|
636
|
+
passed: turns.length > 0 && result.der <= maxDer,
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
|
|
575
640
|
// ── Entity extraction: inferred name/entity match (precision / recall / F1) ──
|
|
576
641
|
|
|
577
642
|
export interface EntityExtractionInput {
|
|
@@ -655,13 +720,113 @@ export function scoreVoiceEntityMatch(
|
|
|
655
720
|
};
|
|
656
721
|
}
|
|
657
722
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
723
|
+
// ── Echo / self-voice rejection: the agent's own TTS must not be a user turn ─
|
|
724
|
+
|
|
725
|
+
export interface EchoRejectionSample {
|
|
726
|
+
/** Ground truth: this turn is the agent's own TTS echoed back through the mic. */
|
|
727
|
+
isAgentEcho: boolean;
|
|
728
|
+
/** The agent responded to (i.e. failed to suppress) this turn. */
|
|
729
|
+
responded: boolean;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
export interface EchoRejectionResult {
|
|
733
|
+
kind: "echo-rejection";
|
|
734
|
+
/** Number of agent-echo turns scored. */
|
|
735
|
+
total: number;
|
|
736
|
+
/** Echo turns correctly suppressed (no response). */
|
|
737
|
+
rejected: number;
|
|
738
|
+
rejectionRate: number;
|
|
739
|
+
minRejectionRate: number;
|
|
740
|
+
passed: boolean;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Score self-echo rejection over the agent-echo turns only: each must be
|
|
745
|
+
* suppressed (no response). Real turns are scored by {@link scoreRespondDecision}
|
|
746
|
+
* — this isolates "did the agent talk to itself?".
|
|
747
|
+
*/
|
|
748
|
+
export function scoreEchoRejection(
|
|
749
|
+
samples: ReadonlyArray<EchoRejectionSample>,
|
|
750
|
+
opts: { minRejectionRate?: number } = {},
|
|
751
|
+
): EchoRejectionResult {
|
|
752
|
+
const minRejectionRate = opts.minRejectionRate ?? 0.9;
|
|
753
|
+
const echo = samples.filter((s) => s.isAgentEcho);
|
|
754
|
+
const total = echo.length;
|
|
755
|
+
let rejected = 0;
|
|
756
|
+
for (const s of echo) if (!s.responded) rejected += 1;
|
|
757
|
+
const rejectionRate = total > 0 ? rejected / total : 0;
|
|
758
|
+
return {
|
|
759
|
+
kind: "echo-rejection",
|
|
760
|
+
total,
|
|
761
|
+
rejected,
|
|
762
|
+
rejectionRate: round4(rejectionRate),
|
|
763
|
+
minRejectionRate,
|
|
764
|
+
passed: total > 0 && rejectionRate >= minRejectionRate,
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// ── Owner security: owner vs. intruder gating (never accept an impostor) ──────
|
|
769
|
+
|
|
770
|
+
export interface OwnerSecuritySample {
|
|
771
|
+
/** The system judged this turn to be the device owner. */
|
|
772
|
+
predictedOwner: boolean;
|
|
773
|
+
/** Ground truth: this turn IS the owner. */
|
|
774
|
+
expectedOwner: boolean;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
export interface OwnerSecurityResult {
|
|
778
|
+
kind: "owner-security";
|
|
779
|
+
total: number;
|
|
780
|
+
accuracy: number;
|
|
781
|
+
/** Accepted a non-owner AS the owner (the dangerous false-accept). */
|
|
782
|
+
impostorAcceptRate: number;
|
|
783
|
+
/** Rejected the real owner (a friction false-reject). */
|
|
784
|
+
ownerRejectRate: number;
|
|
785
|
+
minAccuracy: number;
|
|
786
|
+
maxImpostorAcceptRate: number;
|
|
787
|
+
passed: boolean;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Score owner-vs-intruder gating. Passing requires both high overall accuracy
|
|
792
|
+
* AND an impostor-accept rate at/below the (strict, default 0) ceiling —
|
|
793
|
+
* letting a stranger in is the failure mode that matters for security, so it is
|
|
794
|
+
* gated separately from plain accuracy.
|
|
795
|
+
*/
|
|
796
|
+
export function scoreOwnerSecurity(
|
|
797
|
+
samples: ReadonlyArray<OwnerSecuritySample>,
|
|
798
|
+
opts: { minAccuracy?: number; maxImpostorAcceptRate?: number } = {},
|
|
799
|
+
): OwnerSecurityResult {
|
|
800
|
+
const minAccuracy = opts.minAccuracy ?? 0.9;
|
|
801
|
+
const maxImpostorAcceptRate = opts.maxImpostorAcceptRate ?? 0;
|
|
802
|
+
const total = samples.length;
|
|
803
|
+
let correct = 0;
|
|
804
|
+
let impostorAccept = 0;
|
|
805
|
+
let ownerReject = 0;
|
|
806
|
+
let owners = 0;
|
|
807
|
+
let nonOwners = 0;
|
|
808
|
+
for (const s of samples) {
|
|
809
|
+
if (s.predictedOwner === s.expectedOwner) correct += 1;
|
|
810
|
+
if (s.expectedOwner) owners += 1;
|
|
811
|
+
else nonOwners += 1;
|
|
812
|
+
if (s.predictedOwner && !s.expectedOwner) impostorAccept += 1;
|
|
813
|
+
if (!s.predictedOwner && s.expectedOwner) ownerReject += 1;
|
|
814
|
+
}
|
|
815
|
+
const accuracy = total > 0 ? correct / total : 0;
|
|
816
|
+
const impostorAcceptRate = nonOwners > 0 ? impostorAccept / nonOwners : 0;
|
|
817
|
+
return {
|
|
818
|
+
kind: "owner-security",
|
|
819
|
+
total,
|
|
820
|
+
accuracy: round4(accuracy),
|
|
821
|
+
impostorAcceptRate: round4(impostorAcceptRate),
|
|
822
|
+
ownerRejectRate: round4(owners > 0 ? ownerReject / owners : 0),
|
|
823
|
+
minAccuracy,
|
|
824
|
+
maxImpostorAcceptRate,
|
|
825
|
+
passed:
|
|
826
|
+
total > 0 &&
|
|
827
|
+
accuracy >= minAccuracy &&
|
|
828
|
+
impostorAcceptRate <= maxImpostorAcceptRate,
|
|
829
|
+
};
|
|
665
830
|
}
|
|
666
831
|
|
|
667
832
|
export type VoiceE2eCaseResult =
|
|
@@ -674,7 +839,9 @@ export type VoiceE2eCaseResult =
|
|
|
674
839
|
| RespondDecisionResult
|
|
675
840
|
| DiarizationResult
|
|
676
841
|
| EntityExtractionResult
|
|
677
|
-
| VoiceEntityMatchResult
|
|
842
|
+
| VoiceEntityMatchResult
|
|
843
|
+
| EchoRejectionResult
|
|
844
|
+
| OwnerSecurityResult;
|
|
678
845
|
|
|
679
846
|
export interface VoiceE2eSummary {
|
|
680
847
|
passed: boolean;
|
|
@@ -733,11 +900,3 @@ function missingMeasurement(name: string): VoiceE2eHarnessError {
|
|
|
733
900
|
{ name },
|
|
734
901
|
);
|
|
735
902
|
}
|
|
736
|
-
|
|
737
|
-
function round1(value: number): number {
|
|
738
|
-
return Math.round(value * 10) / 10;
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
function round4(value: number): number {
|
|
742
|
-
return Math.round(value * 10000) / 10000;
|
|
743
|
-
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_PLAYBACK_DELAY_MS,
|
|
4
|
+
estimateEchoDelaySamples,
|
|
5
|
+
PLATFORM_PLAYBACK_DELAY_DEFAULTS,
|
|
6
|
+
platformPlaybackDelayMs,
|
|
7
|
+
platformPlaybackDelaySamples,
|
|
8
|
+
} from "./echo-delay.ts";
|
|
9
|
+
|
|
10
|
+
/** Deterministic PRNG so fixtures are reproducible across runs/CI. */
|
|
11
|
+
function mulberry32(seed: number): () => number {
|
|
12
|
+
let a = seed >>> 0;
|
|
13
|
+
return () => {
|
|
14
|
+
a |= 0;
|
|
15
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
16
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a);
|
|
17
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
18
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function whiteNoise(n: number, amp: number, rng: () => number): Float32Array {
|
|
23
|
+
const out = new Float32Array(n);
|
|
24
|
+
for (let i = 0; i < n; i++) out[i] = (rng() * 2 - 1) * amp;
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe("estimateEchoDelaySamples (#9583)", () => {
|
|
29
|
+
it("recovers a known playback→mic delay", () => {
|
|
30
|
+
const rng = mulberry32(7);
|
|
31
|
+
const far = whiteNoise(8000, 0.5, rng);
|
|
32
|
+
const delay = 137;
|
|
33
|
+
const gain = 0.6;
|
|
34
|
+
const near = new Float32Array(far.length);
|
|
35
|
+
for (let i = delay; i < far.length; i++) {
|
|
36
|
+
near[i] = gain * far[i - delay] + (rng() * 2 - 1) * 0.01; // tiny near noise
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const est = estimateEchoDelaySamples(near, far, { maxLagSamples: 400 });
|
|
40
|
+
expect(est.lagSamples).toBe(delay);
|
|
41
|
+
// Scale-invariant correlation: the 0.6 gain does not lower confidence.
|
|
42
|
+
expect(est.confidence).toBeGreaterThan(0.9);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("recovers a zero delay (synchronous reference)", () => {
|
|
46
|
+
const rng = mulberry32(3);
|
|
47
|
+
const far = whiteNoise(8000, 0.5, rng);
|
|
48
|
+
const near = new Float32Array(far.length);
|
|
49
|
+
for (let i = 0; i < far.length; i++) near[i] = 0.7 * far[i];
|
|
50
|
+
|
|
51
|
+
const est = estimateEchoDelaySamples(near, far, { maxLagSamples: 200 });
|
|
52
|
+
expect(est.lagSamples).toBe(0);
|
|
53
|
+
expect(est.confidence).toBeGreaterThan(0.95);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("reports low confidence when near is independent of far (no echo)", () => {
|
|
57
|
+
const far = whiteNoise(8000, 0.5, mulberry32(1));
|
|
58
|
+
const near = whiteNoise(8000, 0.5, mulberry32(2)); // independent signal
|
|
59
|
+
|
|
60
|
+
const est = estimateEchoDelaySamples(near, far, { maxLagSamples: 400 });
|
|
61
|
+
expect(est.confidence).toBeLessThan(0.3);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("returns zero on empty input", () => {
|
|
65
|
+
expect(
|
|
66
|
+
estimateEchoDelaySamples(new Float32Array(0), new Float32Array(0)),
|
|
67
|
+
).toEqual({ lagSamples: 0, confidence: 0 });
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("honors a minLagSamples floor", () => {
|
|
71
|
+
const rng = mulberry32(9);
|
|
72
|
+
const far = whiteNoise(8000, 0.5, rng);
|
|
73
|
+
const delay = 40;
|
|
74
|
+
const near = new Float32Array(far.length);
|
|
75
|
+
for (let i = delay; i < far.length; i++) near[i] = 0.5 * far[i - delay];
|
|
76
|
+
|
|
77
|
+
// Floor above the true delay forces the search to start past it.
|
|
78
|
+
const est = estimateEchoDelaySamples(near, far, {
|
|
79
|
+
minLagSamples: 100,
|
|
80
|
+
maxLagSamples: 400,
|
|
81
|
+
});
|
|
82
|
+
expect(est.lagSamples).toBeGreaterThanOrEqual(100);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe("platformPlaybackDelaySamples seed (#9583)", () => {
|
|
87
|
+
it("maps known platforms to their seed delay (ms)", () => {
|
|
88
|
+
expect(platformPlaybackDelayMs("darwin")).toBe(20);
|
|
89
|
+
expect(platformPlaybackDelayMs("ios")).toBe(25);
|
|
90
|
+
expect(platformPlaybackDelayMs("android")).toBe(45);
|
|
91
|
+
expect(platformPlaybackDelayMs("win32")).toBe(30);
|
|
92
|
+
expect(platformPlaybackDelayMs("linux")).toBe(30);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("falls back to the default seed for an unrecognized platform", () => {
|
|
96
|
+
expect(platformPlaybackDelayMs("haiku")).toBe(DEFAULT_PLAYBACK_DELAY_MS);
|
|
97
|
+
// The table must not accidentally carry the unknown key.
|
|
98
|
+
expect("haiku" in PLATFORM_PLAYBACK_DELAY_DEFAULTS).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("converts the seed to samples at 16 kHz by default", () => {
|
|
102
|
+
// 20 ms * 16000 / 1000 = 320 samples
|
|
103
|
+
expect(platformPlaybackDelaySamples("darwin")).toBe(320);
|
|
104
|
+
// unknown → 25 ms default → 400 samples
|
|
105
|
+
expect(platformPlaybackDelaySamples("unknown")).toBe(400);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("honours a custom sample rate", () => {
|
|
109
|
+
// 30 ms * 48000 / 1000 = 1440 samples
|
|
110
|
+
expect(platformPlaybackDelaySamples("win32", 48_000)).toBe(1440);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("never returns a negative seed", () => {
|
|
114
|
+
for (const p of ["darwin", "ios", "android", "win32", "linux", "??"]) {
|
|
115
|
+
expect(platformPlaybackDelaySamples(p)).toBeGreaterThanOrEqual(0);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playback→mic echo-delay calibration (#9583, follow-up to #9455).
|
|
3
|
+
*
|
|
4
|
+
* The NLMS echo canceller's adaptive taps model only the room impulse response;
|
|
5
|
+
* the bulk transport delay between TTS playback and the mic capture window
|
|
6
|
+
* (audio-HAL buffering, Bluetooth, resampling, …) should be removed FIRST so the
|
|
7
|
+
* finite tap span (and the adaptation budget) isn't spent modelling pure
|
|
8
|
+
* latency. This finds that bulk lag by normalized cross-correlation of the mic
|
|
9
|
+
* (near-end) against the playback reference (far-end): the lag that maximizes
|
|
10
|
+
* correlation is the playback→mic delay, which the caller then applies as a
|
|
11
|
+
* fixed pre-alignment before the adaptive filter.
|
|
12
|
+
*
|
|
13
|
+
* Pure DSP — no FFI, no device. The per-platform default delay still needs to be
|
|
14
|
+
* tuned on hardware, but the estimator itself is deterministic and testable.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export interface EchoDelayEstimate {
|
|
18
|
+
/** Best playback→mic delay in samples (far leads near by this much). */
|
|
19
|
+
lagSamples: number;
|
|
20
|
+
/** Peak normalized cross-correlation at that lag, in [0, 1]. */
|
|
21
|
+
confidence: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface EchoDelayOptions {
|
|
25
|
+
/** Largest lag to search, in samples. Default 4800 (300 ms @ 16 kHz). */
|
|
26
|
+
maxLagSamples?: number;
|
|
27
|
+
/** Smallest lag to search, in samples. Default 0. */
|
|
28
|
+
minLagSamples?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Estimate the bulk playback→mic delay: the lag `d` (in samples) that best
|
|
33
|
+
* aligns the far-end reference into the near-end mic signal, i.e.
|
|
34
|
+
* `near[n] ≈ g · far[n - d]`. Returns that lag plus its normalized
|
|
35
|
+
* cross-correlation as a `[0, 1]` confidence.
|
|
36
|
+
*
|
|
37
|
+
* Normalized correlation is scale-invariant, so the playback gain `g` does not
|
|
38
|
+
* bias the result. A low confidence (e.g. `< 0.3`) means no detectable echo
|
|
39
|
+
* (the signals are independent) — the caller should keep its previous
|
|
40
|
+
* calibration rather than trust a spurious peak.
|
|
41
|
+
*/
|
|
42
|
+
export function estimateEchoDelaySamples(
|
|
43
|
+
near: Float32Array,
|
|
44
|
+
far: Float32Array,
|
|
45
|
+
options: EchoDelayOptions = {},
|
|
46
|
+
): EchoDelayEstimate {
|
|
47
|
+
const maxLag = Math.max(0, Math.floor(options.maxLagSamples ?? 4800));
|
|
48
|
+
const minLag = Math.max(0, Math.floor(options.minLagSamples ?? 0));
|
|
49
|
+
const n = Math.min(near.length, far.length);
|
|
50
|
+
if (n === 0 || minLag > maxLag) {
|
|
51
|
+
return { lagSamples: 0, confidence: 0 };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Per-lag normalized cross-correlation over the overlapping window. O((maxLag
|
|
55
|
+
// − minLag) · n) — fine for a short calibration burst (a few hundred ms of
|
|
56
|
+
// audio, run rarely, not per-frame).
|
|
57
|
+
let bestLag = minLag;
|
|
58
|
+
let bestCorr = -Infinity;
|
|
59
|
+
for (let lag = minLag; lag <= maxLag; lag++) {
|
|
60
|
+
let dot = 0;
|
|
61
|
+
let nearEnergy = 0;
|
|
62
|
+
let farEnergy = 0;
|
|
63
|
+
for (let i = lag; i < n; i++) {
|
|
64
|
+
const a = near[i];
|
|
65
|
+
const b = far[i - lag];
|
|
66
|
+
dot += a * b;
|
|
67
|
+
nearEnergy += a * a;
|
|
68
|
+
farEnergy += b * b;
|
|
69
|
+
}
|
|
70
|
+
const denom = Math.sqrt(nearEnergy * farEnergy);
|
|
71
|
+
const corr = denom > 0 ? dot / denom : 0;
|
|
72
|
+
if (corr > bestCorr) {
|
|
73
|
+
bestCorr = corr;
|
|
74
|
+
bestLag = lag;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
lagSamples: bestLag,
|
|
80
|
+
confidence: bestCorr === -Infinity ? 0 : Math.max(0, Math.min(1, bestCorr)),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Per-platform SEED playback→mic delay, in milliseconds. This is the initial
|
|
86
|
+
* pre-alignment applied *before* any echo has been observed; the adaptive
|
|
87
|
+
* {@link estimateEchoDelaySamples} cross-correlation refines it at runtime once
|
|
88
|
+
* enough playback-active audio is seen. Until then a platform-appropriate seed
|
|
89
|
+
* converges faster than starting from zero — most visibly on iOS/macOS, where
|
|
90
|
+
* the CoreAudio / AVAudioEngine transport delay is small but non-zero and a
|
|
91
|
+
* 0-sample seed leaves the first barge-in's echo un-aligned.
|
|
92
|
+
*
|
|
93
|
+
* These are conservative starting points (they still benefit from per-device
|
|
94
|
+
* tuning); the goal is only to put the adaptive filter in the right ballpark on
|
|
95
|
+
* the first turn, not to be exact.
|
|
96
|
+
*/
|
|
97
|
+
export const PLATFORM_PLAYBACK_DELAY_DEFAULTS: Readonly<
|
|
98
|
+
Record<string, number>
|
|
99
|
+
> = {
|
|
100
|
+
/** macOS CoreAudio — low, stable hardware path. */
|
|
101
|
+
darwin: 20,
|
|
102
|
+
/** iOS AVAudioEngine (when its voice-processing IO AEC is not the source). */
|
|
103
|
+
ios: 25,
|
|
104
|
+
/** Android AudioTrack/AudioRecord — variable; a mid seed. */
|
|
105
|
+
android: 45,
|
|
106
|
+
/** Windows WASAPI shared-mode. */
|
|
107
|
+
win32: 30,
|
|
108
|
+
/** Desktop Linux ALSA/PulseAudio/PipeWire. */
|
|
109
|
+
linux: 30,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/** Fallback seed (ms) for an unrecognized platform id. */
|
|
113
|
+
export const DEFAULT_PLAYBACK_DELAY_MS = 25;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Seed playback→mic delay in milliseconds for a platform id (e.g.
|
|
117
|
+
* `process.platform`, or the `"ios"` / `"android"` ids the mobile shells
|
|
118
|
+
* report). Unknown ids fall back to {@link DEFAULT_PLAYBACK_DELAY_MS}.
|
|
119
|
+
*/
|
|
120
|
+
export function platformPlaybackDelayMs(platform: string): number {
|
|
121
|
+
return (
|
|
122
|
+
PLATFORM_PLAYBACK_DELAY_DEFAULTS[platform] ?? DEFAULT_PLAYBACK_DELAY_MS
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Seed playback→mic delay in samples for a platform id. `sampleRate` defaults to
|
|
128
|
+
* the 16 kHz voice-pipeline rate.
|
|
129
|
+
*/
|
|
130
|
+
export function platformPlaybackDelaySamples(
|
|
131
|
+
platform: string,
|
|
132
|
+
sampleRate = 16_000,
|
|
133
|
+
): number {
|
|
134
|
+
return Math.round((platformPlaybackDelayMs(platform) / 1000) * sampleRate);
|
|
135
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { computeErle } from "./echo-metrics";
|
|
3
|
+
|
|
4
|
+
describe("computeErle", () => {
|
|
5
|
+
it("returns dB and handles edge cases", () => {
|
|
6
|
+
const near = new Float32Array([1, 1, 1, 1]);
|
|
7
|
+
const halfResidual = new Float32Array([0.5, 0.5, 0.5, 0.5]);
|
|
8
|
+
|
|
9
|
+
expect(computeErle(near, halfResidual)).toBeCloseTo(6.0206, 2);
|
|
10
|
+
expect(
|
|
11
|
+
computeErle(new Float32Array([0, 0]), new Float32Array([1, 1])),
|
|
12
|
+
).toBe(0);
|
|
13
|
+
expect(
|
|
14
|
+
computeErle(new Float32Array([1, 1]), new Float32Array([0, 0])),
|
|
15
|
+
).toBe(Number.POSITIVE_INFINITY);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Echo-return-loss-enhancement in dB: 10*log10(sum(near^2) / sum(residual^2)).
|
|
3
|
+
* Higher is better. Returns +Infinity when the residual is silent and 0 when
|
|
4
|
+
* there is no near-end energy to enhance.
|
|
5
|
+
*/
|
|
6
|
+
export function computeErle(
|
|
7
|
+
nearEnd: Float32Array,
|
|
8
|
+
residual: Float32Array,
|
|
9
|
+
): number {
|
|
10
|
+
let nearEnergy = 0;
|
|
11
|
+
let residualEnergy = 0;
|
|
12
|
+
const len = Math.min(nearEnd.length, residual.length);
|
|
13
|
+
for (let i = 0; i < len; i++) {
|
|
14
|
+
nearEnergy += nearEnd[i] * nearEnd[i];
|
|
15
|
+
residualEnergy += residual[i] * residual[i];
|
|
16
|
+
}
|
|
17
|
+
if (nearEnergy === 0) return 0;
|
|
18
|
+
if (residualEnergy === 0) return Number.POSITIVE_INFINITY;
|
|
19
|
+
return 10 * Math.log10(nearEnergy / residualEnergy);
|
|
20
|
+
}
|