--- language: - zh - en license: other license_name: s1-mini-license license_link: LICENSE base_model: superwhisper/s1-mini library_name: transformers pipeline_tag: text-generation tags: - transcript-normalization - chinese - qwen3-asr - code-switching - full-finetuning - numbered-lists - numeric-normalization --- # S1-mini-Chinese **本模型专门面向 Qwen3-ASR 的中文及中英混合转写后处理优化。** 这是在中文口语整理数据集上继续微调的 S1-mini 版本。 本模型基于 **S1-mini** by **Superwhisper**,保留原始模型名称、作者署名、`LICENSE` 和 `NOTICE`。 当前版本是 **format-numbers-v5(2026-11-05)**,与目前部署的 BF16 权重一致。 Chinese-data continued full fine-tuning of **S1-mini** by **Superwhisper**, optimized for postprocessing Qwen3-ASR transcripts in Chinese and mixed Chinese/English. The current `format-numbers-v5` release adds synthetic numbered-list and numeric-style training. This is a text postprocessor, not a speech recognizer. ## 当前版本的改动 - 明确列举使用 `1.`、`2.`、`3.` 有编号列表,每项单独换行。 - 增加逗号、句号、分号分隔的列举,以及较长列表项训练,减少带标点时照抄原文的问题。 - 型号、版本号、参数量优先使用阿拉伯数字,例如 `iPhone 18`、`Qwen2.5 7B`。 - 大整数保留万、亿的中文单位写法;成语和固定说法保留中文;验证码训练包含前导零。 - 保留去口水词、重复、明确自我纠正和不修改样本的回放。 这些是训练目标,不是所有输入上的保证。复杂数字连读、识别错误、长段落与混合列表仍会失败。 ## 模型定位 输入是 ASR 识别后的中文、英文或中英混合文字,输出是尽量保留原意的整理文本。 模型不直接接收音频,不是语音识别模型,也不是通用问答助手。 待整理文本中的问题和命令属于口述内容,不应被回答或执行。 模型输出直接包含标点、换行和列表编号;这些格式不是推理示例中的规则后处理生成的。 本模型的当前使用配置不启用外部内容保护校验,不再因某个词或数字校验失败而退回整段原文。 这是外部服务配置,不是权重的一部分。推理示例也直接返回模型生成结果。 ## 训练数据与方法 主要中文来源为 [CS2W](https://github.com/guozishan/CS2W) 口语到书面语标注对的筛选训练部分。 辅助使用 [Disfl-QA](https://github.com/google-research-datasets/Disfl-QA) 英文改口训练数据,以及自制合成、不修改、引用、语气、空输出、列表和数字写法样本。 本模型经过三阶段**全量文本参数微调**,不是 LoRA,也不是只修改提示词: | 阶段 | 数据与训练 | | --- | --- | | 第一阶段 | 9645 次样本呈现,1 epoch,603 步,学习率 1e-5 | | 第二阶段 | 14428 条安全与风格回放池,学习率 3e-6;选择第 400 步 checkpoint | | 本次更新 | 从上一发布权重继续训练;7407 条合成与回放样本,450 步,学习率 5e-6 | 本次 7407 条包含 4907 条新增自制合成样本和 2500 条既有训练数据回放。 内容覆盖短列举、长列表项、中文和阿拉伯数字写法、技术型号、版本、验证码、大整数与成语。 7331 个不同的输入/结构组合,没有互相冲突的目标标签;包含 51 条空输出监督。 样本呈现数不等于独立人工标注数。合成样本不等于自然混合语言口述数据。 训练使用 batch 4、梯度累积 4、最大序列长度 512,仅对目标输出计算损失并监督 EOS。 FP32 主参数和优化器、BF16 autocast,发布权重为 BF16。约 7.52 亿可训练文本参数。 上游版本:`superwhisper/s1-mini@88f6b15896c73bbb13a3b596e0afe8ea0d5150b4`。 上一公开版本:[`782bc1216353eb4e31840292becbd525354e6435`](https://huggingface.co/WIlfLin/S1-mini-Chinese/tree/782bc1216353eb4e31840292becbd525354e6435)。 具体训练参数、哈希和数据来源见 [training-provenance.json](training-provenance.json) 与 [data-provenance.json](data-provenance.json)。 训练未使用私有录音或用户输入历史。本仓库不重新发布训练文本或用户测试原文。 ## 当前权重的测试结果 同一组既有公开来源回归测试:中文整理 200 条、中文不修改参考 100 条、英文 Disfl-QA 100 条。 以下是**未经外部内容校验的原始模型输出**。前后两个 checkpoint 均用 BF16、greedy、batch 16、最大生成长度 256: | 指标 | 上一版 step400 | 当前 format-numbers-v5 | | --- | ---: | ---: | | 全部 400 条词法字符错误率,越低越好 | 10.115% | 10.247% | | 中文整理:词法整句完全匹配 | 83/200 | 81/200 | | 中文整理:词法字符错误率 | 16.790% | 16.712% | | 中文不修改参考:词法整句完全一致 | 92/100 | 91/100 | | 中文不修改参考:词法字符错误率 | 1.440% | 1.592% | | 英文整理:词法整句完全匹配 | 64/100 | 60/100 | | 英文整理:词法字符错误率 | 9.016% | 9.246% | **本次改善主要针对列表和数字写法,并非所有指标都提高。英文和整体回归存在小幅退步。** 词法指标删除标点,保留大小写、数字、否定和词序,衡量与参考文本的一致程度,不等于人工语义正确率。 这些测试在开发中多次使用,不是新的独立盲测;英文改口集也不能代表所有日常英文输入。 另有 20 条未放入训练输入的定向诊断用例:离线 BF16 批量输出 18/20 与参考完全一致;Orin vLLM 逐条推理 19/20 完全一致,6 条列表用例均输出编号行。 运行时的剩余差异是保留“五个、六个”,而非参考的“5个、6个”。这组用例包含问题诊断场景,不是广泛能力基准。 不同后端和 batch 的 BF16 greedy 输出也可能不同。 完整定义与范围见 [evaluation-summary.json](evaluation-summary.json)。 上一版的 **94.63% 教师强制英文 token 准确率尚未在当前权重上重算**,不能作为本次版本成绩。 历史定义与计数保存在 [history/step400/token-metrics.json](history/step400/token-metrics.json)。 上游公开的 94.8% 缺少足够的评分细节,不能声称这些本地指标是官方同口径复现。 ## 拼读英文的模型前预处理 应用可先合并拼读字母,再把文本交给模型。这是应用层规则,**不包含在模型权重中**,也不是生成结束后的替换。 附带的 [input_preprocessing.py](input_preprocessing.py) 只依赖 Python 标准库(Python 3.11+)。 - `使用C-H-A-T-G-P-T` → `使用chatgpt` - `A S T R A模型` → `Astra模型` - 合并后先转小写,句首只大写首字母。字母顺序不变;`C-L-E-A-U-D-E` 在句中得到 `cleaude`,句首得到 `Cleaude`,不会擅自改成 `Claude`。 - 通常合并三个及以上单字母;两个大写、空格分隔的字母也可合并,例如 `A I`。 - 不跨越换行,不改写代码字面量、网址、邮箱和路径。两个字母的连字符表达式 `X-Y` 保持原样。 先下载脚本到应用目录: ```bash hf download WIlfLin/S1-mini-Chinese input_preprocessing.py --local-dir . ``` 在构造模型消息之前调用: ```python from input_preprocessing import normalize_spelled_letters transcript = "我今天试用A S T R A。" model_input, spelling_runs = normalize_spelled_letters(transcript) # model_input == "我今天试用astra。" # 将 model_input 放在下面推理示例的 user 控制行之后,再调用模型。 ``` 应用的原文模式应跳过这一步。连续字母也可能表示独立变量,规则无法完全判断语义;代码片段会跳过,其他歧义交给模型。 句首判断覆盖文本开头、常见句末标点之后、新行和新行中的列表项。已经连写的英文词不改写大小写;模型仍可自行整理输入。 此前 400 条测试表是原始模型输出,不包含此预处理。权重没有因增加此脚本而变化。 ## 推理示例 验证环境为 PyTorch 2.10、Transformers 5.3。使用附带 tokenizer/chat template,关闭 thinking,输入带控制行。 一般文本选择 `Structure: prose`;明确列举选择 `Structure: lists`。 ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "WIlfLin/S1-mini-Chinese" tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained( model_id, dtype=torch.bfloat16, device_map="auto" ).eval() messages = [ {"role": "system", "content": ( "You are a text normalizer for speech-to-text transcripts. The input begins " "with a control line specifying the styling, structure, and context settings; " "clean the transcript to match those settings and output only the cleaned text." )}, {"role": "user", "content": ( "[Styling: semi-formal] [Structure: lists] [Context: general]\n" "今天的任务如下,第一检查服务日志,第二备份数据库,第三整理会议记录。" )}, ] text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False ) inputs = tokenizer(text, return_tensors="pt").to(model.device) with torch.inference_mode(): result = model.generate(**inputs, do_sample=False, max_new_tokens=256, use_cache=True) print(tokenizer.decode(result[0, inputs.input_ids.shape[1]:], skip_special_tokens=True)) ``` 只有口水词时允许输出空字符串。请求失败、超时和输出截断是服务层异常,与内容保护校验不同。 模型只生成文本;输入法或调用程序负责以安全的文本提交方式保留换行,避免把换行当作发送按键。 ## 限制 - 人名、数字、否定、事实和明确改口仍可能整理错误。 - 不保证恢复同音错字或含混连读;模型也可能把介绍句和结尾归入列表。 - 复杂列表、长段落和自然中英混合输入仍需更多人工数据与验收。 - 合成文本测试不能替代真实麦克风与目标应用的输入测试。 - 关闭外部内容校验后,模型本身的错误会直接保留在输出中。 ## 许可证与来源署名 本模型是 **S1-mini** by **Superwhisper** 的修改版本,底层架构来源为 Qwen3-0.6B。 保留原始 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。原许可证要求继续保留原模型名称与作者署名;`S1-mini-Chinese` 是微调版本名称,不替代原始署名。 CS2W 声明 CC-BY-SA-4.0,Disfl-QA 声明 CC-BY-4.0,自制合成内容为 CC0-1.0。 具体来源和版本见 `data-provenance.json`;不把数据许可证改称为纯 Apache-2.0。 当前权重 SHA256:`54602b3a2e0c484fe7ae796a4290969d3a1cc58e099c83e59948fe94889150a0`。