Files
qwen2.5-0.5b-game-commands-stt/TRAINING_REPORT.md
ModelHub XC 324c94e24f 初始化项目,由ModelHub XC社区提供模型
Model: Marco333/qwen2.5-0.5b-game-commands-stt
Source: Original Platform
2026-06-18 04:38:16 +08:00

7.1 KiB
Raw Permalink Blame History

Training Report: Game Command Recognition from Noisy STT

Overview

This model fine-tunes Qwen2.5-0.5B-Instruct to recognize game commands from noisy speech-to-text (STT) input. Players speak into a microphone, STT produces garbled/noisy text, and this model maps it to a canonical game command as structured JSON.

Final Result: 99.4% token accuracy on held-out test set.


Architecture & Approach

Component Choice Rationale
Base model Qwen/Qwen2.5-0.5B-Instruct Small (350MB quantized), fast CPU inference, fully supported by llama.cpp (Qwen2 architecture)
Training method SFT + LoRA Parameter-efficient; only ~7M trainable params vs 494M total; fast training
Output format JSON: {"command": "OpenDoor"} Deterministic, parseable, exact-match evaluatable
Dataset Synthetic noisy STT → command pairs No gaming voice command dataset exists; generated with ASR noise simulation

Literature basis: arxiv:2502.12923 — "On-Device LLMs for Home Assistant" demonstrated Qwen2-0.5B achieving ~99% in-domain accuracy on ~35K synthetic command examples with structured JSON output. We adapted this recipe for gaming commands.


Dataset

Source: Marco333/game-commands-noisy-stt

Split Samples
Train 2,097
Test 869

Commands (20 total)

Attack, CastSpell, CloseDoor, Crouch, Defend, DropItem, Heal, Interact, Jump, OpenDoor, OpenInventory, OpenMap, PauseGame, PickUp, Reload, SaveGame, Sprint, Stop, SwitchWeapon, UseItem

Plus "Unknown" for non-command speech (negative examples).

Noise Simulation

The dataset simulates real ASR errors:

  • Phonetic confusions: "door" → "dur", "attack" → "attak", "heal" → "hel"
  • Word drops: "the" disappears randomly
  • Filler words: "um", "uh" inserted (mic background noise)
  • Character-level noise: swaps, deletions, insertions
  • Formatting issues: random caps, missing/extra spaces, stuttering

Noise levels vary randomly between 0.20.8 per sample to ensure the model sees easy and hard examples.


Training Configuration

Hyperparameter Value
Learning rate 2e-4 (10× base for LoRA)
LR scheduler Cosine
Warmup 5% of steps
Epochs 5
Batch size 8
Gradient accumulation 2 (effective batch = 16)
Max sequence length 512 tokens
Precision bf16
Loss Cross-entropy on assistant tokens only

LoRA Configuration

Parameter Value
Rank (r) 32
Alpha 16
Dropout 0.05
Target modules q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
Trainable params ~7M / 494M total (1.4%)

Training Results

Loss Curve

Epoch Train Loss Eval Loss Eval Token Accuracy
1 0.120 0.043 98.7%
2 0.025 0.022 99.3%
3 0.006 0.022 99.4%
4 0.003 0.027 99.5%
5 0.002 0.025 99.4%

Best checkpoint: Epoch 2 (eval_loss = 0.022, loaded via load_best_model_at_end)

Key Observations

  1. Rapid convergence: Loss dropped from 0.40 → 0.02 in just 2 epochs. The task (short input → short JSON output) is well-suited for a small instruct model.

  2. No overfitting concerns: Eval loss stabilized at ~0.022 and didn't degrade significantly in later epochs. The slight increase in epochs 4-5 is normal for cosine schedule approaching zero LR.

  3. 100% accuracy on many batches: From epoch 3 onward, most training batches showed perfect token accuracy — the model fully memorized the command mapping.

  4. Training time: 44 minutes on a single NVIDIA T4 (16GB VRAM). Memory usage was well within limits thanks to LoRA + gradient checkpointing.


Inference Validation

Post-training inference on held-out noisy inputs:

Noisy STT Input Expected Model Output
opun da dur OpenDoor {"command": "OpenDoor"}
attak enami Attack {"command": "Attack"}
hel me Heal {"command": "Heal"}
pic it op PickUp {"command": "PickUp"}
hello how are you Unknown {"command": "Unknown"}

5/5 correct — including correctly rejecting non-command speech as "Unknown".


Deployment Path

GGUF Conversion (for llama.cpp / C++ runtime)

git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
pip install -r requirements.txt
python convert_hf_to_gguf.py Marco333/qwen2.5-0.5b-game-commands-stt --outtype f16 --outfile model.gguf
cmake -B build && cmake --build build --config Release
./build/bin/llama-quantize model.gguf model_q4.gguf Q4_K_M

Expected Runtime Performance (Q4_K_M)

Metric Value
Model size ~180MB
Inference latency 50100ms per command (CPU, 4 cores)
RAM usage ~300MB

Integration Pattern

Player speaks → STT engine → noisy text → [THIS MODEL] → {"command": "OpenDoor"} → game action

System prompt must be provided at inference time (included in training data):

You are a game command interpreter. The user's input is noisy speech-to-text...
Valid commands: Attack, CastSpell, CloseDoor, ...
Respond with ONLY a JSON object: {"command": "<CommandName>"}

Limitations & Next Steps

Current Limitations

  • Small dataset: 2K training samples covers the 20 defined commands well, but more data would improve robustness to novel phrasings
  • Synthetic noise only: Real ASR errors from Whisper/DeepSpeech may differ from simulated phonetic noise
  • Fixed command set: Adding new commands requires regenerating data and retraining
  1. Expand to 10K+ samples by generating more paraphrase variations per command
  2. Real ASR noise: Run canonical phrases through TTS → Whisper pipeline to get authentic STT errors
  3. Player-specific fine-tuning: Collect a small set of real player recordings to fine-tune further
  4. Confidence thresholding: The model could output a confidence score; reject low-confidence matches
  5. Larger model (1.5B): If accuracy on edge cases matters, Qwen2.5-1.5B would give ~86% OOD accuracy vs ~80% for 0.5B (per arxiv:2502.12923)

Artifacts

Resource Link
Model Marco333/qwen2.5-0.5b-game-commands-stt
Dataset Marco333/game-commands-noisy-stt
Training script train.py
Dataset generation create_dataset.py

Reproducibility

pip install trl peft transformers datasets accelerate torch
python train.py

Hardware: 1× NVIDIA T4 (16GB VRAM)
Training time: ~44 minutes
Software: TRL v1.3.0, Transformers v5.6.x, PEFT v0.15.x, PyTorch 2.x