Back to Blog

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.

Voice server specs by player count
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.

  1. SSH into the VPS as root

    From your terminal, replacing YOUR.VOICE.IP with the IP from your provider email:

    ssh root@YOUR.VOICE.IP
  2. Update the system

    apt update && apt upgrade -y
  3. Install mumble-server

    apt install -y mumble-server

    During 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.
  4. Verify the service is running

    systemctl status mumble-server

    You should see active (running) in green. Press q to 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.

  1. Connect to your Windows VPS via RDP

    Use Remote Desktop (Win + Rmstsc → Enter) with the IP and credentials from your provider.

  2. 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).

  3. 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.

  4. 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.

  5. Start the Murmur service

    Press Win + R, type services.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:

PowerShell (Administrator)
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 setups
  • resources/pma-voice/config.lua - standalone install

Find these two lines and edit them (the file has lots of other options you can leave alone):

pma-voice/config.lua
-- 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
mumble-server.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.

pma-voice/config.lua
-- ===== 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.ini above 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-server on Linux, or Mumble Server service in services.msc on Windows)
  • FiveM main server has pma-voice/config.lua updated 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