@pipedog/core 0.0.0 → 0.1.0
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 +25 -0
- package/NOTICE +9 -0
- package/dist/adapters/base_llm_adapter.d.ts +266 -0
- package/dist/adapters/base_llm_adapter.js +489 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/schemas/direct_function.d.ts +202 -0
- package/dist/adapters/schemas/direct_function.js +302 -0
- package/dist/adapters/schemas/function_schema.d.ts +67 -0
- package/dist/adapters/schemas/function_schema.js +72 -0
- package/dist/adapters/schemas/index.d.ts +2 -0
- package/dist/adapters/schemas/index.js +8 -0
- package/dist/adapters/schemas/tools_schema.d.ts +57 -0
- package/dist/adapters/schemas/tools_schema.js +79 -0
- package/dist/adapters/services/index.d.ts +2 -0
- package/dist/adapters/services/index.js +8 -0
- package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
- package/dist/adapters/services/open_ai_adapter.js +250 -0
- package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
- package/dist/audio/dtmf/dtmf_data.js +22 -0
- package/dist/audio/dtmf/index.d.ts +2 -0
- package/dist/audio/dtmf/index.js +8 -0
- package/dist/audio/dtmf/types.d.ts +31 -0
- package/dist/audio/dtmf/types.js +35 -0
- package/dist/audio/dtmf/utils.d.ts +13 -0
- package/dist/audio/dtmf/utils.js +62 -0
- package/dist/audio/filters/base_audio_filter.d.ts +51 -0
- package/dist/audio/filters/base_audio_filter.js +17 -0
- package/dist/audio/filters/index.d.ts +2 -0
- package/dist/audio/filters/index.js +8 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/krisp_instance.d.ts +95 -0
- package/dist/audio/krisp_instance.js +229 -0
- package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
- package/dist/audio/mixers/base_audio_mixer.js +16 -0
- package/dist/audio/mixers/index.d.ts +2 -0
- package/dist/audio/mixers/index.js +8 -0
- package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
- package/dist/audio/resamplers/base_audio_resampler.js +35 -0
- package/dist/audio/resamplers/index.d.ts +2 -0
- package/dist/audio/resamplers/index.js +8 -0
- package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
- package/dist/audio/resamplers/resampy_resampler.js +15 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +54 -0
- package/dist/audio/resamplers/soxr_resampler.js +69 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +75 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +146 -0
- package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
- package/dist/audio/turn/base_turn_analyzer.js +61 -0
- package/dist/audio/turn/index.d.ts +2 -0
- package/dist/audio/turn/index.js +8 -0
- package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
- package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +143 -0
- package/dist/audio/utils.d.ts +224 -0
- package/dist/audio/utils.js +634 -0
- package/dist/audio/vad/data/index.d.ts +2 -0
- package/dist/audio/vad/data/index.js +8 -0
- package/dist/audio/vad/index.d.ts +2 -0
- package/dist/audio/vad/index.js +8 -0
- package/dist/audio/vad/vad_analyzer.d.ts +126 -0
- package/dist/audio/vad/vad_analyzer.js +211 -0
- package/dist/audio/vad/vad_controller.d.ts +143 -0
- package/dist/audio/vad/vad_controller.js +228 -0
- package/dist/audio/volume.d.ts +38 -0
- package/dist/audio/volume.js +75 -0
- package/dist/bus/adapters/base.d.ts +35 -0
- package/dist/bus/adapters/base.js +19 -0
- package/dist/bus/adapters/index.d.ts +10 -0
- package/dist/bus/adapters/index.js +15 -0
- package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
- package/dist/bus/adapters/llm_context_adapter.js +82 -0
- package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
- package/dist/bus/adapters/tools_schema_adapter.js +70 -0
- package/dist/bus/bridge_processor.d.ts +111 -0
- package/dist/bus/bridge_processor.js +166 -0
- package/dist/bus/bus.d.ts +110 -0
- package/dist/bus/bus.js +200 -0
- package/dist/bus/index.d.ts +22 -0
- package/dist/bus/index.js +27 -0
- package/dist/bus/local/async_queue.d.ts +12 -0
- package/dist/bus/local/async_queue.js +21 -0
- package/dist/bus/local/index.d.ts +3 -0
- package/dist/bus/local/index.js +8 -0
- package/dist/bus/messages.d.ts +378 -0
- package/dist/bus/messages.js +357 -0
- package/dist/bus/network/index.d.ts +16 -0
- package/dist/bus/network/index.js +21 -0
- package/dist/bus/queue.d.ts +27 -0
- package/dist/bus/queue.js +51 -0
- package/dist/bus/serializers/base.d.ts +25 -0
- package/dist/bus/serializers/base.js +14 -0
- package/dist/bus/serializers/index.d.ts +9 -0
- package/dist/bus/serializers/index.js +14 -0
- package/dist/bus/serializers/json.d.ts +77 -0
- package/dist/bus/serializers/json.js +367 -0
- package/dist/bus/subscriber.d.ts +46 -0
- package/dist/bus/subscriber.js +27 -0
- package/dist/bus/ui/index.d.ts +3 -0
- package/dist/bus/ui/index.js +8 -0
- package/dist/bus/ui/messages.d.ts +186 -0
- package/dist/bus/ui/messages.js +171 -0
- package/dist/classifiers/base_classifier.d.ts +263 -0
- package/dist/classifiers/base_classifier.js +346 -0
- package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
- package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
- package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
- package/dist/classifiers/cloudflare/clef/client.js +234 -0
- package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/clef/index.js +8 -0
- package/dist/classifiers/cloudflare/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/index.js +8 -0
- package/dist/classifiers/http_client.d.ts +70 -0
- package/dist/classifiers/http_client.js +161 -0
- package/dist/classifiers/index.d.ts +2 -0
- package/dist/classifiers/index.js +8 -0
- package/dist/classifiers/jev/classifier.d.ts +8 -0
- package/dist/classifiers/jev/classifier.js +13 -0
- package/dist/classifiers/jev/client.d.ts +8 -0
- package/dist/classifiers/jev/client.js +13 -0
- package/dist/classifiers/jev/index.d.ts +2 -0
- package/dist/classifiers/jev/index.js +8 -0
- package/dist/classifiers/llm/classifier.d.ts +72 -0
- package/dist/classifiers/llm/classifier.js +304 -0
- package/dist/classifiers/llm/index.d.ts +2 -0
- package/dist/classifiers/llm/index.js +8 -0
- package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
- package/dist/classifiers/openai/decisions/classifier.js +241 -0
- package/dist/classifiers/openai/decisions/client.d.ts +108 -0
- package/dist/classifiers/openai/decisions/client.js +234 -0
- package/dist/classifiers/openai/decisions/index.d.ts +2 -0
- package/dist/classifiers/openai/decisions/index.js +8 -0
- package/dist/classifiers/openai/index.d.ts +2 -0
- package/dist/classifiers/openai/index.js +8 -0
- package/dist/classifiers/typesafe/index.d.ts +2 -0
- package/dist/classifiers/typesafe/index.js +8 -0
- package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
- package/dist/classifiers/typesafe/jev/classifier.js +220 -0
- package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
- package/dist/classifiers/typesafe/jev/client.js +233 -0
- package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
- package/dist/classifiers/typesafe/jev/index.js +8 -0
- package/dist/clocks/base_clock.d.ts +13 -0
- package/dist/clocks/base_clock.js +14 -0
- package/dist/clocks/index.d.ts +2 -0
- package/dist/clocks/index.js +8 -0
- package/dist/clocks/system_clock.d.ts +15 -0
- package/dist/clocks/system_clock.js +25 -0
- package/dist/frames/frames.d.ts +2533 -0
- package/dist/frames/frames.js +2485 -0
- package/dist/frames/index.d.ts +2 -0
- package/dist/frames/index.js +8 -0
- package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
- package/dist/frames/protobufs/frames_pb2.js +466 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/metrics.d.ts +276 -0
- package/dist/metrics/metrics.js +254 -0
- package/dist/observers/base_observer.d.ts +173 -0
- package/dist/observers/base_observer.js +151 -0
- package/dist/observers/error_observer.d.ts +75 -0
- package/dist/observers/error_observer.js +87 -0
- package/dist/observers/function_call_observer.d.ts +157 -0
- package/dist/observers/function_call_observer.js +222 -0
- package/dist/observers/index.d.ts +2 -0
- package/dist/observers/index.js +8 -0
- package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
- package/dist/observers/loggers/debug_log_observer.js +228 -0
- package/dist/observers/loggers/index.d.ts +2 -0
- package/dist/observers/loggers/index.js +8 -0
- package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
- package/dist/observers/loggers/llm_log_observer.js +110 -0
- package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
- package/dist/observers/loggers/metrics_log_observer.js +186 -0
- package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
- package/dist/observers/loggers/transcription_log_observer.js +74 -0
- package/dist/observers/service_metrics_observer.d.ts +168 -0
- package/dist/observers/service_metrics_observer.js +236 -0
- package/dist/observers/speaking_observer.d.ts +104 -0
- package/dist/observers/speaking_observer.js +150 -0
- package/dist/observers/startup_timing_observer.d.ts +221 -0
- package/dist/observers/startup_timing_observer.js +365 -0
- package/dist/observers/turn_tracking_observer.d.ts +78 -0
- package/dist/observers/turn_tracking_observer.js +189 -0
- package/dist/observers/user_bot_latency_observer.d.ts +411 -0
- package/dist/observers/user_bot_latency_observer.js +974 -0
- package/dist/pipeline/base_pipeline.d.ts +49 -0
- package/dist/pipeline/base_pipeline.js +101 -0
- package/dist/pipeline/capabilities.d.ts +76 -0
- package/dist/pipeline/capabilities.js +97 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +8 -0
- package/dist/pipeline/job_context.d.ts +317 -0
- package/dist/pipeline/job_context.js +450 -0
- package/dist/pipeline/job_decorator.d.ts +54 -0
- package/dist/pipeline/job_decorator.js +92 -0
- package/dist/pipeline/llm_switcher.d.ts +84 -0
- package/dist/pipeline/llm_switcher.js +107 -0
- package/dist/pipeline/llm_with_backend.d.ts +435 -0
- package/dist/pipeline/llm_with_backend.js +806 -0
- package/dist/pipeline/parallel_pipeline.d.ts +83 -0
- package/dist/pipeline/parallel_pipeline.js +200 -0
- package/dist/pipeline/pipeline.d.ts +126 -0
- package/dist/pipeline/pipeline.js +196 -0
- package/dist/pipeline/service_switcher.d.ts +287 -0
- package/dist/pipeline/service_switcher.js +509 -0
- package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
- package/dist/pipeline/sync_parallel_pipeline.js +387 -0
- package/dist/pipeline/worker.d.ts +814 -0
- package/dist/pipeline/worker.js +1639 -0
- package/dist/pipeline/worker_observer.d.ts +131 -0
- package/dist/pipeline/worker_observer.js +274 -0
- package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
- package/dist/pipeline/worker_ready_decorator.js +76 -0
- package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
- package/dist/processors/aggregators/async_tool_messages.js +291 -0
- package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
- package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
- package/dist/processors/aggregators/gated.d.ts +43 -0
- package/dist/processors/aggregators/gated.js +86 -0
- package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
- package/dist/processors/aggregators/gated_llm_context.js +86 -0
- package/dist/processors/aggregators/index.d.ts +2 -0
- package/dist/processors/aggregators/index.js +8 -0
- package/dist/processors/aggregators/llm_context.d.ts +370 -0
- package/dist/processors/aggregators/llm_context.js +580 -0
- package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
- package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
- package/dist/processors/aggregators/llm_response.d.ts +37 -0
- package/dist/processors/aggregators/llm_response.js +71 -0
- package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
- package/dist/processors/aggregators/llm_response_universal.js +2394 -0
- package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
- package/dist/processors/aggregators/llm_text_processor.js +102 -0
- package/dist/processors/aggregators/sentence.d.ts +39 -0
- package/dist/processors/aggregators/sentence.js +69 -0
- package/dist/processors/async_generator.d.ts +42 -0
- package/dist/processors/async_generator.js +76 -0
- package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
- package/dist/processors/audio/audio_buffer_processor.js +565 -0
- package/dist/processors/audio/index.d.ts +2 -0
- package/dist/processors/audio/index.js +8 -0
- package/dist/processors/audio/vad_processor.d.ts +67 -0
- package/dist/processors/audio/vad_processor.js +103 -0
- package/dist/processors/consumer_processor.d.ts +49 -0
- package/dist/processors/consumer_processor.js +85 -0
- package/dist/processors/filters/frame_filter.d.ts +39 -0
- package/dist/processors/filters/frame_filter.js +52 -0
- package/dist/processors/filters/function_filter.d.ts +59 -0
- package/dist/processors/filters/function_filter.js +78 -0
- package/dist/processors/filters/identity_filter.d.ts +33 -0
- package/dist/processors/filters/identity_filter.js +37 -0
- package/dist/processors/filters/index.d.ts +2 -0
- package/dist/processors/filters/index.js +8 -0
- package/dist/processors/filters/null_filter.d.ts +34 -0
- package/dist/processors/filters/null_filter.js +47 -0
- package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
- package/dist/processors/filters/wake_notifier_filter.js +49 -0
- package/dist/processors/frame_processor.d.ts +360 -0
- package/dist/processors/frame_processor.js +932 -0
- package/dist/processors/frameworks/index.d.ts +2 -0
- package/dist/processors/frameworks/index.js +8 -0
- package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
- package/dist/processors/frameworks/rtvi/frames.js +259 -0
- package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
- package/dist/processors/frameworks/rtvi/index.js +11 -0
- package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
- package/dist/processors/frameworks/rtvi/models.js +1807 -0
- package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
- package/dist/processors/frameworks/rtvi/observer.js +1113 -0
- package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
- package/dist/processors/frameworks/rtvi/processor.js +676 -0
- package/dist/processors/idle_frame_processor.d.ts +44 -0
- package/dist/processors/idle_frame_processor.js +86 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.js +8 -0
- package/dist/processors/logger.d.ts +42 -0
- package/dist/processors/logger.js +87 -0
- package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
- package/dist/processors/metrics/frame_processor_metrics.js +372 -0
- package/dist/processors/metrics/index.d.ts +2 -0
- package/dist/processors/metrics/index.js +8 -0
- package/dist/processors/producer_processor.d.ts +68 -0
- package/dist/processors/producer_processor.js +78 -0
- package/dist/processors/text_transformer.d.ts +30 -0
- package/dist/processors/text_transformer.js +48 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry.d.ts +69 -0
- package/dist/registry/registry.js +149 -0
- package/dist/registry/types.d.ts +47 -0
- package/dist/registry/types.js +39 -0
- package/dist/serializers/base_serializer.d.ts +94 -0
- package/dist/serializers/base_serializer.js +82 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.js +8 -0
- package/dist/services/ai_service.d.ts +145 -0
- package/dist/services/ai_service.js +262 -0
- package/dist/services/anthropic/index.d.ts +2 -0
- package/dist/services/anthropic/index.js +7 -0
- package/dist/services/assemblyai/index.d.ts +2 -0
- package/dist/services/assemblyai/index.js +7 -0
- package/dist/services/asyncai/index.d.ts +2 -0
- package/dist/services/asyncai/index.js +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.js +7 -0
- package/dist/services/azure/index.d.ts +2 -0
- package/dist/services/azure/index.js +7 -0
- package/dist/services/baseten/index.d.ts +2 -0
- package/dist/services/baseten/index.js +7 -0
- package/dist/services/bland/index.d.ts +2 -0
- package/dist/services/bland/index.js +7 -0
- package/dist/services/camb/index.d.ts +2 -0
- package/dist/services/camb/index.js +7 -0
- package/dist/services/cartesia/index.d.ts +2 -0
- package/dist/services/cartesia/index.js +7 -0
- package/dist/services/cerebras/index.d.ts +2 -0
- package/dist/services/cerebras/index.js +7 -0
- package/dist/services/crusoe/index.d.ts +2 -0
- package/dist/services/crusoe/index.js +7 -0
- package/dist/services/deepgram/index.d.ts +2 -0
- package/dist/services/deepgram/index.js +7 -0
- package/dist/services/deepseek/index.d.ts +2 -0
- package/dist/services/deepseek/index.js +7 -0
- package/dist/services/elevenlabs/index.d.ts +2 -0
- package/dist/services/elevenlabs/index.js +7 -0
- package/dist/services/fal/index.d.ts +2 -0
- package/dist/services/fal/index.js +7 -0
- package/dist/services/fireworks/index.d.ts +2 -0
- package/dist/services/fireworks/index.js +7 -0
- package/dist/services/fish/index.d.ts +2 -0
- package/dist/services/fish/index.js +7 -0
- package/dist/services/funasr/index.d.ts +3 -0
- package/dist/services/funasr/index.js +8 -0
- package/dist/services/gladia/index.d.ts +2 -0
- package/dist/services/gladia/index.js +7 -0
- package/dist/services/google/index.d.ts +2 -0
- package/dist/services/google/index.js +7 -0
- package/dist/services/gradium/index.d.ts +2 -0
- package/dist/services/gradium/index.js +7 -0
- package/dist/services/grok/index.d.ts +2 -0
- package/dist/services/grok/index.js +7 -0
- package/dist/services/groq/index.d.ts +2 -0
- package/dist/services/groq/index.js +7 -0
- package/dist/services/heygen/index.d.ts +2 -0
- package/dist/services/heygen/index.js +7 -0
- package/dist/services/hume/index.d.ts +2 -0
- package/dist/services/hume/index.js +7 -0
- package/dist/services/image_service.d.ts +52 -0
- package/dist/services/image_service.js +60 -0
- package/dist/services/inception/index.d.ts +2 -0
- package/dist/services/inception/index.js +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +8 -0
- package/dist/services/inworld/index.d.ts +2 -0
- package/dist/services/inworld/index.js +7 -0
- package/dist/services/keenable/index.d.ts +2 -0
- package/dist/services/keenable/index.js +7 -0
- package/dist/services/kokoro/index.d.ts +2 -0
- package/dist/services/kokoro/index.js +7 -0
- package/dist/services/llm_service.d.ts +1106 -0
- package/dist/services/llm_service.js +2231 -0
- package/dist/services/mem0/index.d.ts +2 -0
- package/dist/services/mem0/index.js +7 -0
- package/dist/services/meta/index.d.ts +2 -0
- package/dist/services/meta/index.js +7 -0
- package/dist/services/minimax/index.d.ts +2 -0
- package/dist/services/minimax/index.js +7 -0
- package/dist/services/mistral/index.d.ts +2 -0
- package/dist/services/mistral/index.js +7 -0
- package/dist/services/moondream/index.d.ts +2 -0
- package/dist/services/moondream/index.js +7 -0
- package/dist/services/moonshine/index.d.ts +2 -0
- package/dist/services/moonshine/index.js +7 -0
- package/dist/services/nebius/index.d.ts +2 -0
- package/dist/services/nebius/index.js +7 -0
- package/dist/services/neuphonic/index.d.ts +2 -0
- package/dist/services/neuphonic/index.js +7 -0
- package/dist/services/novita/index.d.ts +2 -0
- package/dist/services/novita/index.js +7 -0
- package/dist/services/nvidia/index.d.ts +2 -0
- package/dist/services/nvidia/index.js +11 -0
- package/dist/services/ollama/index.d.ts +2 -0
- package/dist/services/ollama/index.js +7 -0
- package/dist/services/openai/index.d.ts +2 -0
- package/dist/services/openai/index.js +7 -0
- package/dist/services/openclaw/index.d.ts +14 -0
- package/dist/services/openclaw/index.js +19 -0
- package/dist/services/openrouter/index.d.ts +2 -0
- package/dist/services/openrouter/index.js +7 -0
- package/dist/services/perplexity/index.d.ts +2 -0
- package/dist/services/perplexity/index.js +7 -0
- package/dist/services/piper/index.d.ts +2 -0
- package/dist/services/piper/index.js +7 -0
- package/dist/services/pocket_tts/index.d.ts +2 -0
- package/dist/services/pocket_tts/index.js +7 -0
- package/dist/services/qwen/index.d.ts +2 -0
- package/dist/services/qwen/index.js +7 -0
- package/dist/services/resembleai/index.d.ts +2 -0
- package/dist/services/resembleai/index.js +7 -0
- package/dist/services/rime/index.d.ts +2 -0
- package/dist/services/rime/index.js +7 -0
- package/dist/services/sambanova/index.d.ts +2 -0
- package/dist/services/sambanova/index.js +7 -0
- package/dist/services/sarvam/index.d.ts +2 -0
- package/dist/services/sarvam/index.js +7 -0
- package/dist/services/settings.d.ts +356 -0
- package/dist/services/settings.js +437 -0
- package/dist/services/simli/index.d.ts +2 -0
- package/dist/services/simli/index.js +7 -0
- package/dist/services/smallest/index.d.ts +2 -0
- package/dist/services/smallest/index.js +7 -0
- package/dist/services/soniox/index.d.ts +2 -0
- package/dist/services/soniox/index.js +7 -0
- package/dist/services/speechify/index.d.ts +2 -0
- package/dist/services/speechify/index.js +7 -0
- package/dist/services/speechmatics/index.d.ts +2 -0
- package/dist/services/speechmatics/index.js +7 -0
- package/dist/services/stt_latency.d.ts +62 -0
- package/dist/services/stt_latency.js +71 -0
- package/dist/services/stt_service.d.ts +601 -0
- package/dist/services/stt_service.js +1044 -0
- package/dist/services/tavus/index.d.ts +2 -0
- package/dist/services/tavus/index.js +7 -0
- package/dist/services/together/index.d.ts +2 -0
- package/dist/services/together/index.js +7 -0
- package/dist/services/tts_service.d.ts +909 -0
- package/dist/services/tts_service.js +2018 -0
- package/dist/services/ultravox/index.d.ts +2 -0
- package/dist/services/ultravox/index.js +9 -0
- package/dist/services/vision_service.d.ts +56 -0
- package/dist/services/vision_service.js +62 -0
- package/dist/services/websocket_service.d.ts +213 -0
- package/dist/services/websocket_service.js +654 -0
- package/dist/services/whisper/index.d.ts +2 -0
- package/dist/services/whisper/index.js +9 -0
- package/dist/services/xai/index.d.ts +2 -0
- package/dist/services/xai/index.js +9 -0
- package/dist/services/xtts/index.d.ts +2 -0
- package/dist/services/xtts/index.js +9 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.js +8 -0
- package/dist/tests/utils.d.ts +123 -0
- package/dist/tests/utils.js +212 -0
- package/dist/transcriptions/index.d.ts +2 -0
- package/dist/transcriptions/index.js +8 -0
- package/dist/transcriptions/language.d.ts +376 -0
- package/dist/transcriptions/language.js +543 -0
- package/dist/transports/base_input.d.ts +149 -0
- package/dist/transports/base_input.js +338 -0
- package/dist/transports/base_output.d.ts +432 -0
- package/dist/transports/base_output.js +1231 -0
- package/dist/transports/base_transport.d.ts +223 -0
- package/dist/transports/base_transport.js +167 -0
- package/dist/transports/daily/index.d.ts +2 -0
- package/dist/transports/daily/index.js +9 -0
- package/dist/transports/heygen/index.d.ts +2 -0
- package/dist/transports/heygen/index.js +9 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/lemonslice/index.d.ts +2 -0
- package/dist/transports/lemonslice/index.js +9 -0
- package/dist/transports/livekit/index.d.ts +2 -0
- package/dist/transports/livekit/index.js +9 -0
- package/dist/transports/local/index.d.ts +2 -0
- package/dist/transports/local/index.js +9 -0
- package/dist/transports/moq/index.d.ts +2 -0
- package/dist/transports/moq/index.js +9 -0
- package/dist/transports/smallwebrtc/index.d.ts +2 -0
- package/dist/transports/smallwebrtc/index.js +9 -0
- package/dist/transports/tavus/index.d.ts +2 -0
- package/dist/transports/tavus/index.js +9 -0
- package/dist/transports/video_in_sampler.d.ts +157 -0
- package/dist/transports/video_in_sampler.js +258 -0
- package/dist/transports/vonage/index.d.ts +2 -0
- package/dist/transports/vonage/index.js +9 -0
- package/dist/transports/websocket/index.d.ts +2 -0
- package/dist/transports/websocket/index.js +9 -0
- package/dist/transports/whatsapp/index.d.ts +2 -0
- package/dist/transports/whatsapp/index.js +9 -0
- package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
- package/dist/turns/eager_end_of_turn_mixin.js +122 -0
- package/dist/turns/empty_user_turn.d.ts +55 -0
- package/dist/turns/empty_user_turn.js +53 -0
- package/dist/turns/index.d.ts +2 -0
- package/dist/turns/index.js +8 -0
- package/dist/turns/speculation_gate.d.ts +169 -0
- package/dist/turns/speculation_gate.js +294 -0
- package/dist/turns/types.d.ts +33 -0
- package/dist/turns/types.js +35 -0
- package/dist/turns/user_idle_controller.d.ts +94 -0
- package/dist/turns/user_idle_controller.js +187 -0
- package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
- package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
- package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
- package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
- package/dist/turns/user_mute/index.d.ts +6 -0
- package/dist/turns/user_mute/index.js +11 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
- package/dist/turns/user_start/index.d.ts +8 -0
- package/dist/turns/user_start/index.js +16 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
- package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
- package/dist/turns/user_stop/eager_match_policy.js +50 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
- package/dist/turns/user_stop/index.d.ts +10 -0
- package/dist/turns/user_stop/index.js +15 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
- package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
- package/dist/turns/user_turn_completion_mixin.js +591 -0
- package/dist/turns/user_turn_controller.d.ts +134 -0
- package/dist/turns/user_turn_controller.js +335 -0
- package/dist/turns/user_turn_processor.d.ts +87 -0
- package/dist/turns/user_turn_processor.js +180 -0
- package/dist/turns/user_turn_strategies.d.ts +187 -0
- package/dist/turns/user_turn_strategies.js +222 -0
- package/dist/utils/async_tool_cancellation.d.ts +35 -0
- package/dist/utils/async_tool_cancellation.js +78 -0
- package/dist/utils/asyncio/index.d.ts +2 -0
- package/dist/utils/asyncio/index.js +7 -0
- package/dist/utils/asyncio/task_manager.d.ts +49 -0
- package/dist/utils/asyncio/task_manager.js +105 -0
- package/dist/utils/base_object.d.ts +76 -0
- package/dist/utils/base_object.js +154 -0
- package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
- package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
- package/dist/utils/context/audio_context_manager.d.ts +131 -0
- package/dist/utils/context/audio_context_manager.js +233 -0
- package/dist/utils/context/index.d.ts +2 -0
- package/dist/utils/context/index.js +7 -0
- package/dist/utils/context/llm_context_summarization.d.ts +258 -0
- package/dist/utils/context/llm_context_summarization.js +511 -0
- package/dist/utils/context/text_segment_map.d.ts +611 -0
- package/dist/utils/context/text_segment_map.js +1132 -0
- package/dist/utils/context/word_completion_tracker.d.ts +273 -0
- package/dist/utils/context/word_completion_tracker.js +441 -0
- package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
- package/dist/utils/context/word_timestamp_tracker.js +98 -0
- package/dist/utils/deprecation.d.ts +28 -0
- package/dist/utils/deprecation.js +75 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.js +62 -0
- package/dist/utils/errors.d.ts +75 -0
- package/dist/utils/errors.js +202 -0
- package/dist/utils/file_resolver.d.ts +126 -0
- package/dist/utils/file_resolver.js +314 -0
- package/dist/utils/file_storage.d.ts +99 -0
- package/dist/utils/file_storage.js +100 -0
- package/dist/utils/frame_queue.d.ts +36 -0
- package/dist/utils/frame_queue.js +66 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +53 -0
- package/dist/utils/image.d.ts +15 -0
- package/dist/utils/image.js +30 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/log_config.d.ts +34 -0
- package/dist/utils/log_config.js +76 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/mixin.d.ts +14 -0
- package/dist/utils/mixin.js +63 -0
- package/dist/utils/network.d.ts +73 -0
- package/dist/utils/network.js +90 -0
- package/dist/utils/security/allowed_origins.d.ts +16 -0
- package/dist/utils/security/allowed_origins.js +34 -0
- package/dist/utils/security/index.d.ts +2 -0
- package/dist/utils/security/index.js +7 -0
- package/dist/utils/security/redaction.d.ts +27 -0
- package/dist/utils/security/redaction.js +123 -0
- package/dist/utils/security/ssrf.d.ts +79 -0
- package/dist/utils/security/ssrf.js +327 -0
- package/dist/utils/shared.d.ts +35 -0
- package/dist/utils/shared.js +136 -0
- package/dist/utils/startup.d.ts +17 -0
- package/dist/utils/startup.js +130 -0
- package/dist/utils/string.d.ts +116 -0
- package/dist/utils/string.js +460 -0
- package/dist/utils/sync/base_notifier.d.ts +25 -0
- package/dist/utils/sync/base_notifier.js +16 -0
- package/dist/utils/sync/event_notifier.d.ts +38 -0
- package/dist/utils/sync/event_notifier.js +51 -0
- package/dist/utils/sync/index.d.ts +2 -0
- package/dist/utils/sync/index.js +7 -0
- package/dist/utils/text/alnum_utils.d.ts +109 -0
- package/dist/utils/text/alnum_utils.js +262 -0
- package/dist/utils/text/base_text_aggregator.d.ts +146 -0
- package/dist/utils/text/base_text_aggregator.js +102 -0
- package/dist/utils/text/base_text_filter.d.ts +54 -0
- package/dist/utils/text/base_text_filter.js +50 -0
- package/dist/utils/text/index.d.ts +2 -0
- package/dist/utils/text/index.js +7 -0
- package/dist/utils/text/markdown_text_filter.d.ts +147 -0
- package/dist/utils/text/markdown_text_filter.js +522 -0
- package/dist/utils/text/markup_utils.d.ts +54 -0
- package/dist/utils/text/markup_utils.js +156 -0
- package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
- package/dist/utils/text/pattern_pair_aggregator.js +478 -0
- package/dist/utils/text/phonemes.d.ts +60 -0
- package/dist/utils/text/phonemes.js +172 -0
- package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
- package/dist/utils/text/simple_text_aggregator.js +254 -0
- package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
- package/dist/utils/text/skip_tags_aggregator.js +147 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +111 -0
- package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
- package/dist/utils/text/word_timestamp_utils.js +52 -0
- package/dist/utils/time.d.ts +13 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/tracing/index.d.ts +3 -0
- package/dist/utils/tracing/index.js +8 -0
- package/dist/utils/tracing/service_attributes.d.ts +198 -0
- package/dist/utils/tracing/service_attributes.js +434 -0
- package/dist/utils/tracing/service_decorators.d.ts +214 -0
- package/dist/utils/tracing/service_decorators.js +1662 -0
- package/dist/utils/tracing/setup.d.ts +95 -0
- package/dist/utils/tracing/setup.js +110 -0
- package/dist/utils/tracing/tracing_context.d.ts +55 -0
- package/dist/utils/tracing/tracing_context.js +97 -0
- package/dist/utils/tracing/turn_trace_observer.d.ts +90 -0
- package/dist/utils/tracing/turn_trace_observer.js +219 -0
- package/dist/utils/types.d.ts +80 -0
- package/dist/utils/types.js +108 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +22 -0
- package/dist/utils/yaml.d.ts +64 -0
- package/dist/utils/yaml.js +41 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/workers/base_worker.d.ts +772 -0
- package/dist/workers/base_worker.js +1298 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.js +8 -0
- package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
- package/dist/workers/llm/backend_llm_worker.js +1055 -0
- package/dist/workers/llm/index.d.ts +6 -0
- package/dist/workers/llm/index.js +11 -0
- package/dist/workers/llm/llm_context_worker.d.ts +66 -0
- package/dist/workers/llm/llm_context_worker.js +72 -0
- package/dist/workers/llm/llm_worker.d.ts +180 -0
- package/dist/workers/llm/llm_worker.js +323 -0
- package/dist/workers/llm/tool_decorator.d.ts +68 -0
- package/dist/workers/llm/tool_decorator.js +60 -0
- package/dist/workers/runner.d.ts +268 -0
- package/dist/workers/runner.js +489 -0
- package/dist/workers/ui/index.d.ts +22 -0
- package/dist/workers/ui/index.js +27 -0
- package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
- package/dist/workers/ui/ui_event_decorator.js +75 -0
- package/dist/workers/ui/ui_job_context.d.ts +12 -0
- package/dist/workers/ui/ui_job_context.js +17 -0
- package/dist/workers/ui/ui_prompts.d.ts +21 -0
- package/dist/workers/ui/ui_prompts.js +41 -0
- package/dist/workers/ui/ui_tools.d.ts +32 -0
- package/dist/workers/ui/ui_tools.js +112 -0
- package/dist/workers/ui/ui_worker.d.ts +571 -0
- package/dist/workers/ui/ui_worker.js +1156 -0
- package/package.json +46 -3
- package/README.md +0 -5
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type MetricsData } from "../../../metrics/metrics.ts";
|
|
2
|
+
import { BaseTurnAnalyzer, type BaseTurnAnalyzerOptions, BaseTurnParams, EndOfTurnState } from "../base_turn_analyzer.ts";
|
|
3
|
+
export declare const STOP_SECS = 3;
|
|
4
|
+
export declare const PRE_SPEECH_MS = 500;
|
|
5
|
+
export declare const MAX_DURATION_SECONDS = 8;
|
|
6
|
+
export interface SmartTurnParamsOptions {
|
|
7
|
+
/** Maximum silence duration in seconds before ending turn. */
|
|
8
|
+
stopSecs?: number;
|
|
9
|
+
/** Milliseconds of audio to include before speech starts. */
|
|
10
|
+
preSpeechMs?: number;
|
|
11
|
+
/** Maximum duration in seconds for audio segments. */
|
|
12
|
+
maxDurationSecs?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Configuration parameters for smart turn analysis. */
|
|
15
|
+
export declare class SmartTurnParams extends BaseTurnParams {
|
|
16
|
+
stopSecs: number;
|
|
17
|
+
preSpeechMs: number;
|
|
18
|
+
maxDurationSecs: number;
|
|
19
|
+
constructor(options?: SmartTurnParamsOptions);
|
|
20
|
+
toString(): string;
|
|
21
|
+
}
|
|
22
|
+
/** Exception raised when smart turn analysis times out. */
|
|
23
|
+
export declare class SmartTurnTimeoutException extends Error {
|
|
24
|
+
name: string;
|
|
25
|
+
}
|
|
26
|
+
/** Result of a model prediction: `prediction` is 1 for complete, 0 otherwise. */
|
|
27
|
+
export interface SmartTurnPrediction {
|
|
28
|
+
prediction: number;
|
|
29
|
+
probability: number;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface BaseSmartTurnOptions extends BaseTurnAnalyzerOptions {
|
|
33
|
+
/** Configuration parameters for turn analysis behavior. */
|
|
34
|
+
params?: SmartTurnParams | null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Base class for smart turn analyzers using ML models.
|
|
38
|
+
*
|
|
39
|
+
* Provides common functionality for smart turn detection including audio
|
|
40
|
+
* buffering, speech tracking, and ML model integration. Subclasses must
|
|
41
|
+
* implement the specific model prediction logic.
|
|
42
|
+
*
|
|
43
|
+
* Upstream runs the model on a dedicated thread; there are no threads on every
|
|
44
|
+
* runtime we target, so prediction is an async method run inline.
|
|
45
|
+
*/
|
|
46
|
+
export declare abstract class BaseSmartTurn extends BaseTurnAnalyzer {
|
|
47
|
+
protected _params: SmartTurnParams;
|
|
48
|
+
protected _stopMs: number;
|
|
49
|
+
protected _audioBuffer: [number, Int16Array][];
|
|
50
|
+
protected _speechTriggered: boolean;
|
|
51
|
+
protected _silenceMs: number;
|
|
52
|
+
protected _speechStartTime: number;
|
|
53
|
+
protected _vadStartSecs: number;
|
|
54
|
+
constructor(options?: BaseSmartTurnOptions);
|
|
55
|
+
/** Whether speech has been detected and turn analysis is active. */
|
|
56
|
+
get speechTriggered(): boolean;
|
|
57
|
+
/** The current smart turn configuration parameters. */
|
|
58
|
+
get params(): SmartTurnParams;
|
|
59
|
+
/**
|
|
60
|
+
* Append audio data for turn analysis.
|
|
61
|
+
*
|
|
62
|
+
* @param buffer Raw audio data bytes to append for analysis.
|
|
63
|
+
* @param isSpeech Whether the audio buffer contains detected speech.
|
|
64
|
+
* @returns Current end-of-turn state after processing the audio.
|
|
65
|
+
*/
|
|
66
|
+
appendAudio(buffer: Uint8Array, isSpeech: boolean): EndOfTurnState;
|
|
67
|
+
/**
|
|
68
|
+
* Analyze the current audio state to determine if turn has ended.
|
|
69
|
+
*
|
|
70
|
+
* @returns The end-of-turn state and optional metrics data from the ML
|
|
71
|
+
* model analysis.
|
|
72
|
+
*/
|
|
73
|
+
analyzeEndOfTurn(): Promise<[EndOfTurnState, MetricsData | null]>;
|
|
74
|
+
/** Store the new vadStartSecs value. */
|
|
75
|
+
updateVadStartSecs(vadStartSecs: number): void;
|
|
76
|
+
/** Reset the turn analyzer to its initial state. */
|
|
77
|
+
clear(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Release the analyzer's resources.
|
|
80
|
+
*
|
|
81
|
+
* The analyzer stays usable: cleaning up is not only teardown here, since a
|
|
82
|
+
* turn strategy is cleaned up and re-applied whenever the strategies are
|
|
83
|
+
* updated. (Upstream stops its model thread here; there is none in the
|
|
84
|
+
* port.)
|
|
85
|
+
*/
|
|
86
|
+
cleanup(): Promise<void>;
|
|
87
|
+
/** Clear internal state based on turn completion status. */
|
|
88
|
+
protected _clear(turnState: EndOfTurnState): void;
|
|
89
|
+
/** Process accumulated audio segment using ML model. */
|
|
90
|
+
protected _processSpeechSegment(audioBuffer: [number, Int16Array][]): Promise<[EndOfTurnState, MetricsData | null]>;
|
|
91
|
+
/** Predict end-of-turn using ML model from audio data. */
|
|
92
|
+
protected abstract _predictEndpoint(audioArray: Float32Array): Promise<SmartTurnPrediction>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=base_smart_turn.d.ts.map
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/audio/turn/smart_turn/base_smart_turn.py
|
|
6
|
+
/**
|
|
7
|
+
* Smart turn analyzer base class using ML models for end-of-turn detection.
|
|
8
|
+
*
|
|
9
|
+
* Provides the base implementation for smart turn analyzers that use machine
|
|
10
|
+
* learning models to determine when a user has finished speaking, going
|
|
11
|
+
* beyond simple silence-based detection.
|
|
12
|
+
*/
|
|
13
|
+
import { abortable, monotonic } from "@pipedog/asyncio";
|
|
14
|
+
import { TurnMetricsData } from "../../../metrics/metrics.js";
|
|
15
|
+
import { logger } from "../../../utils/logger.js";
|
|
16
|
+
import { BaseTurnAnalyzer, BaseTurnParams, EndOfTurnState, } from "../base_turn_analyzer.js";
|
|
17
|
+
// Default timing parameters
|
|
18
|
+
export const STOP_SECS = 3;
|
|
19
|
+
export const PRE_SPEECH_MS = 500;
|
|
20
|
+
export const MAX_DURATION_SECONDS = 8; // Max allowed segment duration
|
|
21
|
+
/** Configuration parameters for smart turn analysis. */
|
|
22
|
+
export class SmartTurnParams extends BaseTurnParams {
|
|
23
|
+
stopSecs;
|
|
24
|
+
preSpeechMs;
|
|
25
|
+
maxDurationSecs;
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
super(options);
|
|
28
|
+
this.stopSecs = options.stopSecs ?? STOP_SECS;
|
|
29
|
+
this.preSpeechMs = options.preSpeechMs ?? PRE_SPEECH_MS;
|
|
30
|
+
this.maxDurationSecs = options.maxDurationSecs ?? MAX_DURATION_SECONDS;
|
|
31
|
+
}
|
|
32
|
+
toString() {
|
|
33
|
+
return (`stop_secs=${this.stopSecs} pre_speech_ms=${this.preSpeechMs} ` +
|
|
34
|
+
`max_duration_secs=${this.maxDurationSecs}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Exception raised when smart turn analysis times out. */
|
|
38
|
+
export class SmartTurnTimeoutException extends Error {
|
|
39
|
+
name = "SmartTurnTimeoutException";
|
|
40
|
+
}
|
|
41
|
+
function endOfTurnStateName(state) {
|
|
42
|
+
return state === EndOfTurnState.COMPLETE
|
|
43
|
+
? "EndOfTurnState.COMPLETE"
|
|
44
|
+
: "EndOfTurnState.INCOMPLETE";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Base class for smart turn analyzers using ML models.
|
|
48
|
+
*
|
|
49
|
+
* Provides common functionality for smart turn detection including audio
|
|
50
|
+
* buffering, speech tracking, and ML model integration. Subclasses must
|
|
51
|
+
* implement the specific model prediction logic.
|
|
52
|
+
*
|
|
53
|
+
* Upstream runs the model on a dedicated thread; there are no threads on every
|
|
54
|
+
* runtime we target, so prediction is an async method run inline.
|
|
55
|
+
*/
|
|
56
|
+
export class BaseSmartTurn extends BaseTurnAnalyzer {
|
|
57
|
+
_params;
|
|
58
|
+
// Configuration
|
|
59
|
+
_stopMs;
|
|
60
|
+
// Inference state
|
|
61
|
+
_audioBuffer = [];
|
|
62
|
+
_speechTriggered = false;
|
|
63
|
+
_silenceMs = 0;
|
|
64
|
+
_speechStartTime = 0;
|
|
65
|
+
_vadStartSecs = 0.0;
|
|
66
|
+
constructor(options = {}) {
|
|
67
|
+
super(options);
|
|
68
|
+
this._params = options.params ?? new SmartTurnParams();
|
|
69
|
+
this._stopMs = this._params.stopSecs * 1000; // silence threshold in ms
|
|
70
|
+
}
|
|
71
|
+
/** Whether speech has been detected and turn analysis is active. */
|
|
72
|
+
get speechTriggered() {
|
|
73
|
+
return this._speechTriggered;
|
|
74
|
+
}
|
|
75
|
+
/** The current smart turn configuration parameters. */
|
|
76
|
+
get params() {
|
|
77
|
+
return this._params;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Append audio data for turn analysis.
|
|
81
|
+
*
|
|
82
|
+
* @param buffer Raw audio data bytes to append for analysis.
|
|
83
|
+
* @param isSpeech Whether the audio buffer contains detected speech.
|
|
84
|
+
* @returns Current end-of-turn state after processing the audio.
|
|
85
|
+
*/
|
|
86
|
+
appendAudio(buffer, isSpeech) {
|
|
87
|
+
// Append the raw int16 PCM view to the buffer. Conversion to float32 is
|
|
88
|
+
// deferred until _processSpeechSegment, where it runs once per turn on
|
|
89
|
+
// the concatenated segment instead of once per ~20 ms audio frame. The
|
|
90
|
+
// samples are copied so later mutation of the caller's buffer can't leak
|
|
91
|
+
// in (Python relies on `bytes` being immutable).
|
|
92
|
+
const audioInt16 = new Int16Array(buffer.slice(0, buffer.length - (buffer.length % 2)).buffer);
|
|
93
|
+
this._audioBuffer.push([monotonic(), audioInt16]);
|
|
94
|
+
let state = EndOfTurnState.INCOMPLETE;
|
|
95
|
+
if (isSpeech) {
|
|
96
|
+
// Reset silence tracking on speech
|
|
97
|
+
this._silenceMs = 0;
|
|
98
|
+
this._speechTriggered = true;
|
|
99
|
+
if (this._speechStartTime === 0) {
|
|
100
|
+
this._speechStartTime = monotonic();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
if (this._speechTriggered) {
|
|
105
|
+
const chunkDurationMs = audioInt16.length / (this._sampleRate / 1000);
|
|
106
|
+
this._silenceMs += chunkDurationMs;
|
|
107
|
+
// If silence exceeds threshold, mark end of turn
|
|
108
|
+
if (this._silenceMs >= this._stopMs) {
|
|
109
|
+
logger.debug(`End of Turn complete due to stop_secs. Silence in ms: ${this._silenceMs}`);
|
|
110
|
+
state = EndOfTurnState.COMPLETE;
|
|
111
|
+
this._clear(state);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Trim buffer to prevent unbounded growth before speech
|
|
116
|
+
const maxBufferTime = this._params.preSpeechMs / 1000 + this._params.stopSecs + this._params.maxDurationSecs;
|
|
117
|
+
while (this._audioBuffer.length > 0 &&
|
|
118
|
+
this._audioBuffer[0][0] < monotonic() - maxBufferTime) {
|
|
119
|
+
this._audioBuffer.shift();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return state;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Analyze the current audio state to determine if turn has ended.
|
|
127
|
+
*
|
|
128
|
+
* @returns The end-of-turn state and optional metrics data from the ML
|
|
129
|
+
* model analysis.
|
|
130
|
+
*/
|
|
131
|
+
async analyzeEndOfTurn() {
|
|
132
|
+
const [state, result] = await this._processSpeechSegment(this._audioBuffer);
|
|
133
|
+
if (state === EndOfTurnState.COMPLETE) {
|
|
134
|
+
this._clear(state);
|
|
135
|
+
}
|
|
136
|
+
logger.debug(`End of Turn result: ${endOfTurnStateName(state)}`);
|
|
137
|
+
return [state, result];
|
|
138
|
+
}
|
|
139
|
+
/** Store the new vadStartSecs value. */
|
|
140
|
+
updateVadStartSecs(vadStartSecs) {
|
|
141
|
+
this._vadStartSecs = vadStartSecs;
|
|
142
|
+
}
|
|
143
|
+
/** Reset the turn analyzer to its initial state. */
|
|
144
|
+
clear() {
|
|
145
|
+
this._clear(EndOfTurnState.COMPLETE);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Release the analyzer's resources.
|
|
149
|
+
*
|
|
150
|
+
* The analyzer stays usable: cleaning up is not only teardown here, since a
|
|
151
|
+
* turn strategy is cleaned up and re-applied whenever the strategies are
|
|
152
|
+
* updated. (Upstream stops its model thread here; there is none in the
|
|
153
|
+
* port.)
|
|
154
|
+
*/
|
|
155
|
+
async cleanup() {
|
|
156
|
+
await super.cleanup();
|
|
157
|
+
}
|
|
158
|
+
/** Clear internal state based on turn completion status. */
|
|
159
|
+
_clear(turnState) {
|
|
160
|
+
// If the state is still incomplete, keep the _speechTriggered as true
|
|
161
|
+
this._speechTriggered = turnState === EndOfTurnState.INCOMPLETE;
|
|
162
|
+
this._audioBuffer = [];
|
|
163
|
+
this._speechStartTime = 0;
|
|
164
|
+
this._silenceMs = 0;
|
|
165
|
+
}
|
|
166
|
+
/** Process accumulated audio segment using ML model. */
|
|
167
|
+
async _processSpeechSegment(audioBuffer) {
|
|
168
|
+
let state = EndOfTurnState.INCOMPLETE;
|
|
169
|
+
if (audioBuffer.length === 0) {
|
|
170
|
+
return [state, null];
|
|
171
|
+
}
|
|
172
|
+
// Extract recent audio segment for prediction
|
|
173
|
+
const effectivePreSpeechMs = this._params.preSpeechMs + this._vadStartSecs * 1000;
|
|
174
|
+
const startTime = this._speechStartTime - effectivePreSpeechMs / 1000;
|
|
175
|
+
let startIndex = 0;
|
|
176
|
+
for (let i = 0; i < audioBuffer.length; i++) {
|
|
177
|
+
const [t] = audioBuffer[i];
|
|
178
|
+
if (t >= startTime) {
|
|
179
|
+
startIndex = i;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const endIndex = audioBuffer.length - 1;
|
|
184
|
+
// Extract the audio segment. The buffer holds int16 PCM; defer the
|
|
185
|
+
// float32 conversion until after concatenation so it runs once per turn
|
|
186
|
+
// instead of once per appended frame.
|
|
187
|
+
const segmentChunks = audioBuffer.slice(startIndex, endIndex + 1).map(([, chunk]) => chunk);
|
|
188
|
+
const totalLength = segmentChunks.reduce((n, chunk) => n + chunk.length, 0);
|
|
189
|
+
let segmentAudio = new Float32Array(totalLength);
|
|
190
|
+
let offset = 0;
|
|
191
|
+
for (const chunk of segmentChunks) {
|
|
192
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
193
|
+
segmentAudio[offset + i] = chunk[i] / 32768.0;
|
|
194
|
+
}
|
|
195
|
+
offset += chunk.length;
|
|
196
|
+
}
|
|
197
|
+
// Limit maximum duration
|
|
198
|
+
const maxSamples = Math.trunc(this._params.maxDurationSecs * this.sampleRate);
|
|
199
|
+
if (segmentAudio.length > maxSamples) {
|
|
200
|
+
// Keep the last maxSamples samples, discarding the earlier part.
|
|
201
|
+
segmentAudio = segmentAudio.slice(segmentAudio.length - maxSamples);
|
|
202
|
+
}
|
|
203
|
+
let resultData = null;
|
|
204
|
+
if (segmentAudio.length > 0) {
|
|
205
|
+
const start = performance.now();
|
|
206
|
+
try {
|
|
207
|
+
// Upstream awaits the model on an executor, which is a cancellation
|
|
208
|
+
// point; `abortable` keeps it one here.
|
|
209
|
+
const result = await abortable(this._predictEndpoint(segmentAudio));
|
|
210
|
+
state = result.prediction === 1 ? EndOfTurnState.COMPLETE : EndOfTurnState.INCOMPLETE;
|
|
211
|
+
const end = performance.now();
|
|
212
|
+
// Calculate processing time
|
|
213
|
+
const e2eProcessingTimeMs = end - start;
|
|
214
|
+
// Prepare the result data
|
|
215
|
+
resultData = new TurnMetricsData({
|
|
216
|
+
processor: "BaseSmartTurn",
|
|
217
|
+
isComplete: result.prediction === 1,
|
|
218
|
+
probability: result.probability,
|
|
219
|
+
e2eProcessingTimeMs,
|
|
220
|
+
});
|
|
221
|
+
logger.trace(`Prediction: ${resultData.isComplete ? "Complete" : "Incomplete"}`);
|
|
222
|
+
logger.trace(`Probability of complete: ${resultData.probability.toFixed(4)}`);
|
|
223
|
+
logger.trace(`E2E processing time: ${resultData.e2eProcessingTimeMs.toFixed(2)}ms`);
|
|
224
|
+
}
|
|
225
|
+
catch (e) {
|
|
226
|
+
if (!(e instanceof SmartTurnTimeoutException))
|
|
227
|
+
throw e;
|
|
228
|
+
logger.debug(`End of Turn complete due to stop_secs. Silence in ms: ${this._silenceMs}`);
|
|
229
|
+
state = EndOfTurnState.COMPLETE;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
logger.trace(`params: ${this._params}, stop_ms: ${this._stopMs}`);
|
|
234
|
+
logger.trace("Captured empty audio segment, skipping prediction.");
|
|
235
|
+
}
|
|
236
|
+
return [state, resultData];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=base_smart_turn.js.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { BaseSmartTurn, type BaseSmartTurnOptions, type SmartTurnPrediction } from "./base_smart_turn.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The Whisper-based ONNX model expects 16 kHz audio input.
|
|
4
|
+
*
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export declare const MODEL_SAMPLE_RATE = 16000;
|
|
8
|
+
/** Session options matching upstream's `onnxruntime.SessionOptions`. */
|
|
9
|
+
export interface SmartTurnSessionOptions {
|
|
10
|
+
executionMode: "sequential";
|
|
11
|
+
interOpNumThreads: number;
|
|
12
|
+
intraOpNumThreads: number;
|
|
13
|
+
graphOptimizationLevel: "all";
|
|
14
|
+
}
|
|
15
|
+
/** A tensor fed to the model: row-major data plus its dimensions. */
|
|
16
|
+
export interface SmartTurnTensor {
|
|
17
|
+
data: Float32Array;
|
|
18
|
+
dims: number[];
|
|
19
|
+
}
|
|
20
|
+
/** The part of an ONNX inference session the analyzer uses. */
|
|
21
|
+
export interface SmartTurnInferenceSession {
|
|
22
|
+
/**
|
|
23
|
+
* Run the model and return its first output as a flat array (the sigmoid
|
|
24
|
+
* probability of turn completion is element 0).
|
|
25
|
+
*/
|
|
26
|
+
run(feeds: {
|
|
27
|
+
input_features: SmartTurnTensor;
|
|
28
|
+
}): Promise<ArrayLike<number>>;
|
|
29
|
+
}
|
|
30
|
+
/** Creates an inference session for a model file/URL. */
|
|
31
|
+
export type SmartTurnSessionFactory = (modelPath: string, options: SmartTurnSessionOptions) => Promise<SmartTurnInferenceSession>;
|
|
32
|
+
export interface LocalSmartTurnAnalyzerV3Options extends BaseSmartTurnOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Path/URL to the ONNX model file. If not set, the upstream bundled model
|
|
35
|
+
* name (smart-turn-v3.2-cpu.onnx) is used.
|
|
36
|
+
*/
|
|
37
|
+
smartTurnModelPath?: string | null;
|
|
38
|
+
/** The number of CPUs to use for inference. Defaults to 1. */
|
|
39
|
+
cpuCount?: number;
|
|
40
|
+
/** Creates the ONNX inference session (injected runtime). */
|
|
41
|
+
createSession?: SmartTurnSessionFactory;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Local turn analyzer using the smart-turn-v3 ONNX model.
|
|
45
|
+
*
|
|
46
|
+
* Provides end-of-turn detection using a locally-stored ONNX model, enabling
|
|
47
|
+
* offline operation without network dependencies.
|
|
48
|
+
*/
|
|
49
|
+
export declare class LocalSmartTurnAnalyzerV3 extends BaseSmartTurn {
|
|
50
|
+
protected _logData: boolean;
|
|
51
|
+
protected _smartTurnModelPath: string;
|
|
52
|
+
protected _sessionOptions: SmartTurnSessionOptions;
|
|
53
|
+
protected _createSession: SmartTurnSessionFactory;
|
|
54
|
+
protected _session: Promise<SmartTurnInferenceSession>;
|
|
55
|
+
constructor(options?: LocalSmartTurnAnalyzerV3Options);
|
|
56
|
+
/**
|
|
57
|
+
* Write audio data to a WAV file.
|
|
58
|
+
*
|
|
59
|
+
* STUB: core has no filesystem access; logs a warning instead.
|
|
60
|
+
*
|
|
61
|
+
* @param audioArray The audio data (float32, normalized to [-1, 1]).
|
|
62
|
+
* @param sampleRate The sample rate of the audio data.
|
|
63
|
+
* @param suffix Optional suffix to append to the filename.
|
|
64
|
+
*/
|
|
65
|
+
protected _writeAudioToWav(_audioArray: Float32Array, _sampleRate?: number, suffix?: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Resample audio to the model's expected sample rate (16 kHz).
|
|
68
|
+
*
|
|
69
|
+
* @param audioArray Audio data as a float32 array.
|
|
70
|
+
* @returns Resampled audio array at 16 kHz.
|
|
71
|
+
*/
|
|
72
|
+
protected _resampleToModelRate(audioArray: Float32Array): Float32Array;
|
|
73
|
+
/** Predict end-of-turn using local ONNX model. */
|
|
74
|
+
protected _predictEndpoint(audioArray: Float32Array): Promise<SmartTurnPrediction>;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=local_smart_turn_v3.d.ts.map
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/audio/turn/smart_turn/local_smart_turn_v3.py
|
|
6
|
+
/**
|
|
7
|
+
* Local turn analyzer for on-device ML inference using the smart-turn-v3 model.
|
|
8
|
+
*
|
|
9
|
+
* Provides a smart turn analyzer that uses an ONNX model for local
|
|
10
|
+
* end-of-turn detection without requiring network connectivity.
|
|
11
|
+
*
|
|
12
|
+
* PORTING NOTES:
|
|
13
|
+
* - There is no ONNX runtime in core. The analyzer takes an injected
|
|
14
|
+
* `createSession` (backed by `onnxruntime-node` on Bun/Node or
|
|
15
|
+
* `onnxruntime-web` on Workers); the default one is a stub that throws
|
|
16
|
+
* "not ported yet".
|
|
17
|
+
* - The model is not bundled; `smartTurnModelPath` defaults to the upstream
|
|
18
|
+
* file name and is handed to `createSession` as is.
|
|
19
|
+
* - Resampling to 16 kHz uses the soxr stub, so pipelines must run at 16 kHz
|
|
20
|
+
* until a resampler is available.
|
|
21
|
+
* - `PIPECAT_SMART_TURN_LOG_DATA` WAV dumps need a filesystem, which core
|
|
22
|
+
* doesn't use; the dump is a stub that logs a warning.
|
|
23
|
+
*/
|
|
24
|
+
import { envTruthy } from "../../../utils/env.js";
|
|
25
|
+
import { logger } from "../../../utils/logger.js";
|
|
26
|
+
import { soxrResample } from "../../resamplers/soxr_resampler.js";
|
|
27
|
+
import { computeWhisperLogMelFeatures, WHISPER_NUM_FRAMES, WHISPER_NUM_MELS, } from "./_whisper_features.js";
|
|
28
|
+
import { BaseSmartTurn, } from "./base_smart_turn.js";
|
|
29
|
+
/**
|
|
30
|
+
* The Whisper-based ONNX model expects 16 kHz audio input.
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export const MODEL_SAMPLE_RATE = 16000;
|
|
35
|
+
const notPortedSessionFactory = async () => {
|
|
36
|
+
throw new Error("LocalSmartTurnAnalyzerV3: ONNX runtime is not ported yet; pass `createSession`");
|
|
37
|
+
};
|
|
38
|
+
function truncateAudioToLastNSeconds(audioArray, nSeconds = 8, sampleRate = MODEL_SAMPLE_RATE) {
|
|
39
|
+
// Truncate audio to last n seconds or pad with zeros to meet n seconds.
|
|
40
|
+
const maxSamples = nSeconds * sampleRate;
|
|
41
|
+
if (audioArray.length > maxSamples) {
|
|
42
|
+
return audioArray.slice(audioArray.length - maxSamples);
|
|
43
|
+
}
|
|
44
|
+
if (audioArray.length < maxSamples) {
|
|
45
|
+
// Pad with zeros at the beginning
|
|
46
|
+
const padded = new Float32Array(maxSamples);
|
|
47
|
+
padded.set(audioArray, maxSamples - audioArray.length);
|
|
48
|
+
return padded;
|
|
49
|
+
}
|
|
50
|
+
return audioArray;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Local turn analyzer using the smart-turn-v3 ONNX model.
|
|
54
|
+
*
|
|
55
|
+
* Provides end-of-turn detection using a locally-stored ONNX model, enabling
|
|
56
|
+
* offline operation without network dependencies.
|
|
57
|
+
*/
|
|
58
|
+
export class LocalSmartTurnAnalyzerV3 extends BaseSmartTurn {
|
|
59
|
+
_logData;
|
|
60
|
+
_smartTurnModelPath;
|
|
61
|
+
_sessionOptions;
|
|
62
|
+
_createSession;
|
|
63
|
+
_session;
|
|
64
|
+
constructor(options = {}) {
|
|
65
|
+
super(options);
|
|
66
|
+
this._logData = envTruthy("PIPECAT_SMART_TURN_LOG_DATA", false);
|
|
67
|
+
// Upstream loads the model bundled with the package by default.
|
|
68
|
+
this._smartTurnModelPath = options.smartTurnModelPath || "smart-turn-v3.2-cpu.onnx";
|
|
69
|
+
logger.debug(`Loading Local Smart Turn v3.x model from ${this._smartTurnModelPath}...`);
|
|
70
|
+
this._sessionOptions = {
|
|
71
|
+
executionMode: "sequential",
|
|
72
|
+
interOpNumThreads: 1,
|
|
73
|
+
intraOpNumThreads: options.cpuCount ?? 1,
|
|
74
|
+
graphOptimizationLevel: "all",
|
|
75
|
+
};
|
|
76
|
+
this._createSession = options.createSession ?? notPortedSessionFactory;
|
|
77
|
+
// Session creation is async in JS; it starts now and is awaited on first
|
|
78
|
+
// prediction.
|
|
79
|
+
this._session = this._createSession(this._smartTurnModelPath, this._sessionOptions).then((session) => {
|
|
80
|
+
logger.debug("Loaded Local Smart Turn v3.x");
|
|
81
|
+
return session;
|
|
82
|
+
});
|
|
83
|
+
// Errors surface on first use; don't report an unhandled rejection now.
|
|
84
|
+
this._session.catch(() => { });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Write audio data to a WAV file.
|
|
88
|
+
*
|
|
89
|
+
* STUB: core has no filesystem access; logs a warning instead.
|
|
90
|
+
*
|
|
91
|
+
* @param audioArray The audio data (float32, normalized to [-1, 1]).
|
|
92
|
+
* @param sampleRate The sample rate of the audio data.
|
|
93
|
+
* @param suffix Optional suffix to append to the filename.
|
|
94
|
+
*/
|
|
95
|
+
_writeAudioToWav(_audioArray, _sampleRate = MODEL_SAMPLE_RATE, suffix = "") {
|
|
96
|
+
logger.warning(`Smart turn audio logging (${suffix}) is not ported yet: no filesystem access in core`);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resample audio to the model's expected sample rate (16 kHz).
|
|
100
|
+
*
|
|
101
|
+
* @param audioArray Audio data as a float32 array.
|
|
102
|
+
* @returns Resampled audio array at 16 kHz.
|
|
103
|
+
*/
|
|
104
|
+
_resampleToModelRate(audioArray) {
|
|
105
|
+
const actualRate = this._sampleRate || MODEL_SAMPLE_RATE;
|
|
106
|
+
if (actualRate === MODEL_SAMPLE_RATE) {
|
|
107
|
+
return audioArray;
|
|
108
|
+
}
|
|
109
|
+
return soxrResample(audioArray, actualRate, MODEL_SAMPLE_RATE, "HQ");
|
|
110
|
+
}
|
|
111
|
+
/** Predict end-of-turn using local ONNX model. */
|
|
112
|
+
async _predictEndpoint(audioArray) {
|
|
113
|
+
const audioForLogging = audioArray;
|
|
114
|
+
const actualRate = this._sampleRate || MODEL_SAMPLE_RATE;
|
|
115
|
+
// Resample to 16 kHz if the pipeline uses a different sample rate
|
|
116
|
+
audioArray = this._resampleToModelRate(audioArray);
|
|
117
|
+
// Truncate to 8 seconds (keeping the end) or pad to 8 seconds
|
|
118
|
+
audioArray = truncateAudioToLastNSeconds(audioArray, 8);
|
|
119
|
+
// Compute Whisper-style log-mel features (vendored implementation).
|
|
120
|
+
const logMel = computeWhisperLogMelFeatures(audioArray, { doNormalize: true });
|
|
121
|
+
// Add batch dimension
|
|
122
|
+
const inputFeatures = {
|
|
123
|
+
data: logMel,
|
|
124
|
+
dims: [1, WHISPER_NUM_MELS, WHISPER_NUM_FRAMES],
|
|
125
|
+
};
|
|
126
|
+
// Run ONNX inference
|
|
127
|
+
const session = await this._session;
|
|
128
|
+
const output = await session.run({ input_features: inputFeatures });
|
|
129
|
+
// Extract probability (ONNX model returns sigmoid probabilities)
|
|
130
|
+
const probability = Number(output[0]);
|
|
131
|
+
// Make prediction (1 for Complete, 0 for Incomplete)
|
|
132
|
+
const prediction = probability > 0.5 ? 1 : 0;
|
|
133
|
+
if (this._logData) {
|
|
134
|
+
const suffix = prediction === 1 ? "_complete" : "_incomplete";
|
|
135
|
+
this._writeAudioToWav(audioForLogging, actualRate, suffix);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
prediction,
|
|
139
|
+
probability,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=local_smart_turn_v3.js.map
|