@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,147 @@
|
|
|
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/utils/text/skip_tags_aggregator.py
|
|
6
|
+
/**
|
|
7
|
+
* Skip tags aggregator for preventing sentence boundaries within tagged content.
|
|
8
|
+
*
|
|
9
|
+
* This module provides a text aggregator that prevents end-of-sentence matching
|
|
10
|
+
* between specified start/end tag pairs, ensuring that tagged content is processed
|
|
11
|
+
* as a unit regardless of internal punctuation.
|
|
12
|
+
*/
|
|
13
|
+
import { longestTrailingPartialMatch, parseStartEndTags } from "../string.js";
|
|
14
|
+
import { Aggregation, TextType } from "./base_text_aggregator.js";
|
|
15
|
+
import { SimpleTextAggregator, } from "./simple_text_aggregator.js";
|
|
16
|
+
/**
|
|
17
|
+
* Aggregator that prevents end of sentence matching between start/end tags.
|
|
18
|
+
*
|
|
19
|
+
* This aggregator buffers text until it finds an end of sentence or a start
|
|
20
|
+
* tag. If a start tag is found the aggregator will keep aggregating text
|
|
21
|
+
* unconditionally until the corresponding end tag is found. It's particularly
|
|
22
|
+
* useful for processing content with custom delimiters that should prevent
|
|
23
|
+
* text from being considered for end of sentence matching.
|
|
24
|
+
*
|
|
25
|
+
* The aggregator ensures that tags spanning multiple text chunks are correctly
|
|
26
|
+
* identified and that content within tags is never split at sentence boundaries.
|
|
27
|
+
*/
|
|
28
|
+
export class SkipTagsAggregator extends SimpleTextAggregator {
|
|
29
|
+
_tags;
|
|
30
|
+
_currentTag;
|
|
31
|
+
_currentTagIndex;
|
|
32
|
+
/**
|
|
33
|
+
* Initialize the skip tags aggregator.
|
|
34
|
+
*
|
|
35
|
+
* @param options.tags Tag pairs that should prevent sentence boundary detection.
|
|
36
|
+
* Other options are passed to SimpleTextAggregator (e.g. aggregationType).
|
|
37
|
+
*/
|
|
38
|
+
constructor(options) {
|
|
39
|
+
super(options);
|
|
40
|
+
this._tags = options.tags;
|
|
41
|
+
this._currentTag = null;
|
|
42
|
+
this._currentTagIndex = 0;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Aggregate text while respecting tag boundaries.
|
|
46
|
+
*
|
|
47
|
+
* Processes the input text character-by-character, updates tag state, and
|
|
48
|
+
* uses the parent's lookahead logic for sentence detection when not
|
|
49
|
+
* inside tags.
|
|
50
|
+
*
|
|
51
|
+
* In TOKEN mode, text is passed through immediately unless we're inside
|
|
52
|
+
* a tag, in which case we buffer until the closing tag is found. Text
|
|
53
|
+
* ending in a partial start tag (e.g. `<spe` of `<spell>`) is held
|
|
54
|
+
* back until a later chunk determines whether it begins a tag, so a tag
|
|
55
|
+
* split across chunks is still recognized.
|
|
56
|
+
*
|
|
57
|
+
* @param text Text to aggregate.
|
|
58
|
+
* @returns Aggregation objects containing text up to a sentence boundary,
|
|
59
|
+
* marked as SENTENCE type (or TOKEN type in TOKEN mode).
|
|
60
|
+
*/
|
|
61
|
+
async *aggregate(text) {
|
|
62
|
+
if (this._aggregationType === TextType.TOKEN) {
|
|
63
|
+
// In TOKEN mode, process chars for tag tracking but yield the
|
|
64
|
+
// full input as a single token when not inside a tag.
|
|
65
|
+
for (const char of text) {
|
|
66
|
+
this._text += char;
|
|
67
|
+
// Update tag state
|
|
68
|
+
[this._currentTag, this._currentTagIndex] = parseStartEndTags(this._text, this._tags, this._currentTag, this._currentTagIndex);
|
|
69
|
+
}
|
|
70
|
+
// After processing all chars: if not inside a tag, yield accumulated text.
|
|
71
|
+
// A trailing partial start tag (e.g. "<spe" of "<spell>") is held back
|
|
72
|
+
// so a tag split across chunks isn't leaked as plain text; it's retained
|
|
73
|
+
// in the buffer to be completed by the next chunk. The tag-scan index
|
|
74
|
+
// resets to 0 so the retained partial tag is rescanned once complete.
|
|
75
|
+
if (!this._currentTag && this._text) {
|
|
76
|
+
const heldBack = longestTrailingPartialMatch(this._text, this._tags.map(([start]) => start));
|
|
77
|
+
const yieldLength = this._text.length - heldBack;
|
|
78
|
+
if (yieldLength > 0) {
|
|
79
|
+
const content = this._text.slice(0, yieldLength);
|
|
80
|
+
this._text = this._text.slice(yieldLength);
|
|
81
|
+
this._currentTagIndex = 0;
|
|
82
|
+
yield new Aggregation({ text: content, type: TextType.TOKEN });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Process text character by character
|
|
88
|
+
for (const char of text) {
|
|
89
|
+
this._text += char;
|
|
90
|
+
// Update tag state
|
|
91
|
+
[this._currentTag, this._currentTagIndex] = parseStartEndTags(this._text, this._tags, this._currentTag, this._currentTagIndex);
|
|
92
|
+
// If inside tags, don't check for sentences
|
|
93
|
+
if (this._currentTag) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
// Otherwise, use parent's lookahead logic for sentence detection
|
|
97
|
+
const result = await super._checkSentenceWithLookahead(char);
|
|
98
|
+
if (result) {
|
|
99
|
+
yield result;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Flush any remaining text in the buffer.
|
|
105
|
+
*
|
|
106
|
+
* In SENTENCE mode, returns the buffered text as-is: tags are
|
|
107
|
+
* pass-through markers, so content is spoken whether or not a start
|
|
108
|
+
* tag's closing tag ever arrived. In TOKEN mode, returns any text
|
|
109
|
+
* still buffered behind an unclosed tag instead of discarding it.
|
|
110
|
+
*
|
|
111
|
+
* @returns Any remaining text, or null if the buffer is empty.
|
|
112
|
+
*/
|
|
113
|
+
async flush() {
|
|
114
|
+
if (this._aggregationType === TextType.TOKEN) {
|
|
115
|
+
if (this._text) {
|
|
116
|
+
const result = this._text;
|
|
117
|
+
await this.reset();
|
|
118
|
+
return new Aggregation({ text: result, type: TextType.TOKEN });
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return await super.flush();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Handle interruptions by clearing the buffer and tag state.
|
|
126
|
+
*
|
|
127
|
+
* Called when an interruption occurs in the processing pipeline,
|
|
128
|
+
* to reset the state and discard any partially aggregated text.
|
|
129
|
+
*/
|
|
130
|
+
async handleInterruption() {
|
|
131
|
+
await super.handleInterruption();
|
|
132
|
+
this._currentTag = null;
|
|
133
|
+
this._currentTagIndex = 0;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear the internally aggregated text and tag state.
|
|
137
|
+
*
|
|
138
|
+
* Resets the aggregator to its initial state, discarding any
|
|
139
|
+
* buffered text.
|
|
140
|
+
*/
|
|
141
|
+
async reset() {
|
|
142
|
+
await super.reset();
|
|
143
|
+
this._currentTag = null;
|
|
144
|
+
this._currentTagIndex = 0;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=skip_tags_aggregator.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Normalize acronyms so TTS pronounces each letter individually. */
|
|
2
|
+
import type { TextType } from "../../../frames/frames.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Insert spaces between letters of uppercase acronyms.
|
|
5
|
+
*
|
|
6
|
+
* This transformer is alphanumeric-preserving: the same letters are kept,
|
|
7
|
+
* only spaces are added between them, so the `WordCompletionTracker`
|
|
8
|
+
* requires no segment-map overhead.
|
|
9
|
+
*
|
|
10
|
+
* @param text Input text possibly containing acronyms like API or HTTP.
|
|
11
|
+
* @param _textType Text type of the text frame (unused).
|
|
12
|
+
* @returns Text with acronyms letter-spaced (e.g. `"API"` → `"A P I"`).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const result = await normalizeAcronyms("Use the API or HTTP endpoint", "*");
|
|
17
|
+
* // "Use the A P I or H T T P endpoint"
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function normalizeAcronyms(text: string, _textType: string | TextType): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=acronyms.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/utils/text/transforms/acronyms.py
|
|
6
|
+
// Two or more consecutive uppercase letters not immediately followed by a lowercase
|
|
7
|
+
// letter (to avoid splitting CamelCase words like "iPhone" or "McDonalds").
|
|
8
|
+
// Python's `\b` is Unicode-aware; the lookarounds rebuild it with Unicode `\w`
|
|
9
|
+
// (letters, digits and underscore).
|
|
10
|
+
const ACRONYM_RE = /(?<![\p{L}\p{N}_])[A-Z]{2,}(?![a-z])(?![\p{L}\p{N}_])/gu;
|
|
11
|
+
/**
|
|
12
|
+
* Insert spaces between letters of uppercase acronyms.
|
|
13
|
+
*
|
|
14
|
+
* This transformer is alphanumeric-preserving: the same letters are kept,
|
|
15
|
+
* only spaces are added between them, so the `WordCompletionTracker`
|
|
16
|
+
* requires no segment-map overhead.
|
|
17
|
+
*
|
|
18
|
+
* @param text Input text possibly containing acronyms like API or HTTP.
|
|
19
|
+
* @param _textType Text type of the text frame (unused).
|
|
20
|
+
* @returns Text with acronyms letter-spaced (e.g. `"API"` → `"A P I"`).
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const result = await normalizeAcronyms("Use the API or HTTP endpoint", "*");
|
|
25
|
+
* // "Use the A P I or H T T P endpoint"
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export async function normalizeAcronyms(text, _textType) {
|
|
29
|
+
return text.replace(ACRONYM_RE, (match) => [...match].join(" "));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=acronyms.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TextType } from "../../../frames/frames.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Expand currency amounts to their spoken form.
|
|
4
|
+
*
|
|
5
|
+
* @param text Input text possibly containing currency expressions.
|
|
6
|
+
* @param _textType Text type of the text frame (unused).
|
|
7
|
+
* @returns Text with currency amounts replaced by spoken equivalents.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const result = await expandCurrency("Your balance is $42.50", "*");
|
|
12
|
+
* // "Your balance is forty-two dollars and fifty cents"
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function expandCurrency(text: string, _textType: string | TextType): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=currency.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
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/utils/text/transforms/currency.py
|
|
6
|
+
/** Expand currency amounts into spoken form for TTS. */
|
|
7
|
+
import { num2words } from "num2words-ts";
|
|
8
|
+
import { toAsciiDigits } from "../unicode_digits.js";
|
|
9
|
+
/** Maps currency symbol to (singular, plural, cents_singular, cents_plural). */
|
|
10
|
+
const CURRENCY_MAP = {
|
|
11
|
+
$: ["dollar", "dollars", "cent", "cents"],
|
|
12
|
+
"€": ["euro", "euros", "cent", "cents"],
|
|
13
|
+
"£": ["pound", "pounds", "penny", "pence"],
|
|
14
|
+
"¥": ["yen", "yen", null, null],
|
|
15
|
+
"₹": ["rupee", "rupees", "paisa", "paise"],
|
|
16
|
+
};
|
|
17
|
+
// Python's `\b` (after a digit here) is Unicode-aware; the lookahead rebuilds
|
|
18
|
+
// it with Unicode `\w` (letters, digits and underscore).
|
|
19
|
+
// `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
|
|
20
|
+
const CURRENCY_RE = /([€£¥₹$])\s*(\p{Nd}{1,3}(?:,\p{Nd}{3})*|\p{Nd}+)(?![\p{L}\p{N}_])(?:\.(\p{Nd}+))?/gu;
|
|
21
|
+
function amountToWords(n, singular, plural) {
|
|
22
|
+
const words = num2words(n, { lang: "en" });
|
|
23
|
+
const unit = n === 1n ? singular : plural;
|
|
24
|
+
return `${words} ${unit}`;
|
|
25
|
+
}
|
|
26
|
+
function currencyMatch(symbol, wholeMatch, fracStr) {
|
|
27
|
+
const wholeStr = wholeMatch.replaceAll(",", "");
|
|
28
|
+
const currency = CURRENCY_MAP[symbol] ?? ["unit", "units", "cent", "cents"];
|
|
29
|
+
const [singular, plural, cSingular, cPlural] = currency;
|
|
30
|
+
const whole = BigInt(toAsciiDigits(wholeStr));
|
|
31
|
+
let result = amountToWords(whole, singular, plural);
|
|
32
|
+
if (fracStr && cSingular && cPlural) {
|
|
33
|
+
const frac = BigInt(toAsciiDigits(fracStr.slice(0, 2).padEnd(2, "0")));
|
|
34
|
+
if (frac > 0n) {
|
|
35
|
+
result += ` and ${amountToWords(frac, cSingular, cPlural)}`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Expand currency amounts to their spoken form.
|
|
42
|
+
*
|
|
43
|
+
* @param text Input text possibly containing currency expressions.
|
|
44
|
+
* @param _textType Text type of the text frame (unused).
|
|
45
|
+
* @returns Text with currency amounts replaced by spoken equivalents.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const result = await expandCurrency("Your balance is $42.50", "*");
|
|
50
|
+
* // "Your balance is forty-two dollars and fifty cents"
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export async function expandCurrency(text, _textType) {
|
|
54
|
+
return text.replace(CURRENCY_RE, (_match, symbol, whole, frac) => currencyMatch(symbol, whole, frac));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=currency.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TextType } from "../../../frames/frames.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Expand date expressions to their spoken form.
|
|
4
|
+
*
|
|
5
|
+
* Handles ISO format (`YYYY-MM-DD`) and US format (`MM/DD/YYYY` or `MM-DD-YYYY`).
|
|
6
|
+
*
|
|
7
|
+
* @param text Input text possibly containing date expressions.
|
|
8
|
+
* @param _textType Text type of the text frame (unused).
|
|
9
|
+
* @returns Text with date expressions replaced by spoken equivalents.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const result = await normalizeDates("Meeting on 2023-05-10", "*");
|
|
14
|
+
* // "Meeting on May 10th, two thousand and twenty three"
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeDates(text: string, _textType: string | TextType): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=dates.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/utils/text/transforms/dates.py
|
|
6
|
+
/** Expand date expressions into spoken form for TTS. */
|
|
7
|
+
import { num2words } from "num2words-ts";
|
|
8
|
+
import { toAsciiDigits } from "../unicode_digits.js";
|
|
9
|
+
const pyInt = (digits) => Number(toAsciiDigits(digits));
|
|
10
|
+
// Python's `\b` (next to a digit here) is Unicode-aware; the lookarounds
|
|
11
|
+
// rebuild it with Unicode `\w` (letters, digits and underscore).
|
|
12
|
+
// ISO dates: 2023-05-10
|
|
13
|
+
// `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
|
|
14
|
+
const ISO_DATE_RE = /(?<![\p{L}\p{N}_])(\p{Nd}{4})-(\p{Nd}{2})-(\p{Nd}{2})(?![\p{L}\p{N}_])/gu;
|
|
15
|
+
// US dates: 05/10/2023 or 05-10-2023 (not matched by ISO because ISO has 4-digit year first)
|
|
16
|
+
const US_DATE_RE = /(?<![\p{L}\p{N}_])(\p{Nd}{1,2})[/-](\p{Nd}{1,2})[/-](\p{Nd}{4})(?![\p{L}\p{N}_])/gu;
|
|
17
|
+
const ORDINAL_SUFFIXES = { 1: "st", 2: "nd", 3: "rd" };
|
|
18
|
+
// Indexed by month - 1. Hardcoded rather than derived from strftime("%B"), which
|
|
19
|
+
// renders the month in the process's LC_TIME locale and would produce a
|
|
20
|
+
// mixed-language result alongside the English year and ordinal suffix.
|
|
21
|
+
const MONTH_NAMES = [
|
|
22
|
+
"January",
|
|
23
|
+
"February",
|
|
24
|
+
"March",
|
|
25
|
+
"April",
|
|
26
|
+
"May",
|
|
27
|
+
"June",
|
|
28
|
+
"July",
|
|
29
|
+
"August",
|
|
30
|
+
"September",
|
|
31
|
+
"October",
|
|
32
|
+
"November",
|
|
33
|
+
"December",
|
|
34
|
+
];
|
|
35
|
+
function ordinal(n) {
|
|
36
|
+
const key = [11, 12, 13].includes(n % 100) ? 0 : n % 10;
|
|
37
|
+
const suffix = ORDINAL_SUFFIXES[key] ?? "th";
|
|
38
|
+
return `${n}${suffix}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build a date like Python's `datetime(year, month, day)`.
|
|
42
|
+
*
|
|
43
|
+
* @throws RangeError for an out-of-range year, month or day (Python's `ValueError`).
|
|
44
|
+
*/
|
|
45
|
+
function makeDate(year, month, day) {
|
|
46
|
+
if (year < 1 || year > 9999)
|
|
47
|
+
throw new RangeError(`year ${year} is out of range`);
|
|
48
|
+
if (month < 1 || month > 12)
|
|
49
|
+
throw new RangeError("month must be in 1..12");
|
|
50
|
+
const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
51
|
+
const daysInMonth = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
|
|
52
|
+
if (day < 1 || day > daysInMonth)
|
|
53
|
+
throw new RangeError("day is out of range for month");
|
|
54
|
+
return { year, month, day };
|
|
55
|
+
}
|
|
56
|
+
function dateToSpoken(dt) {
|
|
57
|
+
const yearWords = num2words(dt.year, { lang: "en" });
|
|
58
|
+
const month = MONTH_NAMES[dt.month - 1];
|
|
59
|
+
const day = ordinal(dt.day);
|
|
60
|
+
return `${month} ${day}, ${yearWords}`;
|
|
61
|
+
}
|
|
62
|
+
function isoReplace(match, year, month, day) {
|
|
63
|
+
try {
|
|
64
|
+
return dateToSpoken(makeDate(pyInt(year), pyInt(month), pyInt(day)));
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
if (e instanceof RangeError)
|
|
68
|
+
return match;
|
|
69
|
+
throw e;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function usReplace(match, month, day, year) {
|
|
73
|
+
try {
|
|
74
|
+
return dateToSpoken(makeDate(pyInt(year), pyInt(month), pyInt(day)));
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
if (e instanceof RangeError)
|
|
78
|
+
return match;
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Expand date expressions to their spoken form.
|
|
84
|
+
*
|
|
85
|
+
* Handles ISO format (`YYYY-MM-DD`) and US format (`MM/DD/YYYY` or `MM-DD-YYYY`).
|
|
86
|
+
*
|
|
87
|
+
* @param text Input text possibly containing date expressions.
|
|
88
|
+
* @param _textType Text type of the text frame (unused).
|
|
89
|
+
* @returns Text with date expressions replaced by spoken equivalents.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* const result = await normalizeDates("Meeting on 2023-05-10", "*");
|
|
94
|
+
* // "Meeting on May 10th, two thousand and twenty three"
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export async function normalizeDates(text, _textType) {
|
|
98
|
+
text = text.replace(ISO_DATE_RE, isoReplace);
|
|
99
|
+
text = text.replace(US_DATE_RE, usReplace);
|
|
100
|
+
return text;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Transform email addresses into spoken form for TTS. */
|
|
2
|
+
import type { TextType } from "../../../frames/frames.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Transform email addresses into their spoken form.
|
|
5
|
+
*
|
|
6
|
+
* @param text Input text possibly containing email addresses.
|
|
7
|
+
* @param _textType Text type of the text frame (unused).
|
|
8
|
+
* @returns Text with email addresses replaced by spoken equivalents.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const result = await emailToSpeech("Contact user@example.com today", "*");
|
|
13
|
+
* // "Contact user at example dot com today"
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function emailToSpeech(text: string, _textType: string | TextType): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
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/utils/text/transforms/email.py
|
|
6
|
+
const EMAIL_RE = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
|
|
7
|
+
function emailToSpoken(email) {
|
|
8
|
+
const at = email.indexOf("@");
|
|
9
|
+
const local = email.slice(0, at);
|
|
10
|
+
const domain = email.slice(at + 1);
|
|
11
|
+
const localSpoken = local
|
|
12
|
+
.replaceAll(".", " dot ")
|
|
13
|
+
.replaceAll("_", " underscore ")
|
|
14
|
+
.replaceAll("-", " dash ")
|
|
15
|
+
.replaceAll("+", " plus ");
|
|
16
|
+
const domainSpoken = domain.replaceAll(".", " dot ").replaceAll("-", " dash ");
|
|
17
|
+
return `${localSpoken} at ${domainSpoken}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Transform email addresses into their spoken form.
|
|
21
|
+
*
|
|
22
|
+
* @param text Input text possibly containing email addresses.
|
|
23
|
+
* @param _textType Text type of the text frame (unused).
|
|
24
|
+
* @returns Text with email addresses replaced by spoken equivalents.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const result = await emailToSpeech("Contact user@example.com today", "*");
|
|
29
|
+
* // "Contact user at example dot com today"
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export async function emailToSpeech(text, _textType) {
|
|
33
|
+
return text.replace(EMAIL_RE, (match) => emailToSpoken(match));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in text transformers for TTS voice formatting.
|
|
3
|
+
*
|
|
4
|
+
* Transformers are async callables with signature:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* async function transform(text: string, textType: string): Promise<string>
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* They are registered with a TTS service via `textTransforms`:
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const tts = new CartesiaTTSService({
|
|
14
|
+
* textTransforms: [["*", stripMarkdown], ["*", expandCurrency]],
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Or use `VoiceFormatter` for a single configurable bundle:
|
|
19
|
+
*
|
|
20
|
+
* ```ts
|
|
21
|
+
* const tts = new CartesiaTTSService({
|
|
22
|
+
* textTransforms: [["*", new VoiceFormatter({ expandCurrency: true })]],
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export { normalizeAcronyms } from "./acronyms.ts";
|
|
27
|
+
export { expandCurrency } from "./currency.ts";
|
|
28
|
+
export { normalizeDates } from "./dates.ts";
|
|
29
|
+
export { emailToSpeech } from "./email.ts";
|
|
30
|
+
export { expandNumbers } from "./numbers.ts";
|
|
31
|
+
export { expandPercentages } from "./percentages.ts";
|
|
32
|
+
export { expandPhoneNumbers } from "./phone.ts";
|
|
33
|
+
export { replaceText } from "./replacements.ts";
|
|
34
|
+
export { stripMarkdown } from "./strip_markdown.ts";
|
|
35
|
+
export { expandUnits } from "./units.ts";
|
|
36
|
+
export { VoiceFormatter } from "./voice_formatter.ts";
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
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/utils/text/transforms/__init__.py
|
|
6
|
+
/**
|
|
7
|
+
* Built-in text transformers for TTS voice formatting.
|
|
8
|
+
*
|
|
9
|
+
* Transformers are async callables with signature:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* async function transform(text: string, textType: string): Promise<string>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* They are registered with a TTS service via `textTransforms`:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const tts = new CartesiaTTSService({
|
|
19
|
+
* textTransforms: [["*", stripMarkdown], ["*", expandCurrency]],
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Or use `VoiceFormatter` for a single configurable bundle:
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* const tts = new CartesiaTTSService({
|
|
27
|
+
* textTransforms: [["*", new VoiceFormatter({ expandCurrency: true })]],
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export { normalizeAcronyms } from "./acronyms.js";
|
|
32
|
+
export { expandCurrency } from "./currency.js";
|
|
33
|
+
export { normalizeDates } from "./dates.js";
|
|
34
|
+
export { emailToSpeech } from "./email.js";
|
|
35
|
+
export { expandNumbers } from "./numbers.js";
|
|
36
|
+
export { expandPercentages } from "./percentages.js";
|
|
37
|
+
export { expandPhoneNumbers } from "./phone.js";
|
|
38
|
+
export { replaceText } from "./replacements.js";
|
|
39
|
+
export { stripMarkdown } from "./strip_markdown.js";
|
|
40
|
+
export { expandUnits } from "./units.js";
|
|
41
|
+
export { VoiceFormatter } from "./voice_formatter.js";
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TextType } from "../../../frames/frames.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Return a transform that expands numbers to their spoken form.
|
|
4
|
+
*
|
|
5
|
+
* When `digitCutoff` is set, numbers above it are read digit-by-digit
|
|
6
|
+
* (e.g. `"2026"` → `"2 0 2 6"`). Numbers at or below the cutoff are
|
|
7
|
+
* expanded as quantities (e.g. `"42"` → `"forty two"`). Pass `null`
|
|
8
|
+
* to expand all numbers as words regardless of magnitude.
|
|
9
|
+
*
|
|
10
|
+
* Decimals are read as the whole part followed by their fractional digits, one at a
|
|
11
|
+
* time, so every written digit is spoken (`"1.0"` → `"one point zero"`).
|
|
12
|
+
*
|
|
13
|
+
* @param digitCutoff Numbers larger than this value are read digit-by-digit.
|
|
14
|
+
* `null` disables the cutoff so every number is expanded as a word.
|
|
15
|
+
* @returns An async transform callable compatible with `textTransforms`.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const transform = expandNumbers(2025);
|
|
20
|
+
* const result = await transform("Room 42 has 1234 seats and opens in 2026", "*");
|
|
21
|
+
* // "Room forty two has one thousand two hundred thirty four seats and opens in 2 0 2 6"
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function expandNumbers(digitCutoff?: number | bigint | null): (text: string, textType: string | TextType) => Promise<string>;
|
|
25
|
+
//# sourceMappingURL=numbers.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
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/utils/text/transforms/numbers.py
|
|
6
|
+
/** Expand numeric expressions into spoken form for TTS. */
|
|
7
|
+
import { num2words } from "num2words-ts";
|
|
8
|
+
import { toAsciiDigits } from "../unicode_digits.js";
|
|
9
|
+
// Matches integers and decimals, with optional thousand separators.
|
|
10
|
+
// Python's `\b` (next to a digit here) is Unicode-aware; the lookarounds
|
|
11
|
+
// rebuild it with Unicode `\w` (letters, digits and underscore).
|
|
12
|
+
// `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
|
|
13
|
+
const NUMBER_RE = /(?<![\p{L}\p{N}_])(\p{Nd}{1,3}(?:,\p{Nd}{3})*|\p{Nd}+)(?:\.(\p{Nd}+))?(?![\p{L}\p{N}_])/gu;
|
|
14
|
+
/**
|
|
15
|
+
* Return a transform that expands numbers to their spoken form.
|
|
16
|
+
*
|
|
17
|
+
* When `digitCutoff` is set, numbers above it are read digit-by-digit
|
|
18
|
+
* (e.g. `"2026"` → `"2 0 2 6"`). Numbers at or below the cutoff are
|
|
19
|
+
* expanded as quantities (e.g. `"42"` → `"forty two"`). Pass `null`
|
|
20
|
+
* to expand all numbers as words regardless of magnitude.
|
|
21
|
+
*
|
|
22
|
+
* Decimals are read as the whole part followed by their fractional digits, one at a
|
|
23
|
+
* time, so every written digit is spoken (`"1.0"` → `"one point zero"`).
|
|
24
|
+
*
|
|
25
|
+
* @param digitCutoff Numbers larger than this value are read digit-by-digit.
|
|
26
|
+
* `null` disables the cutoff so every number is expanded as a word.
|
|
27
|
+
* @returns An async transform callable compatible with `textTransforms`.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const transform = expandNumbers(2025);
|
|
32
|
+
* const result = await transform("Room 42 has 1234 seats and opens in 2026", "*");
|
|
33
|
+
* // "Room forty two has one thousand two hundred thirty four seats and opens in 2 0 2 6"
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function expandNumbers(digitCutoff = 2025) {
|
|
37
|
+
const numToWords = (wholeMatch, fracStr) => {
|
|
38
|
+
const wholeStr = wholeMatch.replaceAll(",", "");
|
|
39
|
+
const whole = BigInt(toAsciiDigits(wholeStr));
|
|
40
|
+
if (digitCutoff !== null && whole > digitCutoff) {
|
|
41
|
+
let result = [...wholeStr].join(" ");
|
|
42
|
+
if (fracStr) {
|
|
43
|
+
result += ` point ${[...fracStr].join(" ")}`;
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
if (fracStr) {
|
|
48
|
+
// Reading the fraction one digit at a time keeps trailing zeros audible,
|
|
49
|
+
// which also keeps a decimal agreeing with the plural unit expandUnits
|
|
50
|
+
// picks for it ("1.0 kilometers").
|
|
51
|
+
return `${num2words(whole, { lang: "en" })} point ${[...fracStr]
|
|
52
|
+
.map((digit) => num2words(Number(toAsciiDigits(digit)), { lang: "en" }))
|
|
53
|
+
.join(" ")}`;
|
|
54
|
+
}
|
|
55
|
+
return num2words(whole, { lang: "en" });
|
|
56
|
+
};
|
|
57
|
+
return async (text, _textType) => text.replace(NUMBER_RE, (_match, whole, frac) => numToWords(whole, frac));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=numbers.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TextType } from "../../../frames/frames.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Expand percentage expressions to their spoken form.
|
|
4
|
+
*
|
|
5
|
+
* @param text Input text possibly containing percentage expressions.
|
|
6
|
+
* @param _textType Text type of the text frame (unused).
|
|
7
|
+
* @returns Text with percentages replaced by spoken equivalents.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const result = await expandPercentages("50% off today", "*");
|
|
12
|
+
* // "fifty percent off today"
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function expandPercentages(text: string, _textType: string | TextType): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=percentages.d.ts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
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/utils/text/transforms/percentages.py
|
|
6
|
+
/** Expand percentage expressions into spoken form for TTS. */
|
|
7
|
+
import { asFloat, num2words } from "num2words-ts";
|
|
8
|
+
import { toAsciiDigits } from "../unicode_digits.js";
|
|
9
|
+
// `\p{Nd}` is Python's Unicode `\d`; toAsciiDigits() lets BigInt/Number parse what int()/float() accept.
|
|
10
|
+
const PERCENT_RE = /(\p{Nd}+(?:\.\p{Nd}+)?)\s*%/gu;
|
|
11
|
+
function percentToWords(value) {
|
|
12
|
+
// Upstream converts with `float(value)`, so "50" reads as the float 50.0.
|
|
13
|
+
const numberStr = num2words(asFloat(Number.parseFloat(toAsciiDigits(value))), { lang: "en" });
|
|
14
|
+
return `${numberStr} percent`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Expand percentage expressions to their spoken form.
|
|
18
|
+
*
|
|
19
|
+
* @param text Input text possibly containing percentage expressions.
|
|
20
|
+
* @param _textType Text type of the text frame (unused).
|
|
21
|
+
* @returns Text with percentages replaced by spoken equivalents.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const result = await expandPercentages("50% off today", "*");
|
|
26
|
+
* // "fifty percent off today"
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export async function expandPercentages(text, _textType) {
|
|
30
|
+
return text.replace(PERCENT_RE, (_match, value) => percentToWords(value));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=percentages.js.map
|