@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,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice checkpoint policy — thin VAD-event → checkpoint-op translator that
|
|
3
|
+
* sits between the voice loop (turn-controller / pipeline / vad) and the
|
|
4
|
+
* `GatedCheckpointManager` (`../checkpoint-manager.ts`).
|
|
5
|
+
*
|
|
6
|
+
* Why a separate policy module?
|
|
7
|
+
*
|
|
8
|
+
* - The constraint envelope on this scaffold explicitly forbids editing
|
|
9
|
+
* `turn-controller.ts`, `pipeline.ts`, `pipeline-impls.ts`, `vad.ts`,
|
|
10
|
+
* `scheduler.ts`, `phrase-chunker.ts`, `barge-in.ts`, `transcriber.ts`,
|
|
11
|
+
* and anything under `voice/kokoro/` / `voice/streaming-asr/`. Those
|
|
12
|
+
* files are owned by other agents.
|
|
13
|
+
* - But the upstream merge for `--ctx-checkpoints` lands "any week now,"
|
|
14
|
+
* and the JS-side rollback policy is what the merge unlocks. So the
|
|
15
|
+
* policy lives here as a free-standing module that the turn controller
|
|
16
|
+
* can pick up in a follow-up PR by injecting it into its VAD handler
|
|
17
|
+
* and calling `onSpeechPause` / `onSpeechResume` / `onSpeechEndCommit`
|
|
18
|
+
* / `onHardStop` at the matching transitions.
|
|
19
|
+
* - The wiring required in `turn-controller.ts` is documented in the
|
|
20
|
+
* `WIRING-INSTRUCTIONS` comment at the bottom of this file and in
|
|
21
|
+
* `docs/eliza-1-ctx-checkpoints-integration.md`. We intentionally do
|
|
22
|
+
* NOT apply the wiring here — that is a follow-up PR scoped to the
|
|
23
|
+
* turn-controller owner.
|
|
24
|
+
*
|
|
25
|
+
* Policy summary (one C1 per turn, named `pre-speculative-T<turnId>`):
|
|
26
|
+
*
|
|
27
|
+
* - `onSpeechPause(turnId)` — VAD reports the user stopped speaking but
|
|
28
|
+
* hangover hasn't elapsed. Save C1 and let the caller kick the
|
|
29
|
+
* speculative drafter. If the save fails the policy logs and continues
|
|
30
|
+
* (callers MUST treat speculative work as best-effort).
|
|
31
|
+
*
|
|
32
|
+
* - `onSpeechResume(turnId)` — VAD fires `speech-active` within the
|
|
33
|
+
* rollback window. If we previously kicked a speculative draft (the
|
|
34
|
+
* caller flips `speculativeFired=true` to tell us), restore C1 so the
|
|
35
|
+
* KV state is rolled back to the pre-draft point. Otherwise no-op.
|
|
36
|
+
*
|
|
37
|
+
* - `onSpeechEndCommit(turnId)` — VAD's hangover elapsed; the pause was a
|
|
38
|
+
* real turn boundary. The speculative draft is promoted. Erase C1: we
|
|
39
|
+
* no longer need a rollback target for this turn.
|
|
40
|
+
*
|
|
41
|
+
* - `onHardStop(turnId)` — caller-initiated cancellation (e.g. user
|
|
42
|
+
* pressed mute, app backgrounded). If C1 exists, prefer restoring to
|
|
43
|
+
* it so the KV cache is in a known-clean state for the next turn; if
|
|
44
|
+
* C1 isn't around, fall back to `cancel` (the gated manager will
|
|
45
|
+
* either issue `DELETE /slots/<id>` or invoke the SSE-disconnect
|
|
46
|
+
* callback depending on the gate).
|
|
47
|
+
*
|
|
48
|
+
* All four hooks are idempotent and survive a missing C1 by no-op'ing.
|
|
49
|
+
* Errors from the underlying manager are caught and reported through the
|
|
50
|
+
* `events.onError` sink — the policy NEVER throws back into the voice
|
|
51
|
+
* loop, because a failing checkpoint endpoint must not be able to break
|
|
52
|
+
* audio.
|
|
53
|
+
*
|
|
54
|
+
* The policy holds no state of its own beyond the per-turn name; the
|
|
55
|
+
* `GatedCheckpointManager` owns the registry, the REST client, and the
|
|
56
|
+
* capability cache.
|
|
57
|
+
*
|
|
58
|
+
* --- WIRING-INSTRUCTIONS (turn-controller.ts) -----------------------------
|
|
59
|
+
*
|
|
60
|
+
* The turn-controller owner adds (after the upstream merge lands):
|
|
61
|
+
*
|
|
62
|
+
* 1. Construct a `GatedCheckpointManager` once at session start and
|
|
63
|
+
* pass it into a `CheckpointPolicy` instance (one per slot).
|
|
64
|
+
* 2. In the VAD `speech-pause` handler, immediately after the pause
|
|
65
|
+
* hangover timer is armed:
|
|
66
|
+
*
|
|
67
|
+
* await policy.onSpeechPause(this.turnId, this.slotId);
|
|
68
|
+
* // ...kick speculative drafter against the partial transcript
|
|
69
|
+
*
|
|
70
|
+
* 3. In the VAD `speech-active` handler (only when arriving within the
|
|
71
|
+
* rollback window — the controller already tracks this):
|
|
72
|
+
*
|
|
73
|
+
* await policy.onSpeechResume(this.turnId, this.slotId, {
|
|
74
|
+
* speculativeFired: this.speculativeFired,
|
|
75
|
+
* });
|
|
76
|
+
* // ...abort the speculative drafter
|
|
77
|
+
*
|
|
78
|
+
* 4. In the `speech-end` → SPEAKING transition (after the verifier
|
|
79
|
+
* promotes the draft):
|
|
80
|
+
*
|
|
81
|
+
* await policy.onSpeechEndCommit(this.turnId, this.slotId);
|
|
82
|
+
*
|
|
83
|
+
* 5. In the `dispose()` path and any other hard-stop site (mute, app
|
|
84
|
+
* background, error shutdown, barge-in mid-SPEAKING):
|
|
85
|
+
*
|
|
86
|
+
* await policy.onHardStop(this.turnId, this.slotId, () => {
|
|
87
|
+
* this.speculativeAbort?.abort(); // SSE-disconnect callback
|
|
88
|
+
* });
|
|
89
|
+
*
|
|
90
|
+
* 6. Feature flag: pass `useCtxCheckpoints` through to the
|
|
91
|
+
* `GatedCheckpointManager` constructor; when off the policy still
|
|
92
|
+
* runs but every call is a logged no-op.
|
|
93
|
+
*
|
|
94
|
+
* The turn-controller must NOT call `mgr.save/restore/erase/cancel`
|
|
95
|
+
* directly — those names are reserved for the policy so the gated/no-op
|
|
96
|
+
* branching stays in one place. The `policy.events.onError` sink lets the
|
|
97
|
+
* controller forward checkpoint failures into its existing voice-loop
|
|
98
|
+
* telemetry without coupling to the REST error type.
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
import { logger } from "@elizaos/core";
|
|
102
|
+
import type {
|
|
103
|
+
CheckpointHandle,
|
|
104
|
+
GatedCheckpointManager,
|
|
105
|
+
SseDisconnectFn,
|
|
106
|
+
} from "../checkpoint-manager";
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Errors are surfaced through this sink rather than rethrown. The voice
|
|
110
|
+
* loop wires it into its existing telemetry; tests assert on it directly.
|
|
111
|
+
*/
|
|
112
|
+
export interface CheckpointPolicyEvents {
|
|
113
|
+
onError?(
|
|
114
|
+
op: "save" | "restore" | "erase" | "cancel",
|
|
115
|
+
error: unknown,
|
|
116
|
+
turnId: string,
|
|
117
|
+
): void;
|
|
118
|
+
/**
|
|
119
|
+
* Called after a successful save so callers can record the handle in
|
|
120
|
+
* their per-turn state if they want to bypass the name-based lookup on
|
|
121
|
+
* the matching restore.
|
|
122
|
+
*/
|
|
123
|
+
onSaved?(turnId: string, handle: CheckpointHandle): void;
|
|
124
|
+
/** Called after a successful restore. */
|
|
125
|
+
onRestored?(turnId: string, handle: CheckpointHandle): void;
|
|
126
|
+
/** Called when the policy decides to no-op (registry miss, gate off). */
|
|
127
|
+
onNoop?(
|
|
128
|
+
op: "save" | "restore" | "erase" | "cancel",
|
|
129
|
+
turnId: string,
|
|
130
|
+
reason: "gate-off" | "registry-miss" | "no-speculative",
|
|
131
|
+
): void;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface CheckpointPolicyOptions {
|
|
135
|
+
/** Gated manager. Owned by the caller; one per session. */
|
|
136
|
+
manager: GatedCheckpointManager;
|
|
137
|
+
/** Events sink (errors + observability). Optional. */
|
|
138
|
+
events?: CheckpointPolicyEvents;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Optional second arg to `onSpeechResume` so the policy knows whether
|
|
142
|
+
* a speculative draft actually fired. When `false`, the resume is a no-op
|
|
143
|
+
* (no draft means nothing to roll back).
|
|
144
|
+
*/
|
|
145
|
+
export interface SpeechResumeContext {
|
|
146
|
+
speculativeFired: boolean;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Voice checkpoint policy. Stateless w.r.t. checkpoints (the manager owns
|
|
151
|
+
* the registry) — only holds the manager + event sink. One instance per
|
|
152
|
+
* voice session is enough; the `turnId` argument scopes each operation.
|
|
153
|
+
*/
|
|
154
|
+
export class CheckpointPolicy {
|
|
155
|
+
private readonly manager: GatedCheckpointManager;
|
|
156
|
+
private readonly events: CheckpointPolicyEvents;
|
|
157
|
+
|
|
158
|
+
constructor(opts: CheckpointPolicyOptions) {
|
|
159
|
+
this.manager = opts.manager;
|
|
160
|
+
this.events = opts.events ?? {};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* VAD `speech-pause`. Save C1. Caller kicks the speculative drafter on
|
|
165
|
+
* its own — the policy doesn't care; it just guarantees the rollback
|
|
166
|
+
* target exists.
|
|
167
|
+
*/
|
|
168
|
+
async onSpeechPause(turnId: string, slotId: number): Promise<void> {
|
|
169
|
+
const name = checkpointNameFor(turnId);
|
|
170
|
+
if (!this.manager.isFeatureFlagOn()) {
|
|
171
|
+
this.events.onNoop?.("save", turnId, "gate-off");
|
|
172
|
+
logger.debug(
|
|
173
|
+
`[checkpoint-policy] onSpeechPause(${turnId}) — gate off, skipping save`,
|
|
174
|
+
);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const handle = await this.manager.save(slotId, name);
|
|
179
|
+
if (handle === null) {
|
|
180
|
+
// Gate flipped on but capability check declined — manager logs.
|
|
181
|
+
this.events.onNoop?.("save", turnId, "gate-off");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
this.events.onSaved?.(turnId, handle);
|
|
185
|
+
} catch (error) {
|
|
186
|
+
this.events.onError?.("save", error, turnId);
|
|
187
|
+
logger.warn(
|
|
188
|
+
{ error, turnId, slotId },
|
|
189
|
+
"[checkpoint-policy] save failed; speculative draft will run without rollback target",
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* VAD `speech-active` within the rollback window. Restore C1 ONLY if
|
|
196
|
+
* the caller actually kicked a speculative draft — otherwise the KV
|
|
197
|
+
* state hasn't been mutated and we'd be doing a needless REST round
|
|
198
|
+
* trip.
|
|
199
|
+
*/
|
|
200
|
+
async onSpeechResume(
|
|
201
|
+
turnId: string,
|
|
202
|
+
slotId: number,
|
|
203
|
+
ctx: SpeechResumeContext,
|
|
204
|
+
): Promise<void> {
|
|
205
|
+
if (!ctx.speculativeFired) {
|
|
206
|
+
this.events.onNoop?.("restore", turnId, "no-speculative");
|
|
207
|
+
logger.debug(
|
|
208
|
+
`[checkpoint-policy] onSpeechResume(${turnId}) — no speculative draft fired; skipping restore`,
|
|
209
|
+
);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const name = checkpointNameFor(turnId);
|
|
213
|
+
if (!this.manager.isFeatureFlagOn()) {
|
|
214
|
+
this.events.onNoop?.("restore", turnId, "gate-off");
|
|
215
|
+
logger.debug(
|
|
216
|
+
`[checkpoint-policy] onSpeechResume(${turnId}) — gate off, skipping restore`,
|
|
217
|
+
);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const ok = await this.manager.restore(slotId, name);
|
|
222
|
+
if (!ok) {
|
|
223
|
+
this.events.onNoop?.("restore", turnId, "registry-miss");
|
|
224
|
+
logger.warn(
|
|
225
|
+
{ turnId, slotId, name },
|
|
226
|
+
"[checkpoint-policy] restore returned false (handle not found / expired); KV cache may be dirty until next pause",
|
|
227
|
+
);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const handle = this.manager.getNamedHandle(name);
|
|
231
|
+
if (handle) this.events.onRestored?.(turnId, handle);
|
|
232
|
+
} catch (error) {
|
|
233
|
+
this.events.onError?.("restore", error, turnId);
|
|
234
|
+
logger.warn(
|
|
235
|
+
{ error, turnId, slotId },
|
|
236
|
+
"[checkpoint-policy] restore failed; KV cache may contain speculative writes",
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* VAD's hangover elapsed → real turn boundary. Speculative draft is
|
|
243
|
+
* being promoted, so C1 is no longer needed. Erase frees the registry
|
|
244
|
+
* slot (the server-side LRU handles its own eviction independently).
|
|
245
|
+
*/
|
|
246
|
+
async onSpeechEndCommit(turnId: string, slotId: number): Promise<void> {
|
|
247
|
+
const name = checkpointNameFor(turnId);
|
|
248
|
+
if (!this.manager.isFeatureFlagOn()) {
|
|
249
|
+
this.events.onNoop?.("erase", turnId, "gate-off");
|
|
250
|
+
logger.debug(
|
|
251
|
+
`[checkpoint-policy] onSpeechEndCommit(${turnId}) — gate off, skipping erase`,
|
|
252
|
+
);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
await this.manager.erase(slotId, name);
|
|
257
|
+
} catch (error) {
|
|
258
|
+
this.events.onError?.("erase", error, turnId);
|
|
259
|
+
logger.warn(
|
|
260
|
+
{ error, turnId, slotId },
|
|
261
|
+
"[checkpoint-policy] erase failed; registry entry remains until TTL eviction",
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Hard-stop: caller-initiated cancellation. Prefer rolling back to C1
|
|
268
|
+
* (clean KV state for the next turn) when available, else cancel any
|
|
269
|
+
* in-flight decode on the slot. `sseDisconnect` is the existing voice-
|
|
270
|
+
* loop abort hook — required because the gated manager falls back to
|
|
271
|
+
* it when the REST endpoints aren't available.
|
|
272
|
+
*/
|
|
273
|
+
async onHardStop(
|
|
274
|
+
turnId: string,
|
|
275
|
+
slotId: number,
|
|
276
|
+
sseDisconnect: SseDisconnectFn,
|
|
277
|
+
): Promise<void> {
|
|
278
|
+
const name = checkpointNameFor(turnId);
|
|
279
|
+
if (!this.manager.isFeatureFlagOn()) {
|
|
280
|
+
sseDisconnect(slotId);
|
|
281
|
+
this.events.onNoop?.("cancel", turnId, "gate-off");
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const existing = this.manager.getNamedHandle(name);
|
|
285
|
+
if (existing) {
|
|
286
|
+
try {
|
|
287
|
+
const ok = await this.manager.restore(slotId, name);
|
|
288
|
+
if (ok) {
|
|
289
|
+
this.events.onRestored?.(turnId, existing);
|
|
290
|
+
}
|
|
291
|
+
// Also erase: the registry slot serves no further purpose after
|
|
292
|
+
// a hard stop, and leaving it pinned through TTL eviction is
|
|
293
|
+
// wasteful.
|
|
294
|
+
try {
|
|
295
|
+
await this.manager.erase(slotId, name);
|
|
296
|
+
} catch (eraseError) {
|
|
297
|
+
this.events.onError?.("erase", eraseError, turnId);
|
|
298
|
+
}
|
|
299
|
+
return;
|
|
300
|
+
} catch (error) {
|
|
301
|
+
this.events.onError?.("restore", error, turnId);
|
|
302
|
+
logger.warn(
|
|
303
|
+
{ error, turnId, slotId },
|
|
304
|
+
"[checkpoint-policy] hard-stop restore failed; falling back to cancel",
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
await this.manager.cancel(slotId, sseDisconnect);
|
|
310
|
+
} catch (error) {
|
|
311
|
+
this.events.onError?.("cancel", error, turnId);
|
|
312
|
+
logger.warn(
|
|
313
|
+
{ error, turnId, slotId },
|
|
314
|
+
"[checkpoint-policy] cancel failed; voice loop SSE-disconnect already invoked",
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Per-turn checkpoint name. Keeps the namespace stable so a hard-stop
|
|
322
|
+
* after a normal commit doesn't collide with the next turn's C1.
|
|
323
|
+
*
|
|
324
|
+
* The format is the only thing callers outside the policy ever see —
|
|
325
|
+
* `GatedCheckpointManager.getNamedHandle('pre-speculative-T123')` returns
|
|
326
|
+
* the same handle the policy used. Keep it stable; if the format changes
|
|
327
|
+
* in a later change, audit every consumer of `getNamedHandle`.
|
|
328
|
+
*/
|
|
329
|
+
export function checkpointNameFor(turnId: string): string {
|
|
330
|
+
// The gated manager's REST filename validation allows
|
|
331
|
+
// `[A-Za-z0-9._-]`, and turn ids in the voice loop are short integer
|
|
332
|
+
// strings. Sanitize defensively for the unlikely case where turn
|
|
333
|
+
// ids carry colons or slashes.
|
|
334
|
+
const safe = turnId.replace(/[^A-Za-z0-9._-]/g, "_");
|
|
335
|
+
return `pre-speculative-T${safe}`;
|
|
336
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { CompositeEotClassifier } from "./eot-classifier";
|
|
3
|
+
import type { FfiEotScorer } from "./fused-eot-scorer";
|
|
4
|
+
|
|
5
|
+
/** A stub fused scorer that returns a fixed model probability. */
|
|
6
|
+
function mockScorer(probability: number) {
|
|
7
|
+
const score = vi.fn(async () => ({
|
|
8
|
+
probability,
|
|
9
|
+
latencyMs: 3,
|
|
10
|
+
promptTokens: 5,
|
|
11
|
+
}));
|
|
12
|
+
const scorer = { modelLabel: "mock-eot", score } as unknown as FfiEotScorer;
|
|
13
|
+
return { scorer, score };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe("CompositeEotClassifier", () => {
|
|
17
|
+
it("trusts the heuristic and skips the model when it is confident — sentence-final punctuation", async () => {
|
|
18
|
+
const { scorer, score } = mockScorer(0.0);
|
|
19
|
+
const c = new CompositeEotClassifier({ model: scorer });
|
|
20
|
+
// "Hello there." → punctuation → heuristic 0.95 (confidence 0.9 ≥ cutoff).
|
|
21
|
+
expect(await c.score("Hello there.")).toBeCloseTo(0.95, 5);
|
|
22
|
+
expect(score).not.toHaveBeenCalled();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("trusts the heuristic and skips the model when it is confident — trailing conjunction", async () => {
|
|
26
|
+
const { scorer, score } = mockScorer(0.99);
|
|
27
|
+
const c = new CompositeEotClassifier({ model: scorer });
|
|
28
|
+
// "I want to go and" → trailing conjunction → heuristic 0.15 (confidence 0.7).
|
|
29
|
+
expect(await c.score("I want to go and")).toBeCloseTo(0.15, 5);
|
|
30
|
+
expect(score).not.toHaveBeenCalled();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("defers to the model in the ambiguous middle (no syntactic signal)", async () => {
|
|
34
|
+
const { scorer, score } = mockScorer(0.82);
|
|
35
|
+
const c = new CompositeEotClassifier({ model: scorer });
|
|
36
|
+
// 5 words, no punctuation, last word a pronoun → heuristic 0.5 (confidence
|
|
37
|
+
// 0) → the blend is the pure model probability.
|
|
38
|
+
expect(await c.score("tell me more about it")).toBeCloseTo(0.82, 5);
|
|
39
|
+
expect(score).toHaveBeenCalledTimes(1);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("blends model + heuristic for a mid-confidence heuristic (short utterance)", async () => {
|
|
43
|
+
const { scorer, score } = mockScorer(0.2);
|
|
44
|
+
const c = new CompositeEotClassifier({ model: scorer });
|
|
45
|
+
// "okay sure" → 2 words → heuristic 0.7 (confidence 0.4 < cutoff) → model
|
|
46
|
+
// runs; blend = 0.2·(1−0.4) + 0.7·0.4 = 0.40.
|
|
47
|
+
expect(await c.score("okay sure")).toBeCloseTo(0.4, 5);
|
|
48
|
+
expect(score).toHaveBeenCalledTimes(1);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("signal() reports the model source only when the model contributed", async () => {
|
|
52
|
+
const { scorer } = mockScorer(0.6);
|
|
53
|
+
const c = new CompositeEotClassifier({ model: scorer });
|
|
54
|
+
expect((await c.signal("Done.")).source).toBe("heuristic");
|
|
55
|
+
const ambiguous = await c.signal("tell me more about it");
|
|
56
|
+
expect(ambiguous.source).toBe("eliza-1-drafter");
|
|
57
|
+
expect(ambiguous.model).toContain("mock-eot");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
addNoise,
|
|
4
|
+
applyGainDb,
|
|
5
|
+
applyLowQualityLine,
|
|
6
|
+
applyReverb,
|
|
7
|
+
augmentPcm,
|
|
8
|
+
dbToGain,
|
|
9
|
+
estimateSnrDb,
|
|
10
|
+
measureRms,
|
|
11
|
+
mixInto,
|
|
12
|
+
type NoiseKind,
|
|
13
|
+
specIsClean,
|
|
14
|
+
} from "./corpus-augment";
|
|
15
|
+
|
|
16
|
+
const SR = 16_000;
|
|
17
|
+
|
|
18
|
+
/** A deterministic voiced tone with leading + trailing silence. */
|
|
19
|
+
function makeTone(freq: number, durSec: number, gap = 0.2) {
|
|
20
|
+
const gapN = Math.round(gap * SR);
|
|
21
|
+
const n = Math.round(durSec * SR) + gapN * 2;
|
|
22
|
+
const pcm = new Float32Array(n);
|
|
23
|
+
for (let i = gapN; i < n - gapN; i++) {
|
|
24
|
+
pcm[i] = 0.5 * Math.sin((2 * Math.PI * freq * (i - gapN)) / SR);
|
|
25
|
+
}
|
|
26
|
+
return { pcm, voicedStart: gapN, voicedEnd: n - gapN };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe("corpus-augment dB helpers", () => {
|
|
30
|
+
it("dbToGain: +6 dB ≈ ×2, −6 dB ≈ ×0.5", () => {
|
|
31
|
+
expect(dbToGain(6)).toBeCloseTo(2, 1);
|
|
32
|
+
expect(dbToGain(-6)).toBeCloseTo(0.5, 1);
|
|
33
|
+
expect(dbToGain(0)).toBe(1);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("estimateSnrDb recovers a known ratio", () => {
|
|
37
|
+
expect(estimateSnrDb(1, 0.1)).toBeCloseTo(20, 5);
|
|
38
|
+
expect(estimateSnrDb(1, 0)).toBe(Number.POSITIVE_INFINITY);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe("addNoise", () => {
|
|
43
|
+
it("hits the target SNR within ~1.5 dB", () => {
|
|
44
|
+
const { pcm } = makeTone(220, 1.0, 0);
|
|
45
|
+
const noisy = addNoise(pcm, { snrDb: 10, seed: 1 });
|
|
46
|
+
// Recover the noise as (noisy − clean) and compare RMS.
|
|
47
|
+
const noise = new Float32Array(pcm.length);
|
|
48
|
+
for (let i = 0; i < pcm.length; i++) noise[i] = noisy[i] - pcm[i];
|
|
49
|
+
const snr = estimateSnrDb(measureRms(pcm), measureRms(noise));
|
|
50
|
+
expect(snr).toBeGreaterThan(8.5);
|
|
51
|
+
expect(snr).toBeLessThan(11.5);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("lower SNR is louder noise", () => {
|
|
55
|
+
const { pcm } = makeTone(220, 0.5, 0);
|
|
56
|
+
const n5 = addNoise(pcm, { snrDb: 5, seed: 2 });
|
|
57
|
+
const n20 = addNoise(pcm, { snrDb: 20, seed: 2 });
|
|
58
|
+
const noise5 = measureRms(n5) - measureRms(pcm);
|
|
59
|
+
const noise20 = measureRms(n20) - measureRms(pcm);
|
|
60
|
+
// 5 dB SNR adds more energy than 20 dB SNR.
|
|
61
|
+
expect(measureRms(n5)).toBeGreaterThan(measureRms(n20));
|
|
62
|
+
expect(noise5).toBeGreaterThan(noise20);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("is deterministic for a given seed", () => {
|
|
66
|
+
const { pcm } = makeTone(300, 0.3, 0.1);
|
|
67
|
+
const a = addNoise(pcm, { snrDb: 8, seed: 42 });
|
|
68
|
+
const b = addNoise(pcm, { snrDb: 8, seed: 42 });
|
|
69
|
+
const c = addNoise(pcm, { snrDb: 8, seed: 43 });
|
|
70
|
+
expect(Array.from(a)).toEqual(Array.from(b));
|
|
71
|
+
expect(Array.from(a)).not.toEqual(Array.from(c));
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("raises the floor in formerly-silent regions", () => {
|
|
75
|
+
const { pcm, voicedEnd } = makeTone(220, 0.5, 0.2);
|
|
76
|
+
const tailBefore = measureRms(pcm, voicedEnd);
|
|
77
|
+
const noisy = addNoise(pcm, { snrDb: 10, seed: 7 });
|
|
78
|
+
const tailAfter = measureRms(noisy, voicedEnd);
|
|
79
|
+
expect(tailBefore).toBeLessThan(1e-4);
|
|
80
|
+
expect(tailAfter).toBeGreaterThan(tailBefore);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
/** Lag-1 normalized autocorrelation: ≈1 for a smooth/tonal signal, ≈0 for
|
|
85
|
+
* uncorrelated white noise. */
|
|
86
|
+
function lag1Autocorr(x: Float32Array): number {
|
|
87
|
+
let num = 0;
|
|
88
|
+
let den = 0;
|
|
89
|
+
for (let i = 1; i < x.length; i++) num += x[i] * x[i - 1];
|
|
90
|
+
for (let i = 0; i < x.length; i++) den += x[i] * x[i];
|
|
91
|
+
return den > 0 ? num / den : 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
describe("addNoise: music kind", () => {
|
|
95
|
+
const recoverNoise = (pcm: Float32Array, kind: NoiseKind, seed: number) => {
|
|
96
|
+
const noisy = addNoise(pcm, { snrDb: 6, kind, seed });
|
|
97
|
+
const noise = new Float32Array(pcm.length);
|
|
98
|
+
for (let i = 0; i < pcm.length; i++) noise[i] = noisy[i] - pcm[i];
|
|
99
|
+
return noise;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
it("hits the target SNR like the other kinds", () => {
|
|
103
|
+
const { pcm } = makeTone(220, 1.0, 0);
|
|
104
|
+
const noise = recoverNoise(pcm, "music", 1);
|
|
105
|
+
// recoverNoise uses snrDb: 6
|
|
106
|
+
const snr = estimateSnrDb(measureRms(pcm), measureRms(noise));
|
|
107
|
+
expect(snr).toBeGreaterThan(4.5);
|
|
108
|
+
expect(snr).toBeLessThan(7.5);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("is tonal (smooth, highly autocorrelated) unlike flat white noise", () => {
|
|
112
|
+
const { pcm } = makeTone(220, 0.5, 0);
|
|
113
|
+
const music = lag1Autocorr(recoverNoise(pcm, "music", 5));
|
|
114
|
+
const white = lag1Autocorr(recoverNoise(pcm, "white", 5));
|
|
115
|
+
expect(music).toBeGreaterThan(0.9);
|
|
116
|
+
expect(white).toBeLessThan(0.5);
|
|
117
|
+
expect(music).toBeGreaterThan(white);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("is deterministic for a seed and differs from white/pink", () => {
|
|
121
|
+
const { pcm } = makeTone(300, 0.3, 0.1);
|
|
122
|
+
const a = addNoise(pcm, { snrDb: 8, kind: "music", seed: 42 });
|
|
123
|
+
const b = addNoise(pcm, { snrDb: 8, kind: "music", seed: 42 });
|
|
124
|
+
const white = addNoise(pcm, { snrDb: 8, kind: "white", seed: 42 });
|
|
125
|
+
const pink = addNoise(pcm, { snrDb: 8, kind: "pink", seed: 42 });
|
|
126
|
+
expect(Array.from(a)).toEqual(Array.from(b));
|
|
127
|
+
expect(Array.from(a)).not.toEqual(Array.from(white));
|
|
128
|
+
expect(Array.from(a)).not.toEqual(Array.from(pink));
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe("applyReverb", () => {
|
|
133
|
+
it("spreads energy into the tail after the dry signal ends", () => {
|
|
134
|
+
const { pcm, voicedEnd } = makeTone(220, 0.4, 0.0);
|
|
135
|
+
const dryTail = measureRms(pcm, voicedEnd, pcm.length);
|
|
136
|
+
const wet = applyReverb(pcm, SR, { room: 0.7, wet: 0.6, tailSec: 0.6 });
|
|
137
|
+
// The reverb output is longer (tail appended) and the post-voice region rings.
|
|
138
|
+
expect(wet.length).toBeGreaterThan(pcm.length);
|
|
139
|
+
const wetTail = measureRms(
|
|
140
|
+
wet,
|
|
141
|
+
voicedEnd,
|
|
142
|
+
voicedEnd + Math.round(0.3 * SR),
|
|
143
|
+
);
|
|
144
|
+
expect(wetTail).toBeGreaterThan(dryTail);
|
|
145
|
+
expect(wetTail).toBeGreaterThan(1e-3);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("is deterministic", () => {
|
|
149
|
+
const { pcm } = makeTone(200, 0.2);
|
|
150
|
+
const a = applyReverb(pcm, SR, { room: 0.5, wet: 0.4 });
|
|
151
|
+
const b = applyReverb(pcm, SR, { room: 0.5, wet: 0.4 });
|
|
152
|
+
expect(Array.from(a)).toEqual(Array.from(b));
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe("applyGainDb (far-field attenuation)", () => {
|
|
157
|
+
it("−12 dB quarters the amplitude", () => {
|
|
158
|
+
const { pcm } = makeTone(220, 0.3, 0);
|
|
159
|
+
const quiet = applyGainDb(pcm, -12);
|
|
160
|
+
expect(measureRms(quiet) / measureRms(pcm)).toBeCloseTo(dbToGain(-12), 2);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe("applyLowQualityLine", () => {
|
|
165
|
+
it("attenuates high-frequency content more than the speech band", () => {
|
|
166
|
+
const band = makeTone(1000, 0.5, 0);
|
|
167
|
+
const high = makeTone(6500, 0.5, 0);
|
|
168
|
+
const bandOut = applyLowQualityLine(band.pcm, SR);
|
|
169
|
+
const highOut = applyLowQualityLine(high.pcm, SR);
|
|
170
|
+
const bandKept = measureRms(bandOut) / measureRms(band.pcm);
|
|
171
|
+
const highKept = measureRms(highOut) / measureRms(high.pcm);
|
|
172
|
+
// 6.5 kHz is above the ~3.4 kHz line cutoff → far more attenuated.
|
|
173
|
+
expect(highKept).toBeLessThan(bandKept);
|
|
174
|
+
expect(highKept).toBeLessThan(0.5);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("also strips sub-300 Hz rumble", () => {
|
|
178
|
+
const low = makeTone(80, 0.5, 0);
|
|
179
|
+
const out = applyLowQualityLine(low.pcm, SR);
|
|
180
|
+
expect(measureRms(out) / measureRms(low.pcm)).toBeLessThan(0.6);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
describe("mixInto", () => {
|
|
185
|
+
it("adds an overlay at the requested level without changing length", () => {
|
|
186
|
+
const base = new Float32Array(1000);
|
|
187
|
+
const overlay = new Float32Array(1000).fill(0.5);
|
|
188
|
+
const mixed = mixInto(base, overlay, { gainDb: -6 });
|
|
189
|
+
expect(mixed.length).toBe(base.length);
|
|
190
|
+
expect(mixed[500]).toBeCloseTo(0.5 * dbToGain(-6), 4);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("honors offset and loops a short overlay", () => {
|
|
194
|
+
const base = new Float32Array(100);
|
|
195
|
+
const overlay = new Float32Array([1, 0]);
|
|
196
|
+
const mixed = mixInto(base, overlay, { offsetSamples: 10, loop: true });
|
|
197
|
+
expect(mixed[9]).toBe(0);
|
|
198
|
+
expect(mixed[10]).toBe(1);
|
|
199
|
+
expect(mixed[11]).toBe(0);
|
|
200
|
+
expect(mixed[12]).toBe(1);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("does not mutate the inputs", () => {
|
|
204
|
+
const base = new Float32Array([0.125, 0.25]);
|
|
205
|
+
const overlay = new Float32Array([0.5, 0.5]);
|
|
206
|
+
mixInto(base, overlay, {});
|
|
207
|
+
expect(Array.from(base)).toEqual([0.125, 0.25]);
|
|
208
|
+
expect(Array.from(overlay)).toEqual([0.5, 0.5]);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
describe("augmentPcm chain", () => {
|
|
213
|
+
it("specIsClean detects a no-op spec", () => {
|
|
214
|
+
expect(specIsClean(undefined)).toBe(true);
|
|
215
|
+
expect(specIsClean({})).toBe(true);
|
|
216
|
+
expect(specIsClean({ noiseKind: "pink" })).toBe(true); // kind alone is a no-op
|
|
217
|
+
expect(specIsClean({ noiseSnrDb: 10 })).toBe(false);
|
|
218
|
+
expect(specIsClean({ reverb: 0.5 })).toBe(false);
|
|
219
|
+
expect(specIsClean({ lowQuality: true })).toBe(false);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("preserves length and stays within [-1, 1]", () => {
|
|
223
|
+
const { pcm } = makeTone(220, 0.6, 0.15);
|
|
224
|
+
const out = augmentPcm(
|
|
225
|
+
pcm,
|
|
226
|
+
SR,
|
|
227
|
+
{ noiseSnrDb: 6, reverb: 0.7, farFieldDb: 9, lowQuality: true, seed: 3 },
|
|
228
|
+
{},
|
|
229
|
+
);
|
|
230
|
+
expect(out.length).toBe(pcm.length);
|
|
231
|
+
let peak = 0;
|
|
232
|
+
for (const s of out) peak = Math.max(peak, Math.abs(s));
|
|
233
|
+
expect(peak).toBeLessThanOrEqual(1);
|
|
234
|
+
expect(out).not.toBe(pcm); // returns a fresh array
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it("a far-field+reverb+noise voice is materially degraded vs the clean source", () => {
|
|
238
|
+
const { pcm, voicedStart, voicedEnd } = makeTone(220, 0.8, 0.2);
|
|
239
|
+
const out = augmentPcm(
|
|
240
|
+
pcm,
|
|
241
|
+
SR,
|
|
242
|
+
{ farFieldDb: 12, reverb: 0.8, noiseSnrDb: 8, seed: 9 },
|
|
243
|
+
{},
|
|
244
|
+
);
|
|
245
|
+
// The voiced region is quieter (far-field) yet the silent tail now has a
|
|
246
|
+
// noise floor — i.e. SNR dropped, which is the whole point.
|
|
247
|
+
const cleanVoiced = measureRms(pcm, voicedStart, voicedEnd);
|
|
248
|
+
const outVoiced = measureRms(out, voicedStart, voicedEnd);
|
|
249
|
+
expect(outVoiced).toBeLessThan(cleanVoiced);
|
|
250
|
+
expect(measureRms(out, voicedEnd)).toBeGreaterThan(
|
|
251
|
+
measureRms(pcm, voicedEnd),
|
|
252
|
+
);
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it("mixes background talkers when babble is supplied", () => {
|
|
256
|
+
const { pcm } = makeTone(220, 0.5, 0.1);
|
|
257
|
+
const babble = makeTone(440, 0.5, 0).pcm;
|
|
258
|
+
const withBabble = augmentPcm(
|
|
259
|
+
pcm,
|
|
260
|
+
SR,
|
|
261
|
+
{ backgroundTalkersDb: 6 },
|
|
262
|
+
{ babble },
|
|
263
|
+
);
|
|
264
|
+
const without = augmentPcm(pcm, SR, { backgroundTalkersDb: 6 }, {});
|
|
265
|
+
// Babble present → louder than the no-babble control (which is a no-op).
|
|
266
|
+
expect(measureRms(withBabble)).toBeGreaterThan(measureRms(without));
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it("is fully deterministic end-to-end", () => {
|
|
270
|
+
const { pcm } = makeTone(220, 0.4, 0.1);
|
|
271
|
+
const spec = { noiseSnrDb: 7, reverb: 0.5, lowQuality: true, seed: 11 };
|
|
272
|
+
const a = augmentPcm(pcm, SR, spec, {});
|
|
273
|
+
const b = augmentPcm(pcm, SR, spec, {});
|
|
274
|
+
expect(Array.from(a)).toEqual(Array.from(b));
|
|
275
|
+
});
|
|
276
|
+
});
|