I am trying to fix my livekit agent for small user...
# ask-ai
d
I am trying to fix my livekit agent for small user utterances with indian names. I see that VAD and STT work, however transcription quality is low. Same STT model work better with direct audio.
✅ 1
t
Thanks for reaching out, Ayush. I'm an AI assistant and I'm here to help. Give me a moment while I research this topic.
Thanks — I understand you’re seeing good VAD/STT flow but poorer transcription quality inside LiveKit for short utterances (Indian names), while the same STT model performs better with direct audio. I’ll help you narrow this down and suggest focused tests. Quick summary of what I’ll help with: • Identify audio preprocessing, VAD, and buffering behaviors that can degrade short utterance transcription. • Provide concrete test steps to compare LiveKit capture vs. direct audio. • Ask a few targeted questions so I can recommend precise changes. Please confirm a few details first • Which STT provider and exact model are you using? • What audio format is LiveKit sending to STT (sample rate, bit depth, mono/stereo)? • Is any noise cancellation enabled (for example
krisp_enabled
,
BVCTelephony
, or similar)? • Are you using a VAD adapter (e.g.,
silero.VAD
) or custom logic for speech segmentation? • Are the utterances being mis-transcribed (e.g., “Raj” → “Rack”) or sometimes completely missed/truncated? Immediate checks and quick tests to run 1. Disable noise cancellation temporarily ◦ Turn off
krisp_enabled
/
BVCTelephony()
or other aggressive noise suppression and re-test short utterances. Noise cancellation can suppress soft, short names. 1. Match LiveKit audio format to the “direct audio” that worked ◦ Ensure sample rate, bit depth, and channels match the direct-audio setup (commonly 16 kHz, 16-bit, mono). Differences in sampling or resampling can hurt phonetic clarity. 1. Compare raw audio captures ◦ Record the same utterance both via LiveKit’s captured stream and as your direct-audio file. Listen and/or run them through the STT model directly to see if LiveKit audio is degraded (tone, clipping, gating). 1. Check VAD settings and buffering ◦ If using VAD, make it more sensitive to short speech by lowering
min_speech_duration
and reducing
activation_threshold
so the beginning and end of brief names aren’t clipped. ◦ Verify VAD isn’t buffering/aggregating segments such that it omits the first 100–300 ms of speech. 1. Increase audio source queue size to avoid frame loss ◦ Try increasing
queue_size_ms
(for example to 2000 ms) in your
AudioSource
so frames aren’t dropped under load. 1. Inspect for automatic gain control / filtering ◦ Confirm AGC or additional filtering isn’t altering speech envelope. If present, disable for a test run. If transcription errors are phonetic (names mis-heard) • Consider adding a custom vocabulary or hints to the STT model (if your provider supports it) with common Indian names you expect. This improves recognition of unusual or less-common phonemes. What I can do next for you • If you share the STT provider, sample rate, and whether noise cancellation/VAD are enabled, I’ll give tailored parameter values and exact code/settings to change. • If you can attach a short example audio recorded via LiveKit (and the same audio recorded directly), I can help you compare and point to where degradation occurs. Thanks — once you share those details I’ll give step-by-step changes to try and prioritized settings to adjust. Sources: Troubleshooting STT not picking up utterances | LiveKit | Resolving "InvalidState - failed to capture frame" errors in AudioSource | Speech-to-text (STT) models overview | LiveKit Documentation | TTS Translator with Gladia STT | LiveKit Documentation | Capturing the First Few Seconds of a Call for Processing
d
I am using flux, it is a sip call resampled to 16k in input room options and served at same rate to STT. BVCTelephony noise cancellation is being used, using Silero VAD, and yes utterances are being mistranscribed like Raj -> Rack Also, help me understand 4.5 and 6 points
t
Thanks — this is helpful. I’ll focus on actionable guidance for your setup (Flux SIP → resampled to 16 kHz → BVCTelephony enabled → Silero VAD → STT) and clarify points 4 (VAD buffering / clipping) and 6 (audio quality at ingest). Then I’ll suggest concrete changes to try. Quick summary of the likely problem • Soft, short utterances (names like “Raj”) are especially vulnerable to suppression by aggressive noise cancellation and to clipping by VAD buffering. That combination can change phonetic cues (e.g., “j” → “ck”) and cause the STT model to pick a wrong token. Lower-energy consonants and final consonants are the most affected. Clarification — point 4: VAD buffering and how it can clip short utterances • What VAD buffering means: Your VAD (Silero) typically collects incoming audio into short windows and only emits audio to downstream processing once it decides speech has started and then finished. Those windows plus any smoothing logic can delay or trim the start/end of the detected segment. • How clipping happens for short utterances: ◦ If VAD requires a minimum speech duration or a minimum voiced frames threshold, a very short name may not meet that threshold and the VAD either drops it or emits it missing the first/last few tens-to-hundreds of milliseconds. ◦ If VAD adds pre-roll or post-roll trimming (to remove noise before/after speech), it can accidentally trim the weak initial consonant or final sound of a name. • What you can change (specific knobs): ◦ Lower
min_speech_duration
and
min_voiced_frames
so short words are accepted. ◦ Reduce
min_silence_duration
so the VAD does not wait too long before declaring end-of-speech. ◦ Reduce the activation threshold / energy threshold so softer speech triggers detection. ◦ If Silero VAD is performing smoothing or applying hangover frames, shorten those hangover parameters. • Test to confirm: ◦ Temporarily bypass VAD (stream raw audio to STT) and compare transcription. If accuracy improves, VAD trimming is likely the culprit. ◦ Record and inspect the VAD-emitted segment lengths and waveform to see if initial milliseconds are missing. Clarification — point 6: audio quality at ingest and what to check • What “audio quality at ingest” refers to: the audio arriving into your LiveKit pipeline (after Flux/SIP resampling and any LiveKit pre-processing) — not just the final STT request. Even when you resample to 16 kHz, downstream processing (noise cancellation, AGC, resampling libraries) can alter spectral or temporal cues needed to recognize certain phonemes. • Key items to verify: ◦ Confirm the actual PCM payload sent to the STT engine is 16 kHz, 16-bit, mono and is not being re-encoded (e.g., double resampled or compressed) after the resample step. ◦ Ensure no automatic gain control (AGC), limiter, or extra filtering is enabled between resampling and STT. AGC can change relative energy of consonants and vowels. ◦ Check for packet/frame drops or reordering in the buffer chain that could remove small segments — increasing
queue_size_ms
will surface stability issues. ◦ Listen to or run the exact audio chunk you send to STT through the same STT model outside LiveKit. If that audio transcribes correctly, the problem is earlier in LiveKit (VAD, noise cancellation, or frame handling). • How to capture/inspect: ◦ Export a short sample at the point just before sending to STT (raw PCM blob). Compare it with the direct-audio sample you know is good. ◦ Visually inspect waveforms and spectrograms for the name utterance — look for missing initial consonant energy or unusual filtering of high-frequency content. Concrete configuration tests I recommend (in order) 1. Disable BVCTelephony temporarily and retest a set of names. ◦ If accuracy improves, BVCTelephony is removing important phonetic cues. 1. Bypass Silero VAD for a short A/B test (send raw audio to STT). ◦ If accuracy improves, tune Silero VAD parameters (see below). 1. Tune Silero VAD parameters (only if bypass test shows improvement): ◦ Lower
min_speech_duration
(accept shorter segments). ◦ Lower
activation_threshold
/ energy threshold (detect softer starts). ◦ Lower
min_silence_duration
so VAD closes quickly but doesn’t trim initial ms. ◦ Reduce any hangover frames or lookback that trims pre-roll. 1. Increase
queue_size_ms
(AudioSource) to 2000 ms to prevent dropped frames. 2. Ensure no AGC or filtering is enabled between resample and STT. If present, disable for test. 3. If phonetic errors persist, add a custom vocabulary / phrase hints for common Indian names in your STT model (if provider supports it). Example parameter targets to try (start conservative) • `min_speech_duration`: 50–150 ms • `min_silence_duration`: 50–150 ms • `activation_threshold`: reduce by ~20–30% from current threshold (or set to a lower absolute energy if available) • `queue_size_ms`: 2000 How to validate progress • Run an AB test with a list of 20 representative names (short and soft-spoken). Measure word error rate or simple match rate before/after each change. • For each change, capture the exact audio blob you send to STT and compare spectrograms against the known-good direct audio. If you want, I can: • Provide exact Silero VAD parameter names and suggested code snippets if you share the current VAD settings you’re using. • Help interpret waveform/spectrogram if you upload a pair of samples (LiveKit-captured vs direct audio). Would you like the targeted Silero parameter names and a short code snippet to change them next?
d
On VAD point, I am using flux for STT which is a streaming model. Doesn't livekit put the same audio stream in parallel to both VAD and STT queues? In that case, how is VAD impacting mis-transcription?
t
Thanks — this is a great question and your setup details help a lot (Flux streaming STT via SIP → resampled to 16 kHz → BVCTelephony enabled → Silero VAD). Short answer Even though LiveKit sends the same audio in parallel to both VAD and the streaming STT, VAD still affects transcription because it controls turn/end-of-utterance (EOU) decisions and any buffering or endpointing logic that finalizes what the STT result looks like. Premature or aggressive VAD endpointing can truncate or finalize short utterances (like “Raj”), causing the STT to produce the wrong token. Why this happens (concise, step-by-step) • Parallel streams: both VAD and STT receive audio, but they serve different roles — STT produces live hypotheses, while VAD signals speech boundaries (start/end). • VAD as a gatekeeper: downstream logic often waits for VAD to declare EOU before finalizing and emitting the transcription for use. If VAD signals EOU too early, the STT may be forced to finalize an incomplete hypothesis. • Buffering/StreamAdapter: some flows buffer audio until VAD decides the segment is complete. If buffering trims the first or last few milliseconds of a short name, key phonetic cues (like the “j” in “Raj”) get lost. • Endpointing/Context: streaming models like Flux produce better results when they have context and are allowed to continue receiving audio. VAD-driven early endpointing removes that context and increases the risk of phonetic confusion. • Noise cancellation interaction: BVCTelephony or aggressive denoising can reduce the energy of soft consonants; combined with VAD’s timing, small sounds can be removed or misinterpreted. Practical examples of how VAD causes mis-transcription • VAD declares end-of-utterance after a short silence right after “Ra…”, cutting off the “j” energy. STT finalizes as “Rack” or similar. • VAD applies smoothing/hangover that trims pre-roll; the initial consonant is clipped before STT sees it. • VAD thresholds too high: soft starts aren’t detected correctly and are dropped or misaligned in buffers. What to test right now (ordered) 1. Temporary bypass: send raw audio directly to Flux (disable VAD-driven EOU logic) for a quick A/B. If transcription improves, VAD timing is the cause. 2. Use STT-based turn detection: let Flux endpoint semantically instead of relying on Silero for EOU. This uses acoustic + linguistic cues and usually improves short utterance handling. 3. Tune Silero VAD parameters (only if you must keep it for interruption handling): ◦ Lower
min_speech_duration
(accept shorter segments). ◦ Lower
activation_threshold
/ energy threshold (detect softer starts). ◦ Lower
min_silence_duration
or hangover so it doesn’t close too early but avoid trimming pre-roll. 1. Disable BVCTelephony temporarily to see if denoising is removing consonant energy. 2. Capture the exact audio frames sent to STT (and VAD) for a problematic utterance and compare spectrograms with the direct-good sample — look for missing initial high-frequency content or clipped transients. 3. Increase
queue_size_ms
to reduce frame drops and buffering artifacts if you see frame loss. Suggested configuration change (example) • Prefer STT endpointing with Flux:
Copy code
# pseudocode / conceptual
session = AgentSession(
  turn_detection="stt",
  stt=deepgram.STTv2(model="flux-general-en"),
  vad=silero.VAD.load()  # keep for interruption handling only
)
• If keeping VAD endpointing, try: ◦ min_speech_duration: 50–150 ms ◦ min_silence_duration: 50–150 ms ◦ reduce activation_threshold by ~20–30% or set to a lower absolute energy Final notes and offer • Because you’re on a streaming Flux model, STT-based endpointing is usually the most robust for short, phonetically tricky utterances. • If you want, share a short pair of samples (LiveKit-captured audio vs the direct-good audio) or your current Silero VAD parameter names and values. I can suggest exact parameter edits and a small test plan to measure improvement. Would you like the exact Silero parameter names and a small code snippet to change them next? Sources: Speech-to-text (STT) models overview | LiveKit Documentation | Improving voice AI's turn detection with transformers | How does end-of-utterance detection work in conversations? | OpenAI and LiveKit partner to turn Advanced Voice into an API | Agents Framework | livekit/livekit_composite | DeepWiki
d
I removed VAD, but have not set turn_detection explicitly. I think default for that is VAD - what would be happening here?
t
Thanks — that’s a good catch and a very important detail to clarify. What’s happening when you remove VAD but don’t set turn_detection • When you remove VAD but leave
turn_detection
unset, the system uses the default of
turn_detection = "vad"
. • With no active VAD to emit end-of-utterance (EOU) events, the agent never receives the speech-boundary signal it expects. As a result, the agent will wait for an EOU that never arrives and won’t finalize or emit the stabilized transcript/turn. In practice this looks like the STT producing live hypotheses but no final turn being delivered to downstream logic (so the mis-transcription behavior or missing final tokens persists). Why this matters for Flux streaming STT • Flux streams live audio and produces interim transcripts, but downstream logic commonly waits for a definitive EOU before finalizing the transcription for use. If EOU comes from VAD by default and VAD is absent, the agent has no trigger to finalize the turn even though Flux is streaming. • Letting Flux (STT) handle endpointing is preferable for short utterances and names because Flux uses acoustic + linguistic cues and won’t prematurely finalize on brief pauses the way a simple energy-based VAD might. What to do next (recommended, concrete) 1. Explicitly set turn_detection to STT endpointing:
Copy code
turn_detection = "stt"
# or in your AgentSession config:
session = AgentSession(
  turn_detection="stt",
  stt=deepgram.STTv2(model="flux-general-en"),
  vad=None  # optional: keep VAD only for interruption handling if you want
)
• This tells the agent to rely on the streaming STT model’s endpointing instead of a missing VAD. 1. If you still want interruption handling: • Keep Silero VAD active, but use it only to detect interruptions, not to finalize turns. Configure
turn_detection="stt"
while leaving
vad
present for immediate interruption signals. 1. Validate the change: • Run an A/B test with a few short name utterances and confirm final transcripts are emitted and accuracy improves. • Capture the STT “final” messages and ensure they are being forwarded to your downstream logic. Quick troubleshooting checklist if final transcripts still look wrong • Confirm agent is actually receiving the Flux finalization events (inspect STT event stream). • Temporarily disable BVCTelephony to ensure denoising isn’t removing consonant energy. • If errors persist, capture the exact audio chunk sent to STT at the moment of finalization and compare to the direct-good audio. If you want, share how you configure your AgentSession (code snippet) and I’ll give the exact changes to make and a short test script to verify final transcripts come through.
d
I trued calling, and the bot seems to work well. No turn detection set, using flux with no vad. However it still mistranscribed
t
Thanks — I appreciate you testing and reporting back. You’ve done the right things (removed VAD, left Flux as the STT source, no explicit turn_detection) and it’s useful that the bot “works” but still mis-transcribes names like “Raj.” I’ll walk through why this can still happen and give focused, practical steps you can try next. Why mistranscription can persist even without VAD • Flux is streaming and can produce interim hypotheses, but transcription quality depends on the exact audio fed into the model at the moment it finalizes. Removing VAD removes one source of clipping, but other factors still change phonetic cues the model needs (especially for short, low-energy consonants). • Two major remaining suspects: a. Noise cancellation (BVCTelephony) can attenuate soft consonant energy (the “j” in “Raj”), causing phonetic confusion. b. Ingest/processing differences (resampling chain, AGC, frame drops, buffering) can alter timing or spectral content even when nominally 16 kHz. Concrete next steps (in priority order) 1. Temporarily disable BVCTelephony and retest ◦ This is the single highest-impact change. If accuracy improves, BVCTelephony is removing important phonetic detail. 1. Capture and compare the exact audio sent to Flux vs your direct-good audio ◦ Export a short sample (the PCM blob) at the point just before sending to Flux and compare waveform/spectrogram with the direct audio that transcribed well. Look for missing initial consonant energy, smoothing, or high-frequency attenuation. 1. Confirm there’s no AGC/limiter or extra resampling happening after your 16k resample ◦ Ensure the final PCM is 16 kHz, 16-bit, mono and is not being processed again by AGC, compressors, or extra resamplers. 1. Inspect frame delivery / buffering ◦ Increase
queue_size_ms
(e.g., to 2000 ms) for your AudioSource to avoid dropped frames or reordering under load. ◦ Log timestamps/sequence numbers of frames when the name is spoken to confirm no packets are missing. 1. Add targeted language hints / custom vocabulary (if your STT provider supports it) ◦ Supply common Indian names (Raj, Rahul, Priya, etc.) as phrase-hints or custom vocabulary to bias the model toward correct tokens. 1. Run a short A/B test matrix ◦ Test combinations of: BVCTelephony ON/OFF, queue_size default / 2000, hints ON/OFF. ◦ Use a list of 20 representative names; track match rate or simple WER. If you want to dig deeper, I can help with: • Exact commands/snippets to disable BVCTelephony in your current config. • A short script to capture the PCM chunk sent to Flux for a given utterance and produce spectrograms (or instructions to attach samples). • Recommended small set of phrase-hints you can feed to Flux. Which of the above would be most useful right now — the BVCTelephony disable snippet, the audio capture script, or suggested phrase-hints to try first?
d
"Increase
queue_size_ms
(e.g., to 2000 ms) for your AudioSource to avoid dropped frames or reordering under load." Where to find this config
t
Thanks — great question. You configure
queue_size_ms
when you create the AudioSource in your LiveKit RTC code. It increases the internal audio buffer (in milliseconds) to reduce frame drops or capture failures under load. Quick example (Python SDK):
Copy code
from livekit import rtc

audio_source = rtc.AudioSource(
    sample_rate=16000,    # match your STT input
    num_channels=1,       # mono
    queue_size_ms=2000    # increase buffer to reduce dropped frames
)
Notes and tips • Start with 1000–2000 ms and lower if you see added latency you don’t want. • Monitor logs for "failed to capture frame" or timing gaps; if those appear, increase
queue_size_ms
. • This setting only affects the audio capture buffer; it won’t change STT behavior directly but helps ensure the audio reaching STT is complete and not missing small segments. • Keep your sample rate and channels matched (e.g., 16 kHz mono) to avoid extra resampling later. If you tell me which SDK/language you’re using (Node, Python, Go, etc.), I’ll paste the exact snippet for that environment. Sources: Resolving "InvalidState - failed to capture frame" errors in AudioSource | Resolving "InvalidState - failed to capture frame" errors in AudioSource | ...
d
I am using python, using SIPParticipant as user for source audio
t
Thanks — great detail on your setup. You’re using Python with a SIPParticipant as the audio source, so here’s exactly what’s happening and how to act. Short answer • When your audio comes from a SIPParticipant track, you don’t create a low-level
rtc.AudioSource
yourself, so
queue_size_ms
is not directly configurable there. The SIPParticipant audio path is managed by the platform and won’t expose that AudioSource constructor parameter. What that means practically • You cannot set
queue_size_ms
on a SIPParticipant like you would on a custom
AudioSource(...)
. • However, the problems
queue_size_ms
is meant to solve (dropped frames, missing initial audio, capture under load) can be mitigated by other settings and tests you can control for SIP-based flows. Actions you can take now (priority order) 1. Enable preconnect buffering so the system captures audio during the connection handshake and avoids losing the start of an utterance: ◦ In the Python agent connect call, use
preconnect_buffer=True
(or the equivalent option your SDK exposes) when attaching the SIP participant or connecting the agent. ◦ This preserves a short window of audio before the agent is fully connected, capturing early speech that might otherwise be lost. 1. Verify/disable upstream double-processing (noise cancellation) ◦ Confirm your SIP trunk or carrier doesn’t already apply `krisp`/AGC. If server-side processing is enabled, disable agent-side
BVCTelephony()
to avoid double filtering that can remove consonant energy. 1. Tune STT endpointing instead of VAD (you already removed VAD) ◦ Ensure
turn_detection="stt"
so Flux’s semantic endpointing finalizes turns rather than relying on silence-based signals that can be missing or delayed in SIP flows. 1. Capture the exact audio being sent to Flux ◦ Add a short recording hook on the SIPParticipant track to dump PCM frames to disk at the time of the utterance. Compare that dump to your direct-good audio to see if audio is being clipped, low-gain, or filtered. ◦ If the captured SIP PCM is missing the start / low on high-frequency content, that’s evidence of frame drops or pre-processing affecting the audio (and you can escalate on that basis). 1. Use conservative VAD / interruption handling only ◦ If you still want VAD for interruption detection, keep it but with lenient settings (high min_silence_duration, low activation threshold) and set
turn_detection="stt"
. This keeps interruption detection without letting VAD finalize turns. 1. Increase buffer-related limits where available ◦ Some SDK/server settings control buffering or jitter buffers for SIP. Check your SIP integration settings for jitter buffer size, packet-reorder tolerance, or similar — increasing those can have a similar effect to raising
queue_size_ms
. If you’d like, I can: • Provide the exact Python snippet you should add to enable preconnect buffering in your current connect logic (share the connect snippet). • Give a short recording hook example to dump PCM frames from the SIPParticipant track for comparison. • List the SIP/jitter buffer settings to check on your SIP trunk/carrier if you tell me the SIP provider or config panel you’re using. Which would you like next — the preconnect snippet or the PCM-capture hook? Sources: Choosing the right noise cancellation for your agent | LiveKit | Deepgram STT | LiveKit Documentation | Deepgram STT plugin guide | LiveKit Documentation | Resolving "InvalidState - failed to capture frame" errors in AudioSource | Agent speech and audio | LiveKit Documentation
d
I removed noise cancellation, captured audio being fed to DG and this is how it sounds -
t
Thanks — that’s very helpful progress. I appreciate you removing noise cancellation and capturing the audio fed to Deepgram. Please share the captured audio file (or a short clip of the problematic utterance) so I can analyze it. If you can’t attach a file, describe what you hear in the clip with as much detail as possible (examples below). Either way, I’ll walk through a focused checklist and next steps based on what I find. What to attach / describe • A 1–3 second PCM/ WAV clip of the utterance as sent to Deepgram (the exact frame blob you recorded). • The same utterance recorded directly (the “good” audio) if available for A/B comparison. If you can only describe the clip, tell me whether you observe: • Clipping or truncated start/end (does the clip seem to cut off the first or last 10–200 ms?) • Low overall volume (is it much quieter than the direct-good file?) • Muffled sound or low/high-frequency loss (does it lack crispness or sibilance?) • Audible gating/hang or sudden dropouts • Constant background tone or compression artifacts • Any time shift or reverb compared to the direct recording What I’ll do after you share • Inspect waveform and spectrogram to look for: ◦ Missing initial consonant energy (which would explain “Raj” → “Rack”) ◦ High-frequency attenuation or filtering ◦ Clipping, compression, or transient loss ◦ Temporal alignment differences (frame drops or delayed frames) • Recommend precise config changes (e.g., disable/adjust filters, change gain or jitter-buffer settings, exact Silero or Flux params) and provide a short test plan to validate improvements. Quick interim checklist you can run now • Confirm the capture you sent is 16 kHz, 16-bit, mono (if not, include format). • Re-run one test with BVCTelephony disabled (you said you removed it; if you re-enable briefly, test both) and attach results for comparison. • If possible, record the moment the user speaks on both the SIP side and the direct-good source so we can time-align them. Send the clip (or the description) and I’ll analyze it and give targeted fixes.
d
1d78796c-f0c6-423c-be79-1507e7dd40b1.wav
t
Thanks — I see your last message was empty. If you already uploaded the captured audio clip, I don’t seem to have received it. To move forward I can either analyze the audio or guide you through more tests. Please do one of the following: • Attach the captured PCM/WAV clip (1–3s) that you recorded and sent to Deepgram (the utterance that transcribes “Raj” → “Rack”). If you also have the direct-good recording, attach that too for A/B comparison. • If you can’t attach audio, describe what you hear in the captured clip (pick any that apply): ◦ Is the start or end truncated (first/last 10–200 ms missing)? ◦ Is the overall volume much lower than the direct recording? ◦ Does it sound muffled, tinny, or low in high-frequency content? ◦ Any hum, compression artifacts, sudden dropouts, or gating sounds? ◦ Is there latency/echo compared to the direct recording? If you prefer, tell me which of these you want next and I’ll provide the exact steps: • A short Python hook to dump the SIPParticipant PCM frames to a WAV file. • A spectrogram/waveform inspection script to run locally and produce images we can discuss. • Exact config snippets to test (disable BVCTelephony, set turn_detection="stt", Silero params, preconnect_buffer snippet). Which do you want to try first?
d
I have added the audio
t
I don't have the answer you're looking for. You could also try asking your question: • in one of the other Slack channels or • to https://deepwiki.com/livekit/livekit_composite which is trained on all LiveKit source code If you find the answer, please post it here to help others!