@pipedog/core 0.0.0 → 0.2.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/engine.d.ts +60 -0
- package/dist/audio/resamplers/engine.js +89 -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/sinc_engine.d.ts +10 -0
- package/dist/audio/resamplers/sinc_engine.js +235 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
- package/dist/audio/resamplers/soxr_resampler.js +79 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +159 -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 +151 -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 +134 -0
- package/dist/audio/vad/vad_analyzer.js +249 -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 +821 -0
- package/dist/pipeline/worker.js +1656 -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 +115 -0
- package/dist/utils/file_storage.js +178 -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 +14 -0
- package/dist/utils/image.js +63 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jpeg_encoder.d.ts +14 -0
- package/dist/utils/jpeg_encoder.js +315 -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/acronyms.d.ts +21 -0
- package/dist/utils/text/transforms/acronyms.js +31 -0
- package/dist/utils/text/transforms/currency.d.ts +16 -0
- package/dist/utils/text/transforms/currency.js +56 -0
- package/dist/utils/text/transforms/dates.d.ts +18 -0
- package/dist/utils/text/transforms/dates.js +102 -0
- package/dist/utils/text/transforms/email.d.ts +17 -0
- package/dist/utils/text/transforms/email.js +35 -0
- package/dist/utils/text/transforms/index.d.ts +37 -0
- package/dist/utils/text/transforms/index.js +42 -0
- package/dist/utils/text/transforms/numbers.d.ts +25 -0
- package/dist/utils/text/transforms/numbers.js +59 -0
- package/dist/utils/text/transforms/percentages.d.ts +16 -0
- package/dist/utils/text/transforms/percentages.js +32 -0
- package/dist/utils/text/transforms/phone.d.ts +21 -0
- package/dist/utils/text/transforms/phone.js +39 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +112 -0
- package/dist/utils/text/transforms/replacements.d.ts +39 -0
- package/dist/utils/text/transforms/replacements.js +46 -0
- package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
- package/dist/utils/text/transforms/strip_markdown.js +60 -0
- package/dist/utils/text/transforms/units.d.ts +22 -0
- package/dist/utils/text/transforms/units.js +81 -0
- package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
- package/dist/utils/text/transforms/voice_formatter.js +98 -0
- package/dist/utils/text/unicode_digits.d.ts +3 -0
- package/dist/utils/text/unicode_digits.js +34 -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 +107 -0
- package/dist/utils/tracing/setup.js +160 -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 +95 -0
- package/dist/utils/tracing/turn_trace_observer.js +233 -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 +179 -0
- package/dist/utils/yaml.js +556 -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/proxy/index.d.ts +3 -0
- package/dist/workers/proxy/index.js +9 -0
- package/dist/workers/proxy/websocket/client.d.ts +110 -0
- package/dist/workers/proxy/websocket/client.js +196 -0
- package/dist/workers/proxy/websocket/index.d.ts +3 -0
- package/dist/workers/proxy/websocket/index.js +10 -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 +61 -3
- package/README.md +0 -5
|
@@ -0,0 +1,303 @@
|
|
|
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/turns/user_stop/speech_timeout_user_turn_stop_strategy.py
|
|
6
|
+
/** Speech timeout-based user turn stop strategy. */
|
|
7
|
+
import { CancelledError, sleep } from "@pipedog/asyncio";
|
|
8
|
+
import { VAD_STOP_SECS } from "../../audio/vad/vad_analyzer.js";
|
|
9
|
+
import { InterimTranscriptionFrame, STTMetadataFrame, TranscriptionFrame, VADUserStartedSpeakingFrame, VADUserStoppedSpeakingFrame, } from "../../frames/frames.js";
|
|
10
|
+
import { logger } from "../../utils/logger.js";
|
|
11
|
+
import { ProcessFrameResult } from "../types.js";
|
|
12
|
+
import { BaseUserTurnStopStrategy, } from "./base_user_turn_stop_strategy.js";
|
|
13
|
+
/**
|
|
14
|
+
* User turn stop strategy using two independent timers after VAD stop.
|
|
15
|
+
*
|
|
16
|
+
* After the user stops speaking (detected by VAD), this strategy runs two
|
|
17
|
+
* independent timers. The user turn stop is triggered only when both have
|
|
18
|
+
* finished and at least one transcript has been received:
|
|
19
|
+
*
|
|
20
|
+
* - userSpeechTimeout: Policy floor — the window in which the user may
|
|
21
|
+
* resume speaking after a pause. Always runs to completion.
|
|
22
|
+
* - sttTimeout: Safety net for STT latency — the P99 time for the STT
|
|
23
|
+
* service to return a final transcript after VAD stop, adjusted by the
|
|
24
|
+
* VAD stopSecs. Short-circuited when the STT service emits a finalized
|
|
25
|
+
* transcript (`TranscriptionFrame.finalized`), since finalization means
|
|
26
|
+
* STT has nothing more to send.
|
|
27
|
+
*
|
|
28
|
+
* Fallback: when a transcript arrives without a VAD stop event, the
|
|
29
|
+
* userSpeechTimeout timer measures inactivity since the last transcript
|
|
30
|
+
* (rearmed on each transcript). sttTimeout has no meaning here since it
|
|
31
|
+
* is defined relative to VAD stop, and STT has already emitted a
|
|
32
|
+
* transcript — so the stt wait is marked done immediately.
|
|
33
|
+
*/
|
|
34
|
+
export class SpeechTimeoutUserTurnStopStrategy extends BaseUserTurnStopStrategy {
|
|
35
|
+
_userSpeechTimeout;
|
|
36
|
+
_waitForTranscript;
|
|
37
|
+
_sttTimeout = 0.0; // STT P99 latency from STTMetadataFrame
|
|
38
|
+
_stopSecs = 0.0; // VAD stop_secs from VADUserStoppedSpeakingFrame
|
|
39
|
+
_stopSecsWarned = false;
|
|
40
|
+
_text = "";
|
|
41
|
+
_vadUserSpeaking = false;
|
|
42
|
+
_transcriptFinalized = false;
|
|
43
|
+
_vadStopped = false; // Whether VAD reported a stop this turn
|
|
44
|
+
_userSpeechTimeoutTask = null;
|
|
45
|
+
_sttTimeoutTask = null;
|
|
46
|
+
_userSpeechWaitDone = false;
|
|
47
|
+
_sttWaitDone = false;
|
|
48
|
+
constructor(options = {}) {
|
|
49
|
+
super(options);
|
|
50
|
+
this._userSpeechTimeout = options.userSpeechTimeout ?? 0.6;
|
|
51
|
+
this._waitForTranscript = options.waitForTranscript ?? true;
|
|
52
|
+
}
|
|
53
|
+
/** Whether transcripts gate end-of-turn signalling. */
|
|
54
|
+
get waitForTranscript() {
|
|
55
|
+
return this._waitForTranscript;
|
|
56
|
+
}
|
|
57
|
+
set waitForTranscript(value) {
|
|
58
|
+
this._waitForTranscript = value;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Ready the strategy to detect the end of the turn now starting.
|
|
62
|
+
*
|
|
63
|
+
* `_vadUserSpeaking` is deliberately preserved: it reflects the live
|
|
64
|
+
* physical VAD state, not turn-scoped bookkeeping. VAD only re-emits a
|
|
65
|
+
* start after a stop, so clearing the flag for a turn that begins while
|
|
66
|
+
* the user is still speaking would leave the strategy with no active VAD
|
|
67
|
+
* reference, treating any transcript as a standalone utterance.
|
|
68
|
+
*/
|
|
69
|
+
async handleUserTurnStarted() {
|
|
70
|
+
await this._reset({ clearVadUserSpeaking: false });
|
|
71
|
+
}
|
|
72
|
+
/** Clear per-turn state once the turn has ended. */
|
|
73
|
+
async handleUserTurnStopped() {
|
|
74
|
+
await this._reset({ clearVadUserSpeaking: true });
|
|
75
|
+
}
|
|
76
|
+
/** Clear per-turn state, optionally resetting the live VAD flag. */
|
|
77
|
+
async _reset(options) {
|
|
78
|
+
this._text = "";
|
|
79
|
+
if (options.clearVadUserSpeaking) {
|
|
80
|
+
this._vadUserSpeaking = false;
|
|
81
|
+
}
|
|
82
|
+
await this._discardPendingEndOfTurn();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Drop whatever progress toward an end-of-turn has been made so far.
|
|
86
|
+
*
|
|
87
|
+
* Runs at a turn boundary, and whenever VAD reports the user speaking
|
|
88
|
+
* again — which makes earlier progress stale mid-turn.
|
|
89
|
+
*/
|
|
90
|
+
async _discardPendingEndOfTurn() {
|
|
91
|
+
this._transcriptFinalized = false;
|
|
92
|
+
this._vadStopped = false;
|
|
93
|
+
this._userSpeechWaitDone = false;
|
|
94
|
+
this._sttWaitDone = false;
|
|
95
|
+
await this._cancelAllTasks();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Set up the strategy.
|
|
99
|
+
*
|
|
100
|
+
* @param setup Configuration object containing setup parameters.
|
|
101
|
+
*/
|
|
102
|
+
async setup(setup) {
|
|
103
|
+
await super.setup(setup);
|
|
104
|
+
}
|
|
105
|
+
/** Cleanup the strategy. */
|
|
106
|
+
async cleanup() {
|
|
107
|
+
await super.cleanup();
|
|
108
|
+
await this._cancelAllTasks();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Process an incoming frame to update strategy state.
|
|
112
|
+
*
|
|
113
|
+
* Updates internal transcription text and VAD state. The user end turn
|
|
114
|
+
* will be triggered when appropriate based on the collected frames.
|
|
115
|
+
*
|
|
116
|
+
* @param frame The frame to be analyzed.
|
|
117
|
+
* @returns Always returns CONTINUE so subsequent stop strategies are evaluated.
|
|
118
|
+
*/
|
|
119
|
+
async processFrame(frame) {
|
|
120
|
+
if (frame instanceof STTMetadataFrame) {
|
|
121
|
+
this._sttTimeout = frame.ttfsP99Latency;
|
|
122
|
+
this._stopSecsWarned = false;
|
|
123
|
+
}
|
|
124
|
+
else if (frame instanceof VADUserStartedSpeakingFrame) {
|
|
125
|
+
logger.debug(`${this} VADUserStartedSpeakingFrame received`);
|
|
126
|
+
await this._handleVadUserStartedSpeaking(frame);
|
|
127
|
+
}
|
|
128
|
+
else if (frame instanceof VADUserStoppedSpeakingFrame) {
|
|
129
|
+
logger.debug(`${this} VADUserStoppedSpeakingFrame received`);
|
|
130
|
+
await this._handleVadUserStoppedSpeaking(frame);
|
|
131
|
+
}
|
|
132
|
+
else if (frame instanceof TranscriptionFrame) {
|
|
133
|
+
await this._handleTranscription(frame);
|
|
134
|
+
}
|
|
135
|
+
else if (frame instanceof InterimTranscriptionFrame) {
|
|
136
|
+
// An interim means more transcription is still on the way, so an
|
|
137
|
+
// earlier finalized transcript no longer covers all of the user's
|
|
138
|
+
// speech.
|
|
139
|
+
// Without this, a transcript finalized during a pause too short for
|
|
140
|
+
// VAD to report a stop (and thus a new start, which is what normally
|
|
141
|
+
// clears the flag) would leave the flag stale and skip the STT
|
|
142
|
+
// safety net at the next VAD stop while the tail of the utterance is
|
|
143
|
+
// still in flight. This can happen when the STT endpointer finalizes
|
|
144
|
+
// on silences shorter than the VAD stop_secs — e.g. an aggressive
|
|
145
|
+
// STT endpoint or a manually raised stop_secs.
|
|
146
|
+
this._transcriptFinalized = false;
|
|
147
|
+
}
|
|
148
|
+
return ProcessFrameResult.CONTINUE;
|
|
149
|
+
}
|
|
150
|
+
/** Handle when the VAD indicates the user is speaking. */
|
|
151
|
+
async _handleVadUserStartedSpeaking(_frame) {
|
|
152
|
+
this._vadUserSpeaking = true;
|
|
153
|
+
await this._discardPendingEndOfTurn();
|
|
154
|
+
}
|
|
155
|
+
/** Handle when the VAD indicates the user has stopped speaking. */
|
|
156
|
+
async _handleVadUserStoppedSpeaking(frame) {
|
|
157
|
+
this._vadUserSpeaking = false;
|
|
158
|
+
this._stopSecs = frame.stopSecs;
|
|
159
|
+
this._vadStopped = true;
|
|
160
|
+
if (!this._stopSecsWarned) {
|
|
161
|
+
if (this._stopSecs !== VAD_STOP_SECS) {
|
|
162
|
+
this._stopSecsWarned = true;
|
|
163
|
+
logger.warning(`${this}: VAD stop_secs (${this._stopSecs}s) differs from the ` +
|
|
164
|
+
`recommended default (${VAD_STOP_SECS}s). Built-in p99 latency ` +
|
|
165
|
+
`values assume stop_secs=${VAD_STOP_SECS}. Re-run ` +
|
|
166
|
+
"https://github.com/pipecat-ai/stt-benchmark with your settings " +
|
|
167
|
+
"and pass the TTFS P99 latency result as ttfs_p99_latency to " +
|
|
168
|
+
"your STT service.");
|
|
169
|
+
}
|
|
170
|
+
if (this._sttTimeout > 0 && this._stopSecs >= this._sttTimeout) {
|
|
171
|
+
this._stopSecsWarned = true;
|
|
172
|
+
logger.warning(`${this}: VAD stop_secs (${this._stopSecs}s) >= STT p99 latency ` +
|
|
173
|
+
`(${this._sttTimeout}s). STT wait timeout collapsed to 0s, which ` +
|
|
174
|
+
"may cause delayed turn detection specified by the " +
|
|
175
|
+
"user_turn_stop_timeout parameter in the LLMUserAggregatorParams.");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// userSpeechTimeout is the policy floor and always runs. A prior
|
|
179
|
+
// fallback-mode run of the same timer is superseded here.
|
|
180
|
+
await this._restartUserSpeechTimer();
|
|
181
|
+
// sttTimeout is a safety net. Short-circuit it if the transcript is
|
|
182
|
+
// already finalized, or if the VAD stop_secs already covered it.
|
|
183
|
+
this._sttWaitDone = false;
|
|
184
|
+
const effectiveSttWait = Math.max(0.0, this._sttTimeout - this._stopSecs);
|
|
185
|
+
if (this._transcriptFinalized || effectiveSttWait <= 0) {
|
|
186
|
+
this._sttWaitDone = true;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this._sttTimeoutTask = this.taskManager.createTask(() => this._sttTimeoutHandler(effectiveSttWait), `${this}::_stt_timeout_handler`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Handle user transcription. */
|
|
193
|
+
async _handleTranscription(frame) {
|
|
194
|
+
this._text += frame.text;
|
|
195
|
+
if (frame.finalized) {
|
|
196
|
+
this._transcriptFinalized = true;
|
|
197
|
+
// Short-circuit the sttTimeout safety net: STT has told us
|
|
198
|
+
// there's nothing more coming.
|
|
199
|
+
if (!this._sttWaitDone) {
|
|
200
|
+
this._sttWaitDone = true;
|
|
201
|
+
if (this._sttTimeoutTask) {
|
|
202
|
+
await this.taskManager.cancelTask(this._sttTimeoutTask);
|
|
203
|
+
this._sttTimeoutTask = null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// If both waits are already done, the turn was waiting on text —
|
|
208
|
+
// trigger now.
|
|
209
|
+
if (this._userSpeechWaitDone && this._sttWaitDone) {
|
|
210
|
+
await this._maybeTriggerUserTurnStopped();
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// Fallback: transcript arrived without a VAD stop. Measure inactivity
|
|
214
|
+
// since the last transcript with the user-speech timer. sttTimeout
|
|
215
|
+
// has no meaning here (it's defined relative to VAD stop), so mark
|
|
216
|
+
// the stt wait done immediately.
|
|
217
|
+
if (!this._vadUserSpeaking && !this._vadStopped) {
|
|
218
|
+
this._sttWaitDone = true;
|
|
219
|
+
await this._restartUserSpeechTimer();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Cancel any running user-speech timer and start a fresh one. */
|
|
223
|
+
async _restartUserSpeechTimer() {
|
|
224
|
+
if (this._userSpeechTimeoutTask) {
|
|
225
|
+
await this.taskManager.cancelTask(this._userSpeechTimeoutTask);
|
|
226
|
+
this._userSpeechTimeoutTask = null;
|
|
227
|
+
}
|
|
228
|
+
this._userSpeechWaitDone = false;
|
|
229
|
+
this._userSpeechTimeoutTask = this.taskManager.createTask(() => this._userSpeechTimeoutHandler(this._userSpeechTimeout), `${this}::_user_speech_timeout_handler`);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Wait userSpeechTimeout then attempt to trigger user turn stopped.
|
|
233
|
+
*
|
|
234
|
+
* @param timeout The timeout in seconds to wait.
|
|
235
|
+
*/
|
|
236
|
+
async _userSpeechTimeoutHandler(timeout) {
|
|
237
|
+
try {
|
|
238
|
+
await sleep(timeout);
|
|
239
|
+
}
|
|
240
|
+
catch (e) {
|
|
241
|
+
if (e instanceof CancelledError)
|
|
242
|
+
return;
|
|
243
|
+
throw e;
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
this._userSpeechTimeoutTask = null;
|
|
247
|
+
}
|
|
248
|
+
this._userSpeechWaitDone = true;
|
|
249
|
+
await this._maybeTriggerUserTurnStopped();
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Wait sttTimeout then attempt to trigger user turn stopped.
|
|
253
|
+
*
|
|
254
|
+
* @param timeout The timeout in seconds to wait.
|
|
255
|
+
*/
|
|
256
|
+
async _sttTimeoutHandler(timeout) {
|
|
257
|
+
try {
|
|
258
|
+
await sleep(timeout);
|
|
259
|
+
}
|
|
260
|
+
catch (e) {
|
|
261
|
+
if (e instanceof CancelledError)
|
|
262
|
+
return;
|
|
263
|
+
throw e;
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
this._sttTimeoutTask = null;
|
|
267
|
+
}
|
|
268
|
+
this._sttWaitDone = true;
|
|
269
|
+
await this._maybeTriggerUserTurnStopped();
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Trigger user turn stopped if all required conditions are met.
|
|
273
|
+
*
|
|
274
|
+
* Both timers must be done (stt is marked done immediately on the
|
|
275
|
+
* fallback path and when finalization short-circuits the safety net),
|
|
276
|
+
* the user must not be currently speaking, and — when
|
|
277
|
+
* `waitForTranscript` is true — at least one transcript must have been
|
|
278
|
+
* received.
|
|
279
|
+
*/
|
|
280
|
+
async _maybeTriggerUserTurnStopped() {
|
|
281
|
+
if (this._vadUserSpeaking) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (this._waitForTranscript && !this._text) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (this._userSpeechWaitDone && this._sttWaitDone) {
|
|
288
|
+
await this.triggerUserTurnStopped();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/** Cancel any running timer tasks and clear the handles. */
|
|
292
|
+
async _cancelAllTasks() {
|
|
293
|
+
if (this._userSpeechTimeoutTask) {
|
|
294
|
+
await this.taskManager.cancelTask(this._userSpeechTimeoutTask);
|
|
295
|
+
this._userSpeechTimeoutTask = null;
|
|
296
|
+
}
|
|
297
|
+
if (this._sttTimeoutTask) {
|
|
298
|
+
await this.taskManager.cancelTask(this._sttTimeoutTask);
|
|
299
|
+
this._sttTimeoutTask = null;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=speech_timeout_user_turn_stop_strategy.js.map
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/** User turn stop strategy based on turn detection analyzers. */
|
|
2
|
+
import { type Task } from "@pipedog/asyncio";
|
|
3
|
+
import { type BaseTurnAnalyzer } from "../../audio/turn/base_turn_analyzer.ts";
|
|
4
|
+
import { type Frame, InputAudioRawFrame, StartFrame, TranscriptionFrame, VADUserStartedSpeakingFrame, VADUserStoppedSpeakingFrame } from "../../frames/frames.ts";
|
|
5
|
+
import type { MetricsData } from "../../metrics/metrics.ts";
|
|
6
|
+
import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
|
|
7
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
8
|
+
import { BaseUserTurnStopStrategy, type BaseUserTurnStopStrategyOptions } from "./base_user_turn_stop_strategy.ts";
|
|
9
|
+
export interface TurnAnalyzerUserTurnStopStrategyOptions extends BaseUserTurnStopStrategyOptions {
|
|
10
|
+
/** The turn detection analyzer instance to detect end of user turn. */
|
|
11
|
+
turnAnalyzer: BaseTurnAnalyzer;
|
|
12
|
+
/**
|
|
13
|
+
* Whether to require a transcript before triggering end-of-turn. When true
|
|
14
|
+
* (default), turn-end fires only after the turn analyzer reports COMPLETE
|
|
15
|
+
* *and* either a finalized transcript arrives or the STT safety-net timeout
|
|
16
|
+
* elapses with text in hand. When false, the strategy signals turn-end as
|
|
17
|
+
* soon as the turn analyzer reports COMPLETE — independent of transcripts.
|
|
18
|
+
* Set this to false when local turn detection is the intended driver of
|
|
19
|
+
* the conversation (e.g. with a realtime LLM service consuming audio
|
|
20
|
+
* directly), so transcripts are off the latency critical path.
|
|
21
|
+
* `LLMContextAggregatorPair` flips this for you when
|
|
22
|
+
* `realtimeServiceMode: true`.
|
|
23
|
+
*/
|
|
24
|
+
waitForTranscript?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* User turn stop strategy that uses a turn detection model to determine if the
|
|
28
|
+
* user is done speaking.
|
|
29
|
+
*
|
|
30
|
+
* This strategy feeds audio, VAD, and transcription frames to a turn
|
|
31
|
+
* detection model (`BaseTurnAnalyzer`) that predicts when the user has
|
|
32
|
+
* finished their turn. Once the model indicates the turn is complete, the
|
|
33
|
+
* strategy waits for a final transcription before triggering the end of
|
|
34
|
+
* the user's turn.
|
|
35
|
+
*
|
|
36
|
+
* For services that support finalization (`TranscriptionFrame.finalized`),
|
|
37
|
+
* the turn can be triggered immediately once the finalized transcript is
|
|
38
|
+
* received. Otherwise, an STT timeout is used as a fallback: the turn is
|
|
39
|
+
* released once `ttfsP99Latency` has elapsed since the end of the user's
|
|
40
|
+
* speech (as reported by VAD, discounting its `stopSecs` silence window).
|
|
41
|
+
*/
|
|
42
|
+
export declare class TurnAnalyzerUserTurnStopStrategy extends BaseUserTurnStopStrategy {
|
|
43
|
+
protected _turnAnalyzer: BaseTurnAnalyzer;
|
|
44
|
+
protected _waitForTranscript: boolean;
|
|
45
|
+
protected _sttTimeout: number;
|
|
46
|
+
protected _stopSecs: number;
|
|
47
|
+
protected _stopSecsWarned: boolean;
|
|
48
|
+
protected _text: string;
|
|
49
|
+
protected _turnComplete: boolean;
|
|
50
|
+
protected _vadUserSpeaking: boolean;
|
|
51
|
+
protected _vadStopped: boolean;
|
|
52
|
+
protected _transcriptFinalized: boolean;
|
|
53
|
+
protected _timeoutTask: Task<unknown> | null;
|
|
54
|
+
protected _timeoutExpired: boolean;
|
|
55
|
+
constructor(options: TurnAnalyzerUserTurnStopStrategyOptions);
|
|
56
|
+
/** Whether transcripts gate end-of-turn signalling. */
|
|
57
|
+
get waitForTranscript(): boolean;
|
|
58
|
+
set waitForTranscript(value: boolean);
|
|
59
|
+
/** Ready the strategy to detect the end of the turn now starting. */
|
|
60
|
+
handleUserTurnStarted(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Clear the analyzer's buffered speech when the turn ends.
|
|
63
|
+
*
|
|
64
|
+
* Beyond the usual per-turn reset, drop the analyzer's buffered speech
|
|
65
|
+
* state so a stale silence timer can't fire a phantom end-of-turn after
|
|
66
|
+
* an externally-ended turn (for example a forced stop while a mute
|
|
67
|
+
* strategy held audio back). The analyzer already clears itself on its
|
|
68
|
+
* own COMPLETE, so the clear is a no-op on the normal path; the
|
|
69
|
+
* pre-speech buffer refills continuously before the next turn starts.
|
|
70
|
+
*/
|
|
71
|
+
handleUserTurnStopped(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Clear turn-scoped state. Runs at both turn boundaries.
|
|
74
|
+
*
|
|
75
|
+
* `_vadUserSpeaking` is deliberately left alone: whether the user is
|
|
76
|
+
* speaking belongs to the user rather than to the turn, and VAD reports it
|
|
77
|
+
* only on transitions. Clearing it at a turn start VAD didn't drive — a
|
|
78
|
+
* turn begun from a transcript, mid-utterance — would leave it wrong until
|
|
79
|
+
* the user next stops.
|
|
80
|
+
*/
|
|
81
|
+
protected _reset(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Drop any end-of-turn conclusion reached so far.
|
|
84
|
+
*
|
|
85
|
+
* Runs at a turn boundary, and whenever VAD reports the user speaking
|
|
86
|
+
* again — which makes an earlier conclusion stale mid-turn.
|
|
87
|
+
*/
|
|
88
|
+
protected _discardPendingEndOfTurn(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Set up the strategy.
|
|
91
|
+
*
|
|
92
|
+
* @param setup Configuration object containing setup parameters.
|
|
93
|
+
*/
|
|
94
|
+
setup(setup: FrameProcessorSetup): Promise<void>;
|
|
95
|
+
/** Cleanup the strategy. */
|
|
96
|
+
cleanup(): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Process an incoming frame to update the turn analyzer and strategy state.
|
|
99
|
+
*
|
|
100
|
+
* @param frame The frame to be analyzed.
|
|
101
|
+
* @returns Always returns CONTINUE so subsequent stop strategies are evaluated.
|
|
102
|
+
*/
|
|
103
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
104
|
+
/** Process the start frame to configure the turn analyzer. */
|
|
105
|
+
protected _start(_frame: StartFrame): Promise<void>;
|
|
106
|
+
/** Handle input audio to check if the turn is completed. */
|
|
107
|
+
protected _handleInputAudio(frame: InputAudioRawFrame): Promise<void>;
|
|
108
|
+
/** Handle when the VAD indicates the user is speaking. */
|
|
109
|
+
protected _handleVadUserStartedSpeaking(frame: VADUserStartedSpeakingFrame): Promise<void>;
|
|
110
|
+
/** Handle when the VAD indicates the user has stopped speaking. */
|
|
111
|
+
protected _handleVadUserStoppedSpeaking(frame: VADUserStoppedSpeakingFrame): Promise<void>;
|
|
112
|
+
/** Handle user transcription. */
|
|
113
|
+
protected _handleTranscription(frame: TranscriptionFrame): Promise<void>;
|
|
114
|
+
/** Handle a prediction result event from the turn analyzer. */
|
|
115
|
+
protected _handlePredictionResult(result: MetricsData | null | undefined): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Wait for the timeout then trigger user turn stopped if conditions met.
|
|
118
|
+
*
|
|
119
|
+
* @param timeout The timeout in seconds to wait.
|
|
120
|
+
*/
|
|
121
|
+
protected _timeoutHandler(timeout: number): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Trigger user turn stopped if conditions are met.
|
|
124
|
+
*
|
|
125
|
+
* Conditions:
|
|
126
|
+
* - Turn analyzer indicates turn is complete
|
|
127
|
+
* - When `waitForTranscript` is true (default): we have transcription text
|
|
128
|
+
* *and* either the safety-net timeout has elapsed or a finalized
|
|
129
|
+
* transcript arrived.
|
|
130
|
+
* - When `waitForTranscript` is false: fire as soon as the turn analyzer
|
|
131
|
+
* reports COMPLETE — independent of transcripts.
|
|
132
|
+
*/
|
|
133
|
+
protected _maybeTriggerUserTurnStopped(): Promise<void>;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=turn_analyzer_user_turn_stop_strategy.d.ts.map
|