@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,243 @@
|
|
|
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_start/krisp_viva_ip_user_turn_start_strategy.py
|
|
6
|
+
/**
|
|
7
|
+
* User turn start strategy using Krisp Interruption Prediction (IP).
|
|
8
|
+
*
|
|
9
|
+
* This strategy uses Krisp's IP model to distinguish genuine user interruptions
|
|
10
|
+
* from backchannels (e.g. "uh-huh", "yeah"). Instead of triggering a user turn
|
|
11
|
+
* on every VAD speech event, it collects audio after VAD detects speech and runs
|
|
12
|
+
* the IP model to predict whether the speech is a real interruption.
|
|
13
|
+
*
|
|
14
|
+
* Only when the IP model's probability exceeds the configured threshold is
|
|
15
|
+
* `triggerUserTurnStarted()` called. This prevents the bot from being
|
|
16
|
+
* interrupted by brief acknowledgements or filler words.
|
|
17
|
+
*
|
|
18
|
+
* PARTIAL PORT: the Krisp SDK (`krisp_audio`) is a native Python module with no
|
|
19
|
+
* runtime-agnostic JS equivalent. The strategy logic is ported; creating the IP
|
|
20
|
+
* session (`_createIpSession`) is a stub that throws "not ported yet".
|
|
21
|
+
* Subclasses (or tests) can override it to supply a `KrispIpSession`.
|
|
22
|
+
*/
|
|
23
|
+
import { rethrowIfCancelled } from "@pipedog/asyncio";
|
|
24
|
+
import { intToKrispFrameDuration, intToKrispSampleRate, KrispVivaSDKManager, } from "../../audio/krisp_instance.js";
|
|
25
|
+
import { BotStoppedSpeakingFrame, InputAudioRawFrame, VADUserStartedSpeakingFrame, VADUserStoppedSpeakingFrame, } from "../../frames/frames.js";
|
|
26
|
+
import { getEnv } from "../../utils/env.js";
|
|
27
|
+
import { logger } from "../../utils/logger.js";
|
|
28
|
+
import { ProcessFrameResult } from "../types.js";
|
|
29
|
+
import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
|
|
30
|
+
/**
|
|
31
|
+
* User turn start strategy using Krisp VIVA Interruption Prediction.
|
|
32
|
+
*
|
|
33
|
+
* When VAD detects user speech, this strategy feeds audio frames into
|
|
34
|
+
* the Krisp VIVA IP model. The model outputs a probability indicating
|
|
35
|
+
* whether the speech is a genuine interruption (as opposed to a
|
|
36
|
+
* backchannel). A user turn is triggered only when this probability
|
|
37
|
+
* exceeds the configured threshold.
|
|
38
|
+
*
|
|
39
|
+
* This strategy is designed to work alongside other start strategies
|
|
40
|
+
* (e.g. `TranscriptionUserTurnStartStrategy` as a fallback) via the
|
|
41
|
+
* strategy list in `UserTurnStrategies`.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* const strategies = new UserTurnStrategies({
|
|
45
|
+
* start: [
|
|
46
|
+
* new KrispVivaIPUserTurnStartStrategy({
|
|
47
|
+
* modelPath: "/path/to/ip_model.kef",
|
|
48
|
+
* threshold: 0.5,
|
|
49
|
+
* }),
|
|
50
|
+
* new TranscriptionUserTurnStartStrategy(),
|
|
51
|
+
* ],
|
|
52
|
+
* });
|
|
53
|
+
*/
|
|
54
|
+
export class KrispVivaIPUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
55
|
+
_threshold;
|
|
56
|
+
_frameDurationMs;
|
|
57
|
+
_apiKey;
|
|
58
|
+
_modelPath;
|
|
59
|
+
_sdkAcquired = false;
|
|
60
|
+
_ipSession = null;
|
|
61
|
+
_samplesPerFrame = null;
|
|
62
|
+
_sampleRate = null;
|
|
63
|
+
// State tracking
|
|
64
|
+
_speechActive = false;
|
|
65
|
+
_audioBuffer = new Uint8Array(0);
|
|
66
|
+
_decisionMade = false;
|
|
67
|
+
constructor(options = {}) {
|
|
68
|
+
super(options);
|
|
69
|
+
this._threshold = options.threshold ?? 0.5;
|
|
70
|
+
this._frameDurationMs = options.frameDurationMs ?? 20;
|
|
71
|
+
this._apiKey = options.apiKey ?? "";
|
|
72
|
+
const modelPath = options.modelPath || getEnv("KRISP_VIVA_IP_MODEL_PATH");
|
|
73
|
+
if (!modelPath) {
|
|
74
|
+
throw new Error("IP model path must be provided via model_path or " +
|
|
75
|
+
"KRISP_VIVA_IP_MODEL_PATH environment variable.");
|
|
76
|
+
}
|
|
77
|
+
if (!modelPath.endsWith(".kef")) {
|
|
78
|
+
throw new Error("Model is expected with .kef extension");
|
|
79
|
+
}
|
|
80
|
+
// Upstream also checks that the file exists; core has no filesystem
|
|
81
|
+
// access, so that check is left to the Krisp runtime that loads it.
|
|
82
|
+
this._modelPath = modelPath;
|
|
83
|
+
// Acquire SDK
|
|
84
|
+
try {
|
|
85
|
+
KrispVivaSDKManager.acquire(this._apiKey);
|
|
86
|
+
this._sdkAcquired = true;
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
rethrowIfCancelled(e);
|
|
90
|
+
throw new Error(`Failed to initialize Krisp SDK: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Release Krisp SDK resources. */
|
|
94
|
+
async cleanup() {
|
|
95
|
+
if (this._sdkAcquired) {
|
|
96
|
+
try {
|
|
97
|
+
this._ipSession = null;
|
|
98
|
+
KrispVivaSDKManager.release();
|
|
99
|
+
this._sdkAcquired = false;
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
rethrowIfCancelled(e);
|
|
103
|
+
logger.error(`Error cleaning up Krisp VIVA IP strategy: ${e instanceof Error ? e.message : String(e)}`, e);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create a Krisp IP session for the given sample rate.
|
|
109
|
+
*
|
|
110
|
+
* STUB: needs the Krisp SDK (`krisp_audio.IpFloat.create`), which has no JS
|
|
111
|
+
* equivalent yet. Override to supply a session.
|
|
112
|
+
*/
|
|
113
|
+
_createIpSession(sampleRate) {
|
|
114
|
+
// Validate the configuration as the SDK config would.
|
|
115
|
+
intToKrispSampleRate(sampleRate);
|
|
116
|
+
intToKrispFrameDuration(this._frameDurationMs);
|
|
117
|
+
throw new Error(`not ported yet: Krisp VIVA IP session (model ${this._modelPath}) requires the Krisp SDK`);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create or re-create the IP session when sample rate changes.
|
|
121
|
+
*
|
|
122
|
+
* @param sampleRate Audio sample rate in Hz.
|
|
123
|
+
*/
|
|
124
|
+
_ensureSession(sampleRate) {
|
|
125
|
+
if (this._sampleRate === sampleRate && this._ipSession !== null) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this._sampleRate = sampleRate;
|
|
129
|
+
this._samplesPerFrame = Math.trunc((sampleRate * this._frameDurationMs) / 1000);
|
|
130
|
+
this._ipSession = this._createIpSession(sampleRate);
|
|
131
|
+
logger.debug(`Krisp VIVA IP session created (sample_rate=${sampleRate})`);
|
|
132
|
+
}
|
|
133
|
+
/** Reset speech tracking state for the next candidate interruption. */
|
|
134
|
+
_resetState() {
|
|
135
|
+
this._speechActive = false;
|
|
136
|
+
this._audioBuffer = new Uint8Array(0);
|
|
137
|
+
this._decisionMade = false;
|
|
138
|
+
}
|
|
139
|
+
/** Ready the strategy for a new user turn. */
|
|
140
|
+
async handleUserTurnStarted() {
|
|
141
|
+
this._resetState();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Process a frame to detect genuine user interruptions.
|
|
145
|
+
*
|
|
146
|
+
* On `VADUserStartedSpeakingFrame`, begins collecting audio.
|
|
147
|
+
* On `InputAudioRawFrame`, feeds audio through the IP model and
|
|
148
|
+
* triggers a user turn if the interruption probability exceeds the
|
|
149
|
+
* threshold.
|
|
150
|
+
* On `VADUserStoppedSpeakingFrame` or `BotStoppedSpeakingFrame`,
|
|
151
|
+
* resets the candidate state.
|
|
152
|
+
*
|
|
153
|
+
* @param frame The incoming frame.
|
|
154
|
+
* @returns STOP if a genuine interruption was detected, CONTINUE otherwise.
|
|
155
|
+
*/
|
|
156
|
+
async processFrame(frame) {
|
|
157
|
+
if (frame instanceof VADUserStartedSpeakingFrame) {
|
|
158
|
+
return await this._handleVadStarted(frame);
|
|
159
|
+
}
|
|
160
|
+
else if (frame instanceof InputAudioRawFrame) {
|
|
161
|
+
return await this._handleAudio(frame);
|
|
162
|
+
}
|
|
163
|
+
else if (frame instanceof VADUserStoppedSpeakingFrame ||
|
|
164
|
+
frame instanceof BotStoppedSpeakingFrame) {
|
|
165
|
+
return await this._handleReset(frame);
|
|
166
|
+
}
|
|
167
|
+
return ProcessFrameResult.CONTINUE;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Begin collecting audio for interruption classification.
|
|
171
|
+
*
|
|
172
|
+
* @returns Always CONTINUE; the decision is deferred until enough audio is processed.
|
|
173
|
+
*/
|
|
174
|
+
async _handleVadStarted(_frame) {
|
|
175
|
+
logger.trace("Krisp VIVA IP: VAD speech started, collecting audio for classification");
|
|
176
|
+
this._speechActive = true;
|
|
177
|
+
this._decisionMade = false;
|
|
178
|
+
return ProcessFrameResult.CONTINUE;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Feed audio to the IP model and check for genuine interruption.
|
|
182
|
+
*
|
|
183
|
+
* Every frame is passed to the IP model regardless of speech state so
|
|
184
|
+
* that the model maintains continuous internal state (matching the
|
|
185
|
+
* standalone Krisp SDK behaviour). `_speechActive` is forwarded as
|
|
186
|
+
* the per-frame VAD input to the model and also gates the threshold
|
|
187
|
+
* evaluation.
|
|
188
|
+
*
|
|
189
|
+
* @param frame Raw audio input frame.
|
|
190
|
+
* @returns STOP if the model detects a genuine interruption, CONTINUE otherwise.
|
|
191
|
+
*/
|
|
192
|
+
async _handleAudio(frame) {
|
|
193
|
+
this._ensureSession(frame.sampleRate);
|
|
194
|
+
if (this._ipSession === null || this._samplesPerFrame === null) {
|
|
195
|
+
logger.warning("IP session not ready, skipping frame");
|
|
196
|
+
return ProcessFrameResult.CONTINUE;
|
|
197
|
+
}
|
|
198
|
+
const buffer = new Uint8Array(this._audioBuffer.length + frame.audio.length);
|
|
199
|
+
buffer.set(this._audioBuffer, 0);
|
|
200
|
+
buffer.set(frame.audio, this._audioBuffer.length);
|
|
201
|
+
this._audioBuffer = buffer;
|
|
202
|
+
const totalSamples = Math.floor(this._audioBuffer.length / 2); // 2 bytes per int16 sample
|
|
203
|
+
const numCompleteFrames = Math.floor(totalSamples / this._samplesPerFrame);
|
|
204
|
+
if (numCompleteFrames === 0) {
|
|
205
|
+
return ProcessFrameResult.CONTINUE;
|
|
206
|
+
}
|
|
207
|
+
const completeSamplesCount = numCompleteFrames * this._samplesPerFrame;
|
|
208
|
+
const bytesToProcess = completeSamplesCount * 2;
|
|
209
|
+
// Copy so the Int16Array view is aligned regardless of the buffer offset.
|
|
210
|
+
const audioToProcess = this._audioBuffer.slice(0, bytesToProcess);
|
|
211
|
+
this._audioBuffer = this._audioBuffer.slice(bytesToProcess);
|
|
212
|
+
const audioInt16 = new Int16Array(audioToProcess.buffer, 0, completeSamplesCount);
|
|
213
|
+
const audioFloat32 = new Float32Array(completeSamplesCount);
|
|
214
|
+
for (let i = 0; i < completeSamplesCount; i++) {
|
|
215
|
+
audioFloat32[i] = audioInt16[i] / 32768.0;
|
|
216
|
+
}
|
|
217
|
+
for (let f = 0; f < numCompleteFrames; f++) {
|
|
218
|
+
const ipFrame = audioFloat32.subarray(f * this._samplesPerFrame, (f + 1) * this._samplesPerFrame);
|
|
219
|
+
const ipProb = this._ipSession.process(ipFrame, this._speechActive);
|
|
220
|
+
if (this._speechActive && !this._decisionMade && ipProb >= this._threshold) {
|
|
221
|
+
logger.debug(`Krisp VIVA IP: genuine interruption detected (prob=${ipProb.toFixed(3)}, ` +
|
|
222
|
+
`threshold=${this._threshold})`);
|
|
223
|
+
this._decisionMade = true;
|
|
224
|
+
await this.triggerUserTurnStarted();
|
|
225
|
+
return ProcessFrameResult.STOP;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return ProcessFrameResult.CONTINUE;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Reset state when the candidate interruption window ends.
|
|
232
|
+
*
|
|
233
|
+
* @returns Always CONTINUE.
|
|
234
|
+
*/
|
|
235
|
+
async _handleReset(_frame) {
|
|
236
|
+
if (this._speechActive) {
|
|
237
|
+
logger.trace("Krisp VIVA IP: speech segment ended, resetting state");
|
|
238
|
+
this._resetState();
|
|
239
|
+
}
|
|
240
|
+
return ProcessFrameResult.CONTINUE;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=krisp_viva_ip_user_turn_start_strategy.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** User turn start strategy based on a minimum number of words spoken by the user. */
|
|
2
|
+
import { BotStartedSpeakingFrame, BotStoppedSpeakingFrame, type Frame, InterimTranscriptionFrame, TranscriptionFrame } from "../../frames/frames.ts";
|
|
3
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
4
|
+
import { BaseUserTurnStartStrategy, type BaseUserTurnStartStrategyOptions } from "./base_user_turn_start_strategy.ts";
|
|
5
|
+
export interface MinWordsUserTurnStartStrategyOptions extends BaseUserTurnStartStrategyOptions {
|
|
6
|
+
/** Minimum number of spoken words required to trigger the start of a user turn. */
|
|
7
|
+
minWords: number;
|
|
8
|
+
/** Whether to consider interim transcription frames for earlier detection. */
|
|
9
|
+
useInterim?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* User turn start strategy based on a minimum number of words spoken by the user.
|
|
13
|
+
*
|
|
14
|
+
* This strategy signals the start of a user turn once the user has spoken at
|
|
15
|
+
* least a specified number of words, as determined from transcription frames.
|
|
16
|
+
* Optionally, interim transcriptions can be used for earlier detection.
|
|
17
|
+
*/
|
|
18
|
+
export declare class MinWordsUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
19
|
+
protected _minWords: number;
|
|
20
|
+
protected _useInterim: boolean;
|
|
21
|
+
protected _botSpeaking: boolean;
|
|
22
|
+
constructor(options: MinWordsUserTurnStartStrategyOptions);
|
|
23
|
+
/**
|
|
24
|
+
* Ready the strategy for a new user turn.
|
|
25
|
+
*
|
|
26
|
+
* Clears the bot-speaking flag so the next turn's word counting starts
|
|
27
|
+
* from the single-word interruption threshold.
|
|
28
|
+
*/
|
|
29
|
+
handleUserTurnStarted(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Process an incoming frame to detect the start of a user turn.
|
|
32
|
+
*
|
|
33
|
+
* This method updates internal state based on transcription frames and
|
|
34
|
+
* triggers the user turn once the minimum word count is reached.
|
|
35
|
+
*
|
|
36
|
+
* @param frame The frame to be analyzed.
|
|
37
|
+
* @returns STOP if the minimum word count was reached, CONTINUE otherwise.
|
|
38
|
+
*/
|
|
39
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Handle bot started speaking frame.
|
|
42
|
+
*
|
|
43
|
+
* If the bot is speaking we want to interrupt using min words.
|
|
44
|
+
*/
|
|
45
|
+
protected _handleBotStartedSpeaking(_frame: BotStartedSpeakingFrame): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Handle bot stopped speaking frame.
|
|
48
|
+
*
|
|
49
|
+
* If the bot is not speaking we want to interrupt if we get a single word.
|
|
50
|
+
*/
|
|
51
|
+
protected _handleBotStoppedSpeaking(_frame: BotStoppedSpeakingFrame): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Handle a transcription frame and check word count.
|
|
54
|
+
*
|
|
55
|
+
* @param frame The transcription frame to be processed.
|
|
56
|
+
* @returns STOP if the minimum word count was reached, CONTINUE otherwise.
|
|
57
|
+
*/
|
|
58
|
+
protected _handleTranscription(frame: TranscriptionFrame | InterimTranscriptionFrame): Promise<ProcessFrameResult>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=min_words_user_turn_start_strategy.d.ts.map
|
|
@@ -0,0 +1,102 @@
|
|
|
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_start/min_words_user_turn_start_strategy.py
|
|
6
|
+
/** User turn start strategy based on a minimum number of words spoken by the user. */
|
|
7
|
+
import { BotStartedSpeakingFrame, BotStoppedSpeakingFrame, InterimTranscriptionFrame, TranscriptionFrame, } from "../../frames/frames.js";
|
|
8
|
+
import { logger } from "../../utils/logger.js";
|
|
9
|
+
import { ProcessFrameResult } from "../types.js";
|
|
10
|
+
import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
|
|
11
|
+
/**
|
|
12
|
+
* User turn start strategy based on a minimum number of words spoken by the user.
|
|
13
|
+
*
|
|
14
|
+
* This strategy signals the start of a user turn once the user has spoken at
|
|
15
|
+
* least a specified number of words, as determined from transcription frames.
|
|
16
|
+
* Optionally, interim transcriptions can be used for earlier detection.
|
|
17
|
+
*/
|
|
18
|
+
export class MinWordsUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
19
|
+
_minWords;
|
|
20
|
+
_useInterim;
|
|
21
|
+
_botSpeaking = false;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
super(options);
|
|
24
|
+
this._minWords = options.minWords;
|
|
25
|
+
this._useInterim = options.useInterim ?? true;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Ready the strategy for a new user turn.
|
|
29
|
+
*
|
|
30
|
+
* Clears the bot-speaking flag so the next turn's word counting starts
|
|
31
|
+
* from the single-word interruption threshold.
|
|
32
|
+
*/
|
|
33
|
+
async handleUserTurnStarted() {
|
|
34
|
+
this._botSpeaking = false;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Process an incoming frame to detect the start of a user turn.
|
|
38
|
+
*
|
|
39
|
+
* This method updates internal state based on transcription frames and
|
|
40
|
+
* triggers the user turn once the minimum word count is reached.
|
|
41
|
+
*
|
|
42
|
+
* @param frame The frame to be analyzed.
|
|
43
|
+
* @returns STOP if the minimum word count was reached, CONTINUE otherwise.
|
|
44
|
+
*/
|
|
45
|
+
async processFrame(frame) {
|
|
46
|
+
if (frame instanceof BotStartedSpeakingFrame) {
|
|
47
|
+
await this._handleBotStartedSpeaking(frame);
|
|
48
|
+
}
|
|
49
|
+
else if (frame instanceof BotStoppedSpeakingFrame) {
|
|
50
|
+
await this._handleBotStoppedSpeaking(frame);
|
|
51
|
+
}
|
|
52
|
+
else if (frame instanceof TranscriptionFrame) {
|
|
53
|
+
return await this._handleTranscription(frame);
|
|
54
|
+
}
|
|
55
|
+
else if (frame instanceof InterimTranscriptionFrame && this._useInterim) {
|
|
56
|
+
return await this._handleTranscription(frame);
|
|
57
|
+
}
|
|
58
|
+
return ProcessFrameResult.CONTINUE;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Handle bot started speaking frame.
|
|
62
|
+
*
|
|
63
|
+
* If the bot is speaking we want to interrupt using min words.
|
|
64
|
+
*/
|
|
65
|
+
async _handleBotStartedSpeaking(_frame) {
|
|
66
|
+
this._botSpeaking = true;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Handle bot stopped speaking frame.
|
|
70
|
+
*
|
|
71
|
+
* If the bot is not speaking we want to interrupt if we get a single word.
|
|
72
|
+
*/
|
|
73
|
+
async _handleBotStoppedSpeaking(_frame) {
|
|
74
|
+
this._botSpeaking = false;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handle a transcription frame and check word count.
|
|
78
|
+
*
|
|
79
|
+
* @param frame The transcription frame to be processed.
|
|
80
|
+
* @returns STOP if the minimum word count was reached, CONTINUE otherwise.
|
|
81
|
+
*/
|
|
82
|
+
async _handleTranscription(frame) {
|
|
83
|
+
const minWords = this._botSpeaking ? this._minWords : 1;
|
|
84
|
+
// Python's str.split(): split on whitespace runs, ignoring leading/trailing.
|
|
85
|
+
const trimmed = frame.text.trim();
|
|
86
|
+
const wordCount = trimmed ? trimmed.split(/\s+/).length : 0;
|
|
87
|
+
const shouldTrigger = wordCount >= minWords;
|
|
88
|
+
const isInterim = frame instanceof InterimTranscriptionFrame;
|
|
89
|
+
logger.debug(`${this} should_trigger=${pyBool(shouldTrigger)} num_spoken_words=${wordCount} ` +
|
|
90
|
+
`min_words=${minWords} bot_speaking=${pyBool(this._botSpeaking)} interim_transcription=${pyBool(isInterim)}`);
|
|
91
|
+
if (shouldTrigger) {
|
|
92
|
+
await this.triggerUserTurnStarted();
|
|
93
|
+
return ProcessFrameResult.STOP;
|
|
94
|
+
}
|
|
95
|
+
await this.triggerResetAggregation();
|
|
96
|
+
return ProcessFrameResult.CONTINUE;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function pyBool(value) {
|
|
100
|
+
return value ? "True" : "False";
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=min_words_user_turn_start_strategy.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** User turn start strategy based on transcriptions. */
|
|
2
|
+
import { type Frame } from "../../frames/frames.ts";
|
|
3
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
4
|
+
import { BaseUserTurnStartStrategy, type BaseUserTurnStartStrategyOptions } from "./base_user_turn_start_strategy.ts";
|
|
5
|
+
export interface TranscriptionUserTurnStartStrategyOptions extends BaseUserTurnStartStrategyOptions {
|
|
6
|
+
/** Whether interim transcriptions also start a turn. */
|
|
7
|
+
useInterim?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* User turn start strategy based on transcriptions.
|
|
11
|
+
*
|
|
12
|
+
* This strategy signals the start of a user turn when a transcription is
|
|
13
|
+
* received while the bot is speaking. It is useful as a fallback in scenarios
|
|
14
|
+
* where VAD-based detection fails (for example, when the user speaks very
|
|
15
|
+
* softly) but the STT service still produces transcriptions.
|
|
16
|
+
*/
|
|
17
|
+
export declare class TranscriptionUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
18
|
+
protected _useInterim: boolean;
|
|
19
|
+
/** Initialize transcription-based user turn start strategy. */
|
|
20
|
+
constructor(options?: TranscriptionUserTurnStartStrategyOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Process an incoming frame to detect the start of a user turn.
|
|
23
|
+
*
|
|
24
|
+
* @param frame The frame to be processed.
|
|
25
|
+
* @returns STOP if a transcription was received, CONTINUE otherwise.
|
|
26
|
+
*/
|
|
27
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=transcription_user_turn_start_strategy.d.ts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
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_start/transcription_user_turn_start_strategy.py
|
|
6
|
+
/** User turn start strategy based on transcriptions. */
|
|
7
|
+
import { InterimTranscriptionFrame, TranscriptionFrame } from "../../frames/frames.js";
|
|
8
|
+
import { ProcessFrameResult } from "../types.js";
|
|
9
|
+
import { BaseUserTurnStartStrategy, } from "./base_user_turn_start_strategy.js";
|
|
10
|
+
/**
|
|
11
|
+
* User turn start strategy based on transcriptions.
|
|
12
|
+
*
|
|
13
|
+
* This strategy signals the start of a user turn when a transcription is
|
|
14
|
+
* received while the bot is speaking. It is useful as a fallback in scenarios
|
|
15
|
+
* where VAD-based detection fails (for example, when the user speaks very
|
|
16
|
+
* softly) but the STT service still produces transcriptions.
|
|
17
|
+
*/
|
|
18
|
+
export class TranscriptionUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
19
|
+
_useInterim;
|
|
20
|
+
/** Initialize transcription-based user turn start strategy. */
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
super(options);
|
|
23
|
+
this._useInterim = options.useInterim ?? true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Process an incoming frame to detect the start of a user turn.
|
|
27
|
+
*
|
|
28
|
+
* @param frame The frame to be processed.
|
|
29
|
+
* @returns STOP if a transcription was received, CONTINUE otherwise.
|
|
30
|
+
*/
|
|
31
|
+
async processFrame(frame) {
|
|
32
|
+
if (frame instanceof InterimTranscriptionFrame && this._useInterim) {
|
|
33
|
+
await this.triggerUserTurnStarted();
|
|
34
|
+
return ProcessFrameResult.STOP;
|
|
35
|
+
}
|
|
36
|
+
else if (frame instanceof TranscriptionFrame) {
|
|
37
|
+
await this.triggerUserTurnStarted();
|
|
38
|
+
return ProcessFrameResult.STOP;
|
|
39
|
+
}
|
|
40
|
+
return ProcessFrameResult.CONTINUE;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=transcription_user_turn_start_strategy.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** User turn start strategy based on VAD events. */
|
|
2
|
+
import { type Frame } from "../../frames/frames.ts";
|
|
3
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
4
|
+
import { BaseUserTurnStartStrategy } from "./base_user_turn_start_strategy.ts";
|
|
5
|
+
/**
|
|
6
|
+
* User turn start strategy based on VAD (Voice Activity Detection).
|
|
7
|
+
*
|
|
8
|
+
* This strategy assumes the user turn starts as soon as a VAD frame indicates
|
|
9
|
+
* that the user has started speaking.
|
|
10
|
+
*/
|
|
11
|
+
export declare class VADUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
12
|
+
/**
|
|
13
|
+
* Process an incoming frame to detect user turn start.
|
|
14
|
+
*
|
|
15
|
+
* @param frame The frame to be analyzed.
|
|
16
|
+
* @returns STOP if the user started speaking, CONTINUE otherwise.
|
|
17
|
+
*/
|
|
18
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=vad_user_turn_start_strategy.d.ts.map
|
|
@@ -0,0 +1,31 @@
|
|
|
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_start/vad_user_turn_start_strategy.py
|
|
6
|
+
/** User turn start strategy based on VAD events. */
|
|
7
|
+
import { VADUserStartedSpeakingFrame } from "../../frames/frames.js";
|
|
8
|
+
import { ProcessFrameResult } from "../types.js";
|
|
9
|
+
import { BaseUserTurnStartStrategy } from "./base_user_turn_start_strategy.js";
|
|
10
|
+
/**
|
|
11
|
+
* User turn start strategy based on VAD (Voice Activity Detection).
|
|
12
|
+
*
|
|
13
|
+
* This strategy assumes the user turn starts as soon as a VAD frame indicates
|
|
14
|
+
* that the user has started speaking.
|
|
15
|
+
*/
|
|
16
|
+
export class VADUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
17
|
+
/**
|
|
18
|
+
* Process an incoming frame to detect user turn start.
|
|
19
|
+
*
|
|
20
|
+
* @param frame The frame to be analyzed.
|
|
21
|
+
* @returns STOP if the user started speaking, CONTINUE otherwise.
|
|
22
|
+
*/
|
|
23
|
+
async processFrame(frame) {
|
|
24
|
+
if (frame instanceof VADUserStartedSpeakingFrame) {
|
|
25
|
+
await this.triggerUserTurnStarted();
|
|
26
|
+
return ProcessFrameResult.STOP;
|
|
27
|
+
}
|
|
28
|
+
return ProcessFrameResult.CONTINUE;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=vad_user_turn_start_strategy.js.map
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** User turn start strategy that gates interaction behind wake phrase detection. */
|
|
2
|
+
import { Event, type Task } from "@pipedog/asyncio";
|
|
3
|
+
import { type Frame } from "../../frames/frames.ts";
|
|
4
|
+
import type { FrameProcessorSetup } from "../../processors/frame_processor.ts";
|
|
5
|
+
import { ProcessFrameResult } from "../types.ts";
|
|
6
|
+
import { BaseUserTurnStartStrategy, type BaseUserTurnStartStrategyOptions } from "./base_user_turn_start_strategy.ts";
|
|
7
|
+
/** Internal state for wake phrase detection. */
|
|
8
|
+
export declare const _WakeState: {
|
|
9
|
+
readonly IDLE: "idle";
|
|
10
|
+
readonly AWAKE: "awake";
|
|
11
|
+
};
|
|
12
|
+
export type _WakeState = (typeof _WakeState)[keyof typeof _WakeState];
|
|
13
|
+
export interface WakePhraseUserTurnStartStrategyOptions extends BaseUserTurnStartStrategyOptions {
|
|
14
|
+
/** List of wake phrases to detect. */
|
|
15
|
+
phrases: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Inactivity timeout in seconds before returning to IDLE. In timeout mode,
|
|
18
|
+
* the timer resets on activity. In single activation mode, acts as a
|
|
19
|
+
* keepalive window after wake phrase detection.
|
|
20
|
+
*/
|
|
21
|
+
timeout?: number;
|
|
22
|
+
/**
|
|
23
|
+
* If true, the wake phrase is required before every turn. The strategy
|
|
24
|
+
* returns to IDLE after each turn completes.
|
|
25
|
+
*/
|
|
26
|
+
singleActivation?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* User turn start strategy that requires a wake phrase before interaction.
|
|
30
|
+
*
|
|
31
|
+
* Blocks subsequent strategies until a wake phrase is detected in a final
|
|
32
|
+
* transcription. After detection, allows interaction for a configurable
|
|
33
|
+
* timeout period before requiring the wake phrase again. Use
|
|
34
|
+
* `singleActivation: true` to require the wake phrase before every turn.
|
|
35
|
+
*
|
|
36
|
+
* This strategy should be placed first in the start strategies list.
|
|
37
|
+
*
|
|
38
|
+
* Event handlers available:
|
|
39
|
+
*
|
|
40
|
+
* - on_wake_phrase_detected: Called when a wake phrase is matched.
|
|
41
|
+
* - on_wake_phrase_timeout: Called when the inactivity timeout expires
|
|
42
|
+
* (timeout mode only).
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* // Timeout mode (default): wake phrase unlocks interaction for 10s
|
|
46
|
+
* const strategy = new WakePhraseUserTurnStartStrategy({
|
|
47
|
+
* phrases: ["hey pipecat", "ok pipecat"],
|
|
48
|
+
* timeout: 10.0,
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* // Single activation: wake phrase required before every turn
|
|
52
|
+
* const single = new WakePhraseUserTurnStartStrategy({
|
|
53
|
+
* phrases: ["hey pipecat"],
|
|
54
|
+
* singleActivation: true,
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* strategy.eventHandler("on_wake_phrase_detected", async (strategy, phrase) => { ... });
|
|
58
|
+
* strategy.eventHandler("on_wake_phrase_timeout", async (strategy) => { ... });
|
|
59
|
+
*
|
|
60
|
+
* `timeout`: In timeout mode, the timer resets on activity (user, bot speech).
|
|
61
|
+
* In single activation mode, acts as a keepalive window — the strategy stays
|
|
62
|
+
* AWAKE for this duration after wake phrase detection, allowing the current
|
|
63
|
+
* turn to complete before returning to IDLE.
|
|
64
|
+
*/
|
|
65
|
+
export declare class WakePhraseUserTurnStartStrategy extends BaseUserTurnStartStrategy {
|
|
66
|
+
protected _phrases: string[];
|
|
67
|
+
protected _timeout: number;
|
|
68
|
+
protected _singleActivation: boolean;
|
|
69
|
+
protected _patterns: RegExp[];
|
|
70
|
+
protected _state: _WakeState;
|
|
71
|
+
protected _accumulatedText: string;
|
|
72
|
+
protected _timeoutEvent: Event;
|
|
73
|
+
protected _timeoutTask: Task<unknown> | null;
|
|
74
|
+
constructor(options: WakePhraseUserTurnStartStrategyOptions);
|
|
75
|
+
/** Returns the current wake state. */
|
|
76
|
+
get state(): _WakeState;
|
|
77
|
+
/**
|
|
78
|
+
* Set up the strategy.
|
|
79
|
+
*
|
|
80
|
+
* @param setup Configuration object containing setup parameters.
|
|
81
|
+
*/
|
|
82
|
+
setup(setup: FrameProcessorSetup): Promise<void>;
|
|
83
|
+
/** Cleanup the strategy. */
|
|
84
|
+
cleanup(): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Ready the strategy for a new user turn.
|
|
87
|
+
*
|
|
88
|
+
* In timeout mode, preserves state and refreshes the timeout — a turn
|
|
89
|
+
* starting is the activity that keeps the strategy awake. In single
|
|
90
|
+
* activation mode, does nothing: the keepalive timeout (started when the
|
|
91
|
+
* wake phrase was detected) handles the transition back to IDLE.
|
|
92
|
+
*/
|
|
93
|
+
handleUserTurnStarted(): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Process an incoming frame for wake phrase detection or passthrough.
|
|
96
|
+
*
|
|
97
|
+
* @param frame The frame to be processed.
|
|
98
|
+
* @returns STOP when the wake phrase is detected or when in IDLE state
|
|
99
|
+
* (blocks subsequent strategies), CONTINUE when in AWAKE state (allows
|
|
100
|
+
* subsequent strategies to proceed).
|
|
101
|
+
*/
|
|
102
|
+
processFrame(frame: Frame): Promise<ProcessFrameResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Process a frame while in IDLE state.
|
|
105
|
+
*
|
|
106
|
+
* Only final `TranscriptionFrame` instances are checked for wake phrase
|
|
107
|
+
* matches. When a match is found, a user turn start is triggered.
|
|
108
|
+
* Transcription frames that don't match have their text cleared so that
|
|
109
|
+
* pre-wake-phrase speech is not added to the LLM context. All frames
|
|
110
|
+
* return STOP to block subsequent strategies.
|
|
111
|
+
*/
|
|
112
|
+
protected _processIdle(frame: Frame): Promise<ProcessFrameResult>;
|
|
113
|
+
/**
|
|
114
|
+
* Process a frame while in AWAKE state.
|
|
115
|
+
*
|
|
116
|
+
* Refreshes the timeout on activity frames (timeout mode only). Returns
|
|
117
|
+
* CONTINUE so subsequent strategies can process the frame.
|
|
118
|
+
*/
|
|
119
|
+
protected _processAwake(frame: Frame): Promise<ProcessFrameResult>;
|
|
120
|
+
/** Strip punctuation from text, keeping only letters, digits, and whitespace. */
|
|
121
|
+
protected static _stripPunctuation(text: string): string;
|
|
122
|
+
/**
|
|
123
|
+
* Check if the accumulated text contains a wake phrase.
|
|
124
|
+
*
|
|
125
|
+
* Punctuation is stripped before matching so that STT output like
|
|
126
|
+
* "Hey, Pipecat!" still matches the phrase "hey pipecat".
|
|
127
|
+
*
|
|
128
|
+
* @param text New transcription text to append and check.
|
|
129
|
+
* @returns True if a wake phrase was found, false otherwise.
|
|
130
|
+
*/
|
|
131
|
+
protected _checkWakePhrase(text: string): boolean;
|
|
132
|
+
/** Transition from IDLE to AWAKE state. */
|
|
133
|
+
protected _transitionToAwake(phrase: string): void;
|
|
134
|
+
/** Transition from AWAKE to IDLE state. */
|
|
135
|
+
protected _transitionToIdle(): void;
|
|
136
|
+
/** Refresh the inactivity timeout. */
|
|
137
|
+
protected _refreshTimeout(): void;
|
|
138
|
+
/** Background task that monitors inactivity timeout. */
|
|
139
|
+
protected _timeoutTaskHandler(): Promise<void>;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=wake_phrase_user_turn_start_strategy.d.ts.map
|