pbakaus/impeccable · warning

[impeccable.voice] recognition error:

Error message

[impeccable.voice] recognition error:

What it means

The Web Speech API SpeechRecognition instance used by impeccable's voice mode fired its onerror handler. The raw browser error code (e.g. 'not-allowed', 'no-speech', 'network', 'audio-capture', 'aborted', 'service-not-allowed') is logged, then the recognition is stopped with a user-facing message derived by steerVoiceErrorMessage. It indicates the voice recognition session ended due to a browser/speech-service error rather than a transcript.

Source

Thrown at skill/scripts/live-browser.js:10626

    rec.onstart = () => {
      syncVoiceUi(true);
    };

    rec.onresult = (event) => {
      if (!voiceCtx?.input) return;
      let transcript = '';
      for (let i = 0; i < event.results.length; i++) {
        transcript += event.results[i][0]?.transcript || '';
      }
      voiceCtx.input.value = (voiceInterimBase + transcript).trim();
      if (voiceCtx.mode === 'steer') syncPageChatVisual();
      else syncConfigureInputChrome();
    };

    rec.onerror = (event) => {
      const code = event.error || 'unknown';
      console.warn('[impeccable.voice] recognition error:', code);
      const message = steerVoiceErrorMessage(code);
      stopVoice({ suppressSubmit: true, message: message || undefined });
    };

    rec.onend = () => {
      if (voiceRecognition !== rec) return;
      finishVoiceSession();
    };

    voiceRecognition = rec;
    try {
      rec.start();
    } catch (err) {
      console.warn('[impeccable.voice] start failed:', err);
      stopVoice({
        suppressSubmit: true,
        message: err?.message?.includes('already started')
          ? 'Voice input already running'

View on GitHub (pinned to 2bc2879276)

Solutions

  1. Grant the site microphone permission (padlock icon > Microphone > Allow) and retry voice mode.
  2. Use Chrome or Edge — Web Speech recognition needs a supporting engine.
  3. Check network access to the browser's speech service (proxies/VPN can block it; 'network' code).
  4. Verify a microphone is connected and not exclusively captured by another application ('audio-capture').
  5. For transient 'no-speech' or 'aborted', simply restart the voice session and speak promptly.
Defensive patterns

Strategy: try-catch

Validate before calling

// before starting recognition, check support and permission
if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {
  showToast('Voice recognition is not supported in this browser');
}
const perms = await navigator.permissions.query({ name: 'microphone' }).catch(() => null);
if (perms && perms.state === 'denied') showToast('Microphone permission is blocked');

Type guard

function isSpeechErrorEvent(event) {
  return event && typeof event.error === 'string';
}

Try / catch

rec.onerror = (event) => {
  const code = isSpeechErrorEvent(event) ? event.error : 'unknown';
  console.warn('[impeccable.voice] recognition error:', code);
  const message = steerVoiceErrorMessage(code);
  stopVoice({ suppressSubmit: true, message: message || undefined }); // degrade gracefully, never throw
};

Prevention

When it happens

Trigger: rec.onerror fires during a live-mode voice (steer/configure) session — microphone permission denied ('not-allowed'/'service-not-allowed'), no speech detected within the timeout ('no-speech'), speech-service network failure ('network'), no microphone ('audio-capture'), or recognition aborted.

Common situations: Browser lacks microphone permission or the site was blocked; using a browser without a supported speech backend (Firefox); offline or corporate proxy blocking the speech service; mic in use by another app; user stayed silent past the no-speech timeout.

Related errors


AI-assisted analysis of pbakaus/impeccable@2bc2879276 (2026-09-08). Data as JSON: /api/errors/0a7c25a8d9b49f72. Report an issue: GitHub.