@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.3-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/actions/generate-media.d.ts +59 -0
- package/dist/actions/generate-media.d.ts.map +1 -0
- package/dist/actions/identify-speaker.d.ts +23 -0
- package/dist/actions/identify-speaker.d.ts.map +1 -0
- package/dist/actions/transcription-control.d.ts +29 -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 +8 -37
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38979 -430
- package/dist/index.js.map +217 -0
- package/dist/local-inference-routes.d.ts +47 -0
- package/dist/local-inference-routes.d.ts.map +1 -0
- package/dist/provider.d.ts +21 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/routes/compat-helpers.d.ts +18 -0
- package/dist/routes/compat-helpers.d.ts.map +1 -0
- package/dist/routes/family-member-route.d.ts +62 -0
- package/dist/routes/family-member-route.d.ts.map +1 -0
- package/dist/routes/index.d.ts +20 -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/dist/routes/live-diarization-route.d.ts +33 -0
- package/dist/routes/live-diarization-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-route.d.ts +4 -0
- package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts +20 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/dist/routes/local-inference-compat-routes.d.ts +16 -0
- package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/dist/routes/local-inference-tts-route.d.ts +7 -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 +15 -0
- package/dist/routes/transcript-audio-store.d.ts.map +1 -0
- package/dist/routes/transcripts-routes.d.ts +44 -0
- package/dist/routes/transcripts-routes.d.ts.map +1 -0
- package/dist/routes/voice-first-run-routes.d.ts +62 -0
- package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
- package/dist/routes/voice-models-routes.d.ts +62 -0
- package/dist/routes/voice-models-routes.d.ts.map +1 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts +19 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/dist/routes/voice-profiles-management-routes.d.ts +52 -0
- package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts +57 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/dist/runtime/embedding-manager-support.d.ts +77 -0
- package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
- package/dist/runtime/embedding-presets.d.ts +16 -0
- package/dist/runtime/embedding-presets.d.ts.map +1 -0
- package/dist/runtime/embedding-warmup-policy.d.ts +14 -0
- package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts +70 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +15 -0
- 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/dist/runtime/voice-entity-binding.d.ts +113 -0
- package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
- package/dist/services/active-model.d.ts +310 -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/dist/services/assignments.d.ts +84 -0
- 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/dist/services/backend.d.ts +440 -0
- package/dist/services/backend.d.ts.map +1 -0
- package/dist/services/bionic-host-loader.d.ts +67 -0
- package/dist/services/bionic-host-loader.d.ts.map +1 -0
- package/dist/services/bundled-models.d.ts +34 -0
- package/dist/services/bundled-models.d.ts.map +1 -0
- package/dist/services/cache-bridge.d.ts +206 -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 +109 -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 +102 -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 +142 -0
- package/dist/services/conversation-registry.d.ts.map +1 -0
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts +111 -0
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/dist/services/device-bridge.d.ts +188 -0
- package/dist/services/device-bridge.d.ts.map +1 -0
- package/dist/services/device-resource-metrics.d.ts +149 -0
- package/dist/services/device-resource-metrics.d.ts.map +1 -0
- package/dist/services/device-tier.d.ts +133 -0
- package/dist/services/device-tier.d.ts.map +1 -0
- package/dist/services/downloader.d.ts +94 -0
- package/dist/services/downloader.d.ts.map +1 -0
- package/dist/services/engine.d.ts +579 -0
- 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 +17 -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/dist/services/ffi-streaming-backend.d.ts +201 -0
- package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
- package/dist/services/ffi-streaming-runner.d.ts +146 -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 +56 -0
- package/dist/services/gpu-detect.d.ts.map +1 -0
- package/dist/services/handler-registry.d.ts +72 -0
- package/dist/services/handler-registry.d.ts.map +1 -0
- package/dist/services/hardware.d.ts +63 -0
- package/dist/services/hardware.d.ts.map +1 -0
- package/dist/services/image-description-runtime.d.ts +14 -0
- package/dist/services/image-description-runtime.d.ts.map +1 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts +134 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/backend-selector.d.ts +118 -0
- package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts +105 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/errors.d.ts +16 -0
- package/dist/services/imagegen/errors.d.ts.map +1 -0
- package/dist/services/imagegen/index.d.ts +58 -0
- package/dist/services/imagegen/index.d.ts.map +1 -0
- package/dist/services/imagegen/mflux.d.ts +74 -0
- package/dist/services/imagegen/mflux.d.ts.map +1 -0
- package/dist/services/imagegen/sd-cpp.d.ts +181 -0
- package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts +83 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/types.d.ts +181 -0
- package/dist/services/imagegen/types.d.ts.map +1 -0
- package/dist/services/index.d.ts +31 -0
- 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 +132 -0
- package/dist/services/inference-capabilities.d.ts.map +1 -0
- package/dist/services/inference-telemetry.d.ts +59 -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 +189 -0
- package/dist/services/kv-spill.d.ts.map +1 -0
- package/dist/services/latency-trace.d.ts +346 -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 +96 -0
- package/dist/services/llm-streaming-binding.d.ts.map +1 -0
- package/dist/services/load-args.d.ts +82 -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/dist/services/manifest/schema.d.ts +903 -0
- package/dist/services/manifest/schema.d.ts.map +1 -0
- package/dist/services/manifest/types.d.ts +32 -0
- package/dist/services/manifest/types.d.ts.map +1 -0
- package/dist/services/manifest/validator.d.ts +66 -0
- package/dist/services/manifest/validator.d.ts.map +1 -0
- package/dist/services/memory-arbiter.d.ts +348 -0
- 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/dist/services/memory-monitor.d.ts +128 -0
- package/dist/services/memory-monitor.d.ts.map +1 -0
- package/dist/services/memory-pressure.d.ts +130 -0
- package/dist/services/memory-pressure.d.ts.map +1 -0
- package/dist/services/mtp-doctor.d.ts +13 -0
- package/dist/services/mtp-doctor.d.ts.map +1 -0
- package/dist/services/network-policy.d.ts +127 -0
- package/dist/services/network-policy.d.ts.map +1 -0
- package/dist/services/paths.d.ts +6 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/planner-skeleton.d.ts +124 -0
- package/dist/services/planner-skeleton.d.ts.map +1 -0
- package/dist/services/providers.d.ts +38 -0
- package/dist/services/providers.d.ts.map +1 -0
- package/dist/services/ram-budget.d.ts +110 -0
- package/dist/services/ram-budget.d.ts.map +1 -0
- package/dist/services/readiness.d.ts +9 -0
- package/dist/services/readiness.d.ts.map +1 -0
- package/dist/services/recommendation.d.ts +111 -0
- package/dist/services/recommendation.d.ts.map +1 -0
- package/dist/services/registry.d.ts +33 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/router-handler.d.ts +92 -0
- package/dist/services/router-handler.d.ts.map +1 -0
- package/dist/services/routing-policy.d.ts +92 -0
- package/dist/services/routing-policy.d.ts.map +1 -0
- package/dist/services/routing-preferences.d.ts +8 -0
- package/dist/services/routing-preferences.d.ts.map +1 -0
- package/dist/services/runtime-target.d.ts +98 -0
- package/dist/services/runtime-target.d.ts.map +1 -0
- package/dist/services/service.d.ts +128 -0
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/session-pool.d.ts +72 -0
- package/dist/services/session-pool.d.ts.map +1 -0
- package/dist/services/structured-output/deterministic-repair.d.ts +23 -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 +311 -0
- package/dist/services/structured-output.d.ts.map +1 -0
- package/dist/services/system-memory.d.ts +33 -0
- package/dist/services/system-memory.d.ts.map +1 -0
- package/dist/services/types.d.ts +19 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/verify-on-device.d.ts +34 -0
- package/dist/services/verify-on-device.d.ts.map +1 -0
- package/dist/services/verify.d.ts +8 -0
- package/dist/services/verify.d.ts.map +1 -0
- package/dist/services/vision/aosp-unavailable.d.ts +115 -0
- package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/vision/capacitor-llama.d.ts +99 -0
- package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
- package/dist/services/vision/cloud-fallback.d.ts +47 -0
- package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
- package/dist/services/vision/hash.d.ts +71 -0
- package/dist/services/vision/hash.d.ts.map +1 -0
- package/dist/services/vision/index.d.ts +95 -0
- package/dist/services/vision/index.d.ts.map +1 -0
- package/dist/services/vision/llama-server.d.ts +73 -0
- package/dist/services/vision/llama-server.d.ts.map +1 -0
- package/dist/services/vision/types.d.ts +162 -0
- package/dist/services/vision/types.d.ts.map +1 -0
- package/dist/services/vision/vast-fallback.d.ts +18 -0
- package/dist/services/vision/vast-fallback.d.ts.map +1 -0
- package/dist/services/vision-embedding-cache.d.ts +98 -0
- 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/dist/services/voice/audio-frame-consumer.d.ts +294 -0
- package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/dist/services/voice/barge-in.d.ts +112 -0
- package/dist/services/voice/barge-in.d.ts.map +1 -0
- package/dist/services/voice/cancellation-coordinator.d.ts +127 -0
- package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-manager.d.ts +199 -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 +170 -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/dist/services/voice/eliza1-eot-scorer.d.ts +124 -0
- 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/dist/services/voice/embedding.d.ts +132 -0
- package/dist/services/voice/embedding.d.ts.map +1 -0
- package/dist/services/voice/emotion-attribution.d.ts +68 -0
- package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
- package/dist/services/voice/engine-bridge.d.ts +762 -0
- package/dist/services/voice/engine-bridge.d.ts.map +1 -0
- package/dist/services/voice/eot-classifier-ggml.d.ts +179 -0
- package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/dist/services/voice/eot-classifier.d.ts +211 -0
- package/dist/services/voice/eot-classifier.d.ts.map +1 -0
- package/dist/services/voice/errors.d.ts +20 -0
- package/dist/services/voice/errors.d.ts.map +1 -0
- package/dist/services/voice/expressive-tags.d.ts +158 -0
- package/dist/services/voice/expressive-tags.d.ts.map +1 -0
- package/dist/services/voice/ffi-bindings.d.ts +696 -0
- package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
- package/dist/services/voice/first-line-cache.d.ts +181 -0
- package/dist/services/voice/first-line-cache.d.ts.map +1 -0
- package/dist/services/voice/fused-eot-scorer.d.ts +51 -0
- package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/dist/services/voice/index.d.ts +96 -0
- 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/dist/services/voice/kokoro/kokoro-backend.d.ts +87 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-runtime.d.ts +100 -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 +50 -0
- package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/dist/services/voice/kokoro/pick-runtime.d.ts +61 -0
- 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 +82 -0
- package/dist/services/voice/kokoro/types.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts +23 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voices.d.ts +30 -0
- package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
- package/dist/services/voice/lifecycle.d.ts +135 -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/dist/services/voice/mic-source.d.ts +136 -0
- 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 +109 -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/dist/services/voice/partial-stabilizer.d.ts +73 -0
- package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts +49 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/dist/services/voice/phrase-cache.d.ts +76 -0
- package/dist/services/voice/phrase-cache.d.ts.map +1 -0
- package/dist/services/voice/phrase-chunker.d.ts +62 -0
- package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
- package/dist/services/voice/pipeline-impls.d.ts +151 -0
- package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
- package/dist/services/voice/pipeline.d.ts +216 -0
- package/dist/services/voice/pipeline.d.ts.map +1 -0
- package/dist/services/voice/prefill-client.d.ts +123 -0
- package/dist/services/voice/prefill-client.d.ts.map +1 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts +113 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/dist/services/voice/profile-store.d.ts +248 -0
- package/dist/services/voice/profile-store.d.ts.map +1 -0
- package/dist/services/voice/ring-buffer.d.ts +40 -0
- package/dist/services/voice/ring-buffer.d.ts.map +1 -0
- package/dist/services/voice/rollback-queue.d.ts +24 -0
- package/dist/services/voice/rollback-queue.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts +67 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts +87 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/dist/services/voice/scheduler.d.ts +146 -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/dist/services/voice/shared-resources.d.ts +204 -0
- package/dist/services/voice/shared-resources.d.ts.map +1 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts +74 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts +59 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer.d.ts +75 -0
- package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts +60 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts +33 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder.d.ts +37 -0
- package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
- package/dist/services/voice/speaker-imprint.d.ts +83 -0
- package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
- package/dist/services/voice/speaker-preset-cache.d.ts +77 -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 +73 -0
- package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
- package/dist/services/voice/transcriber.d.ts +244 -0
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcript-knowledge.d.ts +37 -0
- package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/dist/services/voice/transcript-service.d.ts +60 -0
- package/dist/services/voice/transcript-service.d.ts.map +1 -0
- package/dist/services/voice/transcript-store.d.ts +64 -0
- package/dist/services/voice/transcript-store.d.ts.map +1 -0
- package/dist/services/voice/turn-controller.d.ts +183 -0
- package/dist/services/voice/turn-controller.d.ts.map +1 -0
- package/dist/services/voice/types.d.ts +643 -0
- package/dist/services/voice/types.d.ts.map +1 -0
- package/dist/services/voice/vad.d.ts +283 -0
- package/dist/services/voice/vad.d.ts.map +1 -0
- package/dist/services/voice/voice-budget.d.ts +241 -0
- package/dist/services/voice/voice-budget.d.ts.map +1 -0
- package/dist/services/voice/voice-emotion-classifier.d.ts +95 -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/dist/services/voice/voice-preset-format.d.ts +158 -0
- package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-artifact.d.ts +116 -0
- package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-routes.d.ts +83 -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 +364 -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/dist/services/voice/wake-word-ggml.d.ts +100 -0
- package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/dist/services/voice/wake-word.d.ts +255 -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 +70 -0
- package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/dist/services/voice-model-updater.d.ts +240 -0
- package/dist/services/voice-model-updater.d.ts.map +1 -0
- package/dist/services/voice-prewarm.d.ts +3 -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 +101 -15
- package/registry-entry.json +137 -0
- package/src/actions/generate-media.ts +647 -0
- package/src/actions/identify-speaker.ts +171 -0
- package/src/actions/transcription-control.test.ts +100 -0
- package/src/actions/transcription-control.ts +127 -0
- package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
- package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
- package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
- package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
- package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
- package/src/adapters/capacitor-llama/environment.ts +71 -0
- package/src/adapters/capacitor-llama/index.browser.ts +83 -0
- package/src/adapters/capacitor-llama/index.ts +831 -0
- package/src/adapters/capacitor-llama/loader.ts +109 -0
- package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
- package/src/adapters/capacitor-llama/structured-output.ts +165 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
- package/src/adapters/capacitor-llama/types.ts +374 -0
- package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
- package/src/backends/apple-foundation.ts +127 -0
- package/src/index.ts +62 -0
- package/src/local-inference-routes.test.ts +390 -0
- package/src/local-inference-routes.ts +1625 -0
- package/src/provider.ts +1111 -0
- package/src/routes/compat-helpers.ts +275 -0
- package/src/routes/family-member-route.ts +353 -0
- package/src/routes/index.ts +61 -0
- package/src/routes/live-diarization-route.test.ts +347 -0
- package/src/routes/live-diarization-route.ts +198 -0
- package/src/routes/local-inference-asr-route.test.ts +246 -0
- package/src/routes/local-inference-asr-route.ts +166 -0
- package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
- package/src/routes/local-inference-asr-transcribe.ts +97 -0
- package/src/routes/local-inference-compat-routes.test.ts +485 -0
- package/src/routes/local-inference-compat-routes.ts +775 -0
- package/src/routes/local-inference-tts-route.test.ts +179 -0
- package/src/routes/local-inference-tts-route.ts +230 -0
- package/src/routes/native-pcm-turn-route.test.ts +136 -0
- package/src/routes/native-pcm-turn-route.ts +121 -0
- package/src/routes/transcript-audio-store.ts +27 -0
- package/src/routes/transcripts-routes.test.ts +195 -0
- package/src/routes/transcripts-routes.ts +191 -0
- package/src/routes/voice-first-run-routes.ts +524 -0
- package/src/routes/voice-models-routes.ts +554 -0
- package/src/routes/voice-profile-plugin-routes.ts +138 -0
- package/src/routes/voice-profiles-management-routes.ts +476 -0
- package/src/routes/voice-speaker-profile-routes.ts +199 -0
- package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
- package/src/runtime/bionic-wire-encoding.test.ts +147 -0
- package/src/runtime/capacitor-llama.d.ts +25 -0
- package/src/runtime/embedding-manager-support.ts +497 -0
- package/src/runtime/embedding-presets.ts +81 -0
- package/src/runtime/embedding-warmup-policy.test.ts +53 -0
- package/src/runtime/embedding-warmup-policy.ts +48 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +726 -0
- package/src/runtime/ensure-local-inference-handler.ts +1640 -0
- package/src/runtime/index.ts +36 -0
- package/src/runtime/mobile-local-inference-gate.test.ts +152 -0
- package/src/runtime/mobile-local-inference-gate.ts +99 -0
- package/src/runtime/voice-entity-binding.transcript.test.ts +98 -0
- package/src/runtime/voice-entity-binding.ts +368 -0
- package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
- package/src/services/README.md +71 -0
- package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
- package/src/services/__tests__/backend-selector.test.ts +101 -0
- package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
- package/src/services/__tests__/gpu-autotune.test.ts +400 -0
- package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
- package/src/services/__tests__/planner-grammar.test.ts +372 -0
- package/src/services/__tests__/runtime-target.test.ts +176 -0
- package/src/services/active-model-context-fit.test.ts +125 -0
- package/src/services/active-model-switch-rollback.test.ts +183 -0
- package/src/services/active-model.ts +1416 -0
- package/src/services/asr-provenance.ts +68 -0
- package/src/services/assignment-validation.test.ts +118 -0
- package/src/services/assignments.test.ts +106 -0
- package/src/services/assignments.ts +278 -0
- package/src/services/backend-selector.ts +95 -0
- package/src/services/backend.test.ts +84 -0
- package/src/services/backend.ts +791 -0
- package/src/services/bionic-host-loader.test.ts +226 -0
- package/src/services/bionic-host-loader.ts +252 -0
- package/src/services/bundled-models.ts +129 -0
- package/src/services/cache-bridge.test.ts +516 -0
- package/src/services/cache-bridge.ts +423 -0
- package/src/services/catalog.test.ts +259 -0
- package/src/services/catalog.ts +33 -0
- package/src/services/checkpoint-client.ts +258 -0
- package/src/services/checkpoint-manager.ts +474 -0
- package/src/services/cloud-fallback.ts +230 -0
- package/src/services/context-fit.test.ts +121 -0
- package/src/services/context-fit.ts +113 -0
- package/src/services/conversation-registry.test.ts +235 -0
- package/src/services/conversation-registry.ts +264 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +431 -0
- package/src/services/device-bridge.ts +1237 -0
- package/src/services/device-resource-metrics.test.ts +98 -0
- package/src/services/device-resource-metrics.ts +346 -0
- package/src/services/device-tier.test.ts +458 -0
- package/src/services/device-tier.ts +502 -0
- package/src/services/downloader.test.ts +888 -0
- package/src/services/downloader.ts +1039 -0
- package/src/services/engine-direct-bundle.test.ts +90 -0
- package/src/services/engine-streaming.test.ts +80 -0
- package/src/services/engine.ts +2096 -0
- package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
- package/src/services/ensure-local-artifacts.test.ts +368 -0
- package/src/services/ensure-local-artifacts.ts +351 -0
- package/src/services/external-scanner.ts +312 -0
- package/src/services/ffi-llm-mock.ts +354 -0
- package/src/services/ffi-llm-streaming-abi.ts +445 -0
- package/src/services/ffi-streaming-backend.ts +418 -0
- package/src/services/ffi-streaming-runner.test.ts +220 -0
- package/src/services/ffi-streaming-runner.ts +407 -0
- package/src/services/ffi-unload-ordering.test.ts +166 -0
- package/src/services/fused-eliza1-no-regression.test.ts +144 -0
- package/src/services/gpu-autotune.ts +534 -0
- package/src/services/gpu-detect.ts +139 -0
- package/src/services/handler-registry.ts +240 -0
- package/src/services/hardware.test.ts +236 -0
- package/src/services/hardware.ts +438 -0
- package/src/services/image-description-runtime.test.ts +61 -0
- package/src/services/image-description-runtime.ts +118 -0
- package/src/services/imagegen/aosp-unavailable.ts +229 -0
- package/src/services/imagegen/backend-selector.test.ts +190 -0
- package/src/services/imagegen/backend-selector.ts +277 -0
- package/src/services/imagegen/coreml-unavailable.ts +237 -0
- package/src/services/imagegen/errors.ts +40 -0
- package/src/services/imagegen/index.ts +144 -0
- package/src/services/imagegen/mflux.ts +313 -0
- package/src/services/imagegen/sd-cpp.ts +715 -0
- package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
- package/src/services/imagegen/types.ts +193 -0
- package/src/services/index.ts +229 -0
- package/src/services/inference-capabilities.test.ts +75 -0
- package/src/services/inference-capabilities.ts +204 -0
- package/src/services/inference-telemetry.ts +143 -0
- package/src/services/ios-llama-streaming.ts +248 -0
- package/src/services/kv-spill.test.ts +222 -0
- package/src/services/kv-spill.ts +357 -0
- package/src/services/latency-trace.test.ts +266 -0
- package/src/services/latency-trace.ts +844 -0
- 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/llama-server-metrics.ts +304 -0
- package/src/services/llm-streaming-binding.ts +136 -0
- package/src/services/load-args.ts +81 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +790 -0
- package/src/services/manifest/index.ts +72 -0
- package/src/services/manifest/manifest.test.ts +791 -0
- package/src/services/manifest/schema.ts +761 -0
- package/src/services/manifest/types.ts +61 -0
- package/src/services/manifest/validator.ts +633 -0
- package/src/services/memory-arbiter.test.ts +558 -0
- package/src/services/memory-arbiter.ts +991 -0
- package/src/services/memory-benchmark.test.ts +91 -0
- package/src/services/memory-benchmark.ts +354 -0
- package/src/services/memory-monitor.test.ts +232 -0
- package/src/services/memory-monitor.ts +309 -0
- package/src/services/memory-pressure.ts +414 -0
- package/src/services/mtp-doctor.ts +86 -0
- package/src/services/network-policy.ts +346 -0
- package/src/services/paths.ts +25 -0
- package/src/services/planner-skeleton.ts +175 -0
- package/src/services/providers.ts +507 -0
- package/src/services/ram-budget-cache.test.ts +164 -0
- package/src/services/ram-budget.ts +309 -0
- package/src/services/readiness.test.ts +87 -0
- package/src/services/readiness.ts +238 -0
- package/src/services/recommendation.test.ts +216 -0
- package/src/services/recommendation.ts +671 -0
- package/src/services/registry.ts +157 -0
- package/src/services/required-kernels-gate.test.ts +64 -0
- package/src/services/router-handler.test.ts +45 -0
- package/src/services/router-handler.ts +426 -0
- package/src/services/routing-policy.test.ts +352 -0
- package/src/services/routing-policy.ts +367 -0
- package/src/services/routing-preferences.ts +17 -0
- package/src/services/runtime-target.ts +154 -0
- package/src/services/service.test.ts +223 -0
- package/src/services/service.ts +750 -0
- package/src/services/session-pool.ts +153 -0
- package/src/services/structured-output/deterministic-repair.test.ts +169 -0
- package/src/services/structured-output/deterministic-repair.ts +443 -0
- package/src/services/structured-output/index.ts +4 -0
- package/src/services/structured-output.test.ts +483 -0
- package/src/services/structured-output.ts +712 -0
- package/src/services/system-memory.test.ts +47 -0
- package/src/services/system-memory.ts +67 -0
- package/src/services/transcription-priority.test.ts +211 -0
- package/src/services/types.ts +59 -0
- package/src/services/verify-on-device.test.ts +87 -0
- package/src/services/verify-on-device.ts +127 -0
- package/src/services/verify.ts +13 -0
- package/src/services/vision/aosp-unavailable.ts +163 -0
- package/src/services/vision/capacitor-llama.ts +255 -0
- package/src/services/vision/cloud-fallback.test.ts +243 -0
- package/src/services/vision/cloud-fallback.ts +268 -0
- package/src/services/vision/fallback-chain.test.ts +86 -0
- package/src/services/vision/hash.ts +157 -0
- package/src/services/vision/index.ts +251 -0
- package/src/services/vision/llama-server.ts +177 -0
- package/src/services/vision/types.ts +163 -0
- package/src/services/vision/vast-fallback.ts +127 -0
- package/src/services/vision-embedding-cache.ts +189 -0
- package/src/services/voice/VOICE_WORKBENCH.md +133 -0
- package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
- package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +194 -0
- package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
- package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
- package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
- package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
- package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
- package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
- package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
- package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
- package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
- package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
- package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
- package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
- 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 +139 -0
- package/src/services/voice/audio-frame-consumer.test.ts +669 -0
- package/src/services/voice/audio-frame-consumer.ts +651 -0
- package/src/services/voice/barge-in.test.ts +244 -0
- package/src/services/voice/barge-in.ts +335 -0
- package/src/services/voice/cancellation-coordinator.test.ts +196 -0
- package/src/services/voice/cancellation-coordinator.ts +269 -0
- package/src/services/voice/checkpoint-manager.ts +401 -0
- package/src/services/voice/checkpoint-policy.ts +336 -0
- package/src/services/voice/composite-eot-classifier.test.ts +59 -0
- 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 +182 -0
- package/src/services/voice/e2e-harness.ts +902 -0
- package/src/services/voice/eager-context-builder.ts +262 -0
- 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 +242 -0
- package/src/services/voice/embedding-server.ts +200 -0
- package/src/services/voice/embedding.test.ts +131 -0
- package/src/services/voice/embedding.ts +242 -0
- package/src/services/voice/emotion-attribution.test.ts +129 -0
- package/src/services/voice/emotion-attribution.ts +361 -0
- package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
- package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
- package/src/services/voice/engine-bridge.test.ts +384 -0
- package/src/services/voice/engine-bridge.ts +2343 -0
- package/src/services/voice/eot-classifier-ggml.ts +569 -0
- package/src/services/voice/eot-classifier.test.ts +98 -0
- package/src/services/voice/eot-classifier.ts +422 -0
- package/src/services/voice/errors.ts +34 -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 +405 -0
- package/src/services/voice/ffi-bindings.test.ts +735 -0
- package/src/services/voice/ffi-bindings.ts +3387 -0
- package/src/services/voice/first-line-cache.ts +725 -0
- package/src/services/voice/fused-eot-scorer.ts +139 -0
- package/src/services/voice/index.ts +502 -0
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +262 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +236 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
- package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
- package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
- package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +67 -0
- package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
- package/src/services/voice/kokoro/index.ts +79 -0
- package/src/services/voice/kokoro/kokoro-backend.ts +223 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
- package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
- package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
- package/src/services/voice/kokoro/phonemizer.ts +344 -0
- package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
- package/src/services/voice/kokoro/pick-runtime.ts +130 -0
- package/src/services/voice/kokoro/runtime-selection.ts +64 -0
- package/src/services/voice/kokoro/types.ts +95 -0
- package/src/services/voice/kokoro/voice-presets.ts +129 -0
- package/src/services/voice/kokoro/voices.ts +64 -0
- package/src/services/voice/lifecycle.test.ts +315 -0
- package/src/services/voice/lifecycle.ts +301 -0
- package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
- package/src/services/voice/live-diarization-session.ts +622 -0
- 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.test.ts +210 -0
- package/src/services/voice/mic-source.ts +503 -0
- 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/optimistic-policy.test.ts +101 -0
- package/src/services/voice/optimistic-policy.ts +192 -0
- package/src/services/voice/optimistic-rollback.ts +343 -0
- package/src/services/voice/partial-stabilizer.test.ts +68 -0
- package/src/services/voice/partial-stabilizer.ts +140 -0
- package/src/services/voice/phoneme-tokenizer.ts +158 -0
- package/src/services/voice/phrase-cache.test.ts +242 -0
- package/src/services/voice/phrase-cache.ts +186 -0
- package/src/services/voice/phrase-chunker.test.ts +239 -0
- package/src/services/voice/phrase-chunker.ts +281 -0
- package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
- package/src/services/voice/pipeline-impls.test.ts +292 -0
- package/src/services/voice/pipeline-impls.ts +315 -0
- package/src/services/voice/pipeline.ts +504 -0
- package/src/services/voice/prefill-client.ts +316 -0
- package/src/services/voice/prefix-preserving-queue.ts +162 -0
- package/src/services/voice/profile-store.ts +887 -0
- package/src/services/voice/real-audio-decode.test.ts +148 -0
- 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/ring-buffer.test.ts +129 -0
- package/src/services/voice/ring-buffer.ts +123 -0
- package/src/services/voice/rollback-queue.ts +74 -0
- package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
- package/src/services/voice/samantha-preset-placeholder.ts +148 -0
- package/src/services/voice/samantha-preset-regenerator.ts +393 -0
- package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
- package/src/services/voice/scheduler.t2.test.ts +141 -0
- package/src/services/voice/scheduler.ts +927 -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 +343 -0
- package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +449 -0
- package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
- package/src/services/voice/speaker/diarizer-fused.ts +154 -0
- package/src/services/voice/speaker/diarizer.ts +218 -0
- package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
- package/src/services/voice/speaker/encoder-fused.ts +138 -0
- package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
- package/src/services/voice/speaker/encoder-ggml.ts +79 -0
- package/src/services/voice/speaker/encoder.ts +105 -0
- package/src/services/voice/speaker-imprint.test.ts +185 -0
- package/src/services/voice/speaker-imprint.ts +312 -0
- package/src/services/voice/speaker-preset-cache.test.ts +154 -0
- package/src/services/voice/speaker-preset-cache.ts +195 -0
- package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
- package/src/services/voice/system-audio-sink.test.ts +29 -0
- package/src/services/voice/system-audio-sink.ts +366 -0
- package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
- package/src/services/voice/transcriber.test.ts +392 -0
- package/src/services/voice/transcriber.ts +704 -0
- package/src/services/voice/transcript-knowledge.test.ts +68 -0
- package/src/services/voice/transcript-knowledge.ts +75 -0
- package/src/services/voice/transcript-service.test.ts +195 -0
- package/src/services/voice/transcript-service.ts +205 -0
- package/src/services/voice/transcript-store.test.ts +189 -0
- package/src/services/voice/transcript-store.ts +164 -0
- package/src/services/voice/turn-controller.test.ts +575 -0
- package/src/services/voice/turn-controller.ts +596 -0
- package/src/services/voice/types.ts +699 -0
- package/src/services/voice/vad.test.ts +498 -0
- package/src/services/voice/vad.ts +832 -0
- package/src/services/voice/vad.v1-v4.test.ts +222 -0
- package/src/services/voice/voice-budget.test.ts +415 -0
- package/src/services/voice/voice-budget.ts +635 -0
- package/src/services/voice/voice-duet.test.ts +375 -0
- package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
- package/src/services/voice/voice-emotion-classifier.ts +273 -0
- 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 +713 -0
- package/src/services/voice/voice-preset-generator.test.ts +89 -0
- package/src/services/voice/voice-profile-artifact.test.ts +138 -0
- package/src/services/voice/voice-profile-artifact.ts +518 -0
- package/src/services/voice/voice-profile-routes.test.ts +429 -0
- package/src/services/voice/voice-profile-routes.ts +425 -0
- package/src/services/voice/voice-scenario.test.ts +159 -0
- package/src/services/voice/voice-scenario.ts +280 -0
- package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
- package/src/services/voice/voice-state-machine.ts +727 -0
- package/src/services/voice/voice-workbench-report.test.ts +168 -0
- package/src/services/voice/voice-workbench-report.ts +367 -0
- package/src/services/voice/voice-workbench.test.ts +158 -0
- package/src/services/voice/voice.test.ts +1070 -0
- package/src/services/voice/wake-word-ggml.ts +319 -0
- package/src/services/voice/wake-word.test.ts +298 -0
- package/src/services/voice/wake-word.ts +554 -0
- 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/wrap-with-first-line-cache.ts +267 -0
- package/src/services/voice-model-updater.ts +724 -0
- package/src/services/voice-prewarm.ts +51 -0
- package/src/voice-workbench.ts +71 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eager provider context split (C3).
|
|
3
|
+
*
|
|
4
|
+
* Splits provider context assembly into two parts so KV prefill can begin
|
|
5
|
+
* on speech-START — before ASR has produced a transcript:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Deterministic part** — doesn't depend on the user's message text:
|
|
8
|
+
* system prompt, persona, enabled skills list, conversation history
|
|
9
|
+
* up to the last turn, tool definitions.
|
|
10
|
+
* Built on `speech-start` (fire-and-forget via `prebuildDeterministic`).
|
|
11
|
+
*
|
|
12
|
+
* 2. **Message-dependent part** — depends on the actual transcript:
|
|
13
|
+
* the user's message itself, any message-conditional context injected
|
|
14
|
+
* by callers (e.g. relevant calendar/contacts snippets).
|
|
15
|
+
* Built on `speech-end` via `complete(userMessage)`.
|
|
16
|
+
*
|
|
17
|
+
* The codebase routes context through elizaOS's provider pipeline rather than
|
|
18
|
+
* a single `buildContext` call. `EagerContextBuilder` adapts to that model by
|
|
19
|
+
* accepting two async factory functions: one for the deterministic part
|
|
20
|
+
* (returns a `ContextPartial`) and one for the message-dependent part
|
|
21
|
+
* (receives the user message, returns a `ContextPartial`). `mergeContext`
|
|
22
|
+
* combines them in a consistent order so downstream consumers always see
|
|
23
|
+
* `[deterministic parts] + [message-dependent parts]`.
|
|
24
|
+
*
|
|
25
|
+
* Staleness: the deterministic context is considered stale after 30 seconds
|
|
26
|
+
* (conversation history may have changed if the agent received a message from
|
|
27
|
+
* another surface). `complete()` rebuilds when stale.
|
|
28
|
+
*
|
|
29
|
+
* Thread-safety: all methods are async; do NOT call them concurrently from
|
|
30
|
+
* multiple async contexts — the class is designed for single-threaded use by
|
|
31
|
+
* the voice event loop.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Types
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A fragment of the final prompt context. Fields are intentionally generic
|
|
40
|
+
* so the same type works regardless of whether the runtime uses raw strings,
|
|
41
|
+
* token arrays, or structured message lists.
|
|
42
|
+
*
|
|
43
|
+
* In practice callers fill `systemBlocks` with things like the system prompt,
|
|
44
|
+
* enabled skills, persona, tool definitions, and `historyBlocks` with the
|
|
45
|
+
* conversation history. `mergeContext` joins them in that order.
|
|
46
|
+
*/
|
|
47
|
+
export interface ContextPartial {
|
|
48
|
+
/**
|
|
49
|
+
* Ordered list of system / pre-amble text blocks. Each element is a
|
|
50
|
+
* distinct structural unit (e.g. persona block, skills block, tool-defs
|
|
51
|
+
* block). They are joined in order during `mergeContext`.
|
|
52
|
+
*/
|
|
53
|
+
systemBlocks: string[];
|
|
54
|
+
/**
|
|
55
|
+
* Conversation history turns up to (but NOT including) the new user
|
|
56
|
+
* message. Stored as alternating `{role, content}` entries for
|
|
57
|
+
* compatibility with the elizaOS message format.
|
|
58
|
+
*/
|
|
59
|
+
historyBlocks: Array<{ role: "user" | "assistant"; content: string }>;
|
|
60
|
+
/**
|
|
61
|
+
* Free-form metadata for diagnostics / telemetry. Not included in the
|
|
62
|
+
* merged prompt text.
|
|
63
|
+
*/
|
|
64
|
+
meta?: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Complete merged context — the full prompt assembly ready for the LLM
|
|
69
|
+
* inference call. Produced by `mergeContext` from the two halves.
|
|
70
|
+
*/
|
|
71
|
+
export interface FullContext {
|
|
72
|
+
/**
|
|
73
|
+
* The fully assembled system string (deterministic blocks joined by
|
|
74
|
+
* double-newline, message-dependent blocks appended after).
|
|
75
|
+
*/
|
|
76
|
+
systemText: string;
|
|
77
|
+
/**
|
|
78
|
+
* Full conversation history including the new user message at the end.
|
|
79
|
+
*/
|
|
80
|
+
history: Array<{ role: "user" | "assistant"; content: string }>;
|
|
81
|
+
/** ISO timestamp of when the deterministic part was built. */
|
|
82
|
+
deterministicBuiltAt: string;
|
|
83
|
+
/** ISO timestamp of when `complete()` was called. */
|
|
84
|
+
completedAt: string;
|
|
85
|
+
/** True when the deterministic context was rebuilt inside `complete()` due to staleness. */
|
|
86
|
+
deterministicWasStale: boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Factory function that builds the deterministic context part. Called with no
|
|
91
|
+
* arguments (it must capture its own runtime reference if it needs one).
|
|
92
|
+
*/
|
|
93
|
+
export type BuildDeterministicFn = () => Promise<ContextPartial>;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Factory function that builds the message-dependent context part. Called with
|
|
97
|
+
* the actual user message text.
|
|
98
|
+
*/
|
|
99
|
+
export type BuildMessageDependentFn = (
|
|
100
|
+
userMessage: string,
|
|
101
|
+
) => Promise<ContextPartial>;
|
|
102
|
+
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Implementation
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
const DEFAULT_STALE_MS = 30_000;
|
|
108
|
+
|
|
109
|
+
export interface EagerContextBuilderOptions {
|
|
110
|
+
buildDeterministic: BuildDeterministicFn;
|
|
111
|
+
buildMessageDependent: BuildMessageDependentFn;
|
|
112
|
+
/**
|
|
113
|
+
* How many milliseconds before the cached deterministic context is
|
|
114
|
+
* considered stale and must be rebuilt. Default 30 000 ms.
|
|
115
|
+
*/
|
|
116
|
+
staleCutoffMs?: number;
|
|
117
|
+
/**
|
|
118
|
+
* Optional clock injection for tests. Defaults to `Date.now`.
|
|
119
|
+
*/
|
|
120
|
+
now?: () => number;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Manages eager splitting of provider context into deterministic + message-
|
|
125
|
+
* dependent halves. Wire `prebuildDeterministic` to the `speech-start` event
|
|
126
|
+
* and `complete` to the `speech-end` path (after ASR produces the final
|
|
127
|
+
* transcript).
|
|
128
|
+
*/
|
|
129
|
+
export class EagerContextBuilder {
|
|
130
|
+
private deterministic: ContextPartial | null = null;
|
|
131
|
+
private builtAt: number = 0;
|
|
132
|
+
private readonly staleCutoffMs: number;
|
|
133
|
+
private readonly buildDeterministicFn: BuildDeterministicFn;
|
|
134
|
+
private readonly buildMessageDependentFn: BuildMessageDependentFn;
|
|
135
|
+
private readonly nowFn: () => number;
|
|
136
|
+
|
|
137
|
+
/** In-flight prebuild promise — prevents concurrent duplicate prebuilds. */
|
|
138
|
+
private prebuildInFlight: Promise<void> | null = null;
|
|
139
|
+
|
|
140
|
+
constructor(opts: EagerContextBuilderOptions) {
|
|
141
|
+
this.buildDeterministicFn = opts.buildDeterministic;
|
|
142
|
+
this.buildMessageDependentFn = opts.buildMessageDependent;
|
|
143
|
+
this.staleCutoffMs = opts.staleCutoffMs ?? DEFAULT_STALE_MS;
|
|
144
|
+
this.nowFn = opts.now ?? (() => Date.now());
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Fire on `speech-start` (fire-and-forget). Builds and caches the
|
|
149
|
+
* deterministic context half so it is ready when `complete` is called.
|
|
150
|
+
*
|
|
151
|
+
* Concurrent calls are collapsed into a single in-flight build — safe to
|
|
152
|
+
* call multiple times without double-spending GPU/compute resources.
|
|
153
|
+
*/
|
|
154
|
+
prebuildDeterministic(): void {
|
|
155
|
+
if (this.prebuildInFlight) return;
|
|
156
|
+
this.prebuildInFlight = this.runPrebuild().finally(() => {
|
|
157
|
+
this.prebuildInFlight = null;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Call on `speech-end` with the actual final transcript. Returns the fully
|
|
163
|
+
* merged context.
|
|
164
|
+
*
|
|
165
|
+
* If the cached deterministic context is absent or stale it is rebuilt
|
|
166
|
+
* inline (blocking). The returned `deterministicWasStale` flag lets callers
|
|
167
|
+
* emit latency telemetry when the eager pre-build didn't complete in time.
|
|
168
|
+
*/
|
|
169
|
+
async complete(userMessage: string): Promise<FullContext> {
|
|
170
|
+
let deterministicWasStale = false;
|
|
171
|
+
// If a prebuild is in-flight, wait for it first (avoids duplicate work).
|
|
172
|
+
if (this.prebuildInFlight) {
|
|
173
|
+
await this.prebuildInFlight;
|
|
174
|
+
}
|
|
175
|
+
let det = this.deterministic;
|
|
176
|
+
if (det === null || this.isStale()) {
|
|
177
|
+
deterministicWasStale = det !== null; // null means never built; stale = was built but expired
|
|
178
|
+
await this.runPrebuild();
|
|
179
|
+
det = this.deterministic;
|
|
180
|
+
if (det === null) {
|
|
181
|
+
throw new Error(
|
|
182
|
+
"deterministic context prebuild did not produce a result",
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const msgDep = await this.buildMessageDependentFn(userMessage);
|
|
187
|
+
return mergeContext(det, msgDep, {
|
|
188
|
+
deterministicBuiltAt: new Date(this.builtAt).toISOString(),
|
|
189
|
+
completedAt: new Date(this.nowFn()).toISOString(),
|
|
190
|
+
deterministicWasStale,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Returns true if the cached deterministic context is older than
|
|
196
|
+
* `staleCutoffMs`.
|
|
197
|
+
*/
|
|
198
|
+
isStale(): boolean {
|
|
199
|
+
if (this.deterministic === null) return true;
|
|
200
|
+
return this.nowFn() - this.builtAt > this.staleCutoffMs;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Discard the cached deterministic context. Useful when the conversation
|
|
205
|
+
* is reset or the runtime is re-initialised. Thread-safe — can be called
|
|
206
|
+
* from any context.
|
|
207
|
+
*/
|
|
208
|
+
invalidate(): void {
|
|
209
|
+
this.deterministic = null;
|
|
210
|
+
this.builtAt = 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// -------------------------------------------------------------------------
|
|
214
|
+
// private
|
|
215
|
+
// -------------------------------------------------------------------------
|
|
216
|
+
|
|
217
|
+
private async runPrebuild(): Promise<void> {
|
|
218
|
+
const result = await this.buildDeterministicFn();
|
|
219
|
+
this.deterministic = result;
|
|
220
|
+
this.builtAt = this.nowFn();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// mergeContext
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Merge deterministic and message-dependent context halves into a
|
|
230
|
+
* `FullContext`. The merged output places deterministic system blocks first,
|
|
231
|
+
* then message-dependent system blocks, and appends the user message as the
|
|
232
|
+
* last history turn.
|
|
233
|
+
*
|
|
234
|
+
* @internal Exported for tests.
|
|
235
|
+
*/
|
|
236
|
+
export function mergeContext(
|
|
237
|
+
det: ContextPartial,
|
|
238
|
+
msgDep: ContextPartial,
|
|
239
|
+
timestamps: {
|
|
240
|
+
deterministicBuiltAt: string;
|
|
241
|
+
completedAt: string;
|
|
242
|
+
deterministicWasStale: boolean;
|
|
243
|
+
},
|
|
244
|
+
): FullContext {
|
|
245
|
+
const systemBlocks = [...det.systemBlocks, ...msgDep.systemBlocks];
|
|
246
|
+
const systemText = systemBlocks.filter(Boolean).join("\n\n");
|
|
247
|
+
|
|
248
|
+
// History: deterministic half contains history up to last turn; message-
|
|
249
|
+
// dependent half contains the new user message (and any injected turns).
|
|
250
|
+
const history: FullContext["history"] = [
|
|
251
|
+
...det.historyBlocks,
|
|
252
|
+
...msgDep.historyBlocks,
|
|
253
|
+
];
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
systemText,
|
|
257
|
+
history,
|
|
258
|
+
deterministicBuiltAt: timestamps.deterministicBuiltAt,
|
|
259
|
+
completedAt: timestamps.completedAt,
|
|
260
|
+
deterministicWasStale: timestamps.deterministicWasStale,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { EchoReferenceBuffer } from "./echo-reference-buffer.ts";
|
|
3
|
+
|
|
4
|
+
/** Ramp where sample i has value i+1 (so 0 = "not filled"). */
|
|
5
|
+
function ramp(from: number, count: number): Float32Array {
|
|
6
|
+
const out = new Float32Array(count);
|
|
7
|
+
for (let i = 0; i < count; i++) out[i] = from + i + 1;
|
|
8
|
+
return out;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
describe("EchoReferenceBuffer (#9583)", () => {
|
|
12
|
+
it("returns the last `length` samples at zero delay", () => {
|
|
13
|
+
const buf = new EchoReferenceBuffer({ capacitySamples: 1000 });
|
|
14
|
+
buf.push(ramp(0, 500)); // values 1..500
|
|
15
|
+
const ref = buf.referenceFor(4, 0);
|
|
16
|
+
expect(Array.from(ref)).toEqual([497, 498, 499, 500]);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("shifts the window back by the delay", () => {
|
|
20
|
+
const buf = new EchoReferenceBuffer({ capacitySamples: 1000 });
|
|
21
|
+
buf.push(ramp(0, 500)); // values 1..500
|
|
22
|
+
// delay 10 → window ends at sample (500-10)=490 → [487,488,489,490]
|
|
23
|
+
expect(Array.from(buf.referenceFor(4, 10))).toEqual([487, 488, 489, 490]);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("zero-fills samples not yet pushed (delay+length exceeds stream)", () => {
|
|
27
|
+
const buf = new EchoReferenceBuffer({ capacitySamples: 1000 });
|
|
28
|
+
buf.push(ramp(0, 3)); // values 1,2,3
|
|
29
|
+
// length 5, delay 0 → window [-2,3): two leading zeros then 1,2,3
|
|
30
|
+
expect(Array.from(buf.referenceFor(5, 0))).toEqual([0, 0, 1, 2, 3]);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("zero-fills the part evicted past capacity", () => {
|
|
34
|
+
const buf = new EchoReferenceBuffer({ capacitySamples: 8 });
|
|
35
|
+
buf.push(ramp(0, 12)); // values 1..12; only the last 8 (5..12) retained
|
|
36
|
+
// delay 0, length 8 → the retained window is values 5..12
|
|
37
|
+
expect(Array.from(buf.referenceFor(8, 0))).toEqual([
|
|
38
|
+
5, 6, 7, 8, 9, 10, 11, 12,
|
|
39
|
+
]);
|
|
40
|
+
// Asking for 10 reaches before the retained window → 2 leading zeros.
|
|
41
|
+
expect(Array.from(buf.referenceFor(10, 0))).toEqual([
|
|
42
|
+
0, 0, 5, 6, 7, 8, 9, 10, 11, 12,
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("accumulates across multiple pushes and tracks position", () => {
|
|
47
|
+
const buf = new EchoReferenceBuffer({ capacitySamples: 1000 });
|
|
48
|
+
buf.push(ramp(0, 100));
|
|
49
|
+
buf.push(ramp(100, 100)); // values 101..200, position now 200
|
|
50
|
+
expect(buf.position).toBe(200);
|
|
51
|
+
expect(Array.from(buf.referenceFor(3, 0))).toEqual([198, 199, 200]);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("reset clears the buffer", () => {
|
|
55
|
+
const buf = new EchoReferenceBuffer({ capacitySamples: 1000 });
|
|
56
|
+
buf.push(ramp(0, 50));
|
|
57
|
+
buf.reset();
|
|
58
|
+
expect(buf.position).toBe(0);
|
|
59
|
+
expect(Array.from(buf.referenceFor(3, 0))).toEqual([0, 0, 0]);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("preserves timestamp gaps between playback bursts", () => {
|
|
63
|
+
const buf = new EchoReferenceBuffer({
|
|
64
|
+
capacitySamples: 4000,
|
|
65
|
+
sampleRateHz: 16_000,
|
|
66
|
+
});
|
|
67
|
+
buf.pushAt(1000, ramp(0, 4)); // samples 0..3
|
|
68
|
+
buf.pushAt(1100, ramp(100, 4)); // samples 1600..1603
|
|
69
|
+
|
|
70
|
+
expect(Array.from(buf.referenceAt(1000, 4, 0))).toEqual([1, 2, 3, 4]);
|
|
71
|
+
expect(Array.from(buf.referenceAt(1050, 4, 0))).toEqual([0, 0, 0, 0]);
|
|
72
|
+
expect(Array.from(buf.referenceAt(1100, 4, 0))).toEqual([
|
|
73
|
+
101, 102, 103, 104,
|
|
74
|
+
]);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("applies delay to timestamp-aligned reads", () => {
|
|
78
|
+
const buf = new EchoReferenceBuffer({
|
|
79
|
+
capacitySamples: 1000,
|
|
80
|
+
sampleRateHz: 16_000,
|
|
81
|
+
});
|
|
82
|
+
buf.pushAt(0, ramp(0, 10));
|
|
83
|
+
|
|
84
|
+
expect(Array.from(buf.referenceAt(0.25, 4, 2))).toEqual([3, 4, 5, 6]);
|
|
85
|
+
});
|
|
86
|
+
});
|