feat(eot): Audio EOT#4722
Conversation
|
@chenghao-mou Excited to see this! A couple of questions:
|
Thanks for your patience! We don't have an official decision or timeline yet, but hopefully I can get it ready within a month or two. |
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
β¦dal-EOU # Conflicts: # livekit-agents/livekit/agents/version.py # livekit-agents/pyproject.toml # livekit-plugins/livekit-plugins-anam/livekit/plugins/anam/version.py # livekit-plugins/livekit-plugins-anam/pyproject.toml # livekit-plugins/livekit-plugins-anthropic/livekit/plugins/anthropic/version.py # livekit-plugins/livekit-plugins-anthropic/pyproject.toml # livekit-plugins/livekit-plugins-assemblyai/livekit/plugins/assemblyai/version.py # livekit-plugins/livekit-plugins-assemblyai/pyproject.toml # livekit-plugins/livekit-plugins-asyncai/livekit/plugins/asyncai/version.py # livekit-plugins/livekit-plugins-asyncai/pyproject.toml # livekit-plugins/livekit-plugins-avatario/livekit/plugins/avatario/version.py # livekit-plugins/livekit-plugins-avatario/pyproject.toml # livekit-plugins/livekit-plugins-avatartalk/livekit/plugins/avatartalk/version.py # livekit-plugins/livekit-plugins-avatartalk/pyproject.toml # livekit-plugins/livekit-plugins-aws/livekit/plugins/aws/version.py # livekit-plugins/livekit-plugins-aws/pyproject.toml # livekit-plugins/livekit-plugins-azure/livekit/plugins/azure/version.py # livekit-plugins/livekit-plugins-azure/pyproject.toml # livekit-plugins/livekit-plugins-baseten/livekit/plugins/baseten/version.py # livekit-plugins/livekit-plugins-baseten/pyproject.toml # livekit-plugins/livekit-plugins-bey/livekit/plugins/bey/version.py # livekit-plugins/livekit-plugins-bey/pyproject.toml # livekit-plugins/livekit-plugins-bithuman/livekit/plugins/bithuman/version.py # livekit-plugins/livekit-plugins-bithuman/pyproject.toml # livekit-plugins/livekit-plugins-browser/livekit/plugins/browser/version.py # livekit-plugins/livekit-plugins-browser/pyproject.toml # livekit-plugins/livekit-plugins-cambai/livekit/plugins/cambai/version.py # livekit-plugins/livekit-plugins-cambai/pyproject.toml # livekit-plugins/livekit-plugins-cartesia/livekit/plugins/cartesia/version.py # livekit-plugins/livekit-plugins-cartesia/pyproject.toml # livekit-plugins/livekit-plugins-cerebras/livekit/plugins/cerebras/version.py # livekit-plugins/livekit-plugins-cerebras/pyproject.toml # livekit-plugins/livekit-plugins-clova/livekit/plugins/clova/version.py # livekit-plugins/livekit-plugins-clova/pyproject.toml # livekit-plugins/livekit-plugins-deepgram/livekit/plugins/deepgram/version.py # livekit-plugins/livekit-plugins-deepgram/pyproject.toml # livekit-plugins/livekit-plugins-did/livekit/plugins/did/version.py # livekit-plugins/livekit-plugins-did/pyproject.toml # livekit-plugins/livekit-plugins-elevenlabs/livekit/plugins/elevenlabs/version.py # livekit-plugins/livekit-plugins-elevenlabs/pyproject.toml # livekit-plugins/livekit-plugins-fal/livekit/plugins/fal/version.py # livekit-plugins/livekit-plugins-fal/pyproject.toml # livekit-plugins/livekit-plugins-fireworksai/livekit/plugins/fireworksai/version.py # livekit-plugins/livekit-plugins-fireworksai/pyproject.toml # livekit-plugins/livekit-plugins-fishaudio/livekit/plugins/fishaudio/version.py # livekit-plugins/livekit-plugins-fishaudio/pyproject.toml # livekit-plugins/livekit-plugins-gladia/livekit/plugins/gladia/version.py # livekit-plugins/livekit-plugins-gladia/pyproject.toml # livekit-plugins/livekit-plugins-gnani/livekit/plugins/gnani/version.py # livekit-plugins/livekit-plugins-gnani/pyproject.toml # livekit-plugins/livekit-plugins-google/livekit/plugins/google/version.py # livekit-plugins/livekit-plugins-google/pyproject.toml # livekit-plugins/livekit-plugins-gradium/livekit/plugins/gradium/version.py # livekit-plugins/livekit-plugins-gradium/pyproject.toml # livekit-plugins/livekit-plugins-groq/livekit/plugins/groq/version.py # livekit-plugins/livekit-plugins-groq/pyproject.toml # livekit-plugins/livekit-plugins-hamming/livekit/plugins/hamming/version.py # livekit-plugins/livekit-plugins-hamming/pyproject.toml # livekit-plugins/livekit-plugins-hedra/livekit/plugins/hedra/version.py # livekit-plugins/livekit-plugins-hedra/pyproject.toml # livekit-plugins/livekit-plugins-hume/livekit/plugins/hume/version.py # livekit-plugins/livekit-plugins-hume/pyproject.toml # livekit-plugins/livekit-plugins-inworld/livekit/plugins/inworld/version.py # livekit-plugins/livekit-plugins-inworld/pyproject.toml # livekit-plugins/livekit-plugins-keyframe/livekit/plugins/keyframe/version.py # livekit-plugins/livekit-plugins-keyframe/pyproject.toml # livekit-plugins/livekit-plugins-krisp/livekit/plugins/krisp/version.py # livekit-plugins/livekit-plugins-krisp/pyproject.toml # livekit-plugins/livekit-plugins-langchain/livekit/plugins/langchain/version.py # livekit-plugins/livekit-plugins-langchain/pyproject.toml # livekit-plugins/livekit-plugins-lemonslice/livekit/plugins/lemonslice/version.py # livekit-plugins/livekit-plugins-lemonslice/pyproject.toml # livekit-plugins/livekit-plugins-liveavatar/livekit/plugins/liveavatar/version.py # livekit-plugins/livekit-plugins-liveavatar/pyproject.toml # livekit-plugins/livekit-plugins-lmnt/livekit/plugins/lmnt/version.py # livekit-plugins/livekit-plugins-lmnt/pyproject.toml # livekit-plugins/livekit-plugins-minimal/livekit/plugins/minimal/version.py # livekit-plugins/livekit-plugins-minimal/pyproject.toml # livekit-plugins/livekit-plugins-minimax/livekit/plugins/minimax/version.py # livekit-plugins/livekit-plugins-minimax/pyproject.toml # livekit-plugins/livekit-plugins-mistralai/livekit/plugins/mistralai/version.py # livekit-plugins/livekit-plugins-mistralai/pyproject.toml # livekit-plugins/livekit-plugins-murf/livekit/plugins/murf/version.py # livekit-plugins/livekit-plugins-murf/pyproject.toml # livekit-plugins/livekit-plugins-neuphonic/livekit/plugins/neuphonic/version.py # livekit-plugins/livekit-plugins-neuphonic/pyproject.toml # livekit-plugins/livekit-plugins-nltk/livekit/plugins/nltk/version.py # livekit-plugins/livekit-plugins-nltk/pyproject.toml # livekit-plugins/livekit-plugins-nvidia/livekit/plugins/nvidia/version.py # livekit-plugins/livekit-plugins-nvidia/pyproject.toml # livekit-plugins/livekit-plugins-openai/livekit/plugins/openai/version.py # livekit-plugins/livekit-plugins-openai/pyproject.toml # livekit-plugins/livekit-plugins-perplexity/livekit/plugins/perplexity/version.py # livekit-plugins/livekit-plugins-perplexity/pyproject.toml # livekit-plugins/livekit-plugins-phonic/livekit/plugins/phonic/version.py # livekit-plugins/livekit-plugins-phonic/pyproject.toml # livekit-plugins/livekit-plugins-resemble/livekit/plugins/resemble/version.py # livekit-plugins/livekit-plugins-resemble/pyproject.toml # livekit-plugins/livekit-plugins-rime/livekit/plugins/rime/version.py # livekit-plugins/livekit-plugins-rime/pyproject.toml # livekit-plugins/livekit-plugins-rtzr/livekit/plugins/rtzr/version.py # livekit-plugins/livekit-plugins-rtzr/pyproject.toml # livekit-plugins/livekit-plugins-runway/livekit/plugins/runway/version.py # livekit-plugins/livekit-plugins-runway/pyproject.toml # livekit-plugins/livekit-plugins-sarvam/livekit/plugins/sarvam/version.py # livekit-plugins/livekit-plugins-sarvam/pyproject.toml # livekit-plugins/livekit-plugins-silero/livekit/plugins/silero/version.py # livekit-plugins/livekit-plugins-silero/pyproject.toml # livekit-plugins/livekit-plugins-simli/livekit/plugins/simli/version.py # livekit-plugins/livekit-plugins-simli/pyproject.toml # livekit-plugins/livekit-plugins-simplismart/livekit/plugins/simplismart/version.py # livekit-plugins/livekit-plugins-simplismart/pyproject.toml # livekit-plugins/livekit-plugins-slng/livekit/plugins/slng/version.py # livekit-plugins/livekit-plugins-slng/pyproject.toml # livekit-plugins/livekit-plugins-smallestai/livekit/plugins/smallestai/version.py # livekit-plugins/livekit-plugins-smallestai/pyproject.toml # livekit-plugins/livekit-plugins-soniox/livekit/plugins/soniox/version.py # livekit-plugins/livekit-plugins-soniox/pyproject.toml # livekit-plugins/livekit-plugins-speechify/livekit/plugins/speechify/version.py # livekit-plugins/livekit-plugins-speechify/pyproject.toml # livekit-plugins/livekit-plugins-speechmatics/livekit/plugins/speechmatics/version.py # livekit-plugins/livekit-plugins-speechmatics/pyproject.toml # livekit-plugins/livekit-plugins-spitch/livekit/plugins/spitch/version.py # livekit-plugins/livekit-plugins-spitch/pyproject.toml # livekit-plugins/livekit-plugins-tavus/livekit/plugins/tavus/version.py # livekit-plugins/livekit-plugins-tavus/pyproject.toml # livekit-plugins/livekit-plugins-telnyx/livekit/plugins/telnyx/version.py # livekit-plugins/livekit-plugins-telnyx/pyproject.toml # livekit-plugins/livekit-plugins-trugen/livekit/plugins/trugen/version.py # livekit-plugins/livekit-plugins-trugen/pyproject.toml # livekit-plugins/livekit-plugins-turn-detector/livekit/plugins/turn_detector/version.py # livekit-plugins/livekit-plugins-turn-detector/pyproject.toml # livekit-plugins/livekit-plugins-ultravox/livekit/plugins/ultravox/version.py # livekit-plugins/livekit-plugins-ultravox/pyproject.toml # livekit-plugins/livekit-plugins-upliftai/livekit/plugins/upliftai/version.py # livekit-plugins/livekit-plugins-upliftai/pyproject.toml # livekit-plugins/livekit-plugins-xai/livekit/plugins/xai/version.py # livekit-plugins/livekit-plugins-xai/pyproject.toml
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
| if ( | ||
| prediction_event is None | ||
| or prediction_event is not self._last_emitted_prediction | ||
| ): | ||
| self._last_emitted_prediction = prediction_event | ||
| inference_duration = ( | ||
| prediction_event.inference_duration | ||
| if prediction_event is not None | ||
| and prediction_event.inference_duration is not None | ||
| else 0.0 | ||
| ) | ||
| # end of speech -> prediction receive time | ||
| delay = ( | ||
| time.time() - last_speaking_time | ||
| if last_speaking_time is not None | ||
| else 0.0 | ||
| ) | ||
| self._hooks.on_eot_prediction( | ||
| EotPredictionEvent( | ||
| probability=end_of_turn_probability or 0.0, | ||
| threshold=unlikely_threshold or 0.0, | ||
| inference_duration=inference_duration, | ||
| delay=delay, | ||
| ) | ||
| ) |
There was a problem hiding this comment.
π‘ EotPredictionEvent emitted with probability=0.0 when turn detector's language is unsupported
When turn_detector.supports_language() returns False, the code skips the entire detection else block (line 1251), leaving end_of_turn_probability as None and unlikely_threshold as None. However, the on_eot_prediction dedup guard at line 1322 always fires when prediction_event is None (which it is here since we never entered the detection block). This emits an EotPredictionEvent with probability=0.0 and threshold=0.0 β a meaningless prediction that downstream consumers (the remote session protocol, metrics) cannot distinguish from a genuine zero-probability result. A similar false emission occurs when the supports_language check logs an info message and falls through.
Was this helpful? React with π or π to provide feedback.
# Conflicts: # examples/voice_agents/async_tool_agent.py # examples/voice_agents/basic_agent.py # livekit-agents/livekit/agents/voice/agent_activity.py # tests/test_agent_session.py
Adds streaming audio end-of-turn detection. Single user-facing
AudioTurnDetectorthat selects between two backends:cloudlocalOn cloud transport error or
predict_end_of_turntimeout, the session swaps to local for the rest of the stream (sticky per session, one warning per failure mode). Local failures emit the default1.0prediction and retry on the next turn.A user-set
unlikely_thresholdis scaled multiplicatively against the cloud default so the operating point survives a fallback.Wired into
AudioRecognition: VADINFERENCE_DONEtriggerswarmup,END_OF_SPEECHactivates the stream, predictions flow back through_run_eou_detectionand arbitrate against the endpointing delay. A speaking guard cancels an in-flight bounce if VADSTART_OF_SPEECHfires mid-window.