Aider-AI/aider · error · SoundDeviceError

No audio input device detected. Please check your audio…

Error message

No audio input device detected. Please check your audio settings and try again.

What it means

In Voice.raw_record_and_transcribe, before opening an input stream the code queries the chosen device's default input sample rate via sd.query_devices(self.device_id, "input"). A sounddevice.PortAudioError from that query is converted to SoundDeviceError('No audio input device detected...') — PortAudio itself reports no usable input device. This is an environment/backend problem (no mic, disabled device, or a broken audio server), distinct from the later stream-open failure at voice.py:138.

Solutions

  1. Verify an input device exists and is enabled: python -c "import sounddevice as sd; print([d['name'] for d in sd.query_devices() if d['max_input_channels']>0])" — empty list confirms the OS sees no mic.
  2. On headless/SSH/container environments, attach an audio device (docker --device /dev/snd, PulseAudio socket forward) or use text input instead of voice.
  3. On Linux, restart/verify the sound server (pulseaudio -k && pulseaudio -D or check pipewire) so devices enumerate.
  4. Enable/unmute the microphone in OS privacy settings and re-run.

Example fix

# before (headless box)
from aider.voice import Voice
Voice().record_and_transcribe()  # SoundDeviceError: No audio input device detected

# after (guard before recording)
import sounddevice as sd
try:
    inputs = [d["name"] for d in sd.query_devices() if d["max_input_channels"] > 0]
except Exception:
    inputs = []
if not inputs:
    raise SystemExit("No microphone available; use text input instead.")
Voice().record_and_transcribe()
Defensive patterns

Strategy: validation

Validate before calling

import sounddevice as sd

def has_input_device() -> bool:
    try:
        return any(d["max_input_channels"] > 0 for d in sd.query_devices())
    except (OSError, ModuleNotFoundError, sd.PortAudioError):
        return False

Try / catch

from aider.voice import SoundDeviceError, Voice
try:
    text = Voice().record_and_transcribe()
except SoundDeviceError as e:
    if "No audio input device" in str(e):
        text = input("No mic available — type instead: ")
    else:
        raise

Prevention

When it happens

Trigger: Calling record_and_transcribe()/raw_record_and_transcribe on a machine where PortAudio finds no default input device: headless server/VM/container with no audio hardware, microphone disabled at OS level, or Linux sound server (PulseAudio/PipeWire) down so query_devices cannot resolve an input.

Common situations: Running aider's voice feature over SSH or in Docker where /dev/snd is absent; CI machines; laptops with mic privacy-switch off or mic disabled in BIOS/OS; Linux after the audio daemon crashes.

Related errors


AI-assisted analysis of Aider-AI/aider@5dc9490bb3 (2026-08-15). Data as JSON: /api/errors/dff124627bfb5486. Report an issue: GitHub.

Appendix: source

Thrown at aider/voice.py:126

            return self.raw_record_and_transcribe(history, language)
        except KeyboardInterrupt:
            return
        except SoundDeviceError as e:
            print(f"Error: {e}")
            print("Please ensure you have a working audio input device connected and try again.")
            return

    def raw_record_and_transcribe(self, history, language):
        self.q = queue.Queue()

        temp_wav = tempfile.mktemp(suffix=".wav")

        try:
            sample_rate = int(self.sd.query_devices(self.device_id, "input")["default_samplerate"])
        except (TypeError, ValueError):
            sample_rate = 16000  # fallback to 16kHz if unable to query device
        except self.sd.PortAudioError:
            raise SoundDeviceError(
                "No audio input device detected. Please check your audio settings and try again."
            )

        self.start_time = time.time()

        try:
            with self.sd.InputStream(
                samplerate=sample_rate, channels=1, callback=self.callback, device=self.device_id
            ):
                prompt(self.get_prompt, refresh_interval=0.1)
        except self.sd.PortAudioError as err:
            raise SoundDeviceError(f"Error accessing audio input device: {err}")

        with sf.SoundFile(temp_wav, mode="x", samplerate=sample_rate, channels=1) as file:
            while not self.q.empty():
                file.write(self.q.get())

        use_audio_format = self.audio_format

View on GitHub (pinned to 5dc9490bb3)