fix: log teamsbot audio capture diagnostics in gateway

Read and log per-chunk capture diagnostics (trackId, readyState, rms, nativeSampleRate) from bot audioChunk messages to support root-cause analysis of silent audio streams.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
patrick-motsch 2026-02-24 14:55:43 +01:00
parent 312163d34a
commit ea8cffee3c

View file

@ -302,11 +302,13 @@ class TeamsbotService:
audioData = message.get("audio", {}) audioData = message.get("audio", {})
audioBase64 = audioData.get("data", "") audioBase64 = audioData.get("data", "")
sampleRate = audioData.get("sampleRate", 16000) sampleRate = audioData.get("sampleRate", 16000)
captureDiagnostics = audioData.get("captureDiagnostics") or {}
if audioBase64: if audioBase64:
await self._processAudioChunk( await self._processAudioChunk(
sessionId=sessionId, sessionId=sessionId,
audioBase64=audioBase64, audioBase64=audioBase64,
sampleRate=sampleRate, sampleRate=sampleRate,
captureDiagnostics=captureDiagnostics,
interface=interface, interface=interface,
voiceInterface=voiceInterface, voiceInterface=voiceInterface,
websocket=websocket, websocket=websocket,
@ -390,6 +392,7 @@ class TeamsbotService:
sessionId: str, sessionId: str,
audioBase64: str, audioBase64: str,
sampleRate: int, sampleRate: int,
captureDiagnostics: Optional[Dict[str, Any]],
interface, interface,
voiceInterface, voiceInterface,
websocket: WebSocket, websocket: WebSocket,
@ -401,6 +404,16 @@ class TeamsbotService:
if len(audioBytes) < 1000: if len(audioBytes) < 1000:
return return
if captureDiagnostics:
trackId = captureDiagnostics.get("trackId")
readyState = captureDiagnostics.get("readyState")
rms = captureDiagnostics.get("rms")
nativeSampleRate = captureDiagnostics.get("nativeSampleRate")
logger.debug(
f"[AudioChunk] diagnostics: track={trackId}, readyState={readyState}, "
f"rms={rms}, nativeRate={nativeSampleRate}, bytes={len(audioBytes)}"
)
# Detect silent/all-zeros audio early to avoid expensive STT calls # Detect silent/all-zeros audio early to avoid expensive STT calls
if len(set(audioBytes[100:min(500, len(audioBytes))])) < 3: if len(set(audioBytes[100:min(500, len(audioBytes))])) < 3:
logger.debug(f"[AudioChunk] Skipping silent audio ({len(audioBytes)} bytes, low byte variation)") logger.debug(f"[AudioChunk] Skipping silent audio ({len(audioBytes)} bytes, low byte variation)")