
作为程序员,幸幸苦苦忙碌一年,春节回家也未必轻松,赶火车回家团圆,参加爸妈安排的相亲,同学的婚礼随份子, 被七大姑问候工资,然而最恐怖的却是突如其来的 -- 「[P0 级报警] 核心交易服务响应超时!」
身为一个程序员,每每看到类似的场景我都感同身受

为了过个好年,我们打造了一个能够在极端环境下 单手完成生产系统的救火工具!
然而,碰到的第一个挑战就是,如何让传统的语音识别,能够100%准确的转化成各个云平台API,或者K8S,Linux的操作指令?
1.1 问题背景
首先要解决的是,工程师经常需要在移动端通过语音快速执行各种命令,各种参数,比如 kubectl 等等。在移动端,这个过程面临一个显著的体验问题:在手机虚拟键盘上输入复杂的 Kubernetes 命令极其痛苦,而且效率低下。
语音输入是一个自然的解决方案。然而,传统 ASR(Automatic Speech Recognition,自动语音识别)系统在处理 K8S 命令时面临严峻挑战:
挑战类型 | 具体表现 | 示例 |
|---|---|---|
专有名词识别 | 命令动词被识别为谐音词 | kubectl → "酷 B 控制"、"cube ctl" |
参数组合复杂 | 长命令参数丢失或错位 | kubectl get pods -n default -o wide → "kubectl get pods default wide" |
资源类型混淆 | 缩写与全称混用导致歧义 | svc vs services、deploy vs deployments |
命名空间参数 | 短参数容易被忽略 | -n、--namespace 被吞噬或误识别 |
特殊字符处理 | 符号无法正确识别 | -、--、/ 等符号丢失 |
1.2 传统方案的局限性
传统语音识别方案主要存在以下问题:
1.3 Chaterm 的解决思路
Chaterm 通过双层架构设计,实现了 K8S 命令接近 100% 的精准识别率:

2.1 核心组件架构
在核心组件的实现层面,整体架构遵循「客户端 → 网关 → 外部服务」的设计模式,其中各层级之间通过WebSocket协议进行双向数据交互。

Flutter 移动端:架构分为用户界面(UI)组件与服务层两大模块。在UI层面,VoiceInputButton 组件为用户提供了一个语音输入的接口,并通过WaveAnimation 实时反馈用户的操作状态;而在服务层面上,AudioStreamService 负责处理PCM格式的音频流采集工作,SpeechService 则封装了基于WebSocket协议的数据传输逻辑,同时,VoiceCommandCorrection 模块封装了精心设计的Prompt,实现了对大型语言模型(LLM)进行调用来完成语音命令的纠正功能。
网关层:采用了Go语言构建后端服务,其核心组成部分包括WebSocket处理器和认证模块。特别地,在建立连接的过程中,会附加一个名为 hotword_id 的参数,这使得自动语音识别(ASR)系统能够加载相应的热词列表,从而实现“一次握手,全程优化”的效果。
外部服务体系:主要集成了两方面的关键能力:一是利用腾讯云提供的实时语音识别引擎,该引擎支持热词表、替换词、权重增强等音频处理能力;二是集成LLM服务以提供高级别的语义理解和指令生成能力。这两项技术相互配合,共同提升了系统的整体性能。
2.2 语音执行执行全流程解析

语音驱动运维指令执行:以 kubectl get pods -A 为例
该流程演示了当用户直接口述技术命令时,系统如何处理识别误差并最终精准执行:
3.1 热词表技术原理
热词表(Hotword List) 是 ASR 系统提供的一种领域适配机制,通过提升特定词汇在解码过程中的先验概率,显著提高目标词汇的识别准确率。
3.1.1 为什么需要热词表
通用 ASR 模型基于海量日常语料训练,对专业术语覆盖不足,存在 OOV(Out-of-Vocabulary)问题。当用户说 "kubectl" 时,模型倾向于输出训练时见过的近音词(如"酷B控制"),而非低频专业术语。
3.1.2 工作原理
ASR 解码时,会计算每个候选词的输出概率。热词表通过对特定词汇施加概率加成来改变解码结果:
无热词表: 有热词表(kubectl 权重100):
───────────────────── ─────────────────────
"酷B控制" P=0.35 ← 选中 "kubectl" P=0.15×5=0.75 ← 选中
"kubectl" P=0.15 "酷B控制" P=0.35数学表达:P'(热词) = P(热词) × boost_factor
权重越高,boost_factor 越大,热词在同音竞争中获胜概率越高。
3.1.3 热词权重设置
腾讯云 ASR 支持 1-11,100 的权重范围:
权重范围 | 适用场景 | 说明 |
|---|---|---|
1-10 | 常规业务词汇 | 轻度提升,避免过拟合 |
11 | 专业术语 | 中度提升,平衡准确率与泛化 |
100 | 核心关键词 | 强制识别,适用于 OOV 词汇 |
K8S 命令场景采用权重 100,确保 kubectl、namespace 等核心词汇被优先识别。
3.2 K8S 热词表设计
我们构建了包含 K8S 专用热词表,覆盖以下类别:
3.2.1 核心命令动词
kubectl|100
kubectl get|100
cube control|1003.2.2 资源类型词汇
pods|100
pod|100
services|1003.2.3 常用参数组合
杠n|100
杠n default|100
杠杠 namespace|1003.2.4 完整命令模板
kubectl get pods|100
kubectl get pods -A|100
kubectl get pods -n default|1003.3 热词表集成流程

4.1 LLM 纠错的必要性
尽管热词表显著提升了专业术语的识别率,但 ASR 输出仍可能存在以下问题:
LLM 层的作用:作为语义理解层,将 ASR 的原始输出(自然语言、谐音词、不完整命令)转换为标准的、可执行的 K8S 命令。
4.2 Prompt Engineering 设计
业界对 Prompt Engineering(提示词工程)普遍采用的设计范式包括:明确的角色定义(Role Definition)、清晰的任务边界约束、结构化的处理流程,以及高质量的 Few-shot 示例。一个设计良好的 Prompt 能显著提升模型输出的准确性和一致性。
在 Chaterm 的语音命令纠错场景中,我们遵循上述原则,设计了如下 System Prompt 结构:

4.3 LLM 纠错效果
典型场景纠错示例
场景 | ASR 原始输出 | LLM 纠错输出 |
|---|---|---|
谐音纠错 | "酷 B 控制 get 跑的" | kubectl get pods |
自然语言转换 | "查看所有 pod" | kubectl get pods -A |
参数规范化 | "kubectl get pods 杠 n default" | kubectl get pods -n default |
混合纠错 | "kube ctl describe 的 ployment nginx" | kubectl describe deployment nginx |
资源操作 | "删除 default 下面的 nginx" | kubectl delete pod nginx -n default |
案例 :使用语音输入恢复payment-deployment服务

通过 ASR与热词增强 + LLM 纠错 的双层架构,Chaterm 实现了 K8S 命令接近 100% 的精准识别:
最后,祝大家春节快乐,业务稳定0告警!
欢迎大家试试 Chaterm 移动端,也欢迎从工程视角给我们提意见。
📱 移动端
💻 桌面端
🧑💻 开源仓库
本文由 Chaterm 技术团队撰写,介绍了在移动端实现 K8S 命令高精度语音识别的技术方案。如有问题或建议,欢迎交流讨论。
-End-
原创作者丨双承、DYin