The World's First AI-Powered Proximity Voice Chat Moderator for Minecraft
✔ Folia · Paper · Spigot | ✔ 1.16.5 – 1.21.11+ | ✔ 100% Free API Tier | ✔ 50+ Languages
What is SVCAIModeration?
Conventional chat filters and word lists are trivially bypassed — a single letter swap defeats them entirely. SVCAIModeration takes a fundamentally different approach.
It hooks directly into Simple Voice Chat to intercept proximity voice audio in real-time, transcribes it using Whisper large-v3 (the same speech recognition model powering professional captioning services), then feeds the transcript through LLaMA 3.3 70B — a state-of-the-art large language model that understands context, intent, and nuance across over 50 languages.
A player saying "I'll destroy you" in the middle of a PvP fight? Clean. A player saying "I'll find where you live and hurt you"? Flagged, evidenced, and punished — automatically.
The entire pipeline runs fully asynchronously on dedicated thread pools, with zero impact on server TPS.
SVCAIModeration uses a two-stage pipeline designed to be both instantaneous and intelligent:
Stage 1 — Static Keyword Filter (Zero latency)
Define exact words or phrases in your config that trigger instant punishment without calling any API. Zero latency, 100% deterministic, zero API cost. Use this for slurs you want immediately actioned.
Stage 2 — LLM Semantic Analysis (Fallback)
If Stage 1 doesn't match, the transcript is passed to LLaMA 3.3 70B for deep contextual analysis. The AI evaluates intent, tone, and meaning — not just words. It returns a structured violation type and a confidence score. Below your configured confidence threshold, no action is taken.
YAML:
custom-keywords:
enabled: true
triggers:
"example-slur": "SLUR" # instant, no API call needed
"example-threat": "THREAT"
Whisper large-v3 natively transcribes speech in over 50 languages — Arabic, Spanish, Turkish, French, German, Portuguese, Russian, Japanese, and more. The LLM classifier then evaluates violations in whatever language was spoken. A slur shouted in Arabic is detected just as reliably as one in English.
Configure a language hint to improve short-clip accuracy:
YAML:
ai:
language: "ar" # Arabic — improves accuracy on short clips
Track each player's offense history persistently across server restarts. Configure a different punishment for each strike count, per violation type. When the defined strikes run out, the highest tier repeats.
YAML:
actions:
SLUR:
strikes:
1: "msg {player} &c[SVCAI] Final warning — slurs are not tolerated. (Case: {evidence_id})"
2: "mute {player} 1h [AI] Slur usage (2nd offense) | {evidence_id}"
3: "ban {player} 7d [AI] Slur usage (3rd offense) | {evidence_id}"
THREAT:
strikes:
1: "mute {player} 2h [AI] Threats (1st offense)"
2: "ban {player} 7d [AI] Threats (2nd offense)"
HARASSMENT:
strikes:
1: "msg {player} &cWarning: harassment is prohibited."
2: "mute {player} 30m [AI] Harassment"
3: "kick {player} [AI] Repeated harassment"
Placeholders:
{player} {reason} {evidence_id}Every confirmed violation fires an embed to your staff Discord channel. No separate bot required — just paste a webhook URL. Each embed includes:
- Player name and UUID
- Violation category with color-coded severity (
slur/hate ·
threat ·
harassment/sexual) - The exact transcript text
- The AI's reasoning in plain English
- A unique Case ID for cross-referencing
- The actual .wav audio file attached — undeniable audio evidence
All Discord delivery runs asynchronously on a dedicated I/O thread — never touching the main server thread.
Every violation is saved to disk as a pair of files:
{evidence_id}.wav— the raw audio recording{evidence_id}.json— metadata: player UUID, name, violation type, AI reason, timestamp
Configure automatic retention policies to keep your disk clean:
YAML:
moderation:
evidence-retention-days: 30 # auto-purge files older than 30 days
max-evidence-dir-mb: 500 # hard cap — oldest files deleted first if exceeded
A configurable global semaphore caps simultaneous API calls to protect against rate-limit spikes. When the cap is hit, new voice clips queue and wait — never dropped, never lost. Retry logic with jitter and
Retry-After header support handles temporary API errors gracefully.
YAML:
moderation:
max-concurrent-api-calls: 3 # increase for high-traffic servers
cooldown-ms: 3000 # min gap between analyses per player
silence-timeout-ms: 1500 # submit clip after 1.5s of silence
min-audio-duration-ms: 500 # ignore mic pops and coughs
By default, SVCAIModeration runs silently — only violations, errors, and API warnings appear in console. Enable verbose mode for debugging to see every transcript, confidence score, and LLM result live. Toggle it without restarting:
YAML:
logging:
verbose: false # set true for debug, false in production
Or toggle live in-game:
/svcai debug — persists to config automatically.SVCAIModeration detects Folia at runtime via class introspection and switches scheduler implementations automatically. On Folia:
GlobalRegionScheduler for sync tasks, AsyncScheduler for async timers. On Spigot/Paper: standard BukkitScheduler. No separate jar needed — one build, all platforms.Not locked to Groq. Any OpenAI-compatible STT or LLM endpoint works:
- Groq — recommended, free tier (For testing),Dev plan recommended, fastest
- OpenAI — Whisper-1 + GPT-4o
- OpenRouter.ai — access hundreds of models
- Self-hosted — Ollama, LocalAI, or any compatible server
Configure
json-mode per-provider for providers that don't support structured JSON output.1. Drop
SVCAIModeration.jar into your /plugins folder alongside Simple Voice Chat.2. Get a free API key from console.groq.com and paste it into
config.yml under ai.api-key.3. Restart your server. Voice chat is now monitored.
Run
/svcai test and /svcai test toxic to verify both STT and LLM connections are working correctly before going live.All commands require
svcai.admin permission.| Command | Description |
/svcai status | View active STT/LLM models, voice buffer count, webhook state, and verbose mode status |
/svcai stats | Real-time stats: total transcripts, violations per category, average STT and LLM latency |
/svcai cases [player] | Browse saved violation cases with timestamps, category, and AI reason. Filter by player name |
/svcai clear <caseId> | Permanently delete a specific WAV recording and its JSON metadata sidecar |
/svcai test | Run a live diagnostic: submits a silent WAV to STT and a benign phrase to the LLM |
/svcai test toxic | Same test with a toxic phrase — verify the LLM correctly identifies a real violation |
/svcai debug | Toggle verbose logging on/off live — no restart or reload needed |
/svcai reload | Reload config, re-compile keyword triggers, and refresh all cached settings |
Permissions:
svcai.admin— Access to all commands and real-time violation alerts in chat (Default: OP)svcai.bypass— Exempts this player from voice chat monitoring entirely (Default: none)
OP monitoring: Operators are monitored by default. Set
monitor-operators: false to exempt them, or grant svcai.bypass to specific staff accounts.
YAML:
# ---------------------------------------- #
# SVCAIModeration — config.yml #
# ---------------------------------------- #
ai:
# Speech-to-Text endpoint (Groq Whisper = free)
base-url: "https://api.groq.com/openai/v1/audio/transcriptions"
api-key: "YOUR_GROQ_API_KEY_HERE"
model: "whisper-large-v3"
# Language hint: "en", "ar", "es", "auto" (auto-detect)
language: "auto"
moderation:
silence-timeout-ms: 1500 # Submit after 1.5s of silence
max-speech-duration-sec: 10 # Force-submit after 10s regardless
min-audio-duration-ms: 500 # Ignore clips shorter than 500ms (noise)
max-evidence-dir-mb: 500 # Max disk usage for evidence folder
evidence-retention-days: 30 # Auto-purge evidence older than 30 days
cooldown-ms: 3000 # Min gap between API calls per player
max-concurrent-api-calls: 3 # Increase for high player counts
monitor-operators: true # Monitor OPs (overridden by svcai.bypass)
custom-keywords:
enabled: true
triggers:
"example-word": "SLUR" # Instant, zero-latency, zero API cost
llm:
base-url: "https://api.groq.com/openai/v1/chat/completions"
api-key: "" # Leave blank to reuse ai.api-key
model: "llama-3.3-70b-versatile"
rolling-context: true # Send last 5 transcripts for context (disable to save tokens)
json-mode: true # Set false for non-Groq/OpenAI providers
min-confidence: 0.75 # Minimum AI confidence to trigger action (0.0–1.0)
system-prompt: |
You are a strict AI content moderator for a Minecraft server proximity voice chat.
... (full prompt in default config.yml)
actions:
SLUR:
strikes:
1: "msg {player} &c[SVCAI] Warning — slurs are prohibited. (Case: {evidence_id})"
2: "mute {player} 1h [AI Moderation] Slur (2nd offense)"
3: "ban {player} 7d [AI Moderation] Slur (3rd offense)"
HATE_SPEECH:
strikes:
1: "msg {player} &c[SVCAI] Warning — hate speech is prohibited."
2: "ban {player} 3d [AI Moderation] Hate speech"
THREAT:
strikes:
1: "mute {player} 2h [AI Moderation] Threats (1st offense)"
2: "ban {player} 7d [AI Moderation] Threats (2nd offense)"
HARASSMENT:
strikes:
1: "msg {player} &c[SVCAI] Warning — harassment is prohibited."
2: "mute {player} 30m [AI Moderation] Harassment"
3: "kick {player} [AI Moderation] Repeated harassment"
SEXUAL:
command: "kick {player} [AI Moderation] Inappropriate content. {reason}"
discord:
webhook-url: "" # Paste webhook URL to enable rich embeds + WAV uploads
logging:
verbose: false # Enable for debugging, disable in production
The AI classifies every transcript into one of these categories:
| Category | What it catches | Discord color |
| SLUR | Racial, ethnic, religious, or sexuality-based slurs in any language | ■ Deep red |
| HATE_SPEECH | Systematic dehumanization or discrimination against a group | ■ Deep red |
| THREAT | Death threats, doxxing, "I'll find where you live", real-world harm threats | ■ Orange |
| HARASSMENT | Targeted personal attacks, relentless bullying directed at a specific person | ■ Yellow |
| SEXUAL | Sexual harassment or explicit content directed at another player | ■ Yellow |
| NONE | Clean speech, gaming banter, competitive trash talk, casual swearing | No alert |
The AI correctly ignores normal gaming phrases: "I'll kill you", "ez", "you're trash", "touch grass" — all NONE. Only genuine targeted violations are flagged.
- Minecraft: 1.16.5 – 1.21.4+ (Spigot, Paper, or Folia)
- Simple Voice Chat: Any recent release (modrinth)
- Java: 17 or higher
- API key: Free at console.groq.com — no credit card required
Does this work with Simple Voice Chat proximity groups / party mode?
Yes. SVCAIModeration hooks into the raw microphone packet event and captures all voice traffic regardless of channel configuration.
Can players know they're being monitored?
That's up to you. You can add a server rule or MOTD notice. The plugin itself operates silently from the player's perspective.
What happens if the API is down or slow?
All API calls have a 15-second timeout. On 429 rate-limits or 5xx errors, the plugin retries up to twice with exponential jitter backoff and respects
Retry-After headers. If the API is fully unavailable, voice clips are silently skipped — no exceptions, no server impact.Is the Groq free tier actually enough?
Yes, for most servers. Groq's free tier is generous. The plugin minimizes API calls through smart buffering (silence detection, minimum duration threshold, per-player cooldown, and short-clip skipping).
Can I use my own self-hosted model?
Yes. Point
ai.base-url and moderation.llm.base-url at any OpenAI-compatible endpoint. Set json-mode: false if your provider doesn't support structured JSON output.Does it impact TPS?
No. Every operation — transcription, LLM calls, evidence writes, Discord webhooks, strike persistence — runs on dedicated async thread pools. The main server thread is never blocked.
1 - sync your discord account in BBB to get Customer role.
2 - go to cmd channel and type /generate.
3 - Our discord bot will dm your license.
Note : If you did the command multiple times only last key will be work !
Questions, bug reports, or feature requests — join the Discord.
SVCAIModeration is an independent resource and is not affiliated with or endorsed by Mojang, Microsoft, or the Simple Voice Chat project.
