@livekit/agents 0.7.8 → 1.0.0-next.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/dist/_exceptions.cjs +109 -0
- package/dist/_exceptions.cjs.map +1 -0
- package/dist/_exceptions.d.cts +64 -0
- package/dist/_exceptions.d.ts +64 -0
- package/dist/_exceptions.d.ts.map +1 -0
- package/dist/_exceptions.js +80 -0
- package/dist/_exceptions.js.map +1 -0
- package/dist/audio.cjs +10 -3
- package/dist/audio.cjs.map +1 -1
- package/dist/audio.d.cts +2 -0
- package/dist/audio.d.ts +2 -0
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +8 -2
- package/dist/audio.js.map +1 -1
- package/dist/cli.cjs +25 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -1
- package/dist/constants.cjs +6 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +2 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/http_server.cjs.map +1 -1
- package/dist/http_server.d.cts +1 -0
- package/dist/http_server.d.ts +1 -0
- package/dist/http_server.d.ts.map +1 -1
- package/dist/http_server.js.map +1 -1
- package/dist/index.cjs +27 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -10
- package/dist/index.d.ts +13 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -11
- package/dist/index.js.map +1 -1
- package/dist/inference_runner.cjs +0 -1
- package/dist/inference_runner.cjs.map +1 -1
- package/dist/inference_runner.d.cts +2 -3
- package/dist/inference_runner.d.ts +2 -3
- package/dist/inference_runner.d.ts.map +1 -1
- package/dist/inference_runner.js +0 -1
- package/dist/inference_runner.js.map +1 -1
- package/dist/ipc/inference_proc_executor.cjs +2 -2
- package/dist/ipc/inference_proc_executor.cjs.map +1 -1
- package/dist/ipc/inference_proc_executor.js +2 -2
- package/dist/ipc/inference_proc_executor.js.map +1 -1
- package/dist/ipc/job_executor.cjs.map +1 -1
- package/dist/ipc/job_executor.js.map +1 -1
- package/dist/ipc/job_proc_executor.cjs +1 -0
- package/dist/ipc/job_proc_executor.cjs.map +1 -1
- package/dist/ipc/job_proc_executor.js +1 -0
- package/dist/ipc/job_proc_executor.js.map +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs +1 -1
- package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
- package/dist/ipc/job_proc_lazy_main.js +1 -1
- package/dist/ipc/job_proc_lazy_main.js.map +1 -1
- package/dist/ipc/supervised_proc.d.cts +1 -1
- package/dist/ipc/supervised_proc.d.ts +1 -1
- package/dist/ipc/supervised_proc.d.ts.map +1 -1
- package/dist/job.cjs +14 -2
- package/dist/job.cjs.map +1 -1
- package/dist/job.d.cts +8 -0
- package/dist/job.d.ts +8 -0
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +12 -1
- package/dist/job.js.map +1 -1
- package/dist/llm/chat_context.cjs +332 -82
- package/dist/llm/chat_context.cjs.map +1 -1
- package/dist/llm/chat_context.d.cts +152 -48
- package/dist/llm/chat_context.d.ts +152 -48
- package/dist/llm/chat_context.d.ts.map +1 -1
- package/dist/llm/chat_context.js +327 -81
- package/dist/llm/chat_context.js.map +1 -1
- package/dist/llm/chat_context.test.cjs +380 -0
- package/dist/llm/chat_context.test.cjs.map +1 -0
- package/dist/llm/chat_context.test.js +385 -0
- package/dist/llm/chat_context.test.js.map +1 -0
- package/dist/llm/index.cjs +37 -8
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +7 -3
- package/dist/llm/index.d.ts +7 -3
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +39 -9
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.cjs +98 -33
- package/dist/llm/llm.cjs.map +1 -1
- package/dist/llm/llm.d.cts +50 -24
- package/dist/llm/llm.d.ts +50 -24
- package/dist/llm/llm.d.ts.map +1 -1
- package/dist/llm/llm.js +99 -33
- package/dist/llm/llm.js.map +1 -1
- package/dist/llm/provider_format/google.cjs +128 -0
- package/dist/llm/provider_format/google.cjs.map +1 -0
- package/dist/llm/provider_format/google.d.cts +6 -0
- package/dist/llm/provider_format/google.d.ts +6 -0
- package/dist/llm/provider_format/google.d.ts.map +1 -0
- package/dist/llm/provider_format/google.js +104 -0
- package/dist/llm/provider_format/google.js.map +1 -0
- package/dist/llm/provider_format/google.test.cjs +676 -0
- package/dist/llm/provider_format/google.test.cjs.map +1 -0
- package/dist/llm/provider_format/google.test.js +675 -0
- package/dist/llm/provider_format/google.test.js.map +1 -0
- package/dist/llm/provider_format/index.cjs +40 -0
- package/dist/llm/provider_format/index.cjs.map +1 -0
- package/dist/llm/provider_format/index.d.cts +4 -0
- package/dist/llm/provider_format/index.d.ts +4 -0
- package/dist/llm/provider_format/index.d.ts.map +1 -0
- package/dist/llm/provider_format/index.js +16 -0
- package/dist/llm/provider_format/index.js.map +1 -0
- package/dist/llm/provider_format/openai.cjs +116 -0
- package/dist/llm/provider_format/openai.cjs.map +1 -0
- package/dist/llm/provider_format/openai.d.cts +3 -0
- package/dist/llm/provider_format/openai.d.ts +3 -0
- package/dist/llm/provider_format/openai.d.ts.map +1 -0
- package/dist/llm/provider_format/openai.js +92 -0
- package/dist/llm/provider_format/openai.js.map +1 -0
- package/dist/llm/provider_format/openai.test.cjs +490 -0
- package/dist/llm/provider_format/openai.test.cjs.map +1 -0
- package/dist/llm/provider_format/openai.test.js +489 -0
- package/dist/llm/provider_format/openai.test.js.map +1 -0
- package/dist/llm/provider_format/utils.cjs +146 -0
- package/dist/llm/provider_format/utils.cjs.map +1 -0
- package/dist/llm/provider_format/utils.d.cts +38 -0
- package/dist/llm/provider_format/utils.d.ts +38 -0
- package/dist/llm/provider_format/utils.d.ts.map +1 -0
- package/dist/llm/provider_format/utils.js +122 -0
- package/dist/llm/provider_format/utils.js.map +1 -0
- package/dist/llm/realtime.cjs +77 -0
- package/dist/llm/realtime.cjs.map +1 -0
- package/dist/llm/realtime.d.cts +98 -0
- package/dist/llm/realtime.d.ts +98 -0
- package/dist/llm/realtime.d.ts.map +1 -0
- package/dist/llm/realtime.js +52 -0
- package/dist/llm/realtime.js.map +1 -0
- package/dist/llm/remote_chat_context.cjs +112 -0
- package/dist/llm/remote_chat_context.cjs.map +1 -0
- package/dist/llm/remote_chat_context.d.cts +23 -0
- package/dist/llm/remote_chat_context.d.ts +23 -0
- package/dist/llm/remote_chat_context.d.ts.map +1 -0
- package/dist/llm/remote_chat_context.js +88 -0
- package/dist/llm/remote_chat_context.js.map +1 -0
- package/dist/llm/remote_chat_context.test.cjs +225 -0
- package/dist/llm/remote_chat_context.test.cjs.map +1 -0
- package/dist/llm/remote_chat_context.test.js +224 -0
- package/dist/llm/remote_chat_context.test.js.map +1 -0
- package/dist/llm/tool_context.cjs +111 -0
- package/dist/llm/tool_context.cjs.map +1 -0
- package/dist/llm/tool_context.d.cts +125 -0
- package/dist/llm/tool_context.d.ts +125 -0
- package/dist/llm/tool_context.d.ts.map +1 -0
- package/dist/llm/tool_context.js +80 -0
- package/dist/llm/tool_context.js.map +1 -0
- package/dist/llm/tool_context.test.cjs +162 -0
- package/dist/llm/tool_context.test.cjs.map +1 -0
- package/dist/llm/tool_context.test.js +161 -0
- package/dist/llm/tool_context.test.js.map +1 -0
- package/dist/llm/tool_context.type.test.cjs +92 -0
- package/dist/llm/tool_context.type.test.cjs.map +1 -0
- package/dist/llm/tool_context.type.test.js +91 -0
- package/dist/llm/tool_context.type.test.js.map +1 -0
- package/dist/llm/utils.cjs +260 -0
- package/dist/llm/utils.cjs.map +1 -0
- package/dist/llm/utils.d.cts +42 -0
- package/dist/llm/utils.d.ts +42 -0
- package/dist/llm/utils.d.ts.map +1 -0
- package/dist/llm/utils.js +223 -0
- package/dist/llm/utils.js.map +1 -0
- package/dist/llm/utils.test.cjs +513 -0
- package/dist/llm/utils.test.cjs.map +1 -0
- package/dist/llm/utils.test.js +490 -0
- package/dist/llm/utils.test.js.map +1 -0
- package/dist/metrics/base.cjs +0 -27
- package/dist/metrics/base.cjs.map +1 -1
- package/dist/metrics/base.d.cts +105 -63
- package/dist/metrics/base.d.ts +105 -63
- package/dist/metrics/base.d.ts.map +1 -1
- package/dist/metrics/base.js +0 -19
- package/dist/metrics/base.js.map +1 -1
- package/dist/metrics/index.cjs +0 -3
- package/dist/metrics/index.cjs.map +1 -1
- package/dist/metrics/index.d.cts +2 -3
- package/dist/metrics/index.d.ts +2 -3
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +0 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/usage_collector.cjs +17 -12
- package/dist/metrics/usage_collector.cjs.map +1 -1
- package/dist/metrics/usage_collector.d.cts +3 -2
- package/dist/metrics/usage_collector.d.ts +3 -2
- package/dist/metrics/usage_collector.d.ts.map +1 -1
- package/dist/metrics/usage_collector.js +17 -12
- package/dist/metrics/usage_collector.js.map +1 -1
- package/dist/metrics/utils.cjs +22 -59
- package/dist/metrics/utils.cjs.map +1 -1
- package/dist/metrics/utils.d.cts +1 -8
- package/dist/metrics/utils.d.ts +1 -8
- package/dist/metrics/utils.d.ts.map +1 -1
- package/dist/metrics/utils.js +22 -52
- package/dist/metrics/utils.js.map +1 -1
- package/dist/multimodal/index.cjs +0 -2
- package/dist/multimodal/index.cjs.map +1 -1
- package/dist/multimodal/index.d.cts +0 -1
- package/dist/multimodal/index.d.ts +0 -1
- package/dist/multimodal/index.d.ts.map +1 -1
- package/dist/multimodal/index.js +0 -1
- package/dist/multimodal/index.js.map +1 -1
- package/dist/plugin.cjs +24 -8
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +18 -4
- package/dist/plugin.d.ts +18 -4
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +22 -7
- package/dist/plugin.js.map +1 -1
- package/dist/stream/deferred_stream.cjs +98 -0
- package/dist/stream/deferred_stream.cjs.map +1 -0
- package/dist/stream/deferred_stream.d.cts +27 -0
- package/dist/stream/deferred_stream.d.ts +27 -0
- package/dist/stream/deferred_stream.d.ts.map +1 -0
- package/dist/stream/deferred_stream.js +73 -0
- package/dist/stream/deferred_stream.js.map +1 -0
- package/dist/stream/deferred_stream.test.cjs +527 -0
- package/dist/stream/deferred_stream.test.cjs.map +1 -0
- package/dist/stream/deferred_stream.test.js +526 -0
- package/dist/stream/deferred_stream.test.js.map +1 -0
- package/dist/stream/identity_transform.cjs +42 -0
- package/dist/stream/identity_transform.cjs.map +1 -0
- package/dist/stream/identity_transform.d.cts +6 -0
- package/dist/stream/identity_transform.d.ts +6 -0
- package/dist/stream/identity_transform.d.ts.map +1 -0
- package/dist/stream/identity_transform.js +18 -0
- package/dist/stream/identity_transform.js.map +1 -0
- package/dist/stream/identity_transform.test.cjs +125 -0
- package/dist/stream/identity_transform.test.cjs.map +1 -0
- package/dist/stream/identity_transform.test.js +124 -0
- package/dist/stream/identity_transform.test.js.map +1 -0
- package/dist/stream/index.cjs +38 -0
- package/dist/stream/index.cjs.map +1 -0
- package/dist/stream/index.d.cts +5 -0
- package/dist/stream/index.d.ts +5 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +11 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/merge_readable_streams.cjs +59 -0
- package/dist/stream/merge_readable_streams.cjs.map +1 -0
- package/dist/stream/merge_readable_streams.d.cts +4 -0
- package/dist/stream/merge_readable_streams.d.ts +4 -0
- package/dist/stream/merge_readable_streams.d.ts.map +1 -0
- package/dist/stream/merge_readable_streams.js +35 -0
- package/dist/stream/merge_readable_streams.js.map +1 -0
- package/dist/stream/stream_channel.cjs +47 -0
- package/dist/stream/stream_channel.cjs.map +1 -0
- package/dist/stream/stream_channel.d.cts +9 -0
- package/dist/stream/stream_channel.d.ts +9 -0
- package/dist/stream/stream_channel.d.ts.map +1 -0
- package/dist/stream/stream_channel.js +23 -0
- package/dist/stream/stream_channel.js.map +1 -0
- package/dist/stream/stream_channel.test.cjs +97 -0
- package/dist/stream/stream_channel.test.cjs.map +1 -0
- package/dist/stream/stream_channel.test.js +96 -0
- package/dist/stream/stream_channel.test.js.map +1 -0
- package/dist/stt/stream_adapter.cjs +3 -4
- package/dist/stt/stream_adapter.cjs.map +1 -1
- package/dist/stt/stream_adapter.d.cts +1 -0
- package/dist/stt/stream_adapter.d.ts +1 -0
- package/dist/stt/stream_adapter.d.ts.map +1 -1
- package/dist/stt/stream_adapter.js +3 -4
- package/dist/stt/stream_adapter.js.map +1 -1
- package/dist/stt/stt.cjs +101 -10
- package/dist/stt/stt.cjs.map +1 -1
- package/dist/stt/stt.d.cts +26 -5
- package/dist/stt/stt.d.ts +26 -5
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +102 -11
- package/dist/stt/stt.js.map +1 -1
- package/dist/tokenize/basic/basic.cjs +10 -5
- package/dist/tokenize/basic/basic.cjs.map +1 -1
- package/dist/tokenize/basic/basic.d.cts +7 -1
- package/dist/tokenize/basic/basic.d.ts +7 -1
- package/dist/tokenize/basic/basic.d.ts.map +1 -1
- package/dist/tokenize/basic/basic.js +10 -5
- package/dist/tokenize/basic/basic.js.map +1 -1
- package/dist/tokenize/basic/sentence.cjs +14 -6
- package/dist/tokenize/basic/sentence.cjs.map +1 -1
- package/dist/tokenize/basic/sentence.d.cts +1 -1
- package/dist/tokenize/basic/sentence.d.ts +1 -1
- package/dist/tokenize/basic/sentence.d.ts.map +1 -1
- package/dist/tokenize/basic/sentence.js +14 -6
- package/dist/tokenize/basic/sentence.js.map +1 -1
- package/dist/tokenize/token_stream.cjs +5 -3
- package/dist/tokenize/token_stream.cjs.map +1 -1
- package/dist/tokenize/token_stream.d.cts +1 -0
- package/dist/tokenize/token_stream.d.ts +1 -0
- package/dist/tokenize/token_stream.d.ts.map +1 -1
- package/dist/tokenize/token_stream.js +6 -4
- package/dist/tokenize/token_stream.js.map +1 -1
- package/dist/transcription.cjs +1 -2
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +2 -3
- package/dist/transcription.js.map +1 -1
- package/dist/tts/index.cjs +2 -4
- package/dist/tts/index.cjs.map +1 -1
- package/dist/tts/index.d.cts +1 -1
- package/dist/tts/index.d.ts +1 -1
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +1 -3
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/stream_adapter.cjs +26 -13
- package/dist/tts/stream_adapter.cjs.map +1 -1
- package/dist/tts/stream_adapter.d.cts +1 -1
- package/dist/tts/stream_adapter.d.ts +1 -1
- package/dist/tts/stream_adapter.d.ts.map +1 -1
- package/dist/tts/stream_adapter.js +27 -14
- package/dist/tts/stream_adapter.js.map +1 -1
- package/dist/tts/tts.cjs +157 -25
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.d.cts +29 -5
- package/dist/tts/tts.d.ts +29 -5
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +157 -24
- package/dist/tts/tts.js.map +1 -1
- package/dist/types.cjs +60 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +13 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +35 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.cjs +281 -27
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +134 -9
- package/dist/utils.d.ts +134 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +265 -26
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.cjs +492 -0
- package/dist/utils.test.cjs.map +1 -0
- package/dist/utils.test.js +498 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/vad.cjs +76 -20
- package/dist/vad.cjs.map +1 -1
- package/dist/vad.d.cts +25 -5
- package/dist/vad.d.ts +25 -5
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +76 -20
- package/dist/vad.js.map +1 -1
- package/dist/voice/agent.cjs +245 -0
- package/dist/voice/agent.cjs.map +1 -0
- package/dist/voice/agent.d.cts +78 -0
- package/dist/voice/agent.d.ts +78 -0
- package/dist/voice/agent.d.ts.map +1 -0
- package/dist/voice/agent.js +220 -0
- package/dist/voice/agent.js.map +1 -0
- package/dist/voice/agent.test.cjs +61 -0
- package/dist/voice/agent.test.cjs.map +1 -0
- package/dist/voice/agent.test.js +60 -0
- package/dist/voice/agent.test.js.map +1 -0
- package/dist/voice/agent_activity.cjs +1453 -0
- package/dist/voice/agent_activity.cjs.map +1 -0
- package/dist/voice/agent_activity.d.cts +94 -0
- package/dist/voice/agent_activity.d.ts +94 -0
- package/dist/voice/agent_activity.d.ts.map +1 -0
- package/dist/voice/agent_activity.js +1449 -0
- package/dist/voice/agent_activity.js.map +1 -0
- package/dist/voice/agent_session.cjs +312 -0
- package/dist/voice/agent_session.cjs.map +1 -0
- package/dist/voice/agent_session.d.cts +121 -0
- package/dist/voice/agent_session.d.ts +121 -0
- package/dist/voice/agent_session.d.ts.map +1 -0
- package/dist/voice/agent_session.js +295 -0
- package/dist/voice/agent_session.js.map +1 -0
- package/dist/voice/audio_recognition.cjs +375 -0
- package/dist/voice/audio_recognition.cjs.map +1 -0
- package/dist/voice/audio_recognition.d.cts +80 -0
- package/dist/voice/audio_recognition.d.ts +80 -0
- package/dist/voice/audio_recognition.d.ts.map +1 -0
- package/dist/voice/audio_recognition.js +351 -0
- package/dist/voice/audio_recognition.js.map +1 -0
- package/dist/voice/events.cjs +145 -0
- package/dist/voice/events.cjs.map +1 -0
- package/dist/voice/events.d.cts +124 -0
- package/dist/voice/events.d.ts +124 -0
- package/dist/voice/events.d.ts.map +1 -0
- package/dist/voice/events.js +110 -0
- package/dist/voice/events.js.map +1 -0
- package/dist/voice/generation.cjs +700 -0
- package/dist/voice/generation.cjs.map +1 -0
- package/dist/voice/generation.d.cts +115 -0
- package/dist/voice/generation.d.ts +115 -0
- package/dist/voice/generation.d.ts.map +1 -0
- package/dist/voice/generation.js +672 -0
- package/dist/voice/generation.js.map +1 -0
- package/dist/voice/index.cjs +40 -0
- package/dist/voice/index.cjs.map +1 -0
- package/dist/voice/index.d.cts +5 -0
- package/dist/voice/index.d.ts +5 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +11 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/io.cjs +245 -0
- package/dist/voice/io.cjs.map +1 -0
- package/dist/voice/io.d.cts +101 -0
- package/dist/voice/io.d.ts +101 -0
- package/dist/voice/io.d.ts.map +1 -0
- package/dist/voice/io.js +217 -0
- package/dist/voice/io.js.map +1 -0
- package/dist/voice/room_io/_input.cjs +121 -0
- package/dist/voice/room_io/_input.cjs.map +1 -0
- package/dist/voice/room_io/_input.d.cts +24 -0
- package/dist/voice/room_io/_input.d.ts +24 -0
- package/dist/voice/room_io/_input.d.ts.map +1 -0
- package/dist/voice/room_io/_input.js +102 -0
- package/dist/voice/room_io/_input.js.map +1 -0
- package/dist/voice/room_io/_output.cjs +358 -0
- package/dist/voice/room_io/_output.cjs.map +1 -0
- package/dist/voice/room_io/_output.d.cts +75 -0
- package/dist/voice/room_io/_output.d.ts +75 -0
- package/dist/voice/room_io/_output.d.ts.map +1 -0
- package/dist/voice/room_io/_output.js +342 -0
- package/dist/voice/room_io/_output.js.map +1 -0
- package/dist/voice/room_io/index.cjs +25 -0
- package/dist/voice/room_io/index.cjs.map +1 -0
- package/dist/voice/room_io/index.d.cts +3 -0
- package/dist/voice/room_io/index.d.ts +3 -0
- package/dist/voice/room_io/index.d.ts.map +1 -0
- package/dist/voice/room_io/index.js +3 -0
- package/dist/voice/room_io/index.js.map +1 -0
- package/dist/voice/room_io/room_io.cjs +370 -0
- package/dist/voice/room_io/room_io.cjs.map +1 -0
- package/dist/voice/room_io/room_io.d.cts +73 -0
- package/dist/voice/room_io/room_io.d.ts +73 -0
- package/dist/voice/room_io/room_io.d.ts.map +1 -0
- package/dist/voice/room_io/room_io.js +361 -0
- package/dist/voice/room_io/room_io.js.map +1 -0
- package/dist/{pipeline/index.cjs → voice/run_context.cjs} +16 -11
- package/dist/voice/run_context.cjs.map +1 -0
- package/dist/voice/run_context.d.cts +12 -0
- package/dist/voice/run_context.d.ts +12 -0
- package/dist/voice/run_context.d.ts.map +1 -0
- package/dist/voice/run_context.js +14 -0
- package/dist/voice/run_context.js.map +1 -0
- package/dist/voice/speech_handle.cjs +105 -0
- package/dist/voice/speech_handle.cjs.map +1 -0
- package/dist/voice/speech_handle.d.cts +46 -0
- package/dist/voice/speech_handle.d.ts +46 -0
- package/dist/voice/speech_handle.d.ts.map +1 -0
- package/dist/voice/speech_handle.js +81 -0
- package/dist/voice/speech_handle.js.map +1 -0
- package/dist/voice/transcription/_utils.cjs +45 -0
- package/dist/voice/transcription/_utils.cjs.map +1 -0
- package/dist/voice/transcription/_utils.d.cts +3 -0
- package/dist/voice/transcription/_utils.d.ts +3 -0
- package/dist/voice/transcription/_utils.d.ts.map +1 -0
- package/dist/voice/transcription/_utils.js +21 -0
- package/dist/voice/transcription/_utils.js.map +1 -0
- package/dist/voice/transcription/index.cjs +23 -0
- package/dist/voice/transcription/index.cjs.map +1 -0
- package/dist/voice/transcription/index.d.cts +2 -0
- package/dist/voice/transcription/index.d.ts +2 -0
- package/dist/voice/transcription/index.d.ts.map +1 -0
- package/dist/voice/transcription/index.js +2 -0
- package/dist/voice/transcription/index.js.map +1 -0
- package/dist/voice/transcription/synchronizer.cjs +380 -0
- package/dist/voice/transcription/synchronizer.cjs.map +1 -0
- package/dist/voice/transcription/synchronizer.d.cts +86 -0
- package/dist/voice/transcription/synchronizer.d.ts +86 -0
- package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
- package/dist/voice/transcription/synchronizer.js +355 -0
- package/dist/voice/transcription/synchronizer.js.map +1 -0
- package/dist/worker.cjs +22 -4
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +22 -4
- package/dist/worker.js.map +1 -1
- package/package.json +9 -2
- package/src/_exceptions.ts +137 -0
- package/src/audio.ts +12 -1
- package/src/cli.ts +37 -0
- package/src/constants.ts +2 -0
- package/src/http_server.ts +1 -0
- package/src/index.ts +13 -10
- package/src/inference_runner.ts +2 -3
- package/src/ipc/inference_proc_executor.ts +2 -2
- package/src/ipc/job_executor.ts +1 -1
- package/src/ipc/job_proc_executor.ts +1 -1
- package/src/ipc/job_proc_lazy_main.ts +1 -1
- package/src/job.ts +18 -0
- package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
- package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
- package/src/llm/__snapshots__/utils.test.ts.snap +65 -0
- package/src/llm/chat_context.test.ts +450 -0
- package/src/llm/chat_context.ts +501 -103
- package/src/llm/index.ts +53 -18
- package/src/llm/llm.ts +149 -50
- package/src/llm/provider_format/google.test.ts +772 -0
- package/src/llm/provider_format/google.ts +130 -0
- package/src/llm/provider_format/index.ts +23 -0
- package/src/llm/provider_format/openai.test.ts +581 -0
- package/src/llm/provider_format/openai.ts +118 -0
- package/src/llm/provider_format/utils.ts +183 -0
- package/src/llm/realtime.ts +151 -0
- package/src/llm/remote_chat_context.test.ts +290 -0
- package/src/llm/remote_chat_context.ts +114 -0
- package/src/llm/tool_context.test.ts +198 -0
- package/src/llm/tool_context.ts +259 -0
- package/src/llm/tool_context.type.test.ts +115 -0
- package/src/llm/utils.test.ts +670 -0
- package/src/llm/utils.ts +324 -0
- package/src/metrics/base.ts +110 -78
- package/src/metrics/index.ts +3 -9
- package/src/metrics/usage_collector.ts +19 -13
- package/src/metrics/utils.ts +24 -69
- package/src/multimodal/index.ts +0 -1
- package/src/plugin.ts +26 -8
- package/src/stream/deferred_stream.test.ts +755 -0
- package/src/stream/deferred_stream.ts +110 -0
- package/src/stream/identity_transform.test.ts +179 -0
- package/src/stream/identity_transform.ts +18 -0
- package/src/stream/index.ts +7 -0
- package/src/stream/merge_readable_streams.ts +40 -0
- package/src/stream/stream_channel.test.ts +129 -0
- package/src/stream/stream_channel.ts +32 -0
- package/src/stt/stream_adapter.ts +3 -5
- package/src/stt/stt.ts +135 -17
- package/src/tokenize/basic/basic.ts +13 -5
- package/src/tokenize/basic/sentence.ts +20 -6
- package/src/tokenize/token_stream.ts +7 -4
- package/src/transcription.ts +2 -3
- package/src/tts/index.ts +0 -1
- package/src/tts/stream_adapter.ts +42 -16
- package/src/tts/tts.ts +203 -21
- package/src/types.ts +42 -0
- package/src/utils.test.ts +658 -0
- package/src/utils.ts +375 -44
- package/src/vad.ts +90 -22
- package/src/voice/agent.test.ts +80 -0
- package/src/voice/agent.ts +332 -0
- package/src/voice/agent_activity.ts +1913 -0
- package/src/voice/agent_session.ts +460 -0
- package/src/voice/audio_recognition.ts +474 -0
- package/src/voice/events.ts +252 -0
- package/src/voice/generation.ts +881 -0
- package/src/voice/index.ts +7 -0
- package/src/voice/io.ts +304 -0
- package/src/voice/room_io/_input.ts +144 -0
- package/src/voice/room_io/_output.ts +436 -0
- package/src/voice/room_io/index.ts +5 -0
- package/src/voice/room_io/room_io.ts +495 -0
- package/src/voice/run_context.ts +20 -0
- package/src/voice/speech_handle.ts +104 -0
- package/src/voice/transcription/_utils.ts +25 -0
- package/src/voice/transcription/index.ts +4 -0
- package/src/voice/transcription/synchronizer.ts +478 -0
- package/src/worker.ts +22 -2
- package/dist/llm/function_context.cjs +0 -103
- package/dist/llm/function_context.cjs.map +0 -1
- package/dist/llm/function_context.d.cts +0 -47
- package/dist/llm/function_context.d.ts +0 -47
- package/dist/llm/function_context.d.ts.map +0 -1
- package/dist/llm/function_context.js +0 -78
- package/dist/llm/function_context.js.map +0 -1
- package/dist/llm/function_context.test.cjs +0 -218
- package/dist/llm/function_context.test.cjs.map +0 -1
- package/dist/llm/function_context.test.js +0 -217
- package/dist/llm/function_context.test.js.map +0 -1
- package/dist/multimodal/multimodal_agent.cjs +0 -451
- package/dist/multimodal/multimodal_agent.cjs.map +0 -1
- package/dist/multimodal/multimodal_agent.d.cts +0 -48
- package/dist/multimodal/multimodal_agent.d.ts +0 -48
- package/dist/multimodal/multimodal_agent.d.ts.map +0 -1
- package/dist/multimodal/multimodal_agent.js +0 -425
- package/dist/multimodal/multimodal_agent.js.map +0 -1
- package/dist/pipeline/agent_output.cjs +0 -197
- package/dist/pipeline/agent_output.cjs.map +0 -1
- package/dist/pipeline/agent_output.d.cts +0 -33
- package/dist/pipeline/agent_output.d.ts +0 -33
- package/dist/pipeline/agent_output.d.ts.map +0 -1
- package/dist/pipeline/agent_output.js +0 -172
- package/dist/pipeline/agent_output.js.map +0 -1
- package/dist/pipeline/agent_playout.cjs +0 -175
- package/dist/pipeline/agent_playout.cjs.map +0 -1
- package/dist/pipeline/agent_playout.d.cts +0 -40
- package/dist/pipeline/agent_playout.d.ts +0 -40
- package/dist/pipeline/agent_playout.d.ts.map +0 -1
- package/dist/pipeline/agent_playout.js +0 -139
- package/dist/pipeline/agent_playout.js.map +0 -1
- package/dist/pipeline/human_input.cjs +0 -171
- package/dist/pipeline/human_input.cjs.map +0 -1
- package/dist/pipeline/human_input.d.cts +0 -30
- package/dist/pipeline/human_input.d.ts +0 -30
- package/dist/pipeline/human_input.d.ts.map +0 -1
- package/dist/pipeline/human_input.js +0 -146
- package/dist/pipeline/human_input.js.map +0 -1
- package/dist/pipeline/index.cjs.map +0 -1
- package/dist/pipeline/index.d.cts +0 -2
- package/dist/pipeline/index.d.ts +0 -2
- package/dist/pipeline/index.d.ts.map +0 -1
- package/dist/pipeline/index.js +0 -11
- package/dist/pipeline/index.js.map +0 -1
- package/dist/pipeline/pipeline_agent.cjs +0 -849
- package/dist/pipeline/pipeline_agent.cjs.map +0 -1
- package/dist/pipeline/pipeline_agent.d.cts +0 -150
- package/dist/pipeline/pipeline_agent.d.ts +0 -150
- package/dist/pipeline/pipeline_agent.d.ts.map +0 -1
- package/dist/pipeline/pipeline_agent.js +0 -826
- package/dist/pipeline/pipeline_agent.js.map +0 -1
- package/dist/pipeline/speech_handle.cjs +0 -176
- package/dist/pipeline/speech_handle.cjs.map +0 -1
- package/dist/pipeline/speech_handle.d.cts +0 -37
- package/dist/pipeline/speech_handle.d.ts +0 -37
- package/dist/pipeline/speech_handle.d.ts.map +0 -1
- package/dist/pipeline/speech_handle.js +0 -152
- package/dist/pipeline/speech_handle.js.map +0 -1
- package/src/llm/function_context.test.ts +0 -248
- package/src/llm/function_context.ts +0 -142
- package/src/multimodal/multimodal_agent.ts +0 -555
- package/src/pipeline/agent_output.ts +0 -219
- package/src/pipeline/agent_playout.ts +0 -192
- package/src/pipeline/human_input.ts +0 -188
- package/src/pipeline/index.ts +0 -15
- package/src/pipeline/pipeline_agent.ts +0 -1185
- package/src/pipeline/speech_handle.ts +0 -201
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ChatMessage } from '../llm/index.js';
|
|
2
|
+
export declare class SpeechHandle {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly allowInterruptions: boolean;
|
|
5
|
+
readonly stepIndex: number;
|
|
6
|
+
readonly parent?: SpeechHandle | undefined;
|
|
7
|
+
/** Priority for messages that should be played after all other messages in the queue */
|
|
8
|
+
static SPEECH_PRIORITY_LOW: number;
|
|
9
|
+
/** Every speech generates by the VoiceAgent defaults to this priority. */
|
|
10
|
+
static SPEECH_PRIORITY_NORMAL: number;
|
|
11
|
+
/** Priority for important messages that should be played before others. */
|
|
12
|
+
static SPEECH_PRIORITY_HIGH: number;
|
|
13
|
+
private interruptFut;
|
|
14
|
+
private authorizeFut;
|
|
15
|
+
private playoutDoneFut;
|
|
16
|
+
private _chatMessage?;
|
|
17
|
+
constructor(id: string, allowInterruptions: boolean, stepIndex: number, parent?: SpeechHandle | undefined);
|
|
18
|
+
static create(options: {
|
|
19
|
+
allowInterruptions?: boolean;
|
|
20
|
+
stepIndex?: number;
|
|
21
|
+
parent?: SpeechHandle;
|
|
22
|
+
}): SpeechHandle;
|
|
23
|
+
get interrupted(): boolean;
|
|
24
|
+
get done(): boolean;
|
|
25
|
+
get chatMessage(): ChatMessage | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Interrupt the current speech generation.
|
|
28
|
+
*
|
|
29
|
+
* @throws Error If this speech handle does not allow interruptions.
|
|
30
|
+
*
|
|
31
|
+
* @returns The same speech handle that was interrupted.
|
|
32
|
+
*/
|
|
33
|
+
interrupt(): SpeechHandle;
|
|
34
|
+
then(callback: (sh: SpeechHandle) => void): Promise<void>;
|
|
35
|
+
waitForPlayout(): Promise<void>;
|
|
36
|
+
waitIfNotInterrupted(aw: Promise<unknown>[]): Promise<void>;
|
|
37
|
+
/** @internal */
|
|
38
|
+
_setChatMessage(chatMessage: ChatMessage): void;
|
|
39
|
+
/** @internal */
|
|
40
|
+
_authorizePlayout(): void;
|
|
41
|
+
/** @internal */
|
|
42
|
+
_waitForAuthorization(): Promise<void>;
|
|
43
|
+
/** @internal */
|
|
44
|
+
_markPlayoutDone(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=speech_handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech_handle.d.ts","sourceRoot":"","sources":["../../src/voice/speech_handle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,qBAAa,YAAY;IAerB,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,kBAAkB,EAAE,OAAO;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,MAAM,CAAC;IAjBlB,wFAAwF;IACxF,MAAM,CAAC,mBAAmB,SAAK;IAC/B,0EAA0E;IAC1E,MAAM,CAAC,sBAAsB,SAAK;IAClC,2EAA2E;IAC3E,MAAM,CAAC,oBAAoB,SAAM;IAEjC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,cAAc,CAAgB;IAEtC,OAAO,CAAC,YAAY,CAAC,CAAc;gBAGxB,EAAE,EAAE,MAAM,EACV,kBAAkB,EAAE,OAAO,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,0BAAc;IAGhC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,YAAY,CAAC;KACvB;IAMD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,WAAW,IAAI,WAAW,GAAG,SAAS,CAEzC;IAED;;;;;;OAMG;IACH,SAAS,IAAI,YAAY;IAWzB,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI;IAInC,cAAc;IAId,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,gBAAgB;IAChB,eAAe,CAAC,WAAW,EAAE,WAAW;IAOxC,gBAAgB;IAChB,iBAAiB;IAIjB,gBAAgB;IACV,qBAAqB;IAI3B,gBAAgB;IAChB,gBAAgB;CAGjB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Future, shortuuid } from "../utils.js";
|
|
2
|
+
class SpeechHandle {
|
|
3
|
+
constructor(id, allowInterruptions, stepIndex, parent) {
|
|
4
|
+
this.id = id;
|
|
5
|
+
this.allowInterruptions = allowInterruptions;
|
|
6
|
+
this.stepIndex = stepIndex;
|
|
7
|
+
this.parent = parent;
|
|
8
|
+
}
|
|
9
|
+
/** Priority for messages that should be played after all other messages in the queue */
|
|
10
|
+
static SPEECH_PRIORITY_LOW = 0;
|
|
11
|
+
/** Every speech generates by the VoiceAgent defaults to this priority. */
|
|
12
|
+
static SPEECH_PRIORITY_NORMAL = 5;
|
|
13
|
+
/** Priority for important messages that should be played before others. */
|
|
14
|
+
static SPEECH_PRIORITY_HIGH = 10;
|
|
15
|
+
interruptFut = new Future();
|
|
16
|
+
authorizeFut = new Future();
|
|
17
|
+
playoutDoneFut = new Future();
|
|
18
|
+
_chatMessage;
|
|
19
|
+
static create(options) {
|
|
20
|
+
const { allowInterruptions = false, stepIndex = 0, parent } = options ?? {};
|
|
21
|
+
return new SpeechHandle(shortuuid("speech_"), allowInterruptions, stepIndex, parent);
|
|
22
|
+
}
|
|
23
|
+
get interrupted() {
|
|
24
|
+
return this.interruptFut.done;
|
|
25
|
+
}
|
|
26
|
+
get done() {
|
|
27
|
+
return this.playoutDoneFut.done;
|
|
28
|
+
}
|
|
29
|
+
get chatMessage() {
|
|
30
|
+
return this._chatMessage;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Interrupt the current speech generation.
|
|
34
|
+
*
|
|
35
|
+
* @throws Error If this speech handle does not allow interruptions.
|
|
36
|
+
*
|
|
37
|
+
* @returns The same speech handle that was interrupted.
|
|
38
|
+
*/
|
|
39
|
+
interrupt() {
|
|
40
|
+
if (!this.allowInterruptions) {
|
|
41
|
+
throw new Error("interruptions are not allowed");
|
|
42
|
+
}
|
|
43
|
+
if (this.done) return this;
|
|
44
|
+
this.interruptFut.resolve();
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
then(callback) {
|
|
48
|
+
return this.playoutDoneFut.await.finally(() => callback(this));
|
|
49
|
+
}
|
|
50
|
+
async waitForPlayout() {
|
|
51
|
+
return this.playoutDoneFut.await;
|
|
52
|
+
}
|
|
53
|
+
async waitIfNotInterrupted(aw) {
|
|
54
|
+
const allTasksPromise = Promise.all(aw);
|
|
55
|
+
const fs = [allTasksPromise, this.interruptFut.await];
|
|
56
|
+
await Promise.race(fs);
|
|
57
|
+
}
|
|
58
|
+
/** @internal */
|
|
59
|
+
_setChatMessage(chatMessage) {
|
|
60
|
+
if (this.done) {
|
|
61
|
+
throw new Error("cannot set chat message after speech has been played");
|
|
62
|
+
}
|
|
63
|
+
this._chatMessage = chatMessage;
|
|
64
|
+
}
|
|
65
|
+
/** @internal */
|
|
66
|
+
_authorizePlayout() {
|
|
67
|
+
this.authorizeFut.resolve();
|
|
68
|
+
}
|
|
69
|
+
/** @internal */
|
|
70
|
+
async _waitForAuthorization() {
|
|
71
|
+
return this.authorizeFut.await;
|
|
72
|
+
}
|
|
73
|
+
/** @internal */
|
|
74
|
+
_markPlayoutDone() {
|
|
75
|
+
this.playoutDoneFut.resolve();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
SpeechHandle
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=speech_handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/voice/speech_handle.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { ChatMessage } from '../llm/index.js';\nimport { Future, shortuuid } from '../utils.js';\n\nexport class SpeechHandle {\n /** Priority for messages that should be played after all other messages in the queue */\n static SPEECH_PRIORITY_LOW = 0;\n /** Every speech generates by the VoiceAgent defaults to this priority. */\n static SPEECH_PRIORITY_NORMAL = 5;\n /** Priority for important messages that should be played before others. */\n static SPEECH_PRIORITY_HIGH = 10;\n\n private interruptFut = new Future();\n private authorizeFut = new Future();\n private playoutDoneFut = new Future();\n\n private _chatMessage?: ChatMessage;\n\n constructor(\n readonly id: string,\n readonly allowInterruptions: boolean,\n readonly stepIndex: number,\n readonly parent?: SpeechHandle,\n ) {}\n\n static create(options: {\n allowInterruptions?: boolean;\n stepIndex?: number;\n parent?: SpeechHandle;\n }) {\n const { allowInterruptions = false, stepIndex = 0, parent } = options ?? {};\n\n return new SpeechHandle(shortuuid('speech_'), allowInterruptions, stepIndex, parent);\n }\n\n get interrupted(): boolean {\n return this.interruptFut.done;\n }\n\n get done(): boolean {\n return this.playoutDoneFut.done;\n }\n\n get chatMessage(): ChatMessage | undefined {\n return this._chatMessage;\n }\n\n /**\n * Interrupt the current speech generation.\n *\n * @throws Error If this speech handle does not allow interruptions.\n *\n * @returns The same speech handle that was interrupted.\n */\n interrupt(): SpeechHandle {\n if (!this.allowInterruptions) {\n throw new Error('interruptions are not allowed');\n }\n\n if (this.done) return this;\n\n this.interruptFut.resolve();\n return this;\n }\n\n then(callback: (sh: SpeechHandle) => void) {\n return this.playoutDoneFut.await.finally(() => callback(this));\n }\n\n async waitForPlayout() {\n return this.playoutDoneFut.await;\n }\n\n async waitIfNotInterrupted(aw: Promise<unknown>[]): Promise<void> {\n const allTasksPromise = Promise.all(aw);\n const fs: Promise<unknown>[] = [allTasksPromise, this.interruptFut.await];\n await Promise.race(fs);\n }\n\n /** @internal */\n _setChatMessage(chatMessage: ChatMessage) {\n if (this.done) {\n throw new Error('cannot set chat message after speech has been played');\n }\n this._chatMessage = chatMessage;\n }\n\n /** @internal */\n _authorizePlayout() {\n this.authorizeFut.resolve();\n }\n\n /** @internal */\n async _waitForAuthorization() {\n return this.authorizeFut.await;\n }\n\n /** @internal */\n _markPlayoutDone() {\n this.playoutDoneFut.resolve();\n }\n}\n"],"mappings":"AAIA,SAAS,QAAQ,iBAAiB;AAE3B,MAAM,aAAa;AAAA,EAcxB,YACW,IACA,oBACA,WACA,QACT;AAJS;AACA;AACA;AACA;AAAA,EACR;AAAA;AAAA,EAjBH,OAAO,sBAAsB;AAAA;AAAA,EAE7B,OAAO,yBAAyB;AAAA;AAAA,EAEhC,OAAO,uBAAuB;AAAA,EAEtB,eAAe,IAAI,OAAO;AAAA,EAC1B,eAAe,IAAI,OAAO;AAAA,EAC1B,iBAAiB,IAAI,OAAO;AAAA,EAE5B;AAAA,EASR,OAAO,OAAO,SAIX;AACD,UAAM,EAAE,qBAAqB,OAAO,YAAY,GAAG,OAAO,IAAI,WAAW,CAAC;AAE1E,WAAO,IAAI,aAAa,UAAU,SAAS,GAAG,oBAAoB,WAAW,MAAM;AAAA,EACrF;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,OAAgB;AAClB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAI,cAAuC;AACzC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAA0B;AACxB,QAAI,CAAC,KAAK,oBAAoB;AAC5B,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,QAAI,KAAK,KAAM,QAAO;AAEtB,SAAK,aAAa,QAAQ;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,UAAsC;AACzC,WAAO,KAAK,eAAe,MAAM,QAAQ,MAAM,SAAS,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,iBAAiB;AACrB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,MAAM,qBAAqB,IAAuC;AAChE,UAAM,kBAAkB,QAAQ,IAAI,EAAE;AACtC,UAAM,KAAyB,CAAC,iBAAiB,KAAK,aAAa,KAAK;AACxE,UAAM,QAAQ,KAAK,EAAE;AAAA,EACvB;AAAA;AAAA,EAGA,gBAAgB,aAA0B;AACxC,QAAI,KAAK,MAAM;AACb,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA,EAGA,oBAAoB;AAClB,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA;AAAA,EAGA,MAAM,wBAAwB;AAC5B,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA;AAAA,EAGA,mBAAmB;AACjB,SAAK,eAAe,QAAQ;AAAA,EAC9B;AACF;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var utils_exports = {};
|
|
20
|
+
__export(utils_exports, {
|
|
21
|
+
findMicrophoneTrackId: () => findMicrophoneTrackId
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(utils_exports);
|
|
24
|
+
var import_rtc_node = require("@livekit/rtc-node");
|
|
25
|
+
function findMicrophoneTrackId(room, identity) {
|
|
26
|
+
var _a;
|
|
27
|
+
let p = room.remoteParticipants.get(identity) ?? null;
|
|
28
|
+
if (identity === ((_a = room.localParticipant) == null ? void 0 : _a.identity)) {
|
|
29
|
+
p = room.localParticipant;
|
|
30
|
+
}
|
|
31
|
+
if (p === null) {
|
|
32
|
+
throw new Error(`Participant ${identity} not found`);
|
|
33
|
+
}
|
|
34
|
+
for (const track of p.trackPublications.values()) {
|
|
35
|
+
if (track.source === import_rtc_node.TrackSource.SOURCE_MICROPHONE && track.sid) {
|
|
36
|
+
return track.sid;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Participant ${identity} does not have a microphone track`);
|
|
40
|
+
}
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
findMicrophoneTrackId
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=_utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/transcription/_utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { LocalParticipant, Participant, Room } from '@livekit/rtc-node';\nimport { TrackSource } from '@livekit/rtc-node';\n\nexport function findMicrophoneTrackId(room: Room, identity: string): string {\n let p: Participant | LocalParticipant | null = room.remoteParticipants.get(identity) ?? null;\n if (identity === room.localParticipant?.identity) {\n p = room.localParticipant;\n }\n\n if (p === null) {\n throw new Error(`Participant ${identity} not found`);\n }\n\n for (const track of p.trackPublications.values()) {\n if (track.source === TrackSource.SOURCE_MICROPHONE && track.sid) {\n // find the first microphone track\n return track.sid;\n }\n }\n\n throw new Error(`Participant ${identity} does not have a microphone track`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,sBAA4B;AAErB,SAAS,sBAAsB,MAAY,UAA0B;AAN5E;AAOE,MAAI,IAA2C,KAAK,mBAAmB,IAAI,QAAQ,KAAK;AACxF,MAAI,eAAa,UAAK,qBAAL,mBAAuB,WAAU;AAChD,QAAI,KAAK;AAAA,EACX;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,IAAI,MAAM,eAAe,QAAQ,YAAY;AAAA,EACrD;AAEA,aAAW,SAAS,EAAE,kBAAkB,OAAO,GAAG;AAChD,QAAI,MAAM,WAAW,4BAAY,qBAAqB,MAAM,KAAK;AAE/D,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,eAAe,QAAQ,mCAAmC;AAC5E;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils.d.ts","sourceRoot":"","sources":["../../../src/voice/transcription/_utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiC,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG7E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB1E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TrackSource } from "@livekit/rtc-node";
|
|
2
|
+
function findMicrophoneTrackId(room, identity) {
|
|
3
|
+
var _a;
|
|
4
|
+
let p = room.remoteParticipants.get(identity) ?? null;
|
|
5
|
+
if (identity === ((_a = room.localParticipant) == null ? void 0 : _a.identity)) {
|
|
6
|
+
p = room.localParticipant;
|
|
7
|
+
}
|
|
8
|
+
if (p === null) {
|
|
9
|
+
throw new Error(`Participant ${identity} not found`);
|
|
10
|
+
}
|
|
11
|
+
for (const track of p.trackPublications.values()) {
|
|
12
|
+
if (track.source === TrackSource.SOURCE_MICROPHONE && track.sid) {
|
|
13
|
+
return track.sid;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
throw new Error(`Participant ${identity} does not have a microphone track`);
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
findMicrophoneTrackId
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/transcription/_utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { LocalParticipant, Participant, Room } from '@livekit/rtc-node';\nimport { TrackSource } from '@livekit/rtc-node';\n\nexport function findMicrophoneTrackId(room: Room, identity: string): string {\n let p: Participant | LocalParticipant | null = room.remoteParticipants.get(identity) ?? null;\n if (identity === room.localParticipant?.identity) {\n p = room.localParticipant;\n }\n\n if (p === null) {\n throw new Error(`Participant ${identity} not found`);\n }\n\n for (const track of p.trackPublications.values()) {\n if (track.source === TrackSource.SOURCE_MICROPHONE && track.sid) {\n // find the first microphone track\n return track.sid;\n }\n }\n\n throw new Error(`Participant ${identity} does not have a microphone track`);\n}\n"],"mappings":"AAIA,SAAS,mBAAmB;AAErB,SAAS,sBAAsB,MAAY,UAA0B;AAN5E;AAOE,MAAI,IAA2C,KAAK,mBAAmB,IAAI,QAAQ,KAAK;AACxF,MAAI,eAAa,UAAK,qBAAL,mBAAuB,WAAU;AAChD,QAAI,KAAK;AAAA,EACX;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,IAAI,MAAM,eAAe,QAAQ,YAAY;AAAA,EACrD;AAEA,aAAW,SAAS,EAAE,kBAAkB,OAAO,GAAG;AAChD,QAAI,MAAM,WAAW,YAAY,qBAAqB,MAAM,KAAK;AAE/D,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,eAAe,QAAQ,mCAAmC;AAC5E;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
15
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
16
|
+
var transcription_exports = {};
|
|
17
|
+
module.exports = __toCommonJS(transcription_exports);
|
|
18
|
+
__reExport(transcription_exports, require("./_utils.cjs"), module.exports);
|
|
19
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
20
|
+
0 && (module.exports = {
|
|
21
|
+
...require("./_utils.cjs")
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/transcription/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport * from './_utils.js';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAGA,kCAAc,wBAHd;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/voice/transcription/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/voice/transcription/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport * from './_utils.js';\n"],"mappings":"AAGA,cAAc;","names":[]}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var synchronizer_exports = {};
|
|
20
|
+
__export(synchronizer_exports, {
|
|
21
|
+
TranscriptionSynchronizer: () => TranscriptionSynchronizer,
|
|
22
|
+
defaultTextSyncOptions: () => defaultTextSyncOptions
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(synchronizer_exports);
|
|
25
|
+
var import_async = require("@std/async");
|
|
26
|
+
var import_log = require("../../log.cjs");
|
|
27
|
+
var import_identity_transform = require("../../stream/identity_transform.cjs");
|
|
28
|
+
var import_tokenize = require("../../tokenize/index.cjs");
|
|
29
|
+
var import_utils = require("../../utils.cjs");
|
|
30
|
+
var import_io = require("../io.cjs");
|
|
31
|
+
const STANDARD_SPEECH_RATE = 3.83;
|
|
32
|
+
class SegmentSynchronizerImpl {
|
|
33
|
+
constructor(options, nextInChain) {
|
|
34
|
+
this.options = options;
|
|
35
|
+
this.nextInChain = nextInChain;
|
|
36
|
+
this.speed = options.speed * STANDARD_SPEECH_RATE;
|
|
37
|
+
this.textData = {
|
|
38
|
+
sentenceStream: options.sentenceTokenizer.stream(),
|
|
39
|
+
pushedText: "",
|
|
40
|
+
done: false,
|
|
41
|
+
forwardedHyphens: 0,
|
|
42
|
+
forwardedText: ""
|
|
43
|
+
};
|
|
44
|
+
this.audioData = {
|
|
45
|
+
pushedDuration: 0,
|
|
46
|
+
done: false
|
|
47
|
+
};
|
|
48
|
+
this.outputStream = new import_identity_transform.IdentityTransform();
|
|
49
|
+
this.outputStreamWriter = this.outputStream.writable.getWriter();
|
|
50
|
+
this.mainTask().then(() => {
|
|
51
|
+
this.outputStreamWriter.close();
|
|
52
|
+
}).catch((error) => {
|
|
53
|
+
this.logger.error({ error }, "mainTask SegmentSynchronizerImpl");
|
|
54
|
+
});
|
|
55
|
+
this.captureTask = this.captureTaskImpl();
|
|
56
|
+
}
|
|
57
|
+
textData;
|
|
58
|
+
audioData;
|
|
59
|
+
speed;
|
|
60
|
+
outputStream;
|
|
61
|
+
outputStreamWriter;
|
|
62
|
+
captureTask;
|
|
63
|
+
startWallTime;
|
|
64
|
+
startFuture = new import_utils.Future();
|
|
65
|
+
closedFuture = new import_utils.Future();
|
|
66
|
+
playbackCompleted = false;
|
|
67
|
+
logger = (0, import_log.log)();
|
|
68
|
+
get closed() {
|
|
69
|
+
return this.closedFuture.done;
|
|
70
|
+
}
|
|
71
|
+
get audioInputEnded() {
|
|
72
|
+
return this.audioData.done;
|
|
73
|
+
}
|
|
74
|
+
get textInputEnded() {
|
|
75
|
+
return this.textData.done;
|
|
76
|
+
}
|
|
77
|
+
get readable() {
|
|
78
|
+
return this.outputStream.readable;
|
|
79
|
+
}
|
|
80
|
+
pushAudio(frame) {
|
|
81
|
+
if (this.closed) {
|
|
82
|
+
this.logger.warn("SegmentSynchronizerImpl.pushAudio called after close");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const frameDuration = frame.samplesPerChannel / frame.sampleRate;
|
|
86
|
+
if (!this.startWallTime && frameDuration > 0) {
|
|
87
|
+
this.startWallTime = Date.now();
|
|
88
|
+
this.startFuture.resolve();
|
|
89
|
+
}
|
|
90
|
+
this.audioData.pushedDuration += frameDuration;
|
|
91
|
+
}
|
|
92
|
+
endAudioInput() {
|
|
93
|
+
if (this.closed) {
|
|
94
|
+
this.logger.warn("SegmentSynchronizerImpl.endAudioInput called after close");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.audioData.done = true;
|
|
98
|
+
}
|
|
99
|
+
pushText(text) {
|
|
100
|
+
if (this.closed) {
|
|
101
|
+
this.logger.warn("SegmentSynchronizerImpl.pushText called after close");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.textData.sentenceStream.pushText(text);
|
|
105
|
+
this.textData.pushedText += text;
|
|
106
|
+
}
|
|
107
|
+
endTextInput() {
|
|
108
|
+
if (this.closed) {
|
|
109
|
+
this.logger.warn("SegmentSynchronizerImpl.endTextInput called after close");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.textData.done = true;
|
|
113
|
+
this.textData.sentenceStream.endInput();
|
|
114
|
+
}
|
|
115
|
+
markPlaybackFinished(_playbackPosition, interrupted) {
|
|
116
|
+
if (this.closed) {
|
|
117
|
+
this.logger.warn("SegmentSynchronizerImpl.markPlaybackFinished called after close");
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (!this.textData.done || !this.audioData.done) {
|
|
121
|
+
this.logger.warn(
|
|
122
|
+
{ textDone: this.textData.done, audioDone: this.audioData.done },
|
|
123
|
+
"SegmentSynchronizerImpl.markPlaybackFinished called before text/audio input is done"
|
|
124
|
+
);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!interrupted) {
|
|
128
|
+
this.playbackCompleted = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
get synchronizedTranscript() {
|
|
132
|
+
if (this.playbackCompleted) {
|
|
133
|
+
return this.textData.pushedText;
|
|
134
|
+
}
|
|
135
|
+
return this.textData.forwardedText;
|
|
136
|
+
}
|
|
137
|
+
async captureTaskImpl() {
|
|
138
|
+
const reader = this.outputStream.readable.getReader();
|
|
139
|
+
while (true) {
|
|
140
|
+
const { done, value: text } = await reader.read();
|
|
141
|
+
if (done) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
this.textData.forwardedText += text;
|
|
145
|
+
await this.nextInChain.captureText(text);
|
|
146
|
+
}
|
|
147
|
+
reader.releaseLock();
|
|
148
|
+
this.nextInChain.flush();
|
|
149
|
+
}
|
|
150
|
+
async mainTask() {
|
|
151
|
+
await this.startFuture.await;
|
|
152
|
+
if (this.closed && !this.playbackCompleted) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (!this.startWallTime) {
|
|
156
|
+
throw new Error("startWallTime is not set when starting SegmentSynchronizerImpl.mainTask");
|
|
157
|
+
}
|
|
158
|
+
for await (const textSegment of this.textData.sentenceStream) {
|
|
159
|
+
const sentence = textSegment.token;
|
|
160
|
+
let textCursor = 0;
|
|
161
|
+
if (this.closed && !this.playbackCompleted) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
for (const [word, _, endPos] of this.options.splitWords(sentence)) {
|
|
165
|
+
if (this.closed && !this.playbackCompleted) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (this.playbackCompleted) {
|
|
169
|
+
this.outputStreamWriter.write(sentence.slice(textCursor, endPos));
|
|
170
|
+
textCursor = endPos;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const wordHphens = this.options.hyphenateWord(word).length;
|
|
174
|
+
const elapsedSeconds = (Date.now() - this.startWallTime) / 1e3;
|
|
175
|
+
const targetHyphens = elapsedSeconds * this.options.speed;
|
|
176
|
+
const hyphensBehind = Math.max(0, targetHyphens - this.textData.forwardedHyphens);
|
|
177
|
+
let delay2 = Math.max(0, wordHphens - hyphensBehind) / this.speed;
|
|
178
|
+
if (this.playbackCompleted) {
|
|
179
|
+
delay2 = 0;
|
|
180
|
+
}
|
|
181
|
+
await this.sleepIfNotClosed(delay2 / 2);
|
|
182
|
+
this.outputStreamWriter.write(sentence.slice(textCursor, endPos));
|
|
183
|
+
await this.sleepIfNotClosed(delay2 / 2);
|
|
184
|
+
this.textData.forwardedHyphens += wordHphens;
|
|
185
|
+
textCursor = endPos;
|
|
186
|
+
}
|
|
187
|
+
if (textCursor < sentence.length) {
|
|
188
|
+
const remaining = sentence.slice(textCursor);
|
|
189
|
+
this.outputStreamWriter.write(remaining);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async sleepIfNotClosed(sleepTimeSeconds) {
|
|
194
|
+
if (this.closed) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
await (0, import_async.delay)(sleepTimeSeconds * 1e3);
|
|
198
|
+
}
|
|
199
|
+
async close() {
|
|
200
|
+
if (this.closed) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
this.closedFuture.resolve();
|
|
204
|
+
this.startFuture.resolve();
|
|
205
|
+
this.textData.sentenceStream.close();
|
|
206
|
+
await this.captureTask;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const defaultTextSyncOptions = {
|
|
210
|
+
speed: 1,
|
|
211
|
+
hyphenateWord: import_tokenize.basic.hyphenateWord,
|
|
212
|
+
splitWords: import_tokenize.basic.splitWords,
|
|
213
|
+
sentenceTokenizer: new import_tokenize.basic.SentenceTokenizer({
|
|
214
|
+
retainFormat: true
|
|
215
|
+
})
|
|
216
|
+
};
|
|
217
|
+
class TranscriptionSynchronizer {
|
|
218
|
+
audioOutput;
|
|
219
|
+
textOutput;
|
|
220
|
+
options;
|
|
221
|
+
rotateSegmentTask;
|
|
222
|
+
_enabled = true;
|
|
223
|
+
closed = false;
|
|
224
|
+
/* @internal */
|
|
225
|
+
_impl;
|
|
226
|
+
logger = (0, import_log.log)();
|
|
227
|
+
constructor(nextInChainAudio, nextInChainText, options = defaultTextSyncOptions) {
|
|
228
|
+
this.audioOutput = new SyncedAudioOutput(this, nextInChainAudio);
|
|
229
|
+
this.textOutput = new SyncedTextOutput(this, nextInChainText);
|
|
230
|
+
this.options = {
|
|
231
|
+
speed: options.speed,
|
|
232
|
+
hyphenateWord: options.hyphenateWord,
|
|
233
|
+
splitWords: options.splitWords,
|
|
234
|
+
sentenceTokenizer: options.sentenceTokenizer
|
|
235
|
+
};
|
|
236
|
+
this._impl = new SegmentSynchronizerImpl(this.options, nextInChainText);
|
|
237
|
+
this.rotateSegmentTask = import_utils.Task.from(
|
|
238
|
+
(controller) => this.rotateSegmentTaskImpl(controller.signal)
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
get enabled() {
|
|
242
|
+
return this._enabled;
|
|
243
|
+
}
|
|
244
|
+
set enabled(enabled) {
|
|
245
|
+
if (this._enabled === enabled) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this._enabled = enabled;
|
|
249
|
+
this.rotateSegment();
|
|
250
|
+
}
|
|
251
|
+
rotateSegment() {
|
|
252
|
+
if (this.closed) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (!this.rotateSegmentTask.done) {
|
|
256
|
+
this.logger.warn("rotateSegment called while previous segment is still being rotated");
|
|
257
|
+
}
|
|
258
|
+
this.rotateSegmentTask = import_utils.Task.from(
|
|
259
|
+
(controller) => this.rotateSegmentTaskImpl(controller.signal, this.rotateSegmentTask)
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
async close() {
|
|
263
|
+
this.closed = true;
|
|
264
|
+
await this.rotateSegmentTask.cancelAndWait();
|
|
265
|
+
await this._impl.close();
|
|
266
|
+
}
|
|
267
|
+
async barrier() {
|
|
268
|
+
if (this.rotateSegmentTask.done) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
await this.rotateSegmentTask.result;
|
|
272
|
+
}
|
|
273
|
+
async rotateSegmentTaskImpl(abort, oldTask) {
|
|
274
|
+
if (oldTask) {
|
|
275
|
+
await oldTask.result;
|
|
276
|
+
}
|
|
277
|
+
if (abort.aborted) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
await this._impl.close();
|
|
281
|
+
this._impl = new SegmentSynchronizerImpl(this.options, this.textOutput.nextInChain);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
class SyncedAudioOutput extends import_io.AudioOutput {
|
|
285
|
+
constructor(synchronizer, nextInChainAudio) {
|
|
286
|
+
super(nextInChainAudio.sampleRate, nextInChainAudio);
|
|
287
|
+
this.synchronizer = synchronizer;
|
|
288
|
+
this.nextInChainAudio = nextInChainAudio;
|
|
289
|
+
}
|
|
290
|
+
pushedDuration = 0;
|
|
291
|
+
async captureFrame(frame) {
|
|
292
|
+
await this.synchronizer.barrier();
|
|
293
|
+
await super.captureFrame(frame);
|
|
294
|
+
await this.nextInChainAudio.captureFrame(frame);
|
|
295
|
+
this.pushedDuration += frame.samplesPerChannel / frame.sampleRate;
|
|
296
|
+
if (!this.synchronizer.enabled) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
if (this.synchronizer._impl.audioInputEnded) {
|
|
300
|
+
this.logger.warn(
|
|
301
|
+
"SegmentSynchronizerImpl audio marked as ended in capture audio, rotating segment"
|
|
302
|
+
);
|
|
303
|
+
this.synchronizer.rotateSegment();
|
|
304
|
+
await this.synchronizer.barrier();
|
|
305
|
+
}
|
|
306
|
+
this.synchronizer._impl.pushAudio(frame);
|
|
307
|
+
}
|
|
308
|
+
flush() {
|
|
309
|
+
super.flush();
|
|
310
|
+
this.nextInChainAudio.flush();
|
|
311
|
+
if (!this.synchronizer.enabled) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
if (!this.pushedDuration) {
|
|
315
|
+
this.synchronizer.rotateSegment();
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
this.synchronizer._impl.endAudioInput();
|
|
319
|
+
}
|
|
320
|
+
clearBuffer() {
|
|
321
|
+
this.nextInChainAudio.clearBuffer();
|
|
322
|
+
}
|
|
323
|
+
// this is going to be automatically called by the next_in_chain
|
|
324
|
+
onPlaybackFinished(ev) {
|
|
325
|
+
if (!this.synchronizer.enabled) {
|
|
326
|
+
super.onPlaybackFinished(ev);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
this.synchronizer._impl.markPlaybackFinished(ev.playbackPosition, ev.interrupted);
|
|
330
|
+
super.onPlaybackFinished({
|
|
331
|
+
playbackPosition: ev.playbackPosition,
|
|
332
|
+
interrupted: ev.interrupted,
|
|
333
|
+
synchronizedTranscript: this.synchronizer._impl.synchronizedTranscript
|
|
334
|
+
});
|
|
335
|
+
this.synchronizer.rotateSegment();
|
|
336
|
+
this.pushedDuration = 0;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
class SyncedTextOutput extends import_io.TextOutput {
|
|
340
|
+
constructor(synchronizer, nextInChain) {
|
|
341
|
+
super(nextInChain);
|
|
342
|
+
this.synchronizer = synchronizer;
|
|
343
|
+
this.nextInChain = nextInChain;
|
|
344
|
+
}
|
|
345
|
+
capturing = false;
|
|
346
|
+
logger = (0, import_log.log)();
|
|
347
|
+
async captureText(text) {
|
|
348
|
+
await this.synchronizer.barrier();
|
|
349
|
+
if (!this.synchronizer.enabled) {
|
|
350
|
+
await this.nextInChain.captureText(text);
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
this.capturing = true;
|
|
354
|
+
if (this.synchronizer._impl.textInputEnded) {
|
|
355
|
+
this.logger.warn(
|
|
356
|
+
"SegmentSynchronizerImpl text marked as ended in capture text, rotating segment"
|
|
357
|
+
);
|
|
358
|
+
this.synchronizer.rotateSegment();
|
|
359
|
+
await this.synchronizer.barrier();
|
|
360
|
+
}
|
|
361
|
+
this.synchronizer._impl.pushText(text);
|
|
362
|
+
}
|
|
363
|
+
flush() {
|
|
364
|
+
if (!this.synchronizer.enabled) {
|
|
365
|
+
this.nextInChain.flush();
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
if (!this.capturing) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
this.capturing = false;
|
|
372
|
+
this.synchronizer._impl.endTextInput();
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
376
|
+
0 && (module.exports = {
|
|
377
|
+
TranscriptionSynchronizer,
|
|
378
|
+
defaultTextSyncOptions
|
|
379
|
+
});
|
|
380
|
+
//# sourceMappingURL=synchronizer.cjs.map
|