maxaki
AI-powered voice chat transcription with word filtering, Discord logs, and auto-moderation

Supported Games
GameServerKingsGameServerKings

Overview

ToxVoice transcribes player voice chat into text using AI-powered speech recognition. Transcriptions can be logged to Discord and the server console, filtered against configurable trigger words, and used to automatically moderate players with escalating punishments.

Try it instantly — the plugin comes with a built-in trial token. Just install and load the plugin to get 2 hours of free transcription time, no account needed. When you're ready for more, sign up at toxvoice.com and replace the token in the config.

Features

  • Real-time voice-to-text transcription
  • Trigger word/phrase filtering with regex support and weighted scoring
  • Automatic violation tracking with escalating actions (warn, mute, ban)
  • Discord webhook logging for all transcriptions
  • Separate Discord webhook for high-priority alerts
  • Proximity logging — see which players were near the speaker
  • Violation persistence across server restarts
  • Player whitelist via permissions
  • Developer hook for integration with other plugins

Permissions

  • toxvoice.whitelist — Exempt a player from voice transcription

Commands

  • toxvoice steam <steamid> — Look up a player's ToxVoice ID by their Steam ID
  • toxvoice id <toxvoiceid> — Look up a player's Steam ID by their ToxVoice ID
  • toxvoice reset <steamid> — Reset violation count for a specific player
  • toxvoice reset all — Reset all player violations
  • toxvoice whitelist <steamid> — Toggle whitelist for a player (add/remove)

Configuration

{
  "ToxVoice": {
    "Token": "your-token-here"
  },
  "TranscriptionLogs": {
    "ProximityLogs": false,
    "DiscordLog": {
      "Enabled": false,
      "HideSteamId": false,
      "WebhookUrl": "YOUR_DISCORD_WEBHOOK_URL"
    },
    "ConsoleLog": {
      "Enabled": true
    }
  },
  "WeightConfiguration": {
    "DiscordWeightThreshold": {
      "Enabled": false,
      "TriggerAlertWeightThreshold": 20,
      "AlertWebhookUrl": "WEBHOOK_URL"
    },
    "ViolationWeightThreshold": {
      "Enabled": false,
      "TriggerActionWeightThreshold": 10,
      "ViolationActions": {
        "1": { "Action": "warn {steamid} \"First warning\"", "CooldownSeconds": 30 },
        "2": { "Action": "warn {steamid} \"Second warning\"", "CooldownSeconds": 30 },
        "3": { "Action": "mute {steamid} 30s \"Muted\"", "CooldownSeconds": 30 },
        "4": { "Action": "mute {steamid} 1m \"Muted\"", "CooldownSeconds": 60 },
        "5": { "Action": "mute {steamid} 5m \"Muted\"", "CooldownSeconds": 300 }
      }
    }
  },
  "TriggerFilter": {
    "Enabled": false,
    "TriggerFilters": [
      { "Regex": false, "Triggers": ["badword"], "Weight": 8 },
      { "Regex": true, "Triggers": ["\\bword1\\b.*\\bword2\\b"], "Weight": 10 }
    ]
  }
}

Configuration Explained

Token — Your ToxVoice API token. Get one at toxvoice.com.

TranscriptionLogs

  • ProximityLogs — When enabled, logs include which players were within proximity of the speaker.
  • DiscordLog — Send all transcriptions to a Discord webhook. Set HideSteamId to true to anonymize players by using their ToxVoice ID instead.
  • ConsoleLog — Print transcriptions to the server console as [VOICE] [steamid] : text.

TriggerFilter — Define words or phrases to detect in transcriptions. Each filter has a weight value. Supports both plain text matching and regex patterns. Multiple triggers in a single filter act as an AND condition — all words must be present.

DiscordWeightThreshold — When a transcription's total filter weight meets or exceeds TriggerAlertWeightThreshold, it is sent to a separate alert webhook instead of the default log webhook. Useful for routing high-severity matches to a dedicated moderation channel.

ViolationWeightThreshold — When a transcription's filter weight meets or exceeds TriggerActionWeightThreshold, the player's violation count increments and the corresponding action is executed as a server console command. Use {steamid} as a placeholder in the action string. Each violation level has a cooldown to prevent repeated punishment from rapid speech. If a player exceeds the highest defined level, the last action continues to apply.

Developer Hook

void OnPlayerVoiceText(string steamId, string text, string position, string recipients)

Called when a transcription is received. The recipients parameter is a JSON array of players that were in proximity, available when proximity logs are enabled.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.