Fix: Non-Steam Players Have No Voice (ReVoice)
The classic report: Steam players talk to each other fine, but nobody hears the non-Steam players and they hear nobody. Sometimes it is one-way, sometimes robotic. It is all one chain breaking at different links. This page assumes you followed the ReVoice install guide and walks the chain in the order it usually breaks, so stop at the first link that fails.
Why voice splits along Steam lines
Steam builds of CS 1.6 send voice in Steam's own format: SILK on older Steam builds, Opus on current ones. Older non-Steam builds send Speex. The engine converts nothing. It relays each voice packet to the listeners exactly as it arrived, so a Speex packet reaching a Steam client, or an Opus packet reaching a non-Steam client, is data the receiver cannot decode. Steam-to-Steam works without help because both ends already agree.
ReVoice is the translator: it takes over voice handling in ReHLDS, decodes each packet and re-encodes it for every listener, Speex for old builds and Steam format for Steam clients. So a broken ReVoice has a recognisable signature: Steam players keep talking while everyone on a non-Steam build goes silent.
1. Is ReVoice actually running?
The file on disk proves nothing. In the server console:
version
meta list
version must print a ReHLDS version: line. In meta list, ReVoice must show RUN, and Reunion must be listed above it. The order matters: ReVoice asks for Reunion's API the moment it attaches (it uses Reunion to learn each client's protocol) and refuses to start if Reunion is not loaded yet. Your cstrike/addons/metamod/plugins.ini should read:
linux addons/reunion/reunion_mm_i386.so
linux addons/revoice/revoice_mm_i386.so
linux addons/amxmodx/dlls/amxmodx_mm_i386.so
On Windows the lines start with win32 and point at reunion_mm.dll and revoice_mm.dll. If ReVoice shows fail, scroll back through the startup output (or the server log) for its own error:
[REVOICE]: Failed to locate REHLDS API- you are on stock HLDS. ReVoice only runs on ReHLDS.[REVOICE]: Failed to locate Reunion api- Reunion is missing, failed to load, or sits below ReVoice. Fix it with the Reunion install guide. ReVoice needs Reunion specifically; dproto does not provide that API.- A
Reunion APIversion mismatch line - your Reunion build is too old for your ReVoice build. Update Reunion.
ReVoice can only be loaded when the server process starts, so after any of these fixes, restart the server. A map change is not enough.
2. Ask ReVoice how it sees each player
ReVoice can tell you which codec it assigned to each connected player:
rev status
It lists each player with a codec (speex, opus, silk or none), a voice rate and the protocol. Run it in the server's own console: the per-player lines go to the server process's terminal, so over rcon you may only see the header. If it prints nothing at all, ReVoice is not loaded.
How the codec is chosen: on connect, ReVoice asks the client for its sv_version. A build number above 4554 is treated as a Steam-style client and gets opus. Everything else, including a client that never answers the query, gets the value of REV_DefaultCodec, which should be speex. What you want to see:
- Steam players on
opus. - Classic non-Steam builds on
speex. - Nobody on
none. A player onnoneis not handled at all, and ReVoice drops their voice.
A player on the wrong codec is the usual cause of one-way or garbled voice: their packets go through the wrong decoder, so the other side gets noise or nothing. ReVoice classifies by build number alone, so a non-Steam pack built on a newer engine build is treated exactly like Steam.
3. Server cvars: one matters, two do not exist
sv_voiceenable
Typed alone it prints the current value, which must be 1. With 0, ReVoice reads every voice packet and throws it away, so nobody hears anybody, Steam or not.
Many guides also set sv_voicecodec and sv_voicequality. ReHLDS does not have these cvars, so setting them does nothing, and ReHLDS stays silent about unknown commands unless sv_echo_unknown_cmd 1 is set. ReVoice writes the voice setup each client receives on connect itself, always Speex at quality 5, so there is nothing to tune. Delete those lines from server.cfg so they stop misleading whoever debugs voice next.
4. revoice.cfg has two settings
This is the file the current release ships, and these are the only two settings ReVoice registers:
REV_HltvCodec opus // speex, opus
REV_DefaultCodec speex // speex, opus
ReVoice executes it from its own folder, cstrike/addons/revoice/revoice.cfg, at every map start, so a copy in cstrike/ is never read. REV_DefaultCodec is the codec for every client that does not identify as a newer build: leave it on speex. Set to opus, ReVoice decodes the old builds' Speex packets as Opus. REV_HltvCodec only affects HLTV. Any other line in a forum copy of this file (bitrates, quality levels) is not a ReVoice setting and does nothing.
5. Rule out the game's own voice rules
Transcoding decides whether a packet can be understood; the game decides who may hear whom, and its default rules look exactly like a ReVoice fault. On ReGameDLL, sv_alltalk takes these values:
0(default) - teams cannot hear each other; dead players hear their whole team, alive players hear only alive teammates.1- everybody hears everybody.2- teammates hear each other, alive or dead.3- as 2, plus spectators hear everybody.4- alive hear alive, dead hear dead and alive.5- alive hear alive teammates, dead hear dead and alive.
Values 2 to 5 are ReGameDLL additions; the stock game DLL only knows 0 and 1. To test, set sv_alltalk 1 with a Steam and a non-Steam player on the server. If they now hear each other both ways, your "voice bug" was the game rules.
6. AMXX plugins that mute voice
Gag plugins, dead-talk or alltalk managers and "voice for VIPs only" plugins switch voice off per player, and a misconfigured one can silence a whole group. They usually work through the engine module's set_speak with SPEAK_MUTED, fakemeta's FM_Voice_SetClientListening forward, or ReAPI's RG_CSGameRules_CanPlayerHearPlayer hook. If you have the sources, search them:
grep -rlE "set_speak|Voice_SetClientListening|CanPlayerHearPlayer|VTC_" /home/steam/hlds/cstrike/addons/amxmodx/scripting/
With only .amxx files, list what runs with amxx plugins, disable suspects one at a time (see disabling plugins in plugins.ini) and retest after a map change. Gagging and muting players covers how gag plugins behave.
A hit on VTC_ means a plugin is written for VoiceTranscoder, a separate transcoder. Run one transcoder, not two: if VoiceTranscoder is also in the Metamod plugins.ini, remove one of them.
7. The client side
When one particular player is silent, have them run this in their own console:
voice_enable 1
voice_modenable 1
voice_scale 1
bind "k" "+voicerecord"
voice_enable 0 switches the client's voice system off entirely. voice_modenable 0 is sneakier: the game only builds a hearing list for players who report it as on, so that player hears nobody even though everyone hears them. voice_scale is the playback volume of other players. Holding the bound key should show the microphone icon; no icon means a bind, input device or Windows microphone permission problem, all covered in microphone not working.
voice_loopback 1 plays the player's own voice back to them, but ReVoice returns your own packet untouched, so loopback proves the microphone and the client, not the transcoding. A player who cannot hear one specific person may have muted them on the scoreboard; those mutes are saved in voice_ban.dt in the client's cstrike folder and survive reconnects.
Common errors by symptom
- Steam players hear each other, non-Steam players are silent both ways - ReVoice is not running. Check
meta listforfailorbadf, make sure Reunion is above ReVoice and ReHLDS is present, then restart the server. - One-way between Steam and non-Steam - run
rev statuswhile the silent player is on. A Steam player onspeexor an old build onopusis misclassified: putREV_DefaultCodecback tospeex; if it already is, the client is misreporting its build. - One-way between teammates, Steam or not - usually the alive/dead rule of
sv_alltalk 0: the dead hear the living, the living do not hear the dead. That is working as designed. - One player cannot hear one other player - a scoreboard mute or a gag, not ReVoice.
- Garbled or robotic voice - have the speaker try
voice_loopback 1. Robotic to themselves means their microphone level or boost. Clean loopback: checkrev statusfor a wrong codec, then packet loss and very low clientratevalues, since voice rides in the unreliable part of each update and is skipped when there is no room. - Nobody hears anyone, not even Steam to Steam -
sv_voiceenableis 0, a plugin is muting everyone (step 6), or a second transcoder is loaded.
Verification checklist
versionshows ReHLDS, andmeta listshows ReunionRUNabove ReVoiceRUN.- No
[REVOICE]errors in the startup output. sv_voiceenableprints 1, andserver.cfgno longer setssv_voicecodecorsv_voicequality.addons/revoice/revoice.cfghasREV_DefaultCodec speex.rev statusshows Steam players onopus, non-Steam players onspeex, nobody onnone.- With
sv_alltalk 1as a test, a Steam and a non-Steam player hear each other in both directions. Then restore your normal value.









