Use a device with a higher-quality microphone as a virtual microphone on your Linux PC.
Laptop microphones are often low quality. RemoteMic lets you use your phone’s microphone as a virtual system input on your Linux machine over WiFi-no cables required.
flowchart LR
subgraph Phone["Phone / Browser Device"]
Mic["Microphone"]
Browser["Web Browser"]
end
subgraph PC["Linux PC"]
Server["RemoteMic Server"]
Pipe["Named Pipe (FIFO)"]
Pulse["PulseAudio / PipeWire"]
Source["Virtual Mic: RemoteMic"]
end
Mic --> Browser
Browser -- "WebSocket (16-bit PCM audio)" --> Server
Server --> Pipe
Pipe --> Pulse
Pulse --> Source
- The RemoteMic server runs on your Linux PC.
- It creates a virtual microphone source using PulseAudio (
module-pipe-source) or PipeWire compatibility. - A browser device connects via WebSocket over the network.
- The browser captures microphone audio using the Web Audio API.
- Audio is streamed as 16-bit PCM (mono or stereo) to the server.
- The server writes audio into a named pipe (FIFO).
- PulseAudio/PipeWire exposes it as an input device: RemoteMic.
- Linux with PulseAudio or PipeWire (PulseAudio-compatible)
pactl(frompulseaudio-utils)
- Modern browser (Chrome, Firefox, Safari, etc.)
- Microphone permission enabled
- HTTPS connection (required for mic access in most browsers)
curl -L https://github.com/goldpulpy/RemoteMic/releases/download/latest/remotemic -o remotemic
chmod +x remotemic
sudo mv remotemic /usr/local/bin/remotemicAlternatively, if you prefer
wget:
wget https://github.com/goldpulpy/RemoteMic/releases/download/latest/remotemic
chmod +x remotemic
sudo mv remotemic /usr/local/bin/remotemicmake release
chmod +x ./target/x86_64-unknown-linux-musl/release/remotemic
sudo mv ./target/x86_64-unknown-linux-musl/release/remotemic /usr/local/bin/remotemicremotemicBy default, it starts on a random available port.
To specify a port:
remotemic -p 9000On startup, RemoteMic will:
- Verify
pactlis available - Check required audio libraries
- Create a virtual microphone named RemoteMic
- Start the HTTP + WebSocket server
Open your system sound settings:
- Go to Settings → Sound → Input
- Select RemoteMic as the active input device
You can verify with:
pactl list short sourcesCreate a secure tunnel:
Example using localtunnel:
npx localtunnel --port <port>This will generate a URL like:
https://your-tunnel.loca.lt
You can also use alternatives like:
- ngrok
- Cloudflare Tunnel
Warning
Microphone access requires HTTPS.
- Open the tunnel URL in your phone browser
- Tap Connect
- Grant microphone permissions
- Audio will stream live to your Linux PC
- Phone-as-mic streaming over WiFi
- Single active client (prevents audio conflicts)
- Mute toggle (pause streaming without disconnecting)
- Live audio level meter
- Graceful shutdown and cleanup
- Real-time connection logs in terminal
- Codec: Raw PCM
- Bit depth: 16-bit signed integer
- Channels: Mono (default) / configurable stereo
- Transport: WebSocket
- Typical sample rate: 44.1kHz or 48kHz (browser-dependent)
# Ubuntu / Debian
sudo apt install pulseaudio-utils
# Fedora
sudo dnf install pulseaudio-utils
# Arch
sudo pacman -S libpulse# Ubuntu / Debian
sudo apt install libpulse0 libasound2
# Fedora
sudo dnf install pulseaudio-libs alsa-lib
# Arch
sudo pacman -S libpulse alsa-libpactl list short sourcesIf missing:
- Restart PulseAudio / PipeWire
- Restart RemoteMic server
Check:
- Correct input device selected in system settings
- Browser microphone permission granted
- Phone tab is actively connected (not background-suspended)
- Refresh browser page and reconnect
When exposed via public tunnel URLs, anyone with the link can potentially connect and stream audio.
Use trusted tunnels and avoid sharing URLs publicly unless protected.
MIT License — see LICENSE for details.