@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,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic end-of-turn (EOT) classifier — Tier 3 of the three-tier VAD.
|
|
3
|
+
*
|
|
4
|
+
* Tier 1: RMS energy gate (~10 ms)
|
|
5
|
+
* Tier 2: Silero VAD (~32 ms hop)
|
|
6
|
+
* Tier 3: Semantic EOT classifier — P(turn_complete | transcript_so_far)
|
|
7
|
+
*
|
|
8
|
+
* The classifier operates on the partial transcript text emitted by streaming
|
|
9
|
+
* ASR, not on audio. It returns P(done) ∈ [0, 1]. The voice state machine
|
|
10
|
+
* uses it to:
|
|
11
|
+
*
|
|
12
|
+
* P(done) ≥ 0.9 AND silence ≥ 50 ms → commit immediately, skip hangover
|
|
13
|
+
* P(done) ≥ 0.6 AND silence ≥ 20 ms → enter PAUSE_TENTATIVE early (start drafter)
|
|
14
|
+
* P(done) < 0.4 → extend hangover by 50 ms (mid-clause)
|
|
15
|
+
*
|
|
16
|
+
* Three implementations ship:
|
|
17
|
+
*
|
|
18
|
+
* `HeuristicEotClassifier` — deterministic, zero-latency, no model load.
|
|
19
|
+
* This is the baseline; it is always available.
|
|
20
|
+
*
|
|
21
|
+
* `RemoteEotClassifier` — fail-closed HTTP adapter for a real model server.
|
|
22
|
+
* It throws on network/parse errors so callers never mistake a synthetic
|
|
23
|
+
* fallback for a measured turn signal.
|
|
24
|
+
*
|
|
25
|
+
* `Eliza1EotClassifier` — uses the already-loaded text model to compute
|
|
26
|
+
* P(`<|im_end|>` | partial transcript). Zero additional model weights.
|
|
27
|
+
*
|
|
28
|
+
* The GGUF-backed LiveKit detector lives in `eot-classifier-ggml.ts`.
|
|
29
|
+
*
|
|
30
|
+
* Cancellation contract (handshake with VoiceTurnController / R11): the
|
|
31
|
+
* classifier emits a `VoiceTurnSignal` per partial transcript. It NEVER
|
|
32
|
+
* aborts a turn directly — `signal()` is data, not a cancellation. The
|
|
33
|
+
* controller layer above consumes the signal and decides whether to
|
|
34
|
+
* suppress (via `BargeInCancelToken.signal` with reason `"turn-suppressed"`).
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import { scoreEndOfTurnHeuristic } from "@elizaos/shared/voice-eot";
|
|
38
|
+
import type {
|
|
39
|
+
Eliza1EotScoreResult,
|
|
40
|
+
Eliza1EotScorerOptions,
|
|
41
|
+
} from "./eliza1-eot-scorer";
|
|
42
|
+
import { Eliza1EotScorer } from "./eliza1-eot-scorer";
|
|
43
|
+
import { FfiEotScorer, type FfiEotScorerOptions } from "./fused-eot-scorer";
|
|
44
|
+
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Interface
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
export type VoiceNextSpeaker = "agent" | "user" | "unknown";
|
|
50
|
+
|
|
51
|
+
export interface VoiceTurnSignal {
|
|
52
|
+
/** P(user turn complete | transcript/history). */
|
|
53
|
+
endOfTurnProbability: number;
|
|
54
|
+
/**
|
|
55
|
+
* The best turn-taking read from this signal. Text-only EOU models infer
|
|
56
|
+
* this from end-of-turn probability; audio/prosody models can set it
|
|
57
|
+
* directly.
|
|
58
|
+
*/
|
|
59
|
+
nextSpeaker: VoiceNextSpeaker;
|
|
60
|
+
/** Whether the agent should begin a response now. */
|
|
61
|
+
agentShouldSpeak: boolean | null;
|
|
62
|
+
/** Implementation/source name for telemetry and trace records. */
|
|
63
|
+
source:
|
|
64
|
+
| "heuristic"
|
|
65
|
+
| "livekit-turn-detector"
|
|
66
|
+
| "eliza-1-drafter"
|
|
67
|
+
| "remote"
|
|
68
|
+
| "custom";
|
|
69
|
+
/** Optional model/version identifier for telemetry. */
|
|
70
|
+
model?: string;
|
|
71
|
+
/** Text actually scored after normalization/template truncation. */
|
|
72
|
+
transcript: string;
|
|
73
|
+
/** Wall-clock model latency, excluding caller queueing. */
|
|
74
|
+
latencyMs?: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* End-of-turn classifier interface. Both implementations satisfy this contract
|
|
79
|
+
* so callers are backend-agnostic.
|
|
80
|
+
*/
|
|
81
|
+
export interface EotClassifier {
|
|
82
|
+
/** Return P(turn_complete) ∈ [0, 1] for `partialTranscript`. */
|
|
83
|
+
score(partialTranscript: string): Promise<number>;
|
|
84
|
+
/** Return the structured turn signal when the implementation can provide it. */
|
|
85
|
+
signal?(partialTranscript: string): Promise<VoiceTurnSignal>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function clampProbability(value: number): number {
|
|
89
|
+
if (!Number.isFinite(value)) return 0.5;
|
|
90
|
+
return Math.max(0, Math.min(1, value));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function turnSignalFromProbability(args: {
|
|
94
|
+
probability: number;
|
|
95
|
+
transcript: string;
|
|
96
|
+
source: VoiceTurnSignal["source"];
|
|
97
|
+
model?: string;
|
|
98
|
+
latencyMs?: number;
|
|
99
|
+
}): VoiceTurnSignal {
|
|
100
|
+
const p = clampProbability(args.probability);
|
|
101
|
+
const nextSpeaker: VoiceNextSpeaker =
|
|
102
|
+
p >= EOT_TENTATIVE_THRESHOLD
|
|
103
|
+
? "agent"
|
|
104
|
+
: p < EOT_MID_CLAUSE_THRESHOLD
|
|
105
|
+
? "user"
|
|
106
|
+
: "unknown";
|
|
107
|
+
return {
|
|
108
|
+
endOfTurnProbability: p,
|
|
109
|
+
nextSpeaker,
|
|
110
|
+
agentShouldSpeak:
|
|
111
|
+
nextSpeaker === "agent" ? true : nextSpeaker === "user" ? false : null,
|
|
112
|
+
source: args.source,
|
|
113
|
+
...(args.model ? { model: args.model } : {}),
|
|
114
|
+
transcript: args.transcript,
|
|
115
|
+
...(args.latencyMs !== undefined ? { latencyMs: args.latencyMs } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Heuristic baseline
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Rules-of-thumb EOT classifier. Delegates to the single canonical heuristic in
|
|
125
|
+
* `@elizaos/shared/voice-eot` — the SAME scorer the UI shell capture path
|
|
126
|
+
* (`packages/ui/src/voice/end-of-turn.ts`) uses, so the two surfaces can never
|
|
127
|
+
* drift. The rules fire in priority order; the first match wins:
|
|
128
|
+
*
|
|
129
|
+
* Priority Signal P(done)
|
|
130
|
+
* -------- ------------------------------------------- -------
|
|
131
|
+
* 1 Trailing ellipsis ("…" / "..") 0.20
|
|
132
|
+
* 2 Sentence-final punctuation (. ! ?) 0.95
|
|
133
|
+
* 3 Question-tag words ("right?", "yeah", …) 0.85
|
|
134
|
+
* 4 Trailing conjunction (and/but/or/because/…) 0.15
|
|
135
|
+
* 5 Last word is a preposition or article 0.20
|
|
136
|
+
* 6 Short utterance (< 3 words, no trail-off) 0.70
|
|
137
|
+
* 7 No signal 0.50
|
|
138
|
+
*/
|
|
139
|
+
export class HeuristicEotClassifier implements EotClassifier {
|
|
140
|
+
score(partialTranscript: string): Promise<number> {
|
|
141
|
+
return Promise.resolve(scoreEndOfTurnHeuristic(partialTranscript));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
|
|
145
|
+
return turnSignalFromProbability({
|
|
146
|
+
probability: await this.score(partialTranscript),
|
|
147
|
+
transcript: partialTranscript.trim(),
|
|
148
|
+
source: "heuristic",
|
|
149
|
+
model: "heuristic-v1",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Tier-aware GGUF variant resolver (shared with eot-classifier-ggml.ts)
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Resolve which upstream revision a given Eliza-1 tier should bundle.
|
|
160
|
+
* Mobile/small tiers (`2b`, the entry tier) get the English-only variant;
|
|
161
|
+
* desktop/server tiers (`4b`+) get the multilingual variant.
|
|
162
|
+
*
|
|
163
|
+
* Accepts both bare tier ids (`"4b"`) and prefixed catalog ids
|
|
164
|
+
* (`"eliza-1-4b"`).
|
|
165
|
+
*/
|
|
166
|
+
export const LIVEKIT_TURN_DETECTOR_EN_REVISION = "v1.2.2-en";
|
|
167
|
+
export const LIVEKIT_TURN_DETECTOR_INTL_REVISION = "v0.4.1-intl";
|
|
168
|
+
|
|
169
|
+
export function turnDetectorRevisionForTier(
|
|
170
|
+
tierId: string,
|
|
171
|
+
):
|
|
172
|
+
| typeof LIVEKIT_TURN_DETECTOR_EN_REVISION
|
|
173
|
+
| typeof LIVEKIT_TURN_DETECTOR_INTL_REVISION {
|
|
174
|
+
const bare = tierId.startsWith("eliza-1-")
|
|
175
|
+
? tierId.slice("eliza-1-".length)
|
|
176
|
+
: tierId;
|
|
177
|
+
if (bare === "2b") {
|
|
178
|
+
return LIVEKIT_TURN_DETECTOR_EN_REVISION;
|
|
179
|
+
}
|
|
180
|
+
return LIVEKIT_TURN_DETECTOR_INTL_REVISION;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Remote model adapter
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
|
|
187
|
+
export interface RemoteEotClassifierOptions {
|
|
188
|
+
/**
|
|
189
|
+
* HTTP endpoint to POST the partial transcript to. Expected to return JSON
|
|
190
|
+
* with a `p_done` field: `{ "p_done": 0.92 }`.
|
|
191
|
+
*
|
|
192
|
+
* Example: LiveKit turn-detector inference endpoint or a custom model server.
|
|
193
|
+
*/
|
|
194
|
+
endpoint: string;
|
|
195
|
+
/**
|
|
196
|
+
* Timeout in milliseconds for each HTTP request. Default 200 ms — the
|
|
197
|
+
* classifier must be faster than the silence hangover it's trying to beat.
|
|
198
|
+
*/
|
|
199
|
+
timeoutMs?: number;
|
|
200
|
+
/** Optional model label for telemetry. */
|
|
201
|
+
model?: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Remote EOT classifier. POSTs `{ transcript: string }` to `endpoint`
|
|
206
|
+
* and expects `{ p_done: number }` back.
|
|
207
|
+
*
|
|
208
|
+
* Intended to be wired to a real LiveKit turn-detector HTTP API or a custom
|
|
209
|
+
* model inference server. This adapter fails closed: no fallback score is
|
|
210
|
+
* manufactured on network or parse errors.
|
|
211
|
+
*/
|
|
212
|
+
export class RemoteEotClassifier implements EotClassifier {
|
|
213
|
+
private readonly endpoint: string;
|
|
214
|
+
private readonly timeoutMs: number;
|
|
215
|
+
private readonly model: string;
|
|
216
|
+
|
|
217
|
+
constructor(opts: RemoteEotClassifierOptions) {
|
|
218
|
+
this.endpoint = opts.endpoint;
|
|
219
|
+
this.timeoutMs = opts.timeoutMs ?? 200;
|
|
220
|
+
this.model = opts.model ?? "remote-eot";
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
async score(partialTranscript: string): Promise<number> {
|
|
224
|
+
return (await this.signal(partialTranscript)).endOfTurnProbability;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
|
|
228
|
+
const started = performance.now();
|
|
229
|
+
const controller = new AbortController();
|
|
230
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
231
|
+
try {
|
|
232
|
+
const response = await fetch(this.endpoint, {
|
|
233
|
+
method: "POST",
|
|
234
|
+
headers: { "Content-Type": "application/json" },
|
|
235
|
+
body: JSON.stringify({ transcript: partialTranscript }),
|
|
236
|
+
signal: controller.signal,
|
|
237
|
+
});
|
|
238
|
+
if (!response.ok) {
|
|
239
|
+
throw new Error(
|
|
240
|
+
`[voice] Remote EOT classifier failed: HTTP ${response.status} ${response.statusText}`,
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
const json = (await response.json()) as unknown;
|
|
244
|
+
if (
|
|
245
|
+
typeof json === "object" &&
|
|
246
|
+
json !== null &&
|
|
247
|
+
"p_done" in json &&
|
|
248
|
+
typeof (json as Record<string, unknown>).p_done === "number"
|
|
249
|
+
) {
|
|
250
|
+
const p = (json as { p_done: number }).p_done;
|
|
251
|
+
return turnSignalFromProbability({
|
|
252
|
+
probability: p,
|
|
253
|
+
transcript: partialTranscript.trim(),
|
|
254
|
+
source: "remote",
|
|
255
|
+
model: this.model,
|
|
256
|
+
latencyMs: performance.now() - started,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
throw new Error(
|
|
260
|
+
"[voice] Remote EOT classifier response missing numeric p_done.",
|
|
261
|
+
);
|
|
262
|
+
} finally {
|
|
263
|
+
clearTimeout(timer);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
// Thresholds (shared constants so tests and state machine stay in sync)
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
|
|
272
|
+
/** P(done) ≥ this AND silence ≥ EOT_COMMIT_SILENCE_MS → commit immediately. */
|
|
273
|
+
export const EOT_COMMIT_THRESHOLD = 0.9;
|
|
274
|
+
|
|
275
|
+
/** P(done) ≥ this AND silence ≥ EOT_TENTATIVE_SILENCE_MS → enter PAUSE_TENTATIVE early. */
|
|
276
|
+
export const EOT_TENTATIVE_THRESHOLD = 0.6;
|
|
277
|
+
|
|
278
|
+
/** P(done) < this → extend hangover by EOT_HANGOVER_EXTENSION_MS. */
|
|
279
|
+
export const EOT_MID_CLAUSE_THRESHOLD = 0.4;
|
|
280
|
+
|
|
281
|
+
/** Minimum silence (ms) required alongside P ≥ EOT_COMMIT_THRESHOLD to commit. */
|
|
282
|
+
export const EOT_COMMIT_SILENCE_MS = 50;
|
|
283
|
+
|
|
284
|
+
/** Minimum silence (ms) required alongside P ≥ EOT_TENTATIVE_THRESHOLD to start drafter. */
|
|
285
|
+
export const EOT_TENTATIVE_SILENCE_MS = 20;
|
|
286
|
+
|
|
287
|
+
/** How many ms to add to the pause hangover when P < EOT_MID_CLAUSE_THRESHOLD. */
|
|
288
|
+
export const EOT_HANGOVER_EXTENSION_MS = 50;
|
|
289
|
+
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// Eliza-1 drafter EOT classifier
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
|
|
294
|
+
export type { Eliza1EotScoreResult, Eliza1EotScorerOptions };
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Eliza-1 EOT classifier. Reuses the already-loaded text model (typically
|
|
298
|
+
* the eliza-1 drafter — same model MTP keeps warm for speculative
|
|
299
|
+
* decoding) to compute P(`<|im_end|>` | partial transcript). Optionally
|
|
300
|
+
* loads a fine-tuned EOT LoRA adapter on top of the base weights — see
|
|
301
|
+
* `packages/training/scripts/turn_detector/` for the training recipe.
|
|
302
|
+
*
|
|
303
|
+
* Unlike the GGUF-backed `LiveKitGgmlTurnDetector`, this classifier ships
|
|
304
|
+
* zero additional model weights — it leans on what's already in RAM.
|
|
305
|
+
*/
|
|
306
|
+
export class Eliza1EotClassifier implements EotClassifier {
|
|
307
|
+
private readonly scorer: Eliza1EotScorer;
|
|
308
|
+
|
|
309
|
+
constructor(options: Eliza1EotScorerOptions | { scorer: Eliza1EotScorer }) {
|
|
310
|
+
this.scorer =
|
|
311
|
+
"scorer" in options ? options.scorer : new Eliza1EotScorer(options);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
async score(partialTranscript: string): Promise<number> {
|
|
315
|
+
const { probability } = await this.scorer.score(partialTranscript);
|
|
316
|
+
return probability;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
|
|
320
|
+
const result = await this.scorer.score(partialTranscript);
|
|
321
|
+
return turnSignalFromProbability({
|
|
322
|
+
probability: result.probability,
|
|
323
|
+
transcript: partialTranscript,
|
|
324
|
+
source: "eliza-1-drafter",
|
|
325
|
+
model: this.scorer.modelLabel,
|
|
326
|
+
latencyMs: result.latencyMs,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
async dispose(): Promise<void> {
|
|
331
|
+
await this.scorer.dispose();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
// Composite EOT classifier (fused semantic model + heuristic co-signal)
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Above this heuristic confidence the heuristic's high-precision syntactic
|
|
341
|
+
* verdict is trusted outright and the model forward pass is skipped. Sentence-
|
|
342
|
+
* final punctuation, question tags, trailing conjunctions, and dangling
|
|
343
|
+
* prepositions all clear this bar (P ≤ 0.2 or ≥ 0.8 → confidence ≥ 0.6); short
|
|
344
|
+
* utterances and the no-signal case fall below it and defer to the model.
|
|
345
|
+
*/
|
|
346
|
+
export const COMPOSITE_HEURISTIC_CONFIDENCE_CUTOFF = 0.6;
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* End-of-turn classifier that blends the fused semantic scorer
|
|
350
|
+
* (P(`<|im_end|>`) over the loaded text model) with the heuristic syntactic
|
|
351
|
+
* rules. The heuristic is NOT a fallback — it is a tuned co-signal: when it is
|
|
352
|
+
* confident (clear punctuation / mid-clause conjunction / dangling preposition)
|
|
353
|
+
* its verdict wins outright and the model pass is skipped; in the ambiguous
|
|
354
|
+
* middle (short utterance, no syntactic cue) the model's semantic judgment
|
|
355
|
+
* dominates, blended by the heuristic's residual confidence. Acoustic
|
|
356
|
+
* silence/VAD timing lives a tier below this (the VAD), so this layer is the
|
|
357
|
+
* pure text-completion read.
|
|
358
|
+
*/
|
|
359
|
+
export class CompositeEotClassifier implements EotClassifier {
|
|
360
|
+
private readonly model: FfiEotScorer;
|
|
361
|
+
private readonly heuristic: HeuristicEotClassifier;
|
|
362
|
+
private readonly confidenceCutoff: number;
|
|
363
|
+
|
|
364
|
+
constructor(options: {
|
|
365
|
+
model: FfiEotScorer;
|
|
366
|
+
heuristic?: HeuristicEotClassifier;
|
|
367
|
+
confidenceCutoff?: number;
|
|
368
|
+
}) {
|
|
369
|
+
this.model = options.model;
|
|
370
|
+
this.heuristic = options.heuristic ?? new HeuristicEotClassifier();
|
|
371
|
+
this.confidenceCutoff =
|
|
372
|
+
options.confidenceCutoff ?? COMPOSITE_HEURISTIC_CONFIDENCE_CUTOFF;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
private async blend(
|
|
376
|
+
partialTranscript: string,
|
|
377
|
+
): Promise<{ probability: number; latencyMs: number; usedModel: boolean }> {
|
|
378
|
+
const heuristicP = await this.heuristic.score(partialTranscript);
|
|
379
|
+
const heuristicConfidence = Math.abs(heuristicP - 0.5) * 2;
|
|
380
|
+
// High-precision syntactic verdict — trust it and skip the model pass.
|
|
381
|
+
if (heuristicConfidence >= this.confidenceCutoff) {
|
|
382
|
+
return { probability: heuristicP, latencyMs: 0, usedModel: false };
|
|
383
|
+
}
|
|
384
|
+
const { probability: modelP, latencyMs } =
|
|
385
|
+
await this.model.score(partialTranscript);
|
|
386
|
+
const blended =
|
|
387
|
+
modelP * (1 - heuristicConfidence) + heuristicP * heuristicConfidence;
|
|
388
|
+
return {
|
|
389
|
+
probability: clampProbability(blended),
|
|
390
|
+
latencyMs,
|
|
391
|
+
usedModel: true,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
async score(partialTranscript: string): Promise<number> {
|
|
396
|
+
return (await this.blend(partialTranscript)).probability;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
|
|
400
|
+
const { probability, latencyMs, usedModel } =
|
|
401
|
+
await this.blend(partialTranscript);
|
|
402
|
+
return turnSignalFromProbability({
|
|
403
|
+
probability,
|
|
404
|
+
transcript: partialTranscript,
|
|
405
|
+
source: usedModel ? "eliza-1-drafter" : "heuristic",
|
|
406
|
+
model: usedModel ? `${this.model.modelLabel}+heuristic` : "heuristic-v1",
|
|
407
|
+
...(latencyMs > 0 ? { latencyMs } : {}),
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Build a composite EOT classifier backed by the fused FFI scorer, or null when
|
|
414
|
+
* the loaded fused build does not wire the v11 EOT symbol (a pre-v11 library) —
|
|
415
|
+
* the caller then falls back to a heuristic-only classifier.
|
|
416
|
+
*/
|
|
417
|
+
export function tryBuildFusedEotClassifier(
|
|
418
|
+
options: FfiEotScorerOptions,
|
|
419
|
+
): CompositeEotClassifier | null {
|
|
420
|
+
if (!FfiEotScorer.isSupported(options.ffi)) return null;
|
|
421
|
+
return new CompositeEotClassifier({ model: new FfiEotScorer(options) });
|
|
422
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured voice-startup failure.
|
|
3
|
+
*
|
|
4
|
+
* Per `packages/inference/AGENTS.md` §3 + §9 (no defensive code, no
|
|
5
|
+
* log-and-continue), the engine MUST throw one of these when voice mode
|
|
6
|
+
* is requested but cannot start (missing FFI, missing speaker preset,
|
|
7
|
+
* missing fused build, missing required region, manifest mismatch). The
|
|
8
|
+
* runtime then refuses to activate the model — never silently degrades to
|
|
9
|
+
* text-only.
|
|
10
|
+
*
|
|
11
|
+
* Lives in its own module (rather than `engine-bridge.ts`) so the voice
|
|
12
|
+
* sub-modules — `pipeline-impls.ts`, `vad.ts`, `embedding.ts` — can throw
|
|
13
|
+
* it without importing the bridge (which imports them in turn, which
|
|
14
|
+
* would be a cycle).
|
|
15
|
+
*/
|
|
16
|
+
export class VoiceStartupError extends Error {
|
|
17
|
+
readonly code:
|
|
18
|
+
| "missing-ffi"
|
|
19
|
+
| "missing-speaker-preset"
|
|
20
|
+
| "missing-bundle-root"
|
|
21
|
+
| "missing-asr-model"
|
|
22
|
+
| "missing-fused-build"
|
|
23
|
+
| "blocked-asr-provenance"
|
|
24
|
+
| "missing-turn-detector"
|
|
25
|
+
| "already-started"
|
|
26
|
+
| "not-started"
|
|
27
|
+
| "invalid-options";
|
|
28
|
+
|
|
29
|
+
constructor(code: VoiceStartupError["code"], message: string) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = "VoiceStartupError";
|
|
32
|
+
this.code = code;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit coverage for the ASR-emotion → expressive-tag helpers (#9147 voice).
|
|
3
|
+
*
|
|
4
|
+
* normalizeAsrEmotionLabel / asrEmotionToTag / expressiveTagPromptClause are
|
|
5
|
+
* pure mappers between local ASR emotion labels and the TTS expressive-tag
|
|
6
|
+
* vocabulary; they were untested (the parse/strip helpers in the same file are
|
|
7
|
+
* covered separately). No GGUF / audio.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, it } from "vitest";
|
|
11
|
+
import {
|
|
12
|
+
asrEmotionToTag,
|
|
13
|
+
EXPRESSIVE_EMOTION_TAGS,
|
|
14
|
+
EXPRESSIVE_NONVERBAL_TAGS,
|
|
15
|
+
EXPRESSIVE_SINGING_TAG,
|
|
16
|
+
expressiveTagPromptClause,
|
|
17
|
+
normalizeAsrEmotionLabel,
|
|
18
|
+
} from "./expressive-tags";
|
|
19
|
+
|
|
20
|
+
describe("normalizeAsrEmotionLabel", () => {
|
|
21
|
+
it("returns null for empty/missing input", () => {
|
|
22
|
+
expect(normalizeAsrEmotionLabel(null)).toBeNull();
|
|
23
|
+
expect(normalizeAsrEmotionLabel(undefined)).toBeNull();
|
|
24
|
+
expect(normalizeAsrEmotionLabel("")).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("passes through a canonical noun label (case/space-insensitive)", () => {
|
|
28
|
+
expect(normalizeAsrEmotionLabel("happiness")).toBe("happiness");
|
|
29
|
+
expect(normalizeAsrEmotionLabel(" HAPPINESS ")).toBe("happiness");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("maps common adjective forms to noun labels", () => {
|
|
33
|
+
expect(normalizeAsrEmotionLabel("happy")).toBe("happiness");
|
|
34
|
+
expect(normalizeAsrEmotionLabel("sad")).toBe("sadness");
|
|
35
|
+
expect(normalizeAsrEmotionLabel("angry")).toBe("anger");
|
|
36
|
+
expect(normalizeAsrEmotionLabel("afraid")).toBe("fear");
|
|
37
|
+
expect(normalizeAsrEmotionLabel("scared")).toBe("fear");
|
|
38
|
+
expect(normalizeAsrEmotionLabel("surprised")).toBe("surprise");
|
|
39
|
+
expect(normalizeAsrEmotionLabel("disgusted")).toBe("disgust");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("returns null for an unknown label", () => {
|
|
43
|
+
expect(normalizeAsrEmotionLabel("gibberish-xyz")).toBeNull();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("asrEmotionToTag", () => {
|
|
48
|
+
it("maps a recognized emotion to an expressive emotion tag", () => {
|
|
49
|
+
const tag = asrEmotionToTag("happy");
|
|
50
|
+
expect(tag).not.toBeNull();
|
|
51
|
+
expect(EXPRESSIVE_EMOTION_TAGS).toContain(tag);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("returns null for null / unknown input", () => {
|
|
55
|
+
expect(asrEmotionToTag(null)).toBeNull();
|
|
56
|
+
expect(asrEmotionToTag("gibberish-xyz")).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("expressiveTagPromptClause", () => {
|
|
61
|
+
it("lists the emotion + nonverbal tags and excludes singing by default", () => {
|
|
62
|
+
const clause = expressiveTagPromptClause();
|
|
63
|
+
for (const tag of EXPRESSIVE_EMOTION_TAGS) {
|
|
64
|
+
expect(clause).toContain(`[${tag}]`);
|
|
65
|
+
}
|
|
66
|
+
for (const tag of EXPRESSIVE_NONVERBAL_TAGS) {
|
|
67
|
+
expect(clause).toContain(`[${tag}]`);
|
|
68
|
+
}
|
|
69
|
+
expect(clause).not.toContain(`[${EXPRESSIVE_SINGING_TAG}]`);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("includes the singing tag only when singingAllowed", () => {
|
|
73
|
+
expect(expressiveTagPromptClause({ singingAllowed: true })).toContain(
|
|
74
|
+
`[${EXPRESSIVE_SINGING_TAG}]`,
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
emotionToEnum,
|
|
4
|
+
enumToEmotion,
|
|
5
|
+
isExpressiveEmotionEnum,
|
|
6
|
+
isExpressiveTag,
|
|
7
|
+
parseExpressiveTags,
|
|
8
|
+
stripExpressiveTags,
|
|
9
|
+
} from "./expressive-tags.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Inline expressive-tag parsing for the voice path (#9147). Tags are scoped:
|
|
13
|
+
* an emotion/`[singing]` tag starts a new segment; `[laughter]`/`[sigh]` are
|
|
14
|
+
* recorded non-verbals; unrecognized `[tokens]` are preserved as model text
|
|
15
|
+
* (and flagged) rather than silently consumed.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
describe("isExpressiveTag / isExpressiveEmotionEnum", () => {
|
|
19
|
+
it("recognizes vocabulary tags, case/space-insensitively", () => {
|
|
20
|
+
expect(isExpressiveTag("happy")).toBe(true);
|
|
21
|
+
expect(isExpressiveTag(" SINGING ")).toBe(true);
|
|
22
|
+
expect(isExpressiveTag("laughter")).toBe(true);
|
|
23
|
+
expect(isExpressiveTag("grumpy")).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("treats none + emotions (but not singing) as enum values", () => {
|
|
27
|
+
expect(isExpressiveEmotionEnum("none")).toBe(true);
|
|
28
|
+
expect(isExpressiveEmotionEnum("excited")).toBe(true);
|
|
29
|
+
expect(isExpressiveEmotionEnum("singing")).toBe(false);
|
|
30
|
+
expect(isExpressiveEmotionEnum("grumpy")).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe("parseExpressiveTags", () => {
|
|
35
|
+
it("returns one neutral segment for untagged text", () => {
|
|
36
|
+
const parsed = parseExpressiveTags("just a normal reply");
|
|
37
|
+
expect(parsed.hasTags).toBe(false);
|
|
38
|
+
expect(parsed.dominantEmotion).toBeNull();
|
|
39
|
+
expect(parsed.segments).toHaveLength(1);
|
|
40
|
+
expect(parsed.segments[0]).toMatchObject({
|
|
41
|
+
emotion: null,
|
|
42
|
+
singing: false,
|
|
43
|
+
cleanText: "just a normal reply",
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("segments on each scope-setting emotion tag", () => {
|
|
48
|
+
const parsed = parseExpressiveTags("[happy] hello [sad] world");
|
|
49
|
+
expect(parsed.segments.map((s) => [s.emotion, s.cleanText])).toEqual([
|
|
50
|
+
["happy", "hello"],
|
|
51
|
+
["sad", "world"],
|
|
52
|
+
]);
|
|
53
|
+
expect(parsed.dominantEmotion).toBe("happy");
|
|
54
|
+
expect(parsed.cleanText).toBe("hello world");
|
|
55
|
+
expect(parsed.hasTags).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("allows a mid-sentence shift with a leading neutral segment", () => {
|
|
59
|
+
const parsed = parseExpressiveTags("that's [excited] amazing");
|
|
60
|
+
expect(parsed.segments.map((s) => [s.emotion, s.cleanText])).toEqual([
|
|
61
|
+
[null, "that's"],
|
|
62
|
+
["excited", "amazing"],
|
|
63
|
+
]);
|
|
64
|
+
expect(parsed.dominantEmotion).toBe("excited");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("tracks singing scope and preserves non-verbals without segmenting", () => {
|
|
68
|
+
const singing = parseExpressiveTags("[singing] la la la");
|
|
69
|
+
expect(singing.anySinging).toBe(true);
|
|
70
|
+
expect(singing.segments[0]).toMatchObject({ singing: true, emotion: null });
|
|
71
|
+
|
|
72
|
+
const nonverbal = parseExpressiveTags("hello [laughter] there");
|
|
73
|
+
expect(nonverbal.segments).toHaveLength(1);
|
|
74
|
+
expect(nonverbal.segments[0].nonverbals).toEqual(["laughter"]);
|
|
75
|
+
expect(nonverbal.cleanText).toBe("hello there");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("records unknown bracket tokens instead of treating them as tags", () => {
|
|
79
|
+
const parsed = parseExpressiveTags("this is [grumpy] text");
|
|
80
|
+
expect(parsed.unknownTags).toEqual(["[grumpy]"]);
|
|
81
|
+
expect(parsed.hasTags).toBe(false);
|
|
82
|
+
expect(parsed.cleanText).toBe("this is text");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe("stripExpressiveTags", () => {
|
|
87
|
+
it("removes recognized tags but leaves unknown bracket tokens", () => {
|
|
88
|
+
expect(stripExpressiveTags("[happy] hi [sigh] there")).toBe("hi there");
|
|
89
|
+
expect(stripExpressiveTags("[grumpy] hi")).toBe("[grumpy] hi");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe("emotionToEnum / enumToEmotion", () => {
|
|
94
|
+
it("round-trips an emotion and maps null ⇄ none", () => {
|
|
95
|
+
expect(emotionToEnum("happy")).toBe("happy");
|
|
96
|
+
expect(emotionToEnum(null)).toBe("none");
|
|
97
|
+
expect(enumToEmotion("none")).toBeNull();
|
|
98
|
+
expect(enumToEmotion("happy")).toBe("happy");
|
|
99
|
+
expect(enumToEmotion("singing")).toBeNull();
|
|
100
|
+
expect(enumToEmotion(undefined)).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
});
|