How to Set Up an External Voice Server
Moving pma-voice to its own server is one of the biggest free performance wins for any FiveM server with 60+ players. This guide walks you through every single step - from ordering a 5€ VPS to the final config edit - for both Linux and Windows voice hosts. At the end you get two production-tested configs you can copy verbatim.
pma-voice is the most widely-used voice chat resource for FiveM. By default it runs in "server-mode" on FXServer itself - which works fine for small servers but becomes a serious bottleneck at 80+ players. This tutorial shows you how to offload voice to a dedicated external server using the Mumble-compatible protocol. Pick your voice-host platform below - both paths are covered end to end.
Why External Voice?
When pma-voice runs on your main server, every voice packet flows through FXServer. At 150 players with active voice, that's 100+ Mbps of UDP traffic plus significant CPU load on the same thread that runs your scripts. By moving voice to its own VPS, you free up that entire workload.
Pros of External Voice
- Removes voice CPU load from the main FiveM server
- Better voice quality - dedicated CPU for audio mixing
- Lower latency if voice VPS is geographically closer to players
- Scales independently - upgrade voice without touching main
- Survives main-server restarts - voice stays stable
Cons of External Voice
- Extra monthly cost (around 5-10€ for a small VPS)
- Additional server to maintain and monitor
- Requires basic command-line knowledge
- If voice server goes down, players can still play - but without voice
When Should You Make the Switch?
Rule of thumb: if you regularly have 60+ concurrent players, external voice is worth it. At 100+ players it's practically mandatory - without it, voice packets starve your main thread and everyone lags.
1. Voice Server Hardware
Mumble is extremely lightweight. Unlike the FiveM server itself, voice doesn't need raw single-core speed - it needs decent network bandwidth and a small amount of CPU for Opus audio mixing.
Up to 100 players: 1 vCPU · 2 GB RAM · 20 GB SSD · 100 Mbps
Up to 250 players: 2 vCPU · 4 GB RAM · 40 GB SSD · 250 Mbps
500+ players: 4 vCPU · 8 GB RAM · 80 GB SSD · 1 Gbps
Each active voice user uses 40-80 kbps at the configured bitrate. Pick a provider with generous outbound traffic - Hetzner, Netcup, Contabo all include unlimited bandwidth on their VPS plans. A Hetzner CX11 or CX21 is perfect for servers up to 100 players and costs around 4-6€/month.
Pick a datacenter close to your players
Voice latency matters more than game latency - even 100ms becomes noticeable in conversation. If most of your players are in Germany, put the voice server in Nürnberg or Frankfurt. If they're in North America, pick a US datacenter instead.
2. Install Mumble Server (Linux)
This guide uses a fresh Ubuntu 22.04 or 24.04 VPS.
-
SSH into the VPS as root
From your terminal, replacing
YOUR.VOICE.IPwith the IP from your provider email:ssh root@YOUR.VOICE.IP -
Update the system
apt update && apt upgrade -y -
Install mumble-server
apt install -y mumble-serverDuring install you'll get a blue interactive screen asking:
- "Autostart mumble-server on server boot?" → Yes
- "Allow mumble-server to use higher priority?" → Yes (improves audio timing)
- "Password to set on the SuperUser account" → enter a strong password and save it somewhere safe. You don't need it day-to-day, but you'll need it if you ever want to moderate channels.
-
Verify the service is running
systemctl status mumble-serverYou should see
active (running)in green. Pressqto exit. If it's not running, start it:systemctl start mumble-server systemctl enable mumble-server
2. Install Mumble Server (Windows)
Windows Mumble Server (officially called "Murmur") runs as a Windows Service. Here's the exact setup.
-
Connect to your Windows VPS via RDP
Use Remote Desktop (
Win + R→mstsc→ Enter) with the IP and credentials from your provider. -
Download the Windows installer
Inside the RDP session, open a browser and go to mumble.info/downloads. Scroll to "Murmur (Server)" and download the latest Windows build (usually
murmur-*.msi). -
Run the installer
Double-click the downloaded MSI. During setup, make sure to tick:
- "Install as a Windows service" - this auto-starts Murmur whenever the server boots
- "Use default config location" - uses
C:\Program Files\Mumble\murmur\murmur.ini
Finish the installer.
-
Set the SuperUser password
Open Command Prompt as Administrator (Start → type
cmd→ right-click "Command Prompt" → "Run as administrator"). Run:cd "C:\Program Files\Mumble\murmur" murmur.exe -supw "YOUR_STRONG_PASSWORD"You should see
Password for 'SuperUser' set.. Save this password - you need it if you ever want to moderate channels. -
Start the Murmur service
Press
Win + R, typeservices.msc, Enter. Find "Mumble Server" in the list. Right-click it → Properties → set "Startup type" to Automatic → click Start → OK.The service is now running and will auto-start on every reboot.
3. Configure mumble-server.ini
The config file lives at /etc/mumble-server.ini. Edit it with nano:
sudo nano /etc/mumble-server.ini
The complete, production-ready config is in the "Final Configurations" section at the bottom of this post. You can replace the entire file with that one. After saving (Ctrl+X → Y → Enter), restart the service:
sudo systemctl restart mumble-server
3. Configure murmur.ini
The config file lives at C:\Program Files\Mumble\murmur\murmur.ini. Because it's in Program Files, you need to edit it as Administrator.
Open Notepad as Administrator: Start → type notepad → right-click → "Run as administrator". In Notepad: File → Open → navigate to C:\Program Files\Mumble\murmur\murmur.ini. In the "File name" filter dropdown at the bottom-right, pick "All files" to see the .ini.
The complete, production-ready config is in the "Final Configurations" section at the bottom of this post. Replace the entire file contents with that one. Save, then restart the service via services.msc → right-click "Mumble Server" → Restart.
4. Open Firewall Ports (Linux)
Mumble uses TCP + UDP on port 64738. TCP is for the signaling handshake, UDP carries the actual voice packets. Both must be open.
Allow SSH first, always
If you enable UFW without first allowing port 22, you instantly lock yourself out. The commands below are in the correct order - follow them exactly.
sudo ufw allow 22/tcp
sudo ufw allow 64738/tcp
sudo ufw allow 64738/udp
sudo ufw enable
sudo ufw status
Type y when prompted to enable. You should see three ALLOW rules in the final status output.
4. Open Firewall Ports (Windows)
Mumble uses TCP + UDP on port 64738. Both must be open.
Open PowerShell as Administrator (Start → type "PowerShell" → right-click → "Run as administrator"). Paste both commands:
New-NetFirewallRule -DisplayName "Mumble TCP" -Direction Inbound -Protocol TCP -LocalPort 64738 -Action Allow
New-NetFirewallRule -DisplayName "Mumble UDP" -Direction Inbound -Protocol UDP -LocalPort 64738 -Action Allow
5. Cloud-Provider Firewall
If your provider (Hetzner Cloud, OVH, AWS, Azure…) has its own firewall layer in the web dashboard, you also need to open 64738 TCP + UDP there. This is the #1 reason "everything looks right but voice doesn't work" - OS firewall is open but the cloud firewall silently drops everything.
- Provider web dashboard → Firewalls / Security Groups / Network Settings
- Add inbound rule: TCP port 64738 (source: any IPv4 /
0.0.0.0/0) - Add inbound rule: UDP port 64738 (source: any IPv4)
- Make sure the firewall is attached to your voice VPS (easy to miss if you created it separately)
6. Configure pma-voice on Your FiveM Server
Now switch to your main FiveM server (the one with players). Open the pma-voice config file:
resources/[voice]/pma-voice/config.lua
The exact path depends on how your resources are organized. Common locations:
resources/[voice]/pma-voice/config.lua- most ESX / QBCore setupsresources/pma-voice/config.lua- standalone install
Find these two lines and edit them (the file has lots of other options you can leave alone):
-- Enable external voice server
Cfg.ExternalVoiceServer = true
-- Your voice server's public IPv4 + port
Cfg.ExternalVoiceServer_IP = "YOUR.VOICE.SERVER.IP"
Cfg.ExternalVoiceServer_Port = 64738
Replace YOUR.VOICE.SERVER.IP with the public IPv4 of your voice VPS (the IP from your provider's email for the voice server, NOT the main FiveM server).
Save the file, then restart the resource in your FiveM server console:
restart pma-voice
Or restart the entire FiveM server if you can't access its live console.
7. Test Your Setup
The fastest way to verify: connect to your FiveM server with two players and check if proximity voice works. But first, confirm the voice server itself is accepting connections.
On your voice VPS, watch the Mumble log live:
tail -f /var/log/mumble-server/mumble-server.log
When a player joins your FiveM server with voice enabled, you should see lines like:
New connection: YYY.YYY.YYY.YYY:PORT
1 => <1:PlayerName(-1)> Authenticated
Press Ctrl+C to stop watching.
On your Windows voice VPS, the log is at C:\Program Files\Mumble\murmur\murmur.log. Watch it live in PowerShell:
Get-Content "C:\Program Files\Mumble\murmur\murmur.log" -Wait
When players connect, you'll see "New connection" and "Authenticated" lines. Press Ctrl+C to stop watching.
Quick port check from outside
From a completely separate machine (your home PC), run:
telnet YOUR.VOICE.SERVER.IP 64738
If it connects (and doesn't say "timed out"), TCP 64738 is reaching Mumble. Mumble's handshake isn't human-readable, but a successful TCP connect confirms the firewall chain is open.
8. Monitoring & Maintenance
Set up monitoring so you notice issues before players report them:
- UptimeRobot (free) - pings your voice IP every 5 min, alerts via email if down
- htop (Linux) / Task Manager (Windows) - quick CPU/RAM overview
- vnStat (Linux) / NetBalancer (Windows) - track bandwidth usage over time
Troubleshooting
Players connect but can't hear each other
Almost always a UDP firewall issue. TCP (signaling) works, but UDP (voice) is blocked. Check UDP port 64738 in both the OS firewall AND provider cloud firewall. UDP is the #1 forgotten config.
Test UDP reachability from a separate machine:
nc -vzu YOUR.VOICE.IP 64738
High voice latency
Voice VPS is geographically too far from most players. Run from a player's machine:
mtr YOUR.VOICE.SERVER.IP
Under 40ms = perfect, 40-80ms = acceptable, over 80ms = move to a closer datacenter.
"Mumble connection failed" in FiveM console
TCP port 64738 is blocked. Check with telnet YOUR.VOICE.IP 64738. A timeout means the firewall is the problem; "connection refused" means Mumble isn't running.
Works for some players, not others
Some ISPs (especially corporate or school networks) block non-standard UDP ports. Consider moving Mumble to port 443 (HTTPS) in the config - it's virtually never blocked. Update port= in mumble-server.ini, the firewall rules, and Cfg.ExternalVoiceServer_Port on the FiveM side.
Voice cuts out under load
Voice server is CPU-starved. Run top (Linux) or Task Manager (Windows) during peak hours - if murmurd / murmur.exe hits 80%+ CPU, upgrade the VPS. Going from 1 vCPU to 2 vCPU usually solves it entirely.
Final Configurations - Copy & Paste
Here are the two complete, working configs you need. Copy them exactly, replace the IP placeholder, and everything works together out of the box.
1. Voice Server Config (mumble-server.ini)
This file lives on your voice server.
- Linux path:
/etc/mumble-server.ini - Windows path:
C:\Program Files\Mumble\murmur\murmur.ini
# ===== devCon Voice Server Config =====
# Deploy on your external voice server
database=/var/lib/mumble-server/mumble-server.sqlite
dbus=system
logfile=/var/log/mumble-server/mumble-server.log
pidfile=/var/run/mumble-server/mumble-server.pid
# Binding
host=
port=64738
# No server password - auth via FiveM token
serverpassword=
# User limit (player cap + 20% buffer)
users=250
# Audio bandwidth per user in bits/sec (130 kbps = high quality)
bandwidth=130000
# Timeout for disconnects (30 seconds)
timeout=30
# Required for pma-voice
allowhtml=true
# Opus codec - required for modern clients
opusthreshold=0
# Text/image limits
imagemessagelength=0
textmessagelength=5000
# Welcome message shown to connecting clients
welcometext=""
# SuperUser not auto-logged-in
# Set password via: murmurd -supw YOUR_PASSWORD
# Register server as public? No (private use with FiveM)
registerName=
registerPassword=
registerUrl=
registerHostname=
Windows paths differ slightly
On Windows, change the three path lines (database=, logfile=, pidfile=) to Windows paths - the default murmur.ini installed by the Windows MSI already has the right values, so you can leave those lines as they were and only replace everything below them.
2. FiveM Main Server Config (pma-voice config.lua)
This file lives on your FiveM main server (the one with players). Path: resources/[voice]/pma-voice/config.lua
Replace YOUR_VOICE_IP
In the config below, replace YOUR_VOICE_IP with the public IPv4 of your voice server. Nothing else needs to change.
-- ===== devCon FiveM Main Server - pma-voice config =====
-- Deploy on your FiveM server that hosts the actual players
-- ENABLE EXTERNAL VOICE SERVER (REQUIRED)
Cfg.ExternalVoiceServer = true
Cfg.ExternalVoiceServer_IP = "YOUR_VOICE_IP"
Cfg.ExternalVoiceServer_Port = 64738
-- Proximity voice distances (in metres)
Cfg.VoiceModes = {
[1] = {2.5, "Whisper"},
[2] = {8.0, "Normal"},
[3] = {20.0, "Shouting"},
}
-- Default mode (2 = Normal)
Cfg.DefaultVoiceMode = 2
-- Let players change voice mode with TAB-SHIFT by default
Cfg.EnableDefaultVoiceModes = true
-- Radio / Phone channel ranges (0 = disabled)
Cfg.MaxRadioChannels = 1000
Cfg.MaxPhoneChannels = 1000
-- Allow players to use /addproximityCheck
Cfg.EnableUi = true
-- Use key K for mute toggle (default FiveM menu key)
Cfg.ToggleKey = "K"
-- Recommended: enable all submix effects (radio crackle, phone filter)
Cfg.RadioEffects = true
Cfg.PhoneEffects = true
Final Checklist
Before you test - make sure all these are true:
- Voice server has Mumble installed and the
mumble-server.iniabove deployed - Voice server OS firewall allows TCP + UDP on port 64738
- Voice server cloud firewall (provider dashboard) also allows TCP + UDP 64738
- Mumble service is running (
systemctl status mumble-serveron Linux, or Mumble Server service inservices.mscon Windows) - FiveM main server has
pma-voice/config.luaupdated with your voice server's real IP - Resource restarted on FiveM with
restart pma-voice
You're all set!
Both configs are production-tested and used by servers with 150+ concurrent voice users. No further tweaks needed - join the server and talk.
Optimize your server further
Our scripts are built with the same performance-first philosophy. Browse the store.
Browse Store