@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,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming-ASR pipeline adapter (item A1 / W7).
|
|
3
|
+
*
|
|
4
|
+
* The base `VoicePipeline` in `voice/pipeline.ts` drives a `StreamingTranscriber`
|
|
5
|
+
* as a batch: it pushes the WHOLE VAD-gated utterance buffer in a single
|
|
6
|
+
* `feed()` call, awaits `flush()`, and only then splits the final transcript
|
|
7
|
+
* into tokens for the drafter/verifier loop. That works for the fused
|
|
8
|
+
* batch decoder, but it leaves the biggest
|
|
9
|
+
* H2 UX seam (incremental partials → planner / barge-in word-confirm /
|
|
10
|
+
* speculative-on-pause) untapped when the fused build is in streaming mode.
|
|
11
|
+
*
|
|
12
|
+
* Rather than rewrite `pipeline.ts` (the Phase 0/1 agent owns it), this
|
|
13
|
+
* module is a small WRAPPER the engine bridge can use to deliver PCM
|
|
14
|
+
* chunks to a `StreamingTranscriber` as they arrive from the mic / VAD,
|
|
15
|
+
* surface every `partial` event to the turn controller via `onPartial`,
|
|
16
|
+
* and only finalize on `speech-end`. Behind a flag — when the fused
|
|
17
|
+
* library advertises `asrStreamSupported() === false` or the flag is off
|
|
18
|
+
* the caller keeps using `VoicePipeline.transcribeAll` exactly as today.
|
|
19
|
+
*
|
|
20
|
+
* Integration point (documented for the Phase 0/1 agent so they can wire
|
|
21
|
+
* it without merge friction):
|
|
22
|
+
*
|
|
23
|
+
* 1. `EngineVoiceBridge` decides whether streaming is available via
|
|
24
|
+
* `pickStreamingMode({ ffi, asrBundlePresent, flag })`. When the
|
|
25
|
+
* mode is `"streaming"`, the bridge constructs `StreamingAsrFeeder`
|
|
26
|
+
* once per turn (passing the same transcriber that would have been
|
|
27
|
+
* handed to `VoicePipeline`) and routes mic PCM frames through
|
|
28
|
+
* `feeder.feedFrame(frame)` instead of buffering them.
|
|
29
|
+
* 2. The feeder forwards every transcriber `partial` event to
|
|
30
|
+
* `onPartial(update)`. When VAD reports `speech-end` the caller
|
|
31
|
+
* calls `await feeder.finalize()`; the returned `TranscriptUpdate`
|
|
32
|
+
* is the final and is used to seed the drafter/verifier loop exactly
|
|
33
|
+
* as before (`splitTranscriptToTokens(final.partial, 0, final.tokens)`).
|
|
34
|
+
* 3. The batch path (`VoicePipeline.transcribeAll`) is unchanged for
|
|
35
|
+
* every other adapter — there is no fork in `pipeline.ts` itself.
|
|
36
|
+
*
|
|
37
|
+
* This file is intentionally small and side-effect-free so it can land
|
|
38
|
+
* during the merge window without touching files other agents own.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import { splitTranscriptToTokens } from "../pipeline";
|
|
42
|
+
import type {
|
|
43
|
+
PcmFrame,
|
|
44
|
+
StreamingTranscriber,
|
|
45
|
+
TextToken,
|
|
46
|
+
TranscriptUpdate,
|
|
47
|
+
} from "../types";
|
|
48
|
+
|
|
49
|
+
/* ==================================================================== *
|
|
50
|
+
* LocalAgreementBuffer — word-level streaming-ASR partial stabilizer.
|
|
51
|
+
*
|
|
52
|
+
* Streaming ASR emits a fresh word-sequence hypothesis on every audio
|
|
53
|
+
* frame. Individual words near the end of the hypothesis can change
|
|
54
|
+
* across frames ("sat" → "cap" → "sat") before settling. This buffer
|
|
55
|
+
* applies LocalAgreement-n (n=2 default) at the word level: a word is
|
|
56
|
+
* emitted to downstream only when it appears at the same position in n
|
|
57
|
+
* consecutive hypotheses. The committed stable prefix is monotonically
|
|
58
|
+
* non-decreasing — once a word is committed it is never retracted.
|
|
59
|
+
*
|
|
60
|
+
* Word-level (not character-level): suited for the VAD pipeline adapter
|
|
61
|
+
* where downstream consumers (drafter, verifier) operate on word tokens.
|
|
62
|
+
* For the character-level prefix variant, see `partial-stabilizer.ts`.
|
|
63
|
+
* ==================================================================== */
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* LocalAgreement-n word-level partial stabilizer.
|
|
67
|
+
*
|
|
68
|
+
* Usage:
|
|
69
|
+
* const buf = new LocalAgreementBuffer();
|
|
70
|
+
* const stable = buf.stable(["hello", "there", "world"]);
|
|
71
|
+
* // → [] on first call (need n=2 consecutive identical prefix)
|
|
72
|
+
* const stable2 = buf.stable(["hello", "there", "how"]);
|
|
73
|
+
* // → ["hello", "there"] (matched across two consecutive hypotheses)
|
|
74
|
+
*/
|
|
75
|
+
export class LocalAgreementBuffer {
|
|
76
|
+
private readonly n: number;
|
|
77
|
+
/** Rolling window of the last `n` hypotheses, oldest first. */
|
|
78
|
+
private window: string[][] = [];
|
|
79
|
+
/** Monotonically growing committed word list. */
|
|
80
|
+
private committed: string[] = [];
|
|
81
|
+
|
|
82
|
+
constructor(n = 2) {
|
|
83
|
+
if (!Number.isFinite(n) || n < 1) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`[LocalAgreementBuffer] n must be a finite integer >= 1; got ${String(n)}`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
this.n = Math.floor(n);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Feed the latest word-level hypothesis. Returns the stable committed
|
|
93
|
+
* prefix — the longest leading word sequence that has appeared
|
|
94
|
+
* identically in `n` consecutive calls. Monotonically non-decreasing.
|
|
95
|
+
*
|
|
96
|
+
* A rolling window of the last `n` hypotheses is maintained. Once the
|
|
97
|
+
* window is full, the agreed prefix is the intersection across all `n`
|
|
98
|
+
* entries — word i is in the agreed prefix only if it is identical in
|
|
99
|
+
* every hypothesis in the window.
|
|
100
|
+
*/
|
|
101
|
+
stable(current: string[]): string[] {
|
|
102
|
+
this.window.push(current);
|
|
103
|
+
if (this.window.length > this.n) {
|
|
104
|
+
this.window.shift();
|
|
105
|
+
}
|
|
106
|
+
// Need a full window of `n` hypotheses before any word can be agreed.
|
|
107
|
+
if (this.window.length < this.n) {
|
|
108
|
+
return this.committed;
|
|
109
|
+
}
|
|
110
|
+
// Intersect: the agreed prefix is the longest common leading prefix
|
|
111
|
+
// across all entries in the window.
|
|
112
|
+
const first = this.window[0];
|
|
113
|
+
if (!first) {
|
|
114
|
+
throw new Error("hypothesis window unexpectedly empty");
|
|
115
|
+
}
|
|
116
|
+
let agreedLen = first.length;
|
|
117
|
+
for (let i = 1; i < this.window.length; i++) {
|
|
118
|
+
const h = this.window[i];
|
|
119
|
+
if (!h) {
|
|
120
|
+
throw new Error(`missing hypothesis at index ${i}`);
|
|
121
|
+
}
|
|
122
|
+
let matchLen = 0;
|
|
123
|
+
const limit = Math.min(agreedLen, h.length);
|
|
124
|
+
for (let j = 0; j < limit; j++) {
|
|
125
|
+
if (first[j] === h[j]) matchLen++;
|
|
126
|
+
else break;
|
|
127
|
+
}
|
|
128
|
+
agreedLen = matchLen;
|
|
129
|
+
if (agreedLen === 0) break;
|
|
130
|
+
}
|
|
131
|
+
// Extend committed if the new agreement is longer.
|
|
132
|
+
if (agreedLen > this.committed.length) {
|
|
133
|
+
this.committed = first.slice(0, agreedLen);
|
|
134
|
+
}
|
|
135
|
+
return this.committed;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Clear all state. Call at utterance boundaries. */
|
|
139
|
+
reset(): void {
|
|
140
|
+
this.window = [];
|
|
141
|
+
this.committed = [];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** The current committed stable word list (read-only view). */
|
|
145
|
+
getCommitted(): string[] {
|
|
146
|
+
return this.committed;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Available transcription drive modes. */
|
|
151
|
+
export type StreamingPipelineMode = "streaming" | "batch";
|
|
152
|
+
|
|
153
|
+
export interface PickStreamingModeArgs {
|
|
154
|
+
/** True only when the loaded fused library advertises a working streaming decoder. */
|
|
155
|
+
ffiSupportsStreaming: boolean;
|
|
156
|
+
/** True only when the bundled ASR model is present on disk. */
|
|
157
|
+
asrBundlePresent: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* Feature flag — defaults to FALSE so the streaming path stays opt-in
|
|
160
|
+
* until the Phase 0/1 partial-stabilizer wiring lands. Once that lands
|
|
161
|
+
* the engine bridge flips this default to true.
|
|
162
|
+
*/
|
|
163
|
+
enableStreaming: boolean;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Choose the transcription drive mode. Streaming is selected only when:
|
|
168
|
+
* - the loaded fused library advertises a working streaming decoder
|
|
169
|
+
* (`asr_stream_supported() === 1`), AND
|
|
170
|
+
* - the bundled ASR model is present, AND
|
|
171
|
+
* - the engine bridge has opted in via `enableStreaming`.
|
|
172
|
+
*
|
|
173
|
+
* Any other combination falls back to the existing batch path
|
|
174
|
+
* (`VoicePipeline.transcribeAll`).
|
|
175
|
+
*/
|
|
176
|
+
export function pickStreamingMode(
|
|
177
|
+
args: PickStreamingModeArgs,
|
|
178
|
+
): StreamingPipelineMode {
|
|
179
|
+
if (!args.enableStreaming) return "batch";
|
|
180
|
+
if (!args.ffiSupportsStreaming) return "batch";
|
|
181
|
+
if (!args.asrBundlePresent) return "batch";
|
|
182
|
+
return "streaming";
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export interface StreamingAsrFeederEvents {
|
|
186
|
+
/**
|
|
187
|
+
* Called for every transcriber `partial` event the feeder observes
|
|
188
|
+
* BEFORE the segment is finalized. Includes the running `partial`
|
|
189
|
+
* text, `isFinal: false`, and (when the fused build supplied them)
|
|
190
|
+
* the shared text-model token ids.
|
|
191
|
+
*/
|
|
192
|
+
onPartial?(update: TranscriptUpdate): void;
|
|
193
|
+
/**
|
|
194
|
+
* Called the first time ≥1 real word is recognized in the segment.
|
|
195
|
+
* Wired into the turn controller's word-confirm gate so the agent
|
|
196
|
+
* only barge-in-cancels on real speech, not blips.
|
|
197
|
+
*/
|
|
198
|
+
onWords?(words: ReadonlyArray<string>): void;
|
|
199
|
+
/**
|
|
200
|
+
* Called once, after `finalize()` returns, with the final transcript
|
|
201
|
+
* split into contiguous text tokens (`splitTranscriptToTokens`). The
|
|
202
|
+
* batch path delivers the same shape via `transcribeAll`, so the
|
|
203
|
+
* downstream drafter/verifier loop sees an identical signal.
|
|
204
|
+
*/
|
|
205
|
+
onFinalTokens?(
|
|
206
|
+
tokens: ReadonlyArray<TextToken>,
|
|
207
|
+
final: TranscriptUpdate,
|
|
208
|
+
): void;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Drives a `StreamingTranscriber` chunk-by-chunk on behalf of the engine
|
|
213
|
+
* bridge / turn controller. One instance per active speech segment;
|
|
214
|
+
* `finalize()` returns the final transcript and the feeder is disposed.
|
|
215
|
+
*
|
|
216
|
+
* Construction takes a `StreamingTranscriber` (already constructed via
|
|
217
|
+
* `createStreamingTranscriber` with the same options used for batch).
|
|
218
|
+
* The feeder does NOT own the transcriber's lifecycle — disposal still
|
|
219
|
+
* runs through the engine bridge so the same path is used when the
|
|
220
|
+
* batch fallback is taken.
|
|
221
|
+
*/
|
|
222
|
+
export class StreamingAsrFeeder {
|
|
223
|
+
private readonly transcriber: StreamingTranscriber;
|
|
224
|
+
private readonly events: StreamingAsrFeederEvents;
|
|
225
|
+
private latestPartial: TranscriptUpdate | null = null;
|
|
226
|
+
private finalized = false;
|
|
227
|
+
private unsubscribe: (() => void) | null = null;
|
|
228
|
+
|
|
229
|
+
constructor(args: {
|
|
230
|
+
transcriber: StreamingTranscriber;
|
|
231
|
+
events?: StreamingAsrFeederEvents;
|
|
232
|
+
}) {
|
|
233
|
+
this.transcriber = args.transcriber;
|
|
234
|
+
this.events = args.events ?? {};
|
|
235
|
+
this.unsubscribe = this.transcriber.on((event) => {
|
|
236
|
+
switch (event.kind) {
|
|
237
|
+
case "partial":
|
|
238
|
+
this.latestPartial = event.update;
|
|
239
|
+
this.events.onPartial?.(event.update);
|
|
240
|
+
break;
|
|
241
|
+
case "words":
|
|
242
|
+
this.events.onWords?.(event.words);
|
|
243
|
+
break;
|
|
244
|
+
case "final":
|
|
245
|
+
// Final events are surfaced via `finalize()`'s return value so
|
|
246
|
+
// the caller has a single point of truth. We do not re-emit
|
|
247
|
+
// them here.
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Feed one PCM frame as it arrives from the mic / connector. Drops
|
|
255
|
+
* frames received after `finalize()` (the segment is over).
|
|
256
|
+
*/
|
|
257
|
+
feedFrame(frame: PcmFrame): void {
|
|
258
|
+
if (this.finalized) return;
|
|
259
|
+
this.transcriber.feed(frame);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Force-finalize on `speech-end`. Resolves with the final transcript
|
|
264
|
+
* and emits `onFinalTokens` so the caller can seed the drafter /
|
|
265
|
+
* verifier loop without re-running the surface split itself.
|
|
266
|
+
*
|
|
267
|
+
* Calling `finalize()` twice is a hard error — the segment is over.
|
|
268
|
+
*/
|
|
269
|
+
async finalize(): Promise<TranscriptUpdate> {
|
|
270
|
+
if (this.finalized) {
|
|
271
|
+
throw new Error(
|
|
272
|
+
"[streaming-asr] finalize() called twice on the same feeder",
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
this.finalized = true;
|
|
276
|
+
const final = await this.transcriber.flush();
|
|
277
|
+
const tokens = splitTranscriptToTokens(final.partial, 0, final.tokens);
|
|
278
|
+
this.events.onFinalTokens?.(tokens, final);
|
|
279
|
+
return final;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/** The most recent `partial` snapshot observed, or `null` until the first decode lands. */
|
|
283
|
+
getLatestPartial(): TranscriptUpdate | null {
|
|
284
|
+
return this.latestPartial;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** Detach the transcriber subscription. Does NOT dispose the transcriber itself. */
|
|
288
|
+
dispose(): void {
|
|
289
|
+
this.unsubscribe?.();
|
|
290
|
+
this.unsubscribe = null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { WavFileAudioSink } from "./system-audio-sink";
|
|
6
|
+
|
|
7
|
+
describe("WavFileAudioSink", () => {
|
|
8
|
+
it("drain resets buffered samples without dropping artifact chunks", async () => {
|
|
9
|
+
const dir = mkdtempSync(path.join(tmpdir(), "eliza-audio-sink-"));
|
|
10
|
+
const filePath = path.join(dir, "out.wav");
|
|
11
|
+
try {
|
|
12
|
+
const sink = new WavFileAudioSink({ sampleRate: 24_000, filePath });
|
|
13
|
+
sink.write(new Float32Array([0.1, 0.2, 0.3]), 24_000);
|
|
14
|
+
expect(sink.bufferedSamples()).toBe(3);
|
|
15
|
+
|
|
16
|
+
sink.drain();
|
|
17
|
+
expect(sink.bufferedSamples()).toBe(0);
|
|
18
|
+
await sink.finalize();
|
|
19
|
+
|
|
20
|
+
const wav = readFileSync(filePath);
|
|
21
|
+
expect(wav.subarray(0, 4).toString("ascii")).toBe("RIFF");
|
|
22
|
+
expect(wav.subarray(8, 12).toString("ascii")).toBe("WAVE");
|
|
23
|
+
expect(wav.readUInt32LE(40)).toBe(6);
|
|
24
|
+
expect(wav.length).toBe(50);
|
|
25
|
+
} finally {
|
|
26
|
+
rmSync(dir, { recursive: true, force: true });
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System audio sinks for the interactive voice harness.
|
|
3
|
+
*
|
|
4
|
+
* The voice scheduler writes synthesized PCM (`Float32Array` mono in
|
|
5
|
+
* [-1, 1] at the bridge sample rate) into an {@link AudioSink}. For tests
|
|
6
|
+
* and headless runs `InMemoryAudioSink` (in `./ring-buffer`) captures the
|
|
7
|
+
* samples; for an interactive session the harness needs the audio to
|
|
8
|
+
* actually come out of the speakers.
|
|
9
|
+
*
|
|
10
|
+
* `SystemAudioSink` shells out to a long-lived player that reads raw 16-bit
|
|
11
|
+
* signed-LE PCM on stdin. Per-platform selection (priority order):
|
|
12
|
+
* - Linux: `aplay` (alsa-utils), else `paplay` (PulseAudio), else
|
|
13
|
+
* `play`/`sox` (sox), else `ffplay` (ffmpeg).
|
|
14
|
+
* - macOS: `play`/`sox` (sox), else `ffplay` (ffmpeg). `afplay` needs a
|
|
15
|
+
* file (no stdin) so it cannot be used for streaming.
|
|
16
|
+
* - Windows: `ffplay` (ffmpeg), else `play`/`sox` if installed. PowerShell's
|
|
17
|
+
* `Media.SoundPlayer` also needs a file, not a stream, so it's not
|
|
18
|
+
* used here — the renderer's `AudioContext` path (feeding nothing
|
|
19
|
+
* here; the renderer plays directly) is the no-ffmpeg route.
|
|
20
|
+
* If no player is on `PATH`, `available()` returns false and the harness
|
|
21
|
+
* falls back to `WavFileAudioSink` (writes a rolling WAV) — never silence.
|
|
22
|
+
*
|
|
23
|
+
* `WavFileAudioSink` accumulates everything written and serializes a
|
|
24
|
+
* single mono PCM16 WAV on `finalize()` — used by `--no-audio` and as the
|
|
25
|
+
* no-player fallback.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { type ChildProcessByStdio, spawn } from "node:child_process";
|
|
29
|
+
import { existsSync } from "node:fs";
|
|
30
|
+
import fs from "node:fs/promises";
|
|
31
|
+
import path from "node:path";
|
|
32
|
+
import process from "node:process";
|
|
33
|
+
import type { Writable } from "node:stream";
|
|
34
|
+
import type { AudioSink } from "./types";
|
|
35
|
+
|
|
36
|
+
function which(bin: string): string | null {
|
|
37
|
+
const pathEnv = process.env.PATH ?? "";
|
|
38
|
+
const exts =
|
|
39
|
+
process.platform === "win32" ? [".exe", ".cmd", ".bat", ""] : [""];
|
|
40
|
+
for (const dir of pathEnv.split(path.delimiter)) {
|
|
41
|
+
for (const ext of exts) {
|
|
42
|
+
const candidate = path.join(dir, bin + ext);
|
|
43
|
+
if (existsSync(candidate)) return candidate;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function floatToPcm16(pcm: Float32Array): Buffer {
|
|
50
|
+
const out = Buffer.allocUnsafe(pcm.length * 2);
|
|
51
|
+
for (let i = 0; i < pcm.length; i++) {
|
|
52
|
+
let s = pcm[i];
|
|
53
|
+
if (s > 1) s = 1;
|
|
54
|
+
else if (s < -1) s = -1;
|
|
55
|
+
out.writeInt16LE((s * 0x7fff) | 0, i * 2);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function soxRawArgs(sampleRate: number): string[] {
|
|
61
|
+
return [
|
|
62
|
+
"-q",
|
|
63
|
+
"-t",
|
|
64
|
+
"raw",
|
|
65
|
+
"-r",
|
|
66
|
+
String(sampleRate),
|
|
67
|
+
"-e",
|
|
68
|
+
"signed",
|
|
69
|
+
"-b",
|
|
70
|
+
"16",
|
|
71
|
+
"-c",
|
|
72
|
+
"1",
|
|
73
|
+
"-",
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function ffplayRawArgs(sampleRate: number): string[] {
|
|
78
|
+
// ffplay reads raw PCM with -f s16le; -nodisp suppresses the window,
|
|
79
|
+
// -autoexit quits at EOF, -i - reads stdin.
|
|
80
|
+
return [
|
|
81
|
+
"-loglevel",
|
|
82
|
+
"error",
|
|
83
|
+
"-nodisp",
|
|
84
|
+
"-autoexit",
|
|
85
|
+
"-f",
|
|
86
|
+
"s16le",
|
|
87
|
+
"-ar",
|
|
88
|
+
String(sampleRate),
|
|
89
|
+
"-ac",
|
|
90
|
+
"1",
|
|
91
|
+
"-i",
|
|
92
|
+
"-",
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Pick a CLI player that reads raw PCM16-LE on stdin, for the host platform. */
|
|
97
|
+
function resolvePlayer(
|
|
98
|
+
sampleRate: number,
|
|
99
|
+
): { bin: string; args: string[] } | null {
|
|
100
|
+
if (process.platform === "linux") {
|
|
101
|
+
const aplay = which("aplay");
|
|
102
|
+
if (aplay) {
|
|
103
|
+
return {
|
|
104
|
+
bin: aplay,
|
|
105
|
+
args: [
|
|
106
|
+
"-q",
|
|
107
|
+
"-f",
|
|
108
|
+
"S16_LE",
|
|
109
|
+
"-c",
|
|
110
|
+
"1",
|
|
111
|
+
"-r",
|
|
112
|
+
String(sampleRate),
|
|
113
|
+
"-t",
|
|
114
|
+
"raw",
|
|
115
|
+
"-",
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const paplay = which("paplay");
|
|
120
|
+
if (paplay) {
|
|
121
|
+
return {
|
|
122
|
+
bin: paplay,
|
|
123
|
+
args: [
|
|
124
|
+
"--raw",
|
|
125
|
+
`--format=s16le`,
|
|
126
|
+
"--channels=1",
|
|
127
|
+
`--rate=${sampleRate}`,
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const play = which("play");
|
|
132
|
+
if (play) return { bin: play, args: soxRawArgs(sampleRate) };
|
|
133
|
+
const sox = which("sox");
|
|
134
|
+
if (sox) return { bin: sox, args: [...soxRawArgs(sampleRate), "-d"] };
|
|
135
|
+
const ffplay = which("ffplay");
|
|
136
|
+
if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
if (process.platform === "darwin") {
|
|
140
|
+
// `afplay` needs a file (no stdin), so it can't stream — use sox/ffplay.
|
|
141
|
+
const play = which("play");
|
|
142
|
+
if (play) return { bin: play, args: soxRawArgs(sampleRate) };
|
|
143
|
+
const sox = which("sox");
|
|
144
|
+
if (sox) return { bin: sox, args: [...soxRawArgs(sampleRate), "-d"] };
|
|
145
|
+
const ffplay = which("ffplay");
|
|
146
|
+
if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
if (process.platform === "win32") {
|
|
150
|
+
const ffplay = which("ffplay");
|
|
151
|
+
if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
|
|
152
|
+
const play = which("play");
|
|
153
|
+
if (play) return { bin: play, args: soxRawArgs(sampleRate) };
|
|
154
|
+
const sox = which("sox");
|
|
155
|
+
if (sox) return { bin: sox, args: [...soxRawArgs(sampleRate), "-d"] };
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
// Other (BSD, etc.) — best-effort sox/ffplay.
|
|
159
|
+
const play = which("play");
|
|
160
|
+
if (play) return { bin: play, args: soxRawArgs(sampleRate) };
|
|
161
|
+
const ffplay = which("ffplay");
|
|
162
|
+
if (ffplay) return { bin: ffplay, args: ffplayRawArgs(sampleRate) };
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Exported view of {@link resolvePlayer} for the cross-platform preflight
|
|
168
|
+
* (`voice:interactive --platform-report`). Returns the bare program name
|
|
169
|
+
* (no args) the host would stream synthesized audio to, or `null`.
|
|
170
|
+
*/
|
|
171
|
+
export function resolveSystemPlayerName(sampleRate = 24_000): string | null {
|
|
172
|
+
const spec = resolvePlayer(sampleRate);
|
|
173
|
+
return spec ? path.basename(spec.bin) : null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export interface SystemAudioSinkOptions {
|
|
177
|
+
sampleRate: number;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Streams synthesized PCM to a long-lived CLI player (`aplay` / `paplay` /
|
|
182
|
+
* sox `play`). `write()` is non-blocking — PCM is buffered into the
|
|
183
|
+
* player's stdin pipe. `drain()` is a barge-in hook: it kills the current
|
|
184
|
+
* player so queued audio stops within a tick, then a fresh player is
|
|
185
|
+
* spawned lazily on the next `write()`.
|
|
186
|
+
*/
|
|
187
|
+
type StdinPipeProcess = ChildProcessByStdio<Writable, null, null>;
|
|
188
|
+
|
|
189
|
+
export class SystemAudioSink implements AudioSink {
|
|
190
|
+
private readonly sampleRate: number;
|
|
191
|
+
private readonly playerSpec: { bin: string; args: string[] } | null;
|
|
192
|
+
private proc: StdinPipeProcess | null = null;
|
|
193
|
+
private buffered = 0;
|
|
194
|
+
|
|
195
|
+
constructor(opts: SystemAudioSinkOptions) {
|
|
196
|
+
this.sampleRate = opts.sampleRate;
|
|
197
|
+
this.playerSpec = resolvePlayer(opts.sampleRate);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
available(): boolean {
|
|
201
|
+
return this.playerSpec !== null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
player(): string {
|
|
205
|
+
return this.playerSpec ? path.basename(this.playerSpec.bin) : "(none)";
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private ensureProc(): StdinPipeProcess | null {
|
|
209
|
+
if (!this.playerSpec) return null;
|
|
210
|
+
if (this.proc && !this.proc.killed && this.proc.exitCode === null)
|
|
211
|
+
return this.proc;
|
|
212
|
+
const child = spawn(this.playerSpec.bin, this.playerSpec.args, {
|
|
213
|
+
stdio: ["pipe", "ignore", "ignore"] as const,
|
|
214
|
+
});
|
|
215
|
+
child.on("error", () => {
|
|
216
|
+
// Player vanished mid-stream — drop it; next write retries.
|
|
217
|
+
if (this.proc === child) this.proc = null;
|
|
218
|
+
});
|
|
219
|
+
child.on("exit", () => {
|
|
220
|
+
if (this.proc === child) this.proc = null;
|
|
221
|
+
this.buffered = 0;
|
|
222
|
+
});
|
|
223
|
+
this.proc = child;
|
|
224
|
+
return child;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
write(pcm: Float32Array, _sampleRate: number): void {
|
|
228
|
+
const child = this.ensureProc();
|
|
229
|
+
if (!child?.stdin.writable) return;
|
|
230
|
+
const bytes = floatToPcm16(pcm);
|
|
231
|
+
this.buffered += pcm.length;
|
|
232
|
+
child.stdin.write(bytes, () => {
|
|
233
|
+
this.buffered = Math.max(0, this.buffered - pcm.length);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
drain(): void {
|
|
238
|
+
// Barge-in: stop the player immediately. The next write spawns a fresh
|
|
239
|
+
// one so the new turn's audio isn't queued behind cancelled audio.
|
|
240
|
+
if (this.proc) {
|
|
241
|
+
try {
|
|
242
|
+
this.proc.stdin.destroy();
|
|
243
|
+
} catch {
|
|
244
|
+
/* ignore */
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
this.proc.kill("SIGKILL");
|
|
248
|
+
} catch {
|
|
249
|
+
/* ignore */
|
|
250
|
+
}
|
|
251
|
+
this.proc = null;
|
|
252
|
+
}
|
|
253
|
+
this.buffered = 0;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
bufferedSamples(): number {
|
|
257
|
+
return this.buffered;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Flush + close the player. Idempotent. */
|
|
261
|
+
async dispose(): Promise<void> {
|
|
262
|
+
const child = this.proc;
|
|
263
|
+
this.proc = null;
|
|
264
|
+
if (!child) return;
|
|
265
|
+
await new Promise<void>((resolve) => {
|
|
266
|
+
let done = false;
|
|
267
|
+
const finish = () => {
|
|
268
|
+
if (done) return;
|
|
269
|
+
done = true;
|
|
270
|
+
resolve();
|
|
271
|
+
};
|
|
272
|
+
child.on("exit", finish);
|
|
273
|
+
child.on("error", finish);
|
|
274
|
+
try {
|
|
275
|
+
child.stdin.end();
|
|
276
|
+
} catch {
|
|
277
|
+
finish();
|
|
278
|
+
}
|
|
279
|
+
// Don't hang on a stuck player.
|
|
280
|
+
setTimeout(() => {
|
|
281
|
+
try {
|
|
282
|
+
child.kill("SIGKILL");
|
|
283
|
+
} catch {
|
|
284
|
+
/* ignore */
|
|
285
|
+
}
|
|
286
|
+
finish();
|
|
287
|
+
}, 1500);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export interface WavFileAudioSinkOptions {
|
|
293
|
+
sampleRate: number;
|
|
294
|
+
filePath: string;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Accumulates all written PCM and serializes a single mono PCM16 WAV on
|
|
299
|
+
* {@link finalize}. Used by `--no-audio` and as the no-player fallback so
|
|
300
|
+
* a headless run still produces an inspectable artifact (never silence).
|
|
301
|
+
*/
|
|
302
|
+
export class WavFileAudioSink implements AudioSink {
|
|
303
|
+
private readonly sampleRate: number;
|
|
304
|
+
private readonly filePath: string;
|
|
305
|
+
private readonly chunks: Float32Array[] = [];
|
|
306
|
+
private buffered = 0;
|
|
307
|
+
|
|
308
|
+
constructor(opts: WavFileAudioSinkOptions) {
|
|
309
|
+
this.sampleRate = opts.sampleRate;
|
|
310
|
+
this.filePath = opts.filePath;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
write(pcm: Float32Array, _sampleRate: number): void {
|
|
314
|
+
this.chunks.push(pcm.slice());
|
|
315
|
+
this.buffered += pcm.length;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
drain(): void {
|
|
319
|
+
// The WAV sink keeps everything (it's an artifact, not a live stream),
|
|
320
|
+
// so `drain()` only resets the "buffered" counter the scheduler reads.
|
|
321
|
+
this.buffered = 0;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
bufferedSamples(): number {
|
|
325
|
+
return this.buffered;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
totalSamples(): number {
|
|
329
|
+
let n = 0;
|
|
330
|
+
for (const c of this.chunks) n += c.length;
|
|
331
|
+
return n;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
async finalize(): Promise<string> {
|
|
335
|
+
const total = this.totalSamples();
|
|
336
|
+
const dataBytes = total * 2;
|
|
337
|
+
const header = Buffer.allocUnsafe(44);
|
|
338
|
+
header.write("RIFF", 0, "ascii");
|
|
339
|
+
header.writeUInt32LE(36 + dataBytes, 4);
|
|
340
|
+
header.write("WAVE", 8, "ascii");
|
|
341
|
+
header.write("fmt ", 12, "ascii");
|
|
342
|
+
header.writeUInt32LE(16, 16); // PCM fmt chunk size
|
|
343
|
+
header.writeUInt16LE(1, 20); // PCM
|
|
344
|
+
header.writeUInt16LE(1, 22); // mono
|
|
345
|
+
header.writeUInt32LE(this.sampleRate, 24);
|
|
346
|
+
header.writeUInt32LE(this.sampleRate * 2, 28); // byte rate
|
|
347
|
+
header.writeUInt16LE(2, 32); // block align
|
|
348
|
+
header.writeUInt16LE(16, 34); // bits per sample
|
|
349
|
+
header.write("data", 36, "ascii");
|
|
350
|
+
header.writeUInt32LE(dataBytes, 40);
|
|
351
|
+
const body = Buffer.allocUnsafe(dataBytes);
|
|
352
|
+
let off = 0;
|
|
353
|
+
for (const chunk of this.chunks) {
|
|
354
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
355
|
+
let s = chunk[i];
|
|
356
|
+
if (s > 1) s = 1;
|
|
357
|
+
else if (s < -1) s = -1;
|
|
358
|
+
body.writeInt16LE((s * 0x7fff) | 0, off);
|
|
359
|
+
off += 2;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
363
|
+
await fs.writeFile(this.filePath, Buffer.concat([header, body]));
|
|
364
|
+
return this.filePath;
|
|
365
|
+
}
|
|
366
|
+
}
|