战场指挥官 · 技术白皮书 v0.2
本文是 战场指挥官 的技术验证稿,聚焦《全战三国》语音指挥 Mod 的第一版实现。
最初技术启发
本文是 军令如山白皮书 的最初技术启发,保留 STT、LLM 指令解析和执行层的早期线索。当前产品不再以《全战三国》Mod 为唯一落点,而是收束为“自然语言实时指挥版 TABS”。
一、技术验证目标
做一个运行在《全战三国》之上的语音指挥 Mod。
玩家不再使用键鼠精确操作,而是用语音下令,由 AI 理解指令并在游戏中执行。
第一版验证的不是完整守城战,也不是完整部将 AI,而是最小链路:
玩家语音 → 本地语音识别 → LLM 指令解析 → 游戏内单位执行。
验收标准:
能对着麦克风说一句“把预备队调去北门”,游戏里对应单位完成移动。
二、与概念母稿的边界
战场指挥官 讨论的是完整游戏体验:守城战、多线压力、传令兵延迟、部将性格和信息不对称。
本文只讨论《全战三国》Mod 的技术切片:
- 使用现成游戏战场,避免从零开发战斗系统。
- 第一版先不做传令兵延迟动画。
- 第一版先不做部将 AI 回推。
- 第一版先不做完整战役流程。
- 第一版可以是纯后台工具,不需要自定义 UI。
这个切片的价值是尽快验证“语音指令能否替代一部分键鼠操作,并带来指挥官临场感”。
三、系统架构
[玩家语音]
↓
[STT:SenseVoice-small 本地] ← 0.4s 级别,完全离线
↓ 文字
[LLM:指令解析] ← 理解意图,输出结构化指令
↓ JSON
[指令执行层:全战三国 Mod] ← 模拟键鼠操作 / 脚本接口
↓
[游戏响应]STT 层
- 工具:本地 SenseVoice-small(FunASR)。
- 输入:麦克风实时音频。
- 输出:中文文字。
- 延迟目标:< 0.5s。
- 已知状态:本地测试约 0.376s,准确率可接受。
LLM 解析层
输入示例:
把预备队调去北门,弓箭手全部撤回东城楼输出示例:
[
{ "unit": "预备队", "target": "北门", "action": "增援" },
{ "unit": "弓箭手", "target": "东城楼", "action": "撤退" }
]候选方案:
- 本地 Ollama:优先做,验证离线和低成本路径。
- 云端模型:后续对比解析效果与延迟。
延迟目标:< 0.5s。
指令执行层
- 接收结构化 JSON,翻译成游戏内操作。
- 候选方式:模拟键鼠(pyautogui)或游戏脚本接口。
- 参考:zhanlong 项目。
四、Demo 范围
目标场景
《全战三国》野战。玩家作为主将,通过语音调配各部兵力,与敌军正面交战。
包含
- 麦克风实时录音,采用 Push-to-Talk:按住说话,松开识别。
- SenseVoice-small 本地识别。
- LLM 解析出结构化指令。
- 至少支持 3 类基础指令:增援、撤退、集合。
- 指令通过模拟输入或脚本接口在游戏中执行。
不包含
- 传令兵延迟动画。
- 部将 AI 回推。
- 完整战役流程。
- 自定义战场 UI。
- 多人联机。
- 除中文以外的语言。
五、技术选型确认
| 组件 | 选型 | 状态 |
|---|---|---|
| STT | 本地 SenseVoice-small | 已测试 |
| LLM 解析 | 本地 Ollama 优先,后续对比云端 | 待实现 |
| 游戏接口 | 全战三国 Mod 脚本 / pyautogui | 待调研 |
| 触发方式 | Push-to-Talk | 待实现 |
| 运行平台 | Windows,Python 3.13,.venv | 已建立 |
六、指令词表 v0.1
单位类型
| 词 | 含义 |
|---|---|
| 预备队 | 后备兵力 |
| 弓箭手 / 弓兵 | 远程单位 |
| 骑兵 | 骑马单位 |
| 步兵 / 盾兵 | 近战步兵 |
| 投石车 / 攻城器械 | 远程攻城 |
位置类型
| 词 | 含义 |
|---|---|
| 左翼 | 战线左侧 |
| 右翼 | 战线右侧 |
| 中路 | 战线中央 |
| 前线 | 最前方交战位置 |
| 后方 | 后排支援位置 |
| 中军 / 本阵 | 主将所在核心阵地 |
动作类型
| 词 | 含义 |
|---|---|
| 增援 / 支援 / 调去 / 派去 | 移动到目标地点 |
| 撤退 / 撤回 / 后撤 | 从当前位置撤离 |
| 防守 / 守住 / 坚守 | 原地防御 |
| 进攻 / 出击 / 冲上去 | 主动进攻 |
| 集合 / 集结 | 聚集到某点 |
| 停下 / 原地待命 | 暂停行动 |
七、待验证问题
- LLM 解析:本地 Ollama 是否足够稳定,是否需要云端模型兜底。
- 全战三国 Mod 接口:脚本接口和模拟键鼠哪条路径更稳。
- Push-to-Talk:按住说话、松开识别的操作节奏是否自然。
- 指令词表:需要提前定义强词表,还是允许开放式理解。
- 空间锚点:野战中的“左翼 / 右翼 / 中路”是否足够稳定,还是应优先选择守城战的“北门 / 东城楼 / 瓮城”。