diff --git a/docs/troubleshooting_zh.md b/docs/troubleshooting_zh.md index 1a8e52c78..a7f2c2310 100644 --- a/docs/troubleshooting_zh.md +++ b/docs/troubleshooting_zh.md @@ -9,6 +9,7 @@ - **应该用哪个安装命令、模型 id 或 hub?** 看[安装或 import 失败](#安装或-import-失败)和[模型下载慢或失败](#模型下载慢或失败)。对应 #3321、#3045、#3042、#2973、#2976 等问题。 - **CPU、CUDA、Vulkan、GGUF 应该下载哪个 runtime 包?** 看[llama.cpp 或 GGUF runtime 无法启动](#llamacpp-或-gguf-runtime-无法启动)。对应 #3298、#3297、#3296、#3289、#3243 等问题。 - **实时服务、VAD、vLLM 或 server 输出为什么延迟、为空,或和本地 Python 不一致?** 看[`funasr-server` 启动后 OpenAI 兼容接口请求失败](#funasr-server-启动后-openai-兼容接口请求失败)和[WebSocket 实时输出为空或延迟很大](#websocket-实时输出为空或延迟很大)。对应 #3101、#3109、#3038、#3031、#2968、#2965 等问题。 +- **电话车牌、方言、重复确认语音怎么微调和评测?** 看[电话车牌语音的微调与评测](./vehicle_plate_finetuning_zh.md)。热词是软提示,不是确定性车牌纠错。 ## 安装或 import 失败 diff --git a/docs/vehicle_plate_finetuning_zh.md b/docs/vehicle_plate_finetuning_zh.md new file mode 100644 index 000000000..8eea3edbb --- /dev/null +++ b/docs/vehicle_plate_finetuning_zh.md @@ -0,0 +1,39 @@ +# 电话车牌语音的微调与评测 + +电话挪车、客服确认和方言口音中的车牌识别,应把逐字 ASR 与最终车牌提取分成两个任务。本文适用于 Fun-ASR-Nano 的离线推理或 LoRA 微调;它不承诺热词能够对车牌做字符级纠错。 + +## 先建立基础模型基线 + +在训练前,对同一批脱敏音频固定模型 revision、运行路径、GPU、语言提示和 `itn=True`,至少保存三组原始输出:无热词、仅省份前缀热词、以及省份前缀加业务词的热词。`hotwords` 是提示词偏置,**不是确定性纠错**;它可能影响局部文本,却不能保证恢复重复确认、中文数字与字母混读里的完整车牌。 + +不要只记录最终业务系统选出的车牌。保存原始 ASR 文本、热词列表、推理日志和音频 SHA-256,才能区分声学漏转、ITN 规整和下游提取错误。 + +## 切分与标注 + +训练样本以一次完整播报或确认轮次为单位,建议切成 **2-12 秒** 的语义片段,并在两端保留约 0.2-0.5 秒自然上下文。不要把整段客服通话随机拼成一条训练样本,也不要只截取孤立的 7 个车牌字符。 + +ASR 标签写实际听到的内容,即**逐字转写**:保留重复、修正、停顿词、中文数字和确认语气。不要把“鄂A六T R零七......六T六G R零七”直接标成一个业务系统选择的最终车牌。最终车牌属于下游规则或结构化模型的任务;把两类标签混用会导致模型学到不可预测的删改。 + +保留原始整通电话只用于端到端回归。训练、开发和测试集应按通话或说话人划分,避免同一通话的相邻片段跨集合泄漏。脱敏后再保存数据,删除手机号、姓名和非必要对话内容。 + +## 数据量与迭代 + +先准备约 **1,000** 条高质量切分片段,留出 15%-20% 的通话级独立验证/测试集。确认相对基础模型存在稳定增益后,再扩到 **3,000-5,000** 条;优先补充当前失败最多的方言、男女声、电话压缩、噪声、字母/数字混读、重复与纠正样本,而不是机械复制相近音频。 + +LoRA 前后必须在同一份冻结集上对照,并记录 checkpoint、训练/验证样本数、随机种子和完整启动日志。若 LoRA 前后的原始输出完全一致,先检查 adapter 是否加载、训练是否收敛,以及标签是否真正进入数据集。 + +## 三项评测 + +每次实验同时报告: + +1. 逐字 **CER**,用于观察基础转写质量; +2. 车牌片段 exact match,衡量目标字符是否完整; +3. **整通话** 的最终车牌准确率,衡量下游规则或小模型是否正确处理重复确认。 + +只看 CER 会掩盖一个字符错位导致的业务失败;只看最终车牌又会掩盖 ASR 漏转。将三项指标和失败样例一起保存,才能决定下一轮应补数据、调整后处理,还是回归模型质量。 + +## 推理边界 + +对 Fun-ASR-Nano vLLM 推理,使用仓库文档中的 `language="中文"`,并把 `itn=True` 传给 `generate()`。ITN 只能规整已识别的文本,无法补回声学模型没有转出的字符,也不会自动在多次确认语音中选择最终车牌。 + +生产链路应先保存 ASR 原始候选,再以省份简称、字母和数字规则生成候选;必要时让下游结构化模型在固定 JSON schema 和合法性校验下选择最终值。详细的 vLLM 参数和热词接口见 [vLLM 中文指南](./vllm_guide_zh.md)。 diff --git a/tests/test_vehicle_plate_finetuning_guide.py b/tests/test_vehicle_plate_finetuning_guide.py new file mode 100644 index 000000000..717bed509 --- /dev/null +++ b/tests/test_vehicle_plate_finetuning_guide.py @@ -0,0 +1,20 @@ +from pathlib import Path + + +DOC = Path("docs/vehicle_plate_finetuning_zh.md") + + +def test_vehicle_plate_guide_keeps_asr_and_extraction_boundaries_explicit(): + text = DOC.read_text(encoding="utf-8") + + for expected in ( + "2-12 秒", + "逐字转写", + "不是确定性纠错", + "1,000", + "3,000-5,000", + "CER", + "车牌片段 exact match", + "整通话", + ): + assert expected in text