From ef46156c1ba9ca05acd4c7579923f5caa3bc827e Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Thu, 21 May 2026 15:26:27 -0400 Subject: [PATCH] Rename *-local-vad.py example variants to *-locally-driven-turns.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "-local-vad" suffix was ambiguous now that local VAD has two meanings in the realtime context: supplementary user-turn frames broadcast alongside server-driven turns (commented-out opt-in in the base examples), vs. local turn detection driving the conversation end-to-end (server-side turn detection disabled, what these variant files actually demonstrate). The new "-locally-driven-turns" suffix matches the latter intent unambiguously. Renames: realtime-openai-local-vad.py → realtime-openai-locally-driven-turns.py realtime-gemini-live-local-vad.py → realtime-gemini-live-locally-driven-turns.py realtime-grok-local-vad.py → realtime-grok-locally-driven-turns.py realtime-inworld-local-vad.py → realtime-inworld-locally-driven-turns.py Plus the matching changelog fragments. Service docstrings and base examples that referenced the old filenames now point at the new ones. --- changelog/+realtime-grok-local-vad-example.added.md | 1 - .../+realtime-grok-locally-driven-turns-example.added.md | 1 + changelog/+realtime-inworld-local-vad-example.added.md | 1 - .../+realtime-inworld-locally-driven-turns-example.added.md | 1 + changelog/+realtime-openai-local-vad-example.added.md | 1 - .../+realtime-openai-locally-driven-turns-example.added.md | 1 + ...al-vad.py => realtime-gemini-live-locally-driven-turns.py} | 0 examples/realtime/realtime-gemini-live.py | 2 +- ...rok-local-vad.py => realtime-grok-locally-driven-turns.py} | 0 ...-local-vad.py => realtime-inworld-locally-driven-turns.py} | 0 ...i-local-vad.py => realtime-openai-locally-driven-turns.py} | 0 examples/realtime/realtime-openai.py | 4 ++-- src/pipecat/services/google/gemini_live/llm.py | 2 +- src/pipecat/services/inworld/realtime/llm.py | 2 +- src/pipecat/services/openai/realtime/llm.py | 2 +- src/pipecat/services/xai/realtime/llm.py | 2 +- 16 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 changelog/+realtime-grok-local-vad-example.added.md create mode 100644 changelog/+realtime-grok-locally-driven-turns-example.added.md delete mode 100644 changelog/+realtime-inworld-local-vad-example.added.md create mode 100644 changelog/+realtime-inworld-locally-driven-turns-example.added.md delete mode 100644 changelog/+realtime-openai-local-vad-example.added.md create mode 100644 changelog/+realtime-openai-locally-driven-turns-example.added.md rename examples/realtime/{realtime-gemini-live-local-vad.py => realtime-gemini-live-locally-driven-turns.py} (100%) rename examples/realtime/{realtime-grok-local-vad.py => realtime-grok-locally-driven-turns.py} (100%) rename examples/realtime/{realtime-inworld-local-vad.py => realtime-inworld-locally-driven-turns.py} (100%) rename examples/realtime/{realtime-openai-local-vad.py => realtime-openai-locally-driven-turns.py} (100%) diff --git a/changelog/+realtime-grok-local-vad-example.added.md b/changelog/+realtime-grok-local-vad-example.added.md deleted file mode 100644 index b0092d7b8..000000000 --- a/changelog/+realtime-grok-local-vad-example.added.md +++ /dev/null @@ -1 +0,0 @@ -- Added `examples/realtime/realtime-grok-local-vad.py`, a variant of the base Grok Realtime example that disables Grok's server-side turn detection (`turn_detection=None`, manual mode) and instead drives turn boundaries locally with `SileroVADAnalyzer` wired into the user aggregator. Mirrors the OpenAI Realtime local-VAD variant. Server-emitted turn frames are preferred when available. diff --git a/changelog/+realtime-grok-locally-driven-turns-example.added.md b/changelog/+realtime-grok-locally-driven-turns-example.added.md new file mode 100644 index 000000000..5f85c20d8 --- /dev/null +++ b/changelog/+realtime-grok-locally-driven-turns-example.added.md @@ -0,0 +1 @@ +- Added `examples/realtime/realtime-grok-locally-driven-turns.py`, a variant of the base Grok Realtime example that disables Grok's server-side turn detection (`turn_detection=None`, manual mode) and instead drives turn boundaries locally with `SileroVADAnalyzer` wired into the user aggregator. Mirrors the OpenAI Realtime locally-driven-turns variant. Server-emitted turn frames are preferred when available. diff --git a/changelog/+realtime-inworld-local-vad-example.added.md b/changelog/+realtime-inworld-local-vad-example.added.md deleted file mode 100644 index f9567463b..000000000 --- a/changelog/+realtime-inworld-local-vad-example.added.md +++ /dev/null @@ -1 +0,0 @@ -- Added `examples/realtime/realtime-inworld-local-vad.py`, a variant of the base Inworld Realtime example that disables Inworld's server-side turn detection (`turn_detection=None`, manual mode) and instead drives turn boundaries locally with `SileroVADAnalyzer` wired into the user aggregator. Mirrors the OpenAI Realtime and Grok Realtime local-VAD variants. Server-emitted turn frames are preferred when available. diff --git a/changelog/+realtime-inworld-locally-driven-turns-example.added.md b/changelog/+realtime-inworld-locally-driven-turns-example.added.md new file mode 100644 index 000000000..ad0843e03 --- /dev/null +++ b/changelog/+realtime-inworld-locally-driven-turns-example.added.md @@ -0,0 +1 @@ +- Added `examples/realtime/realtime-inworld-locally-driven-turns.py`, a variant of the base Inworld Realtime example that disables Inworld's server-side turn detection (`turn_detection=None`, manual mode) and instead drives turn boundaries locally with `SileroVADAnalyzer` wired into the user aggregator. Mirrors the OpenAI Realtime and Grok Realtime locally-driven-turns variants. Server-emitted turn frames are preferred when available. diff --git a/changelog/+realtime-openai-local-vad-example.added.md b/changelog/+realtime-openai-local-vad-example.added.md deleted file mode 100644 index 4d6004d53..000000000 --- a/changelog/+realtime-openai-local-vad-example.added.md +++ /dev/null @@ -1 +0,0 @@ -- Added `examples/realtime/realtime-openai-local-vad.py`, a variant of the base OpenAI Realtime example that disables OpenAI's server-side turn detection (`turn_detection=False`) and instead drives turn boundaries locally with `SileroVADAnalyzer` wired into the user aggregator. Use this variant if you need a turn analyzer like `LocalSmartTurnV3` to decide when the user is done speaking, or if you need `UserStartedSpeakingFrame` / `UserStoppedSpeakingFrame` to fire from the same source as `InterruptionFrame`. Server-emitted turn frames are preferred when available. diff --git a/changelog/+realtime-openai-locally-driven-turns-example.added.md b/changelog/+realtime-openai-locally-driven-turns-example.added.md new file mode 100644 index 000000000..370f0e71f --- /dev/null +++ b/changelog/+realtime-openai-locally-driven-turns-example.added.md @@ -0,0 +1 @@ +- Added `examples/realtime/realtime-openai-locally-driven-turns.py`, a variant of the base OpenAI Realtime example that disables OpenAI's server-side turn detection (`turn_detection=False`) and instead drives turn boundaries locally with `SileroVADAnalyzer` wired into the user aggregator. Use this variant if you need a turn analyzer like `LocalSmartTurnV3` to decide when the user is done speaking, or if you need `UserStartedSpeakingFrame` / `UserStoppedSpeakingFrame` to fire from the same source as `InterruptionFrame`. Server-emitted turn frames are preferred when available. diff --git a/examples/realtime/realtime-gemini-live-local-vad.py b/examples/realtime/realtime-gemini-live-locally-driven-turns.py similarity index 100% rename from examples/realtime/realtime-gemini-live-local-vad.py rename to examples/realtime/realtime-gemini-live-locally-driven-turns.py diff --git a/examples/realtime/realtime-gemini-live.py b/examples/realtime/realtime-gemini-live.py index 1d158e074..c0035721e 100644 --- a/examples/realtime/realtime-gemini-live.py +++ b/examples/realtime/realtime-gemini-live.py @@ -147,7 +147,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments): # decisions and can desynchronize in subtle ways. # # For local VAD driving the conversation (server VAD disabled), see - # `realtime-gemini-live-local-vad.py` instead. + # `realtime-gemini-live-locally-driven-turns.py` instead. # # from pipecat.audio.vad.silero import SileroVADAnalyzer # from pipecat.processors.aggregators.llm_response_universal import ( diff --git a/examples/realtime/realtime-grok-local-vad.py b/examples/realtime/realtime-grok-locally-driven-turns.py similarity index 100% rename from examples/realtime/realtime-grok-local-vad.py rename to examples/realtime/realtime-grok-locally-driven-turns.py diff --git a/examples/realtime/realtime-inworld-local-vad.py b/examples/realtime/realtime-inworld-locally-driven-turns.py similarity index 100% rename from examples/realtime/realtime-inworld-local-vad.py rename to examples/realtime/realtime-inworld-locally-driven-turns.py diff --git a/examples/realtime/realtime-openai-local-vad.py b/examples/realtime/realtime-openai-locally-driven-turns.py similarity index 100% rename from examples/realtime/realtime-openai-local-vad.py rename to examples/realtime/realtime-openai-locally-driven-turns.py diff --git a/examples/realtime/realtime-openai.py b/examples/realtime/realtime-openai.py index fdce67671..087b82cf6 100644 --- a/examples/realtime/realtime-openai.py +++ b/examples/realtime/realtime-openai.py @@ -190,8 +190,8 @@ Remember, your responses should be short. Just one or two sentences, usually. Re # own UserStarted/StoppedSpeakingFrame from server VAD events, so # local VAD on the aggregator is unnecessary. realtime_service_mode # decouples context writes from turn frames and transcript-bound - # turn-end. See `realtime-openai-local-vad.py` for the variant - # that disables server VAD and drives turn detection locally. + # turn-end. See `realtime-openai-locally-driven-turns.py` for the + # variant that disables server VAD and drives turn detection locally. realtime_service_mode=RealtimeServiceModeConfig(), ) diff --git a/src/pipecat/services/google/gemini_live/llm.py b/src/pipecat/services/google/gemini_live/llm.py index 6d3c4fa0e..f8e09c96b 100644 --- a/src/pipecat/services/google/gemini_live/llm.py +++ b/src/pipecat/services/google/gemini_live/llm.py @@ -370,7 +370,7 @@ class GeminiLiveLLMService(LLMService[GeminiLLMAdapter]): detector — won't activate with the default server-VAD-only setup. Pair with ``LLMContextAggregatorPair(..., realtime_service_mode=RealtimeServiceModeConfig())`` so context writes are correct anyway. To produce the turn frames - locally, see ``examples/realtime/realtime-gemini-live-local-vad.py``; + locally, see ``examples/realtime/realtime-gemini-live-locally-driven-turns.py``; note that locally-generated turn boundaries are a heuristic and may not match Gemini Live's server-side turn decisions. """ diff --git a/src/pipecat/services/inworld/realtime/llm.py b/src/pipecat/services/inworld/realtime/llm.py index d94914dea..2017e5ac2 100644 --- a/src/pipecat/services/inworld/realtime/llm.py +++ b/src/pipecat/services/inworld/realtime/llm.py @@ -209,7 +209,7 @@ class InworldRealtimeLLMService(LLMService[InworldRealtimeLLMAdapter]): service, disable Inworld's server-side turn detection first via ``turn_detection=None`` (manual mode); otherwise both sources broadcast duplicate user-turn frames. See - ``examples/realtime/realtime-inworld-local-vad.py``. + ``examples/realtime/realtime-inworld-locally-driven-turns.py``. Example:: diff --git a/src/pipecat/services/openai/realtime/llm.py b/src/pipecat/services/openai/realtime/llm.py index fee235a27..9ecb8bae5 100644 --- a/src/pipecat/services/openai/realtime/llm.py +++ b/src/pipecat/services/openai/realtime/llm.py @@ -218,7 +218,7 @@ class OpenAIRealtimeLLMService(LLMService[OpenAIRealtimeLLMAdapter]): top of this service, disable OpenAI's server-side turn detection first (``turn_detection=False``); otherwise both sources broadcast duplicate user-turn frames. See - ``examples/realtime/realtime-openai-local-vad.py``. + ``examples/realtime/realtime-openai-locally-driven-turns.py``. """ Settings = OpenAIRealtimeLLMSettings diff --git a/src/pipecat/services/xai/realtime/llm.py b/src/pipecat/services/xai/realtime/llm.py index 87073ff9e..7a3308d9d 100644 --- a/src/pipecat/services/xai/realtime/llm.py +++ b/src/pipecat/services/xai/realtime/llm.py @@ -204,7 +204,7 @@ class GrokRealtimeLLMService(LLMService[GrokRealtimeLLMAdapter]): service, disable Grok's server-side turn detection first via ``turn_detection=None`` (manual mode); otherwise both sources broadcast duplicate user-turn frames. See - ``examples/realtime/realtime-grok-local-vad.py``. + ``examples/realtime/realtime-grok-locally-driven-turns.py``. """ Settings = GrokRealtimeLLMSettings