Voice & Voice Changer
On this page4
Every character gets a hidden voice frequency the moment it is created. It has nothing to do with the player's real voice — it is a value attached to the character and kept on the server. Recognising a voice means recognising that frequency.
The voice bar only fills face to face. A voice over the radio or a phone does not count.
Picking a voice system
| Key | Default | Allowed |
|---|---|---|
Config.VoiceSystem | 'auto' | auto · pma-voice · saltychat · yaca-voice · tokovoip_script · enhanced · native · custom |
Auto order: pma-voice → saltychat → yaca-voice → tokovoip_script → native.
| System | Talk detection | Audible changer |
|---|---|---|
| pma-voice | full | yes |
| SaltyChat | yes (needs its RequestTalkStates = true) | no |
| YaCA | yes | no |
| TokoVOIP | best effort | no |
| native Mumble | yes | no |
enhanced (FiveM for GTA V Enhanced) | native, voice results flagged for admins — beta | no |
Details per system, including the settings to change on their side: Voice Systems.
Config.Voice
| Key | Default | Allowed | What it does |
|---|---|---|---|
RequireBothReports | true | true / false | The scanner must hear the target and the target's own game must report talking. |
IgnoreRadio | true | true / false | A voice heard over the radio never fills the bar. |
IgnoreCall | true | true / false | A voice heard over a phone call never fills the bar. |
UseVoiceRange | true | true / false | Only count talking while the scanner is inside the target's voice range. |
MinRange | 1.5 | metres | A voice range smaller than this is treated as this. |
SampleMs | 200 | 100–250 | How often talking is sampled during a scan. |
LowTrustSelfReport | true | true / false | On voice scripts that cannot see other players talking, use the target's own report and flag the voice result for admins. |
ConflictCreditShare | 0.5 | 0.0–1.0 | When the players' games disagree about whether someone talked, the share of the heard time that still counts. Leave as is. |
The automatic voice check
Config.Voice.AutoLowTrust watches for voice scripts that report talking
unreliably. When it switches on, voice results on your server are flagged for admins,
and the console says so:
[5code-recognition] Voice detection is low-trust on this server (provider: enhanced). Voice results are flagged for admins.| Key | Default | What it does |
|---|---|---|
AutoLowTrust.Enabled | true | Turn the automatic check on or off. |
AutoLowTrust.MinSpokeMs, .MinTargets, .MinScanners, .ExpireMinutes | see config.lua | How sure the check must be before it acts, and how long the flag lasts. Leave them as they are. |
recognition:status shows your players' voice providers and whether that flag is on.
The voice changer
Config.VoiceChanger = {
BatterySeconds = 600,
DrainWhile = 'on',
AudibleEffect = 'auto',
EffectRange = 30.0,
DefaultPreset = 'random',
CheckpointPct = 10,
ResetFlashMs = 1000,
}| Key | Default | Allowed | What it does |
|---|---|---|---|
BatterySeconds | 600 (10 min) | seconds | Use per full battery. |
DrainWhile | 'on' | 'on' · 'talking' | on = drains whenever the device is switched on. talking = only while the wearer talks. |
AudibleEffect | 'auto' | 'auto' · 'off' | Whether people nearby also hear the effect. auto = yes on pma-voice, nothing elsewhere. |
EffectRange | 30.0 | metres | Who gets the sound effect. It is sent only to players this close. |
DefaultPreset | 'random' | 'random' or a preset name | The sound of a brand-new device. One fake voice per device, forever. |
CheckpointPct | 10 | 1–50 | Save the battery level to the database every N % of drain. |
ResetFlashMs | 1000 | ms | How long the scanner's voice icon flashes orange when the voice bar resets. |
Presets
Three ship by default. They are pma-voice radio-filter settings.
| Preset | Label |
|---|---|
robot | Robot |
radio | Radio |
muffled | Muffled |
Presets = {
robot = { label = 'Robot', fx = { freq_low = 200.0, freq_hi = 5000.0, rm_mod_freq = 50.0, rm_mix = 0.55, fudge = 0.0, o_freq_lo = 200.0, o_freq_hi = 5000.0 } },
radio = { label = 'Radio', fx = { freq_low = 500.0, freq_hi = 3000.0, rm_mod_freq = 0.0, rm_mix = 0.0, fudge = 0.4, o_freq_lo = 500.0, o_freq_hi = 3000.0 } },
muffled = { label = 'Muffled', fx = { freq_low = 100.0, freq_hi = 1200.0, rm_mod_freq = 0.0, rm_mix = 0.0, fudge = 0.0, o_freq_lo = 100.0, o_freq_hi = 1200.0 } },
}What the battery running out does
The device stops. The scanner's voice bar resets to zero and the icon flashes
orange, and from that moment the scan starts learning the wearer's real frequency.
The wearer is warned before it happens (Config.Battery.WarnAtPct, default at 20 %
and 5 %).
What a fake voice is worth
Config.Scoring.FakeVoiceFactor (default 0.50) halves the voice points a changed
voice contributes — 20 of the 40. See
Scanning & Scoring.
The bar itself still fills to 100 %, because bars show what you observed. You did hear a voice clearly; it just was not theirs.
Being caught with one
Config.MagneticScanner.DetectVoiceChanger decides whether a magnetic scanner picks
up a voice changer at all. Default: 'off'. See
Devices & Reports.
Batteries
| Key | Default | Allowed | What it does |
|---|---|---|---|
Config.Battery.RechargeTo | 100 | 1–100 | What % a battery item charges a device to. |
Config.Battery.Consume | true | true / false | The battery item is used up. |
Config.Battery.NewDevicePct | 100 | 0–100 | Charge of a brand-new device. |
Config.Battery.WarnAtPct | { 20, 5 } | list of % | Warn the wearer when charge drops below these. |
Config.Battery.ShowAsDurability | true | true / false | ox_inventory: draw the battery as the item's durability bar. |