Skip to content

kf-voice

kf-voice is a drop-in, battle-tested voice wrapper for FiveM built in Mumble, a seamless replacement for pma-voice, mumble-voip, and TokoVOIP. Features

vMenu: If your server is using vMenu, you have to turn off vMenu chat.

  • Plug-and-Play Upgrade: Swap in for pma-voice, mumble-voip, or TokoVOIP.
  • Rich Proximity Controls: Whisper / normal / shout with customizable keybinds.
  • Native 3D & Submix Audio: Leverage GTA’s spatial audio, reverb, and mix routing so radios, calls, and contexts sound distinct and immersive.
  • Voice Channels: Allows external scripts to change voice channels
  • Voice Contexts: Configurable audio sandboxes where scripts can group players, control who hears/speaks, override isolation on demand.
  • Clean In-Game UI: Real-time radio, call, and proximity state.
  • Secure External Hosting: Optional external Mumble address/port with endpoint hiding to keep infrastructure private without sacrificing performance.
  • /vol - Sets radio or call volume.
  • /muteply - Mutes specified player.
  • @AvarianKnight for pma-voice (uses same api/config)
  • @Frazzle for mumble-voip (for which the concept came from)
  • @pichotm for pVoice (where the grid concept came from)
  1. Move the kf-voice folder into your server’s resources directory.

  2. Add the following to your server.cfg.

    server.cfg
    setr voice_useNativeAudio true
    setr voice_useSendingRangeOnly true
    ensure kf-voice

The resource reads config exclusively via convars and exposed in the fxmanifest convar_category. Common ones:

  • voice_useNativeAudio, voice_use2dAudio, voice_use3dAudio, voice_useSendingRangeOnly
  • voice_enableUi, voice_enableProximityCycle, voice_defaultCycle
  • voice_defaultRadioVolume, voice_defaultCallVolume, voice_defaultContextVolume, voice_defaultVoiceMode
  • voice_enableRadios, voice_enableCalls, voice_enableSubmix, voice_enableRadioAnim
  • voice_defaultRadio, voice_uiRefreshRate
  • voice_debugMode, voice_hideEndpoints

Defaults are calculated at runtime so changes only require server restarts (players may need to reconnect for some defaults like volumes).

  • setPlayerRadio(source, channel) – assign/remove radio membership.
  • setPlayerCall(source, channel) – join/leave phone calls.
  • addChannelCheck(channel, cb) – gate radio channel joins.
  • overrideRadioNameGetter(cb) – custom display names in radio lists.
  • Voice Contexts:
    • createContext(id, metadata?)
    • destroyContext(id)
    • setContextMetadata(id, metadata?)
    • addContextPlayer(id, source, options?)options.role ('participant' default, 'monitor'), options.canTalk?, options.isolateIncoming?, options.isolateOutgoing?, options.uiLabel?.
    • setContextPlayerState(id, source, state) – allows updating isolation, talkback, uiLabel; role changes are rejected.
    • removeContextPlayer(id, source)
    • clearPlayerContexts(source)
    • getContextSnapshot(id) – returns { id, metadata, participants, monitors, contributors }.
    • getPlayerContexts(source) – per-context role data with isolation flags.
  • setRadioChannel(channel), removePlayerFromRadio(), setCallChannel(channel)
  • setRadioVolume(vol), setCallVolume(vol), setContextVolume(vol)
  • toggleMutePlayer(serverId)
  • registerCustomSubmix(cb)/setEffectSubmix(type, id)
  • getRadioVolume(), getCallVolume(), getContextVolume()
  • setVoiceProperty(property, value) – toggles radio enablement, mic clicks.
  • Proximity helpers: overrideProximityCheck(cb), resetProximityCheck(), setListenerOverride(bool), setVoiceState(state, channel).

Key state properties stored per player via Player(source).state or LocalPlayer.state:

  • radio – current radio volume (1–100)
  • call – current call volume
  • context – current context routing volume
  • radioChannel, callChannel – active channel numbers (0 = none)
  • assignedChannel – reserved Mumble channel id assigned at join
  • proximity – table { index, distance, mode } for UI and scripts
  • voiceIntent'speech' or 'music'
  • disableRadio – bitmask for radio restrictions
  • radioActive – boolean state for UI
  • pmaVoiceInit – guard to lazily initialize defaults
  • submix – current submix name applied to the player (if any)
  • disableProximity – disable proximity scans for this player
  1. Server resource creates a context (e.g., createContext('pd:interrogation', { label = 'Interrogation Room' })).
  2. When gameplay logic determines a player should join, call addContextPlayer with the desired role ('participant' or 'monitor') and isolation/talkback options.
  3. Client receives kf-voice:context:update, stores metadata in VoiceClientState, and recomputes voice targets. Isolation sets LocalPlayer.state.disableProximity = true so normal proximity updates skip them, while monitors and participants remain mutually audible (monitors with canTalk also feed contributors).
  4. When players leave, removeContextPlayer or clearPlayerContexts ensures both routing and state bags revert, restoring default proximity/radio behaviour.