@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,15 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/audio/resamplers/resampy_resampler.py
|
|
6
|
+
/**
|
|
7
|
+
* Resampy-based audio resampler implementation.
|
|
8
|
+
*
|
|
9
|
+
* PORTING NOTE: upstream's only export, `ResampyResampler`, is deprecated
|
|
10
|
+
* (since 1.2.0, removed in 2.0.0) and is not ported. Use
|
|
11
|
+
* `SOXRAudioResampler`, `createFileResampler()` or `createStreamResampler()`
|
|
12
|
+
* instead.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=resampy_resampler.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResamplerEngine } from "./engine.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Create the pure-TypeScript windowed-sinc engine.
|
|
4
|
+
*
|
|
5
|
+
* Applications normally never call this: core falls back to it on its own
|
|
6
|
+
* when the WASM engine cannot load. It can also be installed explicitly with
|
|
7
|
+
* `setResamplerEngine(createSincResamplerEngine())`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createSincResamplerEngine(): ResamplerEngine;
|
|
10
|
+
//# sourceMappingURL=sinc_engine.d.ts.map
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
// Copyright (c) 2026, pipedog contributors
|
|
2
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
const SPECS = {
|
|
4
|
+
QQ: { passband: 0.8, attenuation: 50 },
|
|
5
|
+
LQ: { passband: 0.676, attenuation: 96 },
|
|
6
|
+
MQ: { passband: 0.91, attenuation: 96 },
|
|
7
|
+
HQ: { passband: 0.91, attenuation: 120 },
|
|
8
|
+
VHQ: { passband: 0.91, attenuation: 140 },
|
|
9
|
+
};
|
|
10
|
+
/** Kaiser window design (Kaiser's formulas for beta and length). */
|
|
11
|
+
function design({ passband, attenuation }) {
|
|
12
|
+
const transition = 1 - passband; // in units of the lower Nyquist frequency
|
|
13
|
+
const cutoff = (1 + passband) / 2;
|
|
14
|
+
const beta = attenuation > 50
|
|
15
|
+
? 0.1102 * (attenuation - 8.7)
|
|
16
|
+
: 0.5842 * (attenuation - 21) ** 0.4 + 0.07886 * (attenuation - 21);
|
|
17
|
+
// Total length in samples of the lower rate, then in zero crossings per side.
|
|
18
|
+
const length = (attenuation - 7.95) / (2.285 * Math.PI * transition);
|
|
19
|
+
const zeros = Math.ceil((length / 2) * cutoff);
|
|
20
|
+
return { zeros, cutoff, beta };
|
|
21
|
+
}
|
|
22
|
+
const PRESETS = Object.fromEntries(Object.entries(SPECS).map(([q, spec]) => [q, design(spec)]));
|
|
23
|
+
/** Table points per zero crossing (linear interpolation error ~ -118 dB). */
|
|
24
|
+
const OVERSAMPLE = 1024;
|
|
25
|
+
/** Zeroth-order modified Bessel function of the first kind. */
|
|
26
|
+
function besselI0(x) {
|
|
27
|
+
let sum = 1;
|
|
28
|
+
let term = 1;
|
|
29
|
+
const q = (x * x) / 4;
|
|
30
|
+
for (let k = 1; k < 200; k++) {
|
|
31
|
+
term *= q / (k * k);
|
|
32
|
+
sum += term;
|
|
33
|
+
if (term < sum * 1e-17)
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
return sum;
|
|
37
|
+
}
|
|
38
|
+
const TABLES = new Map();
|
|
39
|
+
/** sinc(x) * kaiser(x / zeros) for x in [0, zeros], OVERSAMPLE points per unit (plus guard). */
|
|
40
|
+
function kernelTable(quality) {
|
|
41
|
+
let table = TABLES.get(quality);
|
|
42
|
+
if (table)
|
|
43
|
+
return table;
|
|
44
|
+
const { zeros, beta } = PRESETS[quality];
|
|
45
|
+
const n = zeros * OVERSAMPLE;
|
|
46
|
+
table = new Float32Array(n + 2);
|
|
47
|
+
const i0b = besselI0(beta);
|
|
48
|
+
for (let i = 0; i <= n; i++) {
|
|
49
|
+
const x = i / OVERSAMPLE;
|
|
50
|
+
const r = x / zeros;
|
|
51
|
+
const w = besselI0(beta * Math.sqrt(Math.max(0, 1 - r * r))) / i0b;
|
|
52
|
+
const s = i === 0 ? 1 : Math.sin(Math.PI * x) / (Math.PI * x);
|
|
53
|
+
table[i] = s * w;
|
|
54
|
+
}
|
|
55
|
+
TABLES.set(quality, table);
|
|
56
|
+
return table;
|
|
57
|
+
}
|
|
58
|
+
function checkRates(inRate, outRate) {
|
|
59
|
+
if (!(inRate > 0) || !(outRate > 0) || !Number.isFinite(inRate) || !Number.isFinite(outRate)) {
|
|
60
|
+
throw new Error(`invalid sample rates: ${inRate}->${outRate}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** One channel of a streaming windowed-sinc resampler. */
|
|
64
|
+
class SincChannel {
|
|
65
|
+
#step; // input samples per output sample
|
|
66
|
+
#scale; // 2 * fc (fc in cycles per input sample)
|
|
67
|
+
#halfWidth; // kernel half width in input samples
|
|
68
|
+
#table;
|
|
69
|
+
#tableScale; // table index per input-sample distance
|
|
70
|
+
/** Input history; #buf[0] is absolute input index #base. */
|
|
71
|
+
#buf = new Float64Array(256);
|
|
72
|
+
#len = 0;
|
|
73
|
+
#base = 0;
|
|
74
|
+
/** Total input samples seen and next output index (absolute). */
|
|
75
|
+
#totalIn = 0;
|
|
76
|
+
#nextOut = 0;
|
|
77
|
+
constructor(inRate, outRate, quality) {
|
|
78
|
+
const preset = PRESETS[quality];
|
|
79
|
+
this.#step = inRate / outRate;
|
|
80
|
+
const fc = 0.5 * Math.min(1, outRate / inRate) * preset.cutoff;
|
|
81
|
+
this.#scale = 2 * fc;
|
|
82
|
+
this.#halfWidth = preset.zeros / this.#scale;
|
|
83
|
+
this.#table = kernelTable(quality);
|
|
84
|
+
this.#tableScale = this.#scale * OVERSAMPLE;
|
|
85
|
+
}
|
|
86
|
+
#append(samples, start, stride, count) {
|
|
87
|
+
if (this.#len + count > this.#buf.length) {
|
|
88
|
+
const grown = new Float64Array(Math.max(this.#buf.length * 2, this.#len + count));
|
|
89
|
+
grown.set(this.#buf.subarray(0, this.#len));
|
|
90
|
+
this.#buf = grown;
|
|
91
|
+
}
|
|
92
|
+
for (let i = 0; i < count; i++) {
|
|
93
|
+
this.#buf[this.#len + i] = samples[start + i * stride];
|
|
94
|
+
}
|
|
95
|
+
this.#len += count;
|
|
96
|
+
this.#totalIn += count;
|
|
97
|
+
}
|
|
98
|
+
#sampleAt(t) {
|
|
99
|
+
const lo = Math.ceil(t - this.#halfWidth);
|
|
100
|
+
const hi = Math.floor(t + this.#halfWidth);
|
|
101
|
+
const buf = this.#buf;
|
|
102
|
+
const base = this.#base;
|
|
103
|
+
const table = this.#table;
|
|
104
|
+
const ts = this.#tableScale;
|
|
105
|
+
const tableMax = table.length - 2;
|
|
106
|
+
let acc = 0;
|
|
107
|
+
const from = Math.max(lo, base);
|
|
108
|
+
const to = Math.min(hi, base + this.#len - 1);
|
|
109
|
+
for (let n = from; n <= to; n++) {
|
|
110
|
+
const pos = Math.abs(t - n) * ts;
|
|
111
|
+
const i = pos | 0;
|
|
112
|
+
if (i > tableMax)
|
|
113
|
+
continue;
|
|
114
|
+
const frac = pos - i;
|
|
115
|
+
const k = table[i] + (table[i + 1] - table[i]) * frac;
|
|
116
|
+
acc += buf[n - base] * k;
|
|
117
|
+
}
|
|
118
|
+
return acc * this.#scale;
|
|
119
|
+
}
|
|
120
|
+
/** Number of outputs computable now (or, with `end`, the remaining outputs of the stream). */
|
|
121
|
+
#available(end) {
|
|
122
|
+
if (end) {
|
|
123
|
+
const total = Math.round(this.#totalIn / this.#step);
|
|
124
|
+
return Math.max(0, total - this.#nextOut);
|
|
125
|
+
}
|
|
126
|
+
// Output k needs inputs up to floor(k*step + halfWidth) < totalIn.
|
|
127
|
+
const last = Math.floor((this.#totalIn - 1 - this.#halfWidth) / this.#step);
|
|
128
|
+
return Math.max(0, last + 1 - this.#nextOut);
|
|
129
|
+
}
|
|
130
|
+
/** Feed `count` samples (strided) and write the outputs produced to `out` (strided). */
|
|
131
|
+
process(samples, start, stride, count, end) {
|
|
132
|
+
if (count > 0)
|
|
133
|
+
this.#append(samples, start, stride, count);
|
|
134
|
+
const n = this.#available(end);
|
|
135
|
+
const out = new Float64Array(n);
|
|
136
|
+
for (let i = 0; i < n; i++) {
|
|
137
|
+
out[i] = this.#sampleAt((this.#nextOut + i) * this.#step);
|
|
138
|
+
}
|
|
139
|
+
this.#nextOut += n;
|
|
140
|
+
if (end) {
|
|
141
|
+
this.clear();
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Drop history no future output can reach.
|
|
145
|
+
const keepFrom = Math.floor(this.#nextOut * this.#step - this.#halfWidth) - 1;
|
|
146
|
+
const drop = Math.min(this.#len, keepFrom - this.#base);
|
|
147
|
+
if (drop > 0) {
|
|
148
|
+
this.#buf.copyWithin(0, drop, this.#len);
|
|
149
|
+
this.#len -= drop;
|
|
150
|
+
this.#base += drop;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
clear() {
|
|
156
|
+
this.#len = 0;
|
|
157
|
+
this.#base = 0;
|
|
158
|
+
this.#totalIn = 0;
|
|
159
|
+
this.#nextOut = 0;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function toInt16(x) {
|
|
163
|
+
const r = Math.round(x);
|
|
164
|
+
return r > 32767 ? 32767 : r < -32768 ? -32768 : r;
|
|
165
|
+
}
|
|
166
|
+
/** A streaming windowed-sinc resampler over interleaved samples. */
|
|
167
|
+
class SincStream {
|
|
168
|
+
#channels;
|
|
169
|
+
#numChannels;
|
|
170
|
+
/** Samples of an incomplete frame carried to the next call. */
|
|
171
|
+
#pending = [];
|
|
172
|
+
constructor(options) {
|
|
173
|
+
checkRates(options.inRate, options.outRate);
|
|
174
|
+
const numChannels = options.numChannels;
|
|
175
|
+
if (!Number.isInteger(numChannels) || numChannels < 1) {
|
|
176
|
+
throw new Error(`invalid channel count: ${numChannels}`);
|
|
177
|
+
}
|
|
178
|
+
this.#numChannels = numChannels;
|
|
179
|
+
this.#channels = Array.from({ length: numChannels }, () => new SincChannel(options.inRate, options.outRate, options.quality));
|
|
180
|
+
}
|
|
181
|
+
resampleChunk(chunk, last = false) {
|
|
182
|
+
const c = this.#numChannels;
|
|
183
|
+
let input = chunk;
|
|
184
|
+
if (this.#pending.length > 0) {
|
|
185
|
+
input = [...this.#pending, ...chunk];
|
|
186
|
+
this.#pending = [];
|
|
187
|
+
}
|
|
188
|
+
const frames = Math.floor(input.length / c);
|
|
189
|
+
const rest = input.length - frames * c;
|
|
190
|
+
if (rest > 0 && !last) {
|
|
191
|
+
this.#pending = Array.from({ length: rest }, (_, i) => input[frames * c + i]);
|
|
192
|
+
}
|
|
193
|
+
const outs = this.#channels.map((ch, i) => ch.process(input, i, c, frames, last));
|
|
194
|
+
const outFrames = outs[0]?.length ?? 0;
|
|
195
|
+
const isFloat = chunk instanceof Float32Array;
|
|
196
|
+
const out = isFloat ? new Float32Array(outFrames * c) : new Int16Array(outFrames * c);
|
|
197
|
+
for (let ch = 0; ch < c; ch++) {
|
|
198
|
+
const data = outs[ch];
|
|
199
|
+
for (let f = 0; f < outFrames; f++) {
|
|
200
|
+
const v = data[f];
|
|
201
|
+
out[f * c + ch] = isFloat ? v : toInt16(v);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (last)
|
|
205
|
+
this.#pending = [];
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
clear() {
|
|
209
|
+
this.#pending = [];
|
|
210
|
+
for (const ch of this.#channels)
|
|
211
|
+
ch.clear();
|
|
212
|
+
}
|
|
213
|
+
destroy() { }
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Create the pure-TypeScript windowed-sinc engine.
|
|
217
|
+
*
|
|
218
|
+
* Applications normally never call this: core falls back to it on its own
|
|
219
|
+
* when the WASM engine cannot load. It can also be installed explicitly with
|
|
220
|
+
* `setResamplerEngine(createSincResamplerEngine())`.
|
|
221
|
+
*/
|
|
222
|
+
export function createSincResamplerEngine() {
|
|
223
|
+
return {
|
|
224
|
+
resample(audio, inRate, outRate, quality) {
|
|
225
|
+
if (inRate === outRate)
|
|
226
|
+
return audio;
|
|
227
|
+
const stream = new SincStream({ inRate, outRate, numChannels: 1, quality });
|
|
228
|
+
return stream.resampleChunk(audio, true);
|
|
229
|
+
},
|
|
230
|
+
createStream(options) {
|
|
231
|
+
return new SincStream(options);
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=sinc_engine.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SoX-based audio resampler implementation.
|
|
3
|
+
*
|
|
4
|
+
* Provides an audio resampler that uses the SoX resampler library for very
|
|
5
|
+
* high-quality audio sample rate conversion.
|
|
6
|
+
*
|
|
7
|
+
* When to use the SOXRAudioResampler:
|
|
8
|
+
* 1. For batch processing of complete audio files
|
|
9
|
+
* 2. When you have all the audio data available at once
|
|
10
|
+
*
|
|
11
|
+
* PORTING NOTE: libsoxr is not used. `soxr.resample()` is replaced by the
|
|
12
|
+
* resampler engine from `engine.ts`: `@pipedog/resampler-wasm` (rubato
|
|
13
|
+
* windowed sinc in WebAssembly) by default, a pure-TypeScript windowed-sinc
|
|
14
|
+
* fallback if that cannot load, or whatever `setResamplerEngine()` installed.
|
|
15
|
+
* Output lengths follow soxr's; the samples differ slightly because the
|
|
16
|
+
* filters differ.
|
|
17
|
+
*/
|
|
18
|
+
import { BaseAudioResampler, type SoxrQuality } from "./base_audio_resampler.ts";
|
|
19
|
+
/**
|
|
20
|
+
* Stand-in for `soxr.resample()`: resample a whole mono signal.
|
|
21
|
+
*
|
|
22
|
+
* Synchronous, like soxr's: it uses the engine already loaded (or injected)
|
|
23
|
+
* and throws if there is none yet. `await getResamplerEngine()` first when
|
|
24
|
+
* calling it outside `SOXRAudioResampler.resample()`.
|
|
25
|
+
*
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export declare function soxrResample<T extends Int16Array | Float32Array>(audio: T, inRate: number, outRate: number, quality: SoxrQuality): T;
|
|
29
|
+
export interface SOXRAudioResamplerOptions {
|
|
30
|
+
/**
|
|
31
|
+
* SOXR quality preset. Higher quality means higher CPU cost. One of "VHQ"
|
|
32
|
+
* (default, very high quality), "HQ", "MQ", "LQ", or "QQ" (quick, lowest
|
|
33
|
+
* latency).
|
|
34
|
+
*/
|
|
35
|
+
quality?: SoxrQuality;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Audio resampler implementation using the SoX resampler library.
|
|
39
|
+
*
|
|
40
|
+
* Configured for very high quality (VHQ) resampling by default, providing
|
|
41
|
+
* excellent audio quality at the cost of additional computational overhead.
|
|
42
|
+
*/
|
|
43
|
+
export declare class SOXRAudioResampler extends BaseAudioResampler {
|
|
44
|
+
protected _quality: SoxrQuality;
|
|
45
|
+
constructor(options?: SOXRAudioResamplerOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Resample audio data using SoX resampler library.
|
|
48
|
+
*
|
|
49
|
+
* @param audio Input audio data as raw bytes (16-bit signed integers).
|
|
50
|
+
* @param inRate Original sample rate in Hz.
|
|
51
|
+
* @param outRate Target sample rate in Hz.
|
|
52
|
+
* @returns Resampled audio data as raw bytes (16-bit signed integers).
|
|
53
|
+
*/
|
|
54
|
+
resample(audio: Uint8Array, inRate: number, outRate: number): Promise<Uint8Array>;
|
|
55
|
+
}
|
|
56
|
+
/** View (or copy, if unaligned) 16-bit PCM bytes as samples. @internal */
|
|
57
|
+
export declare function bytesToInt16(audio: Uint8Array): Int16Array;
|
|
58
|
+
//# sourceMappingURL=soxr_resampler.d.ts.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/audio/resamplers/soxr_resampler.py
|
|
6
|
+
/**
|
|
7
|
+
* SoX-based audio resampler implementation.
|
|
8
|
+
*
|
|
9
|
+
* Provides an audio resampler that uses the SoX resampler library for very
|
|
10
|
+
* high-quality audio sample rate conversion.
|
|
11
|
+
*
|
|
12
|
+
* When to use the SOXRAudioResampler:
|
|
13
|
+
* 1. For batch processing of complete audio files
|
|
14
|
+
* 2. When you have all the audio data available at once
|
|
15
|
+
*
|
|
16
|
+
* PORTING NOTE: libsoxr is not used. `soxr.resample()` is replaced by the
|
|
17
|
+
* resampler engine from `engine.ts`: `@pipedog/resampler-wasm` (rubato
|
|
18
|
+
* windowed sinc in WebAssembly) by default, a pure-TypeScript windowed-sinc
|
|
19
|
+
* fallback if that cannot load, or whatever `setResamplerEngine()` installed.
|
|
20
|
+
* Output lengths follow soxr's; the samples differ slightly because the
|
|
21
|
+
* filters differ.
|
|
22
|
+
*/
|
|
23
|
+
import { BaseAudioResampler } from "./base_audio_resampler.js";
|
|
24
|
+
import { getLoadedResamplerEngine, getResamplerEngine } from "./engine.js";
|
|
25
|
+
/**
|
|
26
|
+
* Stand-in for `soxr.resample()`: resample a whole mono signal.
|
|
27
|
+
*
|
|
28
|
+
* Synchronous, like soxr's: it uses the engine already loaded (or injected)
|
|
29
|
+
* and throws if there is none yet. `await getResamplerEngine()` first when
|
|
30
|
+
* calling it outside `SOXRAudioResampler.resample()`.
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export function soxrResample(audio, inRate, outRate, quality) {
|
|
35
|
+
const engine = getLoadedResamplerEngine();
|
|
36
|
+
if (!engine) {
|
|
37
|
+
throw new Error("no resampler engine loaded yet: `await getResamplerEngine()` (audio/resamplers/engine) first");
|
|
38
|
+
}
|
|
39
|
+
return engine.resample(audio, inRate, outRate, quality);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Audio resampler implementation using the SoX resampler library.
|
|
43
|
+
*
|
|
44
|
+
* Configured for very high quality (VHQ) resampling by default, providing
|
|
45
|
+
* excellent audio quality at the cost of additional computational overhead.
|
|
46
|
+
*/
|
|
47
|
+
export class SOXRAudioResampler extends BaseAudioResampler {
|
|
48
|
+
_quality;
|
|
49
|
+
constructor(options = {}) {
|
|
50
|
+
super();
|
|
51
|
+
this._quality = options.quality ?? "VHQ";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resample audio data using SoX resampler library.
|
|
55
|
+
*
|
|
56
|
+
* @param audio Input audio data as raw bytes (16-bit signed integers).
|
|
57
|
+
* @param inRate Original sample rate in Hz.
|
|
58
|
+
* @param outRate Target sample rate in Hz.
|
|
59
|
+
* @returns Resampled audio data as raw bytes (16-bit signed integers).
|
|
60
|
+
*/
|
|
61
|
+
async resample(audio, inRate, outRate) {
|
|
62
|
+
if (inRate === outRate) {
|
|
63
|
+
return audio;
|
|
64
|
+
}
|
|
65
|
+
await getResamplerEngine();
|
|
66
|
+
const audioData = bytesToInt16(audio);
|
|
67
|
+
const resampledAudio = soxrResample(audioData, inRate, outRate, this._quality);
|
|
68
|
+
return new Uint8Array(resampledAudio.buffer, resampledAudio.byteOffset, resampledAudio.byteLength);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** View (or copy, if unaligned) 16-bit PCM bytes as samples. @internal */
|
|
72
|
+
export function bytesToInt16(audio) {
|
|
73
|
+
const length = audio.length >> 1;
|
|
74
|
+
if (audio.byteOffset % 2 !== 0) {
|
|
75
|
+
return new Int16Array(audio.slice(0, length * 2).buffer);
|
|
76
|
+
}
|
|
77
|
+
return new Int16Array(audio.buffer, audio.byteOffset, length);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=soxr_resampler.js.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { BaseAudioResampler, type SoxrQuality } from "./base_audio_resampler.ts";
|
|
2
|
+
import { type ResamplerEngine, type ResamplerStream } from "./engine.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Stand-in for `soxr.ResampleStream` (mono, int16): a stream of the resampler
|
|
5
|
+
* engine (the loaded/injected one unless `engine` is given).
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare class SoxrResampleStream {
|
|
10
|
+
protected _stream: ResamplerStream;
|
|
11
|
+
constructor(options: {
|
|
12
|
+
inRate: number;
|
|
13
|
+
outRate: number;
|
|
14
|
+
numChannels: number;
|
|
15
|
+
quality: SoxrQuality;
|
|
16
|
+
}, engine?: ResamplerEngine | null);
|
|
17
|
+
resampleChunk(chunk: Int16Array, last?: boolean): Int16Array;
|
|
18
|
+
clear(): void;
|
|
19
|
+
/** Free the engine's state (WASM memory). */
|
|
20
|
+
destroy(): void;
|
|
21
|
+
}
|
|
22
|
+
export interface SOXRStreamAudioResamplerOptions {
|
|
23
|
+
/**
|
|
24
|
+
* SOXR quality preset. Higher quality means higher CPU cost. One of "VHQ"
|
|
25
|
+
* (default, very high quality), "HQ", "MQ", "LQ", or "QQ" (quick, lowest
|
|
26
|
+
* latency).
|
|
27
|
+
*/
|
|
28
|
+
quality?: SoxrQuality;
|
|
29
|
+
/**
|
|
30
|
+
* Seconds of inactivity after which the internal resampler state is
|
|
31
|
+
* cleared to avoid audio artefacts from stale history. Set to `null` to
|
|
32
|
+
* never clear (recommended for telephony providers that have irregular gaps
|
|
33
|
+
* between chunks). Defaults to 0.2.
|
|
34
|
+
*/
|
|
35
|
+
clearAfterSecs?: number | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Audio resampler implementation using the SoX ResampleStream library.
|
|
39
|
+
*
|
|
40
|
+
* Configured for very high quality (VHQ) resampling by default, providing
|
|
41
|
+
* excellent audio quality at the cost of additional computational overhead.
|
|
42
|
+
* It keeps an internal history which avoids clicks at chunk boundaries.
|
|
43
|
+
*
|
|
44
|
+
* Notes:
|
|
45
|
+
* - Only supports mono audio (1 channel).
|
|
46
|
+
* - Input must be 16-bit signed PCM audio as raw bytes.
|
|
47
|
+
*/
|
|
48
|
+
export declare class SOXRStreamAudioResampler extends BaseAudioResampler {
|
|
49
|
+
protected _quality: SoxrQuality;
|
|
50
|
+
protected _clearAfterSecs: number | null;
|
|
51
|
+
protected _inRate: number | null;
|
|
52
|
+
protected _outRate: number | null;
|
|
53
|
+
protected _lastResampleTime: number;
|
|
54
|
+
protected _soxrStream: SoxrResampleStream | null;
|
|
55
|
+
constructor(options?: SOXRStreamAudioResamplerOptions);
|
|
56
|
+
protected _initialize(inRate: number, outRate: number): void;
|
|
57
|
+
protected _maybeClearInternalState(): void;
|
|
58
|
+
protected _maybeInitializeSoxStream(inRate: number, outRate: number): SoxrResampleStream;
|
|
59
|
+
/**
|
|
60
|
+
* Resample audio data using soxr.ResampleStream resampler library.
|
|
61
|
+
*
|
|
62
|
+
* @param audio Input audio data as raw bytes (16-bit signed integers).
|
|
63
|
+
* @param inRate Original sample rate in Hz.
|
|
64
|
+
* @param outRate Target sample rate in Hz.
|
|
65
|
+
* @returns Resampled audio data as raw bytes (16-bit signed integers).
|
|
66
|
+
*/
|
|
67
|
+
resample(audio: Uint8Array, inRate: number, outRate: number): Promise<Uint8Array>;
|
|
68
|
+
/**
|
|
69
|
+
* Emit the audio held in the filter and reset it for the next stream.
|
|
70
|
+
*
|
|
71
|
+
* @returns The remaining resampled audio as raw bytes, empty if no audio
|
|
72
|
+
* has been resampled yet.
|
|
73
|
+
*/
|
|
74
|
+
flush(): Promise<Uint8Array>;
|
|
75
|
+
/** Discard the audio held in the filter and reset it for the next stream. */
|
|
76
|
+
reset(): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=soxr_stream_resampler.d.ts.map
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026, Daily
|
|
2
|
+
// Copyright (c) 2026, pipedog contributors
|
|
3
|
+
// SPDX-License-Identifier: BSD-2-Clause
|
|
4
|
+
//
|
|
5
|
+
// Ported from pipecat: src/pipecat/audio/resamplers/soxr_stream_resampler.py
|
|
6
|
+
/**
|
|
7
|
+
* SoX-based audio resampler stream implementation.
|
|
8
|
+
*
|
|
9
|
+
* Provides an audio resampler that uses the SoX ResampleStream library for
|
|
10
|
+
* very high quality audio sample rate conversion.
|
|
11
|
+
*
|
|
12
|
+
* When to use the SOXRStreamAudioResampler:
|
|
13
|
+
* 1. For real-time processing scenarios
|
|
14
|
+
* 2. When dealing with very long audio signals
|
|
15
|
+
* 3. When processing audio in chunks or streams
|
|
16
|
+
* 4. When you need to reuse the same resampler configuration multiple times,
|
|
17
|
+
* as it saves initialization overhead
|
|
18
|
+
*
|
|
19
|
+
* PORTING NOTE: libsoxr is not used. `soxr.ResampleStream` is replaced by a
|
|
20
|
+
* stream from the resampler engine (`engine.ts`): `@pipedog/resampler-wasm`
|
|
21
|
+
* by default, a pure-TypeScript windowed-sinc fallback if that cannot load,
|
|
22
|
+
* or whatever `setResamplerEngine()` installed. `resample()` loads the engine
|
|
23
|
+
* on first use.
|
|
24
|
+
*/
|
|
25
|
+
import { time } from "@pipedog/asyncio";
|
|
26
|
+
import { BaseAudioResampler } from "./base_audio_resampler.js";
|
|
27
|
+
import { getLoadedResamplerEngine, getResamplerEngine, } from "./engine.js";
|
|
28
|
+
import { bytesToInt16 } from "./soxr_resampler.js";
|
|
29
|
+
const EMPTY_AUDIO = new Int16Array(0);
|
|
30
|
+
/**
|
|
31
|
+
* Stand-in for `soxr.ResampleStream` (mono, int16): a stream of the resampler
|
|
32
|
+
* engine (the loaded/injected one unless `engine` is given).
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export class SoxrResampleStream {
|
|
37
|
+
_stream;
|
|
38
|
+
constructor(options, engine = getLoadedResamplerEngine()) {
|
|
39
|
+
if (!engine) {
|
|
40
|
+
throw new Error("no resampler engine loaded yet: `await getResamplerEngine()` (audio/resamplers/engine) first");
|
|
41
|
+
}
|
|
42
|
+
this._stream = engine.createStream(options);
|
|
43
|
+
}
|
|
44
|
+
resampleChunk(chunk, last = false) {
|
|
45
|
+
return this._stream.resampleChunk(chunk, last);
|
|
46
|
+
}
|
|
47
|
+
clear() {
|
|
48
|
+
this._stream.clear();
|
|
49
|
+
}
|
|
50
|
+
/** Free the engine's state (WASM memory). */
|
|
51
|
+
destroy() {
|
|
52
|
+
this._stream.destroy?.();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function int16ToBytes(samples) {
|
|
56
|
+
return new Uint8Array(samples.buffer, samples.byteOffset, samples.byteLength);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Audio resampler implementation using the SoX ResampleStream library.
|
|
60
|
+
*
|
|
61
|
+
* Configured for very high quality (VHQ) resampling by default, providing
|
|
62
|
+
* excellent audio quality at the cost of additional computational overhead.
|
|
63
|
+
* It keeps an internal history which avoids clicks at chunk boundaries.
|
|
64
|
+
*
|
|
65
|
+
* Notes:
|
|
66
|
+
* - Only supports mono audio (1 channel).
|
|
67
|
+
* - Input must be 16-bit signed PCM audio as raw bytes.
|
|
68
|
+
*/
|
|
69
|
+
export class SOXRStreamAudioResampler extends BaseAudioResampler {
|
|
70
|
+
_quality;
|
|
71
|
+
_clearAfterSecs;
|
|
72
|
+
_inRate = null;
|
|
73
|
+
_outRate = null;
|
|
74
|
+
_lastResampleTime = 0;
|
|
75
|
+
_soxrStream = null;
|
|
76
|
+
constructor(options = {}) {
|
|
77
|
+
super();
|
|
78
|
+
this._quality = options.quality ?? "VHQ";
|
|
79
|
+
this._clearAfterSecs = options.clearAfterSecs === undefined ? 0.2 : options.clearAfterSecs;
|
|
80
|
+
}
|
|
81
|
+
_initialize(inRate, outRate) {
|
|
82
|
+
this._inRate = inRate;
|
|
83
|
+
this._outRate = outRate;
|
|
84
|
+
this._lastResampleTime = time();
|
|
85
|
+
this._soxrStream = new SoxrResampleStream({
|
|
86
|
+
inRate,
|
|
87
|
+
outRate,
|
|
88
|
+
numChannels: 1,
|
|
89
|
+
quality: this._quality,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
_maybeClearInternalState() {
|
|
93
|
+
const currentTime = time();
|
|
94
|
+
if (this._clearAfterSecs !== null) {
|
|
95
|
+
if (currentTime - this._lastResampleTime > this._clearAfterSecs) {
|
|
96
|
+
if (this._soxrStream) {
|
|
97
|
+
this._soxrStream.clear();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this._lastResampleTime = currentTime;
|
|
102
|
+
}
|
|
103
|
+
_maybeInitializeSoxStream(inRate, outRate) {
|
|
104
|
+
if (this._soxrStream === null) {
|
|
105
|
+
this._initialize(inRate, outRate);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this._maybeClearInternalState();
|
|
109
|
+
}
|
|
110
|
+
if (this._inRate !== inRate || this._outRate !== outRate) {
|
|
111
|
+
throw new Error(`SOXRStreamAudioResampler cannot be reused with different sample rates: ` +
|
|
112
|
+
`expected ${this._inRate}->${this._outRate}, got ${inRate}->${outRate}`);
|
|
113
|
+
}
|
|
114
|
+
return this._soxrStream;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Resample audio data using soxr.ResampleStream resampler library.
|
|
118
|
+
*
|
|
119
|
+
* @param audio Input audio data as raw bytes (16-bit signed integers).
|
|
120
|
+
* @param inRate Original sample rate in Hz.
|
|
121
|
+
* @param outRate Target sample rate in Hz.
|
|
122
|
+
* @returns Resampled audio data as raw bytes (16-bit signed integers).
|
|
123
|
+
*/
|
|
124
|
+
async resample(audio, inRate, outRate) {
|
|
125
|
+
if (inRate === outRate) {
|
|
126
|
+
return audio;
|
|
127
|
+
}
|
|
128
|
+
if (this._soxrStream === null) {
|
|
129
|
+
await getResamplerEngine();
|
|
130
|
+
}
|
|
131
|
+
const stream = this._maybeInitializeSoxStream(inRate, outRate);
|
|
132
|
+
const audioData = bytesToInt16(audio);
|
|
133
|
+
const resampledAudio = stream.resampleChunk(audioData);
|
|
134
|
+
return int16ToBytes(resampledAudio);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Emit the audio held in the filter and reset it for the next stream.
|
|
138
|
+
*
|
|
139
|
+
* @returns The remaining resampled audio as raw bytes, empty if no audio
|
|
140
|
+
* has been resampled yet.
|
|
141
|
+
*/
|
|
142
|
+
async flush() {
|
|
143
|
+
if (!this._soxrStream) {
|
|
144
|
+
return new Uint8Array(0);
|
|
145
|
+
}
|
|
146
|
+
const tail = this._soxrStream.resampleChunk(EMPTY_AUDIO, true);
|
|
147
|
+
this._soxrStream.clear();
|
|
148
|
+
this._lastResampleTime = time();
|
|
149
|
+
return int16ToBytes(tail);
|
|
150
|
+
}
|
|
151
|
+
/** Discard the audio held in the filter and reset it for the next stream. */
|
|
152
|
+
async reset() {
|
|
153
|
+
if (this._soxrStream) {
|
|
154
|
+
this._soxrStream.clear();
|
|
155
|
+
this._lastResampleTime = time();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=soxr_stream_resampler.js.map
|