List all the Microphones connected to System in Python using PyAudio

PyAudio is a powerful Python library that provides bindings for PortAudio, enabling audio input/output operations across multiple platforms. One common requirement when working with audio applications is identifying and listing all available microphones connected to the system.

Installation

Before using PyAudio, install it using pip ?

pip install pyaudio

For Jupyter notebooks, use ?

!pip install pyaudio

Getting Device Count

First, let's check how many audio devices are connected to your system ?

import pyaudio

# Create PyAudio instance
p = pyaudio.PyAudio()

# Get total number of audio devices
device_count = p.get_device_count()
print(f"Total audio devices: {device_count}")

# Clean up
p.terminate()
Total audio devices: 4

Listing All Microphones

To identify microphones, we check the maxInputChannels property. Devices with input channels greater than 0 are microphones ?

import pyaudio

# Create PyAudio instance
p = pyaudio.PyAudio()

print("Available Microphones:")
print("-" * 40)

# Iterate through all devices
for i in range(p.get_device_count()):
    device_info = p.get_device_info_by_index(i)
    
    # Check if device has input channels (microphone)
    if device_info.get('maxInputChannels') > 0:
        name = device_info.get('name')
        index = device_info.get('index')
        channels = device_info.get('maxInputChannels')
        rate = int(device_info.get('defaultSampleRate'))
        
        print(f"Index: {index}")
        print(f"Name: {name}")
        print(f"Channels: {channels}")
        print(f"Sample Rate: {rate} Hz")
        print("-" * 40)

# Clean up
p.terminate()
Available Microphones:
----------------------------------------
Index: 0
Name: Built-in Microphone
Channels: 2
Sample Rate: 44100 Hz
----------------------------------------
Index: 2
Name: USB Microphone
Channels: 1
Sample Rate: 48000 Hz
----------------------------------------

Creating a Microphone Selection Function

Here's a reusable function to select and validate a specific microphone by index ?

import pyaudio

def get_microphone_info(device_index):
    """Get information about a specific microphone device."""
    p = pyaudio.PyAudio()
    
    try:
        device_info = p.get_device_info_by_index(device_index)
        
        if device_info.get('maxInputChannels') > 0:
            return {
                'name': device_info.get('name'),
                'index': device_info.get('index'),
                'channels': device_info.get('maxInputChannels'),
                'sample_rate': int(device_info.get('defaultSampleRate'))
            }
        else:
            return None
    except Exception as e:
        print(f"Error: {e}")
        return None
    finally:
        p.terminate()

# Test the function
mic_info = get_microphone_info(0)
if mic_info:
    print(f"Selected Microphone: {mic_info['name']}")
    print(f"Channels: {mic_info['channels']}")
    print(f"Sample Rate: {mic_info['sample_rate']} Hz")
else:
    print("No microphone found at index 0")
Selected Microphone: Built-in Microphone
Channels: 2
Sample Rate: 44100 Hz

Complete Microphone Listing Script

Here's a comprehensive script that combines all functionality ?

import pyaudio

def list_microphones():
    """List all available microphones with detailed information."""
    p = pyaudio.PyAudio()
    microphones = []
    
    print("Scanning for microphones...")
    print("=" * 60)
    
    for i in range(p.get_device_count()):
        try:
            device_info = p.get_device_info_by_index(i)
            
            if device_info.get('maxInputChannels') > 0:
                mic_data = {
                    'index': i,
                    'name': device_info.get('name'),
                    'channels': device_info.get('maxInputChannels'),
                    'sample_rate': int(device_info.get('defaultSampleRate')),
                    'api': device_info.get('hostApi')
                }
                microphones.append(mic_data)
                
                print(f"[{i:2d}] {mic_data['name']}")
                print(f"     Channels: {mic_data['channels']}, "
                      f"Sample Rate: {mic_data['sample_rate']} Hz")
                print("-" * 60)
                
        except Exception as e:
            print(f"Error reading device {i}: {e}")
    
    p.terminate()
    
    if not microphones:
        print("No microphones found!")
    else:
        print(f"\nTotal microphones found: {len(microphones)}")
    
    return microphones

# Execute the function
available_mics = list_microphones()
Scanning for microphones...
============================================================
[ 0] Built-in Microphone
     Channels: 2, Sample Rate: 44100 Hz
------------------------------------------------------------
[ 2] USB Microphone
     Channels: 1, Sample Rate: 48000 Hz
------------------------------------------------------------

Total microphones found: 2

Key Points

When working with PyAudio microphone detection:

  • Always terminate PyAudio instances with p.terminate() to free resources
  • Check maxInputChannels to identify input devices (microphones)
  • Handle exceptions when accessing device information
  • Note device indices may change between system restarts

Conclusion

PyAudio provides a straightforward way to enumerate and identify microphones connected to your system. Use get_device_count() and get_device_info_by_index() to discover available input devices. This foundation enables building sophisticated audio recording and processing applications.

Updated on: 2026-03-27T08:22:55+05:30

4K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements