tinyhumansai/openhuman · error

[meet-video-producer] silent audio play() failed

Error message

[meet-video-producer] silent audio play() failed

What it means

Playing the muted looping silent-WAV keep-alive audio element failed at producer mount. The element exists to keep the webview's audio pipeline warm (a Chromium autoplay/audio-graph workaround for the meet session); its play() rejected — typically because autoplay policy blocked it before any user gesture, or the element was detached mid-play. Impact is limited to potential first-sound latency/under-run, not correctness of video frames.

Source

Thrown at app/src/features/meet/MascotFrameProducer.tsx:335

    }
  }, [session.requestId]);

  useEffect(() => {
    stoppedRef.current = false;

    const SILENT_WAV =
      'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEAQB8AAEAfAAABAAgAAABmYWN0BAAAAAAAAABkYXRhAAAAAA==';
    const keepAliveAudio = document.createElement('audio');
    keepAliveAudio.muted = true;
    keepAliveAudio.loop = true;
    keepAliveAudio.autoplay = true;
    keepAliveAudio.preload = 'auto';
    keepAliveAudio.src = SILENT_WAV;
    keepAliveAudio.style.display = 'none';
    document.body.appendChild(keepAliveAudio);
    void keepAliveAudio
      .play()
      .catch(err => console.warn('[meet-video-producer] silent audio play() failed', err));

    const url = `ws://127.0.0.1:${session.port}`;
    let ws: WebSocket;
    try {
      ws = new WebSocket(url);
    } catch (err) {
      console.warn('[meet-video-producer] ws ctor failed', err);
      return;
    }
    ws.binaryType = 'arraybuffer';
    wsRef.current = ws;
    ws.onopen = () => {
      wsReadyRef.current = true;
      console.log('[meet-video-producer] ws connected', url);
    };
    ws.onclose = () => {
      wsReadyRef.current = false;
      console.log('[meet-video-producer] ws closed');

View on GitHub (pinned to 7491200858)

Solutions

  1. If audio in the meet session also fails, trigger any user gesture in the window and check whether audio then works (autoplay policy)
  2. Check the warned err name — NotAllowedError confirms autoplay blocking; AbortError usually means the element was reset mid-play
  3. No action needed if meet audio works — the keep-alive is best-effort
  4. If persistent, restart the meet session after a user interaction with the window
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at app/src/features/meet/MascotFrameProducer.tsx:335 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17). Data as JSON: /api/errors/2878f792fcb00c55. Report an issue: GitHub.