@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,651 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AudioFrameConsumer — turn the Android `audioFrame` PCM stream into live,
|
|
3
|
+
* VAD-segmented, speaker-attributed voice turns.
|
|
4
|
+
*
|
|
5
|
+
* The Android native capture path (`plugin-native-talkmode`) streams an
|
|
6
|
+
* `audioFrame` Capacitor event: base64 little-endian s16 mono PCM at 16 kHz,
|
|
7
|
+
* 20 ms per frame, plus `{ sampleRate, channels, samples, rms, timestamp,
|
|
8
|
+
* frameIndex }`. This module is the platform-agnostic consumer that subscribes
|
|
9
|
+
* to that stream (wherever the bun:ffi voice libs are present) and runs:
|
|
10
|
+
*
|
|
11
|
+
* audioFrame (base64 LE-s16) → decode → VadDetector (turn segmentation)
|
|
12
|
+
* → on speech-end: VoiceAttributionPipeline.attribute(turn PCM)
|
|
13
|
+
* → handleLiveVoiceAttribution → VOICE_TURN_OBSERVED + voiceTurnSignal
|
|
14
|
+
*
|
|
15
|
+
* Design notes:
|
|
16
|
+
* - It does NOT reinvent VAD: it drives the existing `VadDetector` state
|
|
17
|
+
* machine (`speech-start` / `speech-pause` / `speech-end`), reusing its
|
|
18
|
+
* Silero onset/offset/hangover logic. It buffers the turn's PCM between
|
|
19
|
+
* `speech-start` and `speech-end`, then attributes the whole utterance.
|
|
20
|
+
* - Every native dependency (`VadDetector`, `VoiceAttributionPipeline`, the
|
|
21
|
+
* runtime) is INJECTED, so the consumer is fully unit-testable with fakes
|
|
22
|
+
* and has no static import of bun:ffi. A `build*` factory in the smoke
|
|
23
|
+
* harness wires the real ggml-backed deps.
|
|
24
|
+
* - The decode boundary (`decodeAudioFramePcm`) is the ONLY place that knows
|
|
25
|
+
* the wire format (base64 LE-s16). Internally everything is Float32 [-1,1].
|
|
26
|
+
*
|
|
27
|
+
* What this module does NOT do: it does not transcribe (ASR text is the
|
|
28
|
+
* separate streaming-ASR path) and it does not own the WebView→agent
|
|
29
|
+
* transport — see `android/AUDIO_FRAMES.md` and `LIVE_PIPELINE.md` for the
|
|
30
|
+
* remaining device wiring.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import {
|
|
34
|
+
type EmitVoiceTurnObservedArgs,
|
|
35
|
+
type HandleLiveVoiceAttributionOptions,
|
|
36
|
+
handleLiveVoiceAttribution,
|
|
37
|
+
} from "../../runtime/voice-entity-binding.js";
|
|
38
|
+
import type { VoiceTurnSignal } from "./eot-classifier.js";
|
|
39
|
+
import {
|
|
40
|
+
NlmsEchoCanceller,
|
|
41
|
+
type ResidualSuppressionOptions,
|
|
42
|
+
} from "./nlms-echo-canceller.js";
|
|
43
|
+
import type {
|
|
44
|
+
VoiceAttributionOutput,
|
|
45
|
+
VoiceAttributionPipeline,
|
|
46
|
+
} from "./speaker/attribution-pipeline.js";
|
|
47
|
+
import type { PcmFrame, VadEvent, VoiceInputSource } from "./types.js";
|
|
48
|
+
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Wire format → Float32 boundary
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The `audioFrame` event payload, mirroring `TalkModeAudioFrameEvent` in
|
|
55
|
+
* `@elizaos/capacitor-talkmode`. Re-declared structurally here so this
|
|
56
|
+
* package does not take a build dep on the Capacitor plugin.
|
|
57
|
+
*/
|
|
58
|
+
export interface AudioFrameEvent {
|
|
59
|
+
/** Base64-encoded little-endian signed 16-bit mono PCM for this frame. */
|
|
60
|
+
pcm16: string;
|
|
61
|
+
/** Sample rate of the captured PCM in Hz (e.g. 16000). */
|
|
62
|
+
sampleRate: number;
|
|
63
|
+
/** Channel count (always 1 — mono). */
|
|
64
|
+
channels: number;
|
|
65
|
+
/** Number of PCM samples in this frame (`pcm16` byte length / 2). */
|
|
66
|
+
samples: number;
|
|
67
|
+
/** RMS amplitude of this frame, normalized 0..1. */
|
|
68
|
+
rms: number;
|
|
69
|
+
/** Monotonic capture timestamp for this frame, ms. */
|
|
70
|
+
timestamp: number;
|
|
71
|
+
/** Running index of this frame since capture started (0-based). */
|
|
72
|
+
frameIndex: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The sample rate every voice model in this pipeline is dimensioned for. */
|
|
76
|
+
export const AUDIO_FRAME_PIPELINE_SAMPLE_RATE = 16_000;
|
|
77
|
+
|
|
78
|
+
export class AudioFrameDecodeError extends Error {
|
|
79
|
+
constructor(message: string) {
|
|
80
|
+
super(message);
|
|
81
|
+
this.name = "AudioFrameDecodeError";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Decode an `audioFrame` payload into a Float32 [-1, 1] window. This is the
|
|
87
|
+
* single boundary that understands the base64 LE-s16 wire format.
|
|
88
|
+
*
|
|
89
|
+
* The native capture path only ever produces 16 kHz mono; this asserts that
|
|
90
|
+
* invariant rather than resampling silently (the downstream Silero/WeSpeaker
|
|
91
|
+
* graphs are 16 kHz-only — a wrong rate is a bug to surface, not paper over).
|
|
92
|
+
*/
|
|
93
|
+
export function decodeAudioFramePcm(frame: AudioFrameEvent): Float32Array {
|
|
94
|
+
if (frame.channels !== 1) {
|
|
95
|
+
throw new AudioFrameDecodeError(
|
|
96
|
+
`[audio-frame-consumer] expected mono (channels=1); got channels=${frame.channels}`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (frame.sampleRate !== AUDIO_FRAME_PIPELINE_SAMPLE_RATE) {
|
|
100
|
+
throw new AudioFrameDecodeError(
|
|
101
|
+
`[audio-frame-consumer] expected ${AUDIO_FRAME_PIPELINE_SAMPLE_RATE} Hz; got ${frame.sampleRate} Hz. Capture at 16 kHz (startAudioFrames default).`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
const bytes = base64ToBytes(frame.pcm16);
|
|
105
|
+
if (bytes.length % 2 !== 0) {
|
|
106
|
+
throw new AudioFrameDecodeError(
|
|
107
|
+
`[audio-frame-consumer] PCM byte length ${bytes.length} is odd — not a whole number of s16 samples`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const sampleCount = bytes.length >> 1;
|
|
111
|
+
// Read LE-s16 over the decoded bytes. A DataView reads the bytes regardless
|
|
112
|
+
// of the host's native endianness, so this is correct on any platform.
|
|
113
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
114
|
+
const out = new Float32Array(sampleCount);
|
|
115
|
+
for (let i = 0; i < sampleCount; i += 1) {
|
|
116
|
+
out[i] = view.getInt16(i * 2, true) / 32_768;
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Decode base64 → bytes without assuming a runtime global. Prefers Node/Bun
|
|
123
|
+
* `Buffer`; falls back to `atob` (browsers / web workers).
|
|
124
|
+
*/
|
|
125
|
+
function base64ToBytes(b64: string): Uint8Array {
|
|
126
|
+
const maybeBuffer = (
|
|
127
|
+
globalThis as { Buffer?: { from(s: string, enc: string): Uint8Array } }
|
|
128
|
+
).Buffer;
|
|
129
|
+
if (maybeBuffer) {
|
|
130
|
+
const buf = maybeBuffer.from(b64, "base64");
|
|
131
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
132
|
+
}
|
|
133
|
+
const atobFn = (globalThis as { atob?: (s: string) => string }).atob;
|
|
134
|
+
if (!atobFn) {
|
|
135
|
+
throw new AudioFrameDecodeError(
|
|
136
|
+
"[audio-frame-consumer] no base64 decoder available (neither Buffer nor atob)",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
const binary = atobFn(b64);
|
|
140
|
+
const out = new Uint8Array(binary.length);
|
|
141
|
+
for (let i = 0; i < binary.length; i += 1) out[i] = binary.charCodeAt(i);
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// VadDetector structural view (injectable)
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* The structural slice of `VadDetector` the consumer needs. Taking the
|
|
151
|
+
* structural view (not the concrete class) keeps the consumer testable with a
|
|
152
|
+
* fake VAD and avoids pulling the optional native VAD surface into callers
|
|
153
|
+
* that only want to feed frames.
|
|
154
|
+
*/
|
|
155
|
+
export interface VadSegmenter {
|
|
156
|
+
/** True while a speech segment (incl. its pause hangover) is open. */
|
|
157
|
+
readonly inSpeech: boolean;
|
|
158
|
+
/** Subscribe to the authoritative VAD timeline. Returns an unsubscribe fn. */
|
|
159
|
+
onVadEvent(listener: (event: VadEvent) => void): () => void;
|
|
160
|
+
/** Feed one mic frame; resolves once its windows are processed. */
|
|
161
|
+
pushFrame(frame: PcmFrame): Promise<void>;
|
|
162
|
+
/** Flush trailing samples and finalize any open segment. */
|
|
163
|
+
flush(): Promise<void>;
|
|
164
|
+
/** Clear all state at a hard boundary. */
|
|
165
|
+
reset(): void;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* The structural slice of `VoiceAttributionPipeline` the consumer needs.
|
|
170
|
+
*/
|
|
171
|
+
export interface AttributionPipelineLike {
|
|
172
|
+
attribute(
|
|
173
|
+
req: Parameters<VoiceAttributionPipeline["attribute"]>[0],
|
|
174
|
+
): Promise<VoiceAttributionOutput>;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* The structural slice of `IAgentRuntime` the consumer needs:
|
|
179
|
+
* `handleLiveVoiceAttribution` calls `emitEvent`.
|
|
180
|
+
*/
|
|
181
|
+
export interface RuntimeEventSink {
|
|
182
|
+
emitEvent(type: unknown, payload: Record<string, unknown>): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* Optional host-supplied far-end (agent TTS playback) reference for the live
|
|
185
|
+
* AEC path (#9583). When a host wires this, the live diarization route threads
|
|
186
|
+
* it into the session's NLMS echo canceller instead of relying on the
|
|
187
|
+
* playback-frames ingest route. Absent on headless/core runtimes.
|
|
188
|
+
*/
|
|
189
|
+
voiceEchoReferenceProvider?: EchoReferenceProvider;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Transcribe a finalized turn's buffered PCM to text (#8786). When injected, the
|
|
194
|
+
* consumer joins the ASR transcript into the diarization attribution so
|
|
195
|
+
* `VOICE_TURN_OBSERVED` carries the real text — previously the live audio-frame
|
|
196
|
+
* path attributed *who* spoke but always emitted `text: ""`, so name/partner
|
|
197
|
+
* extraction (`VoiceObserver.ingestTurn`) could never fire from live audio.
|
|
198
|
+
*
|
|
199
|
+
* Returns the transcript, or `null`/empty for silence / no decode. Best-effort:
|
|
200
|
+
* the consumer swallows a rejection (counted in `transcriptionErrors`) and falls
|
|
201
|
+
* back to a transcript-less turn rather than dropping the diarized turn.
|
|
202
|
+
*/
|
|
203
|
+
export type TurnTranscriber = (
|
|
204
|
+
pcm: Float32Array,
|
|
205
|
+
sampleRate: number,
|
|
206
|
+
) => Promise<string | null> | string | null;
|
|
207
|
+
|
|
208
|
+
export type SelfVoiceSimilarityResolver = (
|
|
209
|
+
embedding: Float32Array,
|
|
210
|
+
output: VoiceAttributionOutput,
|
|
211
|
+
) => Promise<number | null | undefined> | number | null | undefined;
|
|
212
|
+
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// Consumer
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
|
|
217
|
+
export interface AudioFrameConsumerDeps {
|
|
218
|
+
/** Turn-segmentation VAD (drives speech-start/pause/end). */
|
|
219
|
+
vad: VadSegmenter;
|
|
220
|
+
/** Diarization + speaker-attribution pipeline. */
|
|
221
|
+
pipeline: AttributionPipelineLike;
|
|
222
|
+
/** Runtime event sink for VOICE_TURN_OBSERVED. */
|
|
223
|
+
runtime: RuntimeEventSink;
|
|
224
|
+
/**
|
|
225
|
+
* Optional ASR for the finalized turn's PCM (#8786). When present, its text
|
|
226
|
+
* rides on `VOICE_TURN_OBSERVED` so live name/entity extraction runs. When
|
|
227
|
+
* absent the path stays diarization-only (transcript `""`, as before).
|
|
228
|
+
*/
|
|
229
|
+
transcribe?: TurnTranscriber;
|
|
230
|
+
/**
|
|
231
|
+
* Optional live acoustic self-voice resolver. When wired, the consumer passes
|
|
232
|
+
* the turn's WeSpeaker embedding to the host's agent-TTS centroid matcher and
|
|
233
|
+
* forwards the resulting cosine into the ambient gate.
|
|
234
|
+
*/
|
|
235
|
+
resolveSelfVoiceSimilarity?: SelfVoiceSimilarityResolver;
|
|
236
|
+
/**
|
|
237
|
+
* Optional agent-playback (far-end) reference for acoustic echo cancellation
|
|
238
|
+
* (#9455). Given a mic frame's clock timestamp and sample count, returns the
|
|
239
|
+
* agent's TTS playback PCM for that exact window (Float32 16 kHz), or null
|
|
240
|
+
* when the agent is not playing. When wired, the consumer runs an NLMS echo
|
|
241
|
+
* canceller on every mic frame BEFORE VAD/attribution so the agent never
|
|
242
|
+
* transcribes its own TTS. Absent → no AEC (unchanged behavior). The caller
|
|
243
|
+
* owns the playback capture + the playback→mic delay calibration.
|
|
244
|
+
*/
|
|
245
|
+
echoReference?: EchoReferenceProvider;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Returns the agent's TTS playback PCM (the far-end echo reference) aligned to a
|
|
250
|
+
* mic frame's time window, or null when the agent is silent. See #9455.
|
|
251
|
+
*/
|
|
252
|
+
export type EchoReferenceProvider = (
|
|
253
|
+
timestampMs: number,
|
|
254
|
+
samples: number,
|
|
255
|
+
) => Float32Array | null;
|
|
256
|
+
|
|
257
|
+
export interface AudioFrameConsumerConfig {
|
|
258
|
+
/** Source metadata stamped onto every attributed turn. */
|
|
259
|
+
source?: VoiceInputSource;
|
|
260
|
+
/** Gating options forwarded to `handleLiveVoiceAttribution` per turn. */
|
|
261
|
+
attributionOptions?: HandleLiveVoiceAttributionOptions;
|
|
262
|
+
/**
|
|
263
|
+
* Hard cap on a single buffered turn, in seconds. A speaker who never
|
|
264
|
+
* triggers `speech-end` (e.g. continuous noise) must not grow the buffer
|
|
265
|
+
* without bound. When exceeded the turn is force-finalized. Default 30 s.
|
|
266
|
+
*/
|
|
267
|
+
maxTurnSeconds?: number;
|
|
268
|
+
/**
|
|
269
|
+
* Pre-roll seconds of audio kept before `speech-start` so the onset of the
|
|
270
|
+
* first word (which the VAD only confirms a window or two in) is not clipped
|
|
271
|
+
* out of the attribution buffer. Default 0.3 s.
|
|
272
|
+
*/
|
|
273
|
+
preRollSeconds?: number;
|
|
274
|
+
/**
|
|
275
|
+
* Opt-in nonlinear residual-echo suppressor forwarded to the NLMS canceller
|
|
276
|
+
* (#9583/#9649). Default-off; only meaningful when an `echoReference` is wired
|
|
277
|
+
* (no canceller exists otherwise). See {@link NlmsEchoCancellerOptions.residualSuppression}.
|
|
278
|
+
*/
|
|
279
|
+
residualSuppression?: boolean | ResidualSuppressionOptions;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/** A finalized, attributed turn the consumer surfaces to its caller. */
|
|
283
|
+
export interface AttributedTurn {
|
|
284
|
+
turnId: string;
|
|
285
|
+
output: VoiceAttributionOutput;
|
|
286
|
+
signal: VoiceTurnSignal;
|
|
287
|
+
/** Turn span in the mic-clock (frame `timestamp`) domain. */
|
|
288
|
+
startedAtMs: number;
|
|
289
|
+
endedAtMs: number;
|
|
290
|
+
/** Total buffered turn samples that were attributed. */
|
|
291
|
+
samples: number;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export type AttributedTurnListener = (turn: AttributedTurn) => void;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Drives the `audioFrame` → VAD turn-segmentation → attribution → signal
|
|
298
|
+
* pipeline. One instance per capture session.
|
|
299
|
+
*
|
|
300
|
+
* Frame ingestion is serialized through the injected VAD's `pushFrame`
|
|
301
|
+
* (which itself serializes the Silero forward pass), so `onAudioFrame` is
|
|
302
|
+
* safe to fire-and-forget from a Capacitor event listener; turns surface in
|
|
303
|
+
* order via `onTurn`.
|
|
304
|
+
*/
|
|
305
|
+
export class AudioFrameConsumer {
|
|
306
|
+
private readonly vad: VadSegmenter;
|
|
307
|
+
private readonly pipeline: AttributionPipelineLike;
|
|
308
|
+
private readonly runtime: RuntimeEventSink;
|
|
309
|
+
private readonly transcribe: TurnTranscriber | null;
|
|
310
|
+
private readonly resolveSelfVoiceSimilarity: SelfVoiceSimilarityResolver | null;
|
|
311
|
+
private readonly echoReference: EchoReferenceProvider | null;
|
|
312
|
+
/** NLMS echo canceller, instantiated only when an `echoReference` is wired. */
|
|
313
|
+
private readonly echoCanceller: NlmsEchoCanceller | null;
|
|
314
|
+
private readonly source: VoiceInputSource | undefined;
|
|
315
|
+
private readonly attributionOptions: HandleLiveVoiceAttributionOptions;
|
|
316
|
+
private readonly maxTurnSamples: number;
|
|
317
|
+
private readonly preRollSamples: number;
|
|
318
|
+
private readonly unsubscribeVad: () => void;
|
|
319
|
+
private readonly turnListeners = new Set<AttributedTurnListener>();
|
|
320
|
+
|
|
321
|
+
/** Float32 chunks of the in-flight turn, oldest first. */
|
|
322
|
+
private turnChunks: Float32Array[] = [];
|
|
323
|
+
private turnSamples = 0;
|
|
324
|
+
/** Rolling pre-roll ring (frames captured before speech-start). */
|
|
325
|
+
private preRoll: Float32Array[] = [];
|
|
326
|
+
private preRollSampleCount = 0;
|
|
327
|
+
private capturing = false;
|
|
328
|
+
private turnSeq = 0;
|
|
329
|
+
private turnStartedAtMs = 0;
|
|
330
|
+
private lastFrameEndMs = 0;
|
|
331
|
+
/** Serialized attribution chain so turns finalize one at a time, in order. */
|
|
332
|
+
private attributing: Promise<void> = Promise.resolve();
|
|
333
|
+
private closed = false;
|
|
334
|
+
|
|
335
|
+
/** Count of frames that failed to decode (surfaced via getters, not thrown). */
|
|
336
|
+
droppedFrames = 0;
|
|
337
|
+
|
|
338
|
+
/** Count of turns whose ASR transcribe threw (degraded to a transcript-less
|
|
339
|
+
* turn rather than dropping the diarized turn). */
|
|
340
|
+
transcriptionErrors = 0;
|
|
341
|
+
|
|
342
|
+
/** Count of mic frames the echo canceller actually processed (i.e. the agent
|
|
343
|
+
* was playing). Frames skipped while the agent is silent do not count, so
|
|
344
|
+
* this also measures how often AEC took the cheap passthrough path. */
|
|
345
|
+
echoFramesCancelled = 0;
|
|
346
|
+
|
|
347
|
+
constructor(
|
|
348
|
+
deps: AudioFrameConsumerDeps,
|
|
349
|
+
config: AudioFrameConsumerConfig = {},
|
|
350
|
+
) {
|
|
351
|
+
this.vad = deps.vad;
|
|
352
|
+
this.pipeline = deps.pipeline;
|
|
353
|
+
this.runtime = deps.runtime;
|
|
354
|
+
this.transcribe = deps.transcribe ?? null;
|
|
355
|
+
this.resolveSelfVoiceSimilarity = deps.resolveSelfVoiceSimilarity ?? null;
|
|
356
|
+
this.echoReference = deps.echoReference ?? null;
|
|
357
|
+
this.echoCanceller = this.echoReference
|
|
358
|
+
? new NlmsEchoCanceller(
|
|
359
|
+
config.residualSuppression
|
|
360
|
+
? { residualSuppression: config.residualSuppression }
|
|
361
|
+
: {},
|
|
362
|
+
)
|
|
363
|
+
: null;
|
|
364
|
+
this.source = config.source;
|
|
365
|
+
this.attributionOptions = config.attributionOptions ?? {};
|
|
366
|
+
const sr = AUDIO_FRAME_PIPELINE_SAMPLE_RATE;
|
|
367
|
+
this.maxTurnSamples = Math.max(
|
|
368
|
+
sr,
|
|
369
|
+
Math.round((config.maxTurnSeconds ?? 30) * sr),
|
|
370
|
+
);
|
|
371
|
+
this.preRollSamples = Math.max(
|
|
372
|
+
0,
|
|
373
|
+
Math.round((config.preRollSeconds ?? 0.3) * sr),
|
|
374
|
+
);
|
|
375
|
+
this.unsubscribeVad = this.vad.onVadEvent((event) =>
|
|
376
|
+
this.onVadEvent(event),
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** True while a turn is being buffered (between speech-start and speech-end). */
|
|
381
|
+
get inTurn(): boolean {
|
|
382
|
+
return this.capturing;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/** Subscribe to finalized attributed turns. Returns an unsubscribe fn. */
|
|
386
|
+
onTurn(listener: AttributedTurnListener): () => void {
|
|
387
|
+
this.turnListeners.add(listener);
|
|
388
|
+
return () => this.turnListeners.delete(listener);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Feed one decoded-or-raw `audioFrame`. Accepts either the wire-format
|
|
393
|
+
* `AudioFrameEvent` (decoded here) or a pre-decoded Float32 window with the
|
|
394
|
+
* frame's mic-clock timestamp. Resolves once the frame's VAD windows are
|
|
395
|
+
* processed.
|
|
396
|
+
*/
|
|
397
|
+
async onAudioFrame(frame: AudioFrameEvent): Promise<void> {
|
|
398
|
+
if (this.closed) return;
|
|
399
|
+
let pcm: Float32Array;
|
|
400
|
+
try {
|
|
401
|
+
pcm = decodeAudioFramePcm(frame);
|
|
402
|
+
} catch (err) {
|
|
403
|
+
this.droppedFrames += 1;
|
|
404
|
+
throw err instanceof AudioFrameDecodeError
|
|
405
|
+
? err
|
|
406
|
+
: new AudioFrameDecodeError(
|
|
407
|
+
`[audio-frame-consumer] frame decode failed: ${
|
|
408
|
+
err instanceof Error ? err.message : String(err)
|
|
409
|
+
}`,
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
await this.pushDecodedFrame(pcm, frame.timestamp);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Feed a pre-decoded Float32 16 kHz window with its mic-clock timestamp
|
|
417
|
+
* (ms). The decode boundary already ran; used by transports that decode
|
|
418
|
+
* upstream and by the host harness.
|
|
419
|
+
*/
|
|
420
|
+
async pushDecodedFrame(
|
|
421
|
+
pcm: Float32Array,
|
|
422
|
+
timestampMs: number,
|
|
423
|
+
): Promise<void> {
|
|
424
|
+
if (this.closed) return;
|
|
425
|
+
// #9455/#9649: cancel the agent's TTS echo before VAD/attribution so the
|
|
426
|
+
// agent never transcribes its own playback. When the reference provider
|
|
427
|
+
// returns null/empty the agent is silent — skip the FIR canceller so AEC
|
|
428
|
+
// is cheap and exactly passthrough on the common no-playback path.
|
|
429
|
+
const micPcm = this.cancelEcho(pcm, timestampMs);
|
|
430
|
+
this.lastFrameEndMs =
|
|
431
|
+
timestampMs + (micPcm.length / AUDIO_FRAME_PIPELINE_SAMPLE_RATE) * 1000;
|
|
432
|
+
if (this.capturing) {
|
|
433
|
+
this.appendTurnChunk(micPcm);
|
|
434
|
+
} else {
|
|
435
|
+
this.appendPreRoll(micPcm);
|
|
436
|
+
}
|
|
437
|
+
await this.vad.pushFrame({
|
|
438
|
+
pcm: micPcm,
|
|
439
|
+
sampleRate: AUDIO_FRAME_PIPELINE_SAMPLE_RATE,
|
|
440
|
+
timestampMs,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Run the echo canceller on one mic frame when (and only when) the agent is
|
|
446
|
+
* playing. The reference provider returns null while the agent is silent, in
|
|
447
|
+
* which case the mic frame is passed through verbatim and the FIR
|
|
448
|
+
* `process()` loop is not invoked. The canceller still observes the silent
|
|
449
|
+
* far-end so stale playback history is cleared before playback resumes.
|
|
450
|
+
* Returns the echo-cancelled (or untouched) mic frame.
|
|
451
|
+
*/
|
|
452
|
+
private cancelEcho(pcm: Float32Array, timestampMs: number): Float32Array {
|
|
453
|
+
if (!this.echoCanceller || !this.echoReference) return pcm;
|
|
454
|
+
const reference = this.echoReference(timestampMs, pcm.length);
|
|
455
|
+
if (!reference || reference.length === 0) {
|
|
456
|
+
this.echoCanceller.observeFarEndSilence(pcm);
|
|
457
|
+
return pcm;
|
|
458
|
+
}
|
|
459
|
+
this.echoFramesCancelled += 1;
|
|
460
|
+
return this.echoCanceller.process(pcm, reference);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Flush the VAD (finalize any open segment) and await all pending
|
|
465
|
+
* attribution. Call at end-of-capture so a trailing utterance is not lost.
|
|
466
|
+
*/
|
|
467
|
+
async flush(): Promise<void> {
|
|
468
|
+
if (this.closed) return;
|
|
469
|
+
await this.vad.flush();
|
|
470
|
+
await this.attributing;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/** Release listeners and clear all buffers. Idempotent. */
|
|
474
|
+
async close(): Promise<void> {
|
|
475
|
+
if (this.closed) return;
|
|
476
|
+
this.closed = true;
|
|
477
|
+
this.unsubscribeVad();
|
|
478
|
+
await this.attributing;
|
|
479
|
+
this.turnListeners.clear();
|
|
480
|
+
this.turnChunks = [];
|
|
481
|
+
this.preRoll = [];
|
|
482
|
+
this.turnSamples = 0;
|
|
483
|
+
this.preRollSampleCount = 0;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// ---- VAD event handling ------------------------------------------------
|
|
487
|
+
|
|
488
|
+
private onVadEvent(event: VadEvent): void {
|
|
489
|
+
switch (event.type) {
|
|
490
|
+
case "speech-start":
|
|
491
|
+
this.beginTurn(event.timestampMs);
|
|
492
|
+
break;
|
|
493
|
+
case "speech-end":
|
|
494
|
+
this.finalizeTurn(event.timestampMs);
|
|
495
|
+
break;
|
|
496
|
+
// speech-active / speech-pause / blip do not alter buffering: PCM
|
|
497
|
+
// keeps accumulating through pauses (mid-utterance micro-silences are
|
|
498
|
+
// part of the turn), and a `blip` never opened a turn.
|
|
499
|
+
default:
|
|
500
|
+
break;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
private beginTurn(startedAtMs: number): void {
|
|
505
|
+
if (this.capturing) return;
|
|
506
|
+
this.capturing = true;
|
|
507
|
+
this.turnStartedAtMs = startedAtMs;
|
|
508
|
+
// Seed the turn with the pre-roll so the leading word isn't clipped.
|
|
509
|
+
this.turnChunks = this.preRoll;
|
|
510
|
+
this.turnSamples = this.preRollSampleCount;
|
|
511
|
+
this.preRoll = [];
|
|
512
|
+
this.preRollSampleCount = 0;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
private finalizeTurn(endedAtMs: number): void {
|
|
516
|
+
if (!this.capturing) return;
|
|
517
|
+
this.capturing = false;
|
|
518
|
+
const chunks = this.turnChunks;
|
|
519
|
+
const total = this.turnSamples;
|
|
520
|
+
this.turnChunks = [];
|
|
521
|
+
this.turnSamples = 0;
|
|
522
|
+
if (total === 0) return;
|
|
523
|
+
const pcm = concatFloat32(chunks, total);
|
|
524
|
+
const turnId = `aframe_${this.turnSeq++}`;
|
|
525
|
+
const startedAtMs = this.turnStartedAtMs;
|
|
526
|
+
// Serialize attribution so turns surface in order and a slow turn can't
|
|
527
|
+
// interleave with the next one's buffer.
|
|
528
|
+
this.attributing = this.attributing.then(() =>
|
|
529
|
+
this.attributeTurn({ turnId, pcm, startedAtMs, endedAtMs }),
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
private async attributeTurn(args: {
|
|
534
|
+
turnId: string;
|
|
535
|
+
pcm: Float32Array;
|
|
536
|
+
startedAtMs: number;
|
|
537
|
+
endedAtMs: number;
|
|
538
|
+
}): Promise<void> {
|
|
539
|
+
const output = await this.pipeline.attribute({
|
|
540
|
+
turnId: args.turnId,
|
|
541
|
+
pcm: args.pcm,
|
|
542
|
+
startedAtMs: args.startedAtMs,
|
|
543
|
+
endedAtMs: args.endedAtMs,
|
|
544
|
+
...(this.source ? { source: this.source } : {}),
|
|
545
|
+
});
|
|
546
|
+
// Join the ASR transcript for this turn (#8786) so VOICE_TURN_OBSERVED
|
|
547
|
+
// carries the real text and live name/entity extraction can fire. ASR is
|
|
548
|
+
// best-effort: a decode failure degrades to a transcript-less turn (the
|
|
549
|
+
// diarized speaker is still emitted), never a dropped turn.
|
|
550
|
+
const opts = await this.resolveTurnOptions(args.pcm, output);
|
|
551
|
+
const signal = await handleLiveVoiceAttribution(
|
|
552
|
+
this.runtime as Parameters<typeof handleLiveVoiceAttribution>[0],
|
|
553
|
+
output,
|
|
554
|
+
opts,
|
|
555
|
+
);
|
|
556
|
+
const turn: AttributedTurn = {
|
|
557
|
+
turnId: args.turnId,
|
|
558
|
+
output,
|
|
559
|
+
signal,
|
|
560
|
+
startedAtMs: args.startedAtMs,
|
|
561
|
+
endedAtMs: args.endedAtMs,
|
|
562
|
+
samples: args.pcm.length,
|
|
563
|
+
};
|
|
564
|
+
for (const listener of this.turnListeners) listener(turn);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Merge the per-turn ASR transcript into the attribution options. Returns the
|
|
569
|
+
* base options unchanged when no transcriber is wired or the decode yields no
|
|
570
|
+
* text; a thrown decode is swallowed (counted in `transcriptionErrors`) so a
|
|
571
|
+
* diarized turn is never dropped over an ASR failure.
|
|
572
|
+
*/
|
|
573
|
+
private async resolveTurnOptions(
|
|
574
|
+
pcm: Float32Array,
|
|
575
|
+
output: VoiceAttributionOutput,
|
|
576
|
+
): Promise<HandleLiveVoiceAttributionOptions> {
|
|
577
|
+
let options = this.attributionOptions;
|
|
578
|
+
try {
|
|
579
|
+
if (this.transcribe) {
|
|
580
|
+
const transcript = await this.transcribe(
|
|
581
|
+
pcm,
|
|
582
|
+
AUDIO_FRAME_PIPELINE_SAMPLE_RATE,
|
|
583
|
+
);
|
|
584
|
+
const trimmed = transcript?.trim();
|
|
585
|
+
if (trimmed) {
|
|
586
|
+
options = { ...options, transcript: trimmed };
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
} catch {
|
|
590
|
+
this.transcriptionErrors += 1;
|
|
591
|
+
}
|
|
592
|
+
const embedding = output.observation?.embedding;
|
|
593
|
+
if (this.resolveSelfVoiceSimilarity && embedding) {
|
|
594
|
+
const similarity = await this.resolveSelfVoiceSimilarity(
|
|
595
|
+
embedding,
|
|
596
|
+
output,
|
|
597
|
+
);
|
|
598
|
+
if (typeof similarity === "number" && Number.isFinite(similarity)) {
|
|
599
|
+
options = { ...options, selfVoiceSimilarity: similarity };
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return options;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
// ---- buffering ---------------------------------------------------------
|
|
606
|
+
|
|
607
|
+
private appendTurnChunk(pcm: Float32Array): void {
|
|
608
|
+
this.turnChunks.push(pcm);
|
|
609
|
+
this.turnSamples += pcm.length;
|
|
610
|
+
// Hard cap: force-finalize a runaway turn at the current frame edge.
|
|
611
|
+
if (this.turnSamples >= this.maxTurnSamples) {
|
|
612
|
+
this.finalizeTurn(this.lastFrameEndMs);
|
|
613
|
+
this.vad.reset();
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
private appendPreRoll(pcm: Float32Array): void {
|
|
618
|
+
if (this.preRollSamples === 0) return;
|
|
619
|
+
this.preRoll.push(pcm);
|
|
620
|
+
this.preRollSampleCount += pcm.length;
|
|
621
|
+
// Drop oldest pre-roll chunks once over the pre-roll budget.
|
|
622
|
+
while (
|
|
623
|
+
this.preRoll.length > 1 &&
|
|
624
|
+
this.preRollSampleCount - this.preRoll[0].length >= this.preRollSamples
|
|
625
|
+
) {
|
|
626
|
+
const dropped = this.preRoll.shift();
|
|
627
|
+
if (dropped) this.preRollSampleCount -= dropped.length;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/** Concatenate Float32 chunks into a single buffer of known total length. */
|
|
633
|
+
function concatFloat32(
|
|
634
|
+
chunks: readonly Float32Array[],
|
|
635
|
+
total: number,
|
|
636
|
+
): Float32Array {
|
|
637
|
+
const out = new Float32Array(total);
|
|
638
|
+
let cursor = 0;
|
|
639
|
+
for (const c of chunks) {
|
|
640
|
+
out.set(c, cursor);
|
|
641
|
+
cursor += c.length;
|
|
642
|
+
}
|
|
643
|
+
return out;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Re-export of the producer's emit args, so a consumer caller can construct a
|
|
648
|
+
* VOICE_TURN_OBSERVED payload directly when wiring a custom transport without
|
|
649
|
+
* importing the runtime subpath twice.
|
|
650
|
+
*/
|
|
651
|
+
export type { EmitVoiceTurnObservedArgs };
|