Loading... # 基于 CTC 的普通话发音教练系统技术分析 # 一、新闻概述 ## 1. 标题 A 9M-parameter Mandarin pronunciation tutor —— 基于 CTC 的普通话发音教练系统 ## 2. 发布时间 2026 年 1 月 31 日 ## 3. 来源 SimEdw's Blog # 二、核心内容 ## 1. 事件摘要 ### A. 主要内容 作者 Simon Edwardsson 开发了一个基于深度学习的计算机辅助发音训练(CAPT)系统,使用 CTC(Connectionist Temporal Classification)损失训练 Conformer 编码器,用于评估和纠正普通话发音。 ### B. 核心亮点 - 使用 Conformer + CTC 架构,参数量仅 9M - 基于 Pinyin + tone 作为 token,精确捕捉声调错误 - 使用 Viterbi 算法进行强制对齐,定位发音错误 - 模型量化后仅 11MB,可浏览器端运行 - 基于 AISHELL-1 和 Primewords 数据集训练(约 300 小时) ## 2. 关键信息 ### A. 涉及技术 - Conformer 架构(结合 CNN 和 Transformer) - CTC(Connectionist Temporal Classification)损失函数 - Viterbi 动态规划算法 - SpecAugment 数据增强 - INT8 量化 ### B. 模型性能 - 参数量:9M - TER(Token Error Rate):5.27% - 声调准确率:98.29% - 模型大小:INT8 量化后 11MB ### C. 数据集 - AISHELL-1 + Primewords - 总时长约 300 小时 - 使用 SpecAugment 增强 # 三、详细报道 ## 1. 技术背景 ### A. 问题定义 普通话学习中的发音纠正是一个常见问题。传统方法包括音高可视化(基于 FFT 和启发式算法),但这种方法容易受背景噪声、协同发音、说话人变化等因素影响。 ### B. 技术选择 作者选择了基于深度学习的 CAPT 系统,而不是手工设计的特征提取方法。这是基于"苦涩的教训"(The Bitter Lesson)——当有足够的数据和计算资源时,学习的表征通常优于精心手工设计的系统。 ## 2. 系统架构 ### A. 整体架构 ```mermaid graph TB Input[音频输入] --> Preproc[预处理] Preproc --> Spec[声学特征提取] Spec --> Conv[Conformer 编码器] Conv --> CTC[CTC 输出层] CTC --> Prob[概率分布矩阵] Prob --> Viterbi[Viterbi 对齐] Viterbi --> Align[强制对齐结果] Align --> Score[置信度评分] Score --> UI[UI 高亮显示] ```  ### B. 工作流程 1. 用户录制音频 2. 提取声学特征(梅尔频谱) 3. Conformer 编码器逐帧输出 token 概率 4. CTC 解码获得原始输出序列 5. Viterbi 算法计算最优对齐路径 6. 根据对齐结果计算每个音节的置信度 7. UI 高亮显示发音错误的音节 ## 3. 核心技术 ### A. 为什么选择 Conformer 语音需要同时捕捉局部和全局模式: **局部交互**:卷捲舌音 zh 和齿龈音 z 的区别发生在毫秒级。CNN 擅长捕捉这些短距离频谱特征。 **全局交互**:普通话声调是相对的(对我来说的"高音调"对儿童可能是"低音调")且依赖上下文(变调)。Transformer 擅长建模这种长距离上下文。 Conformer 结合了两者:卷积处理局部细节,注意力处理全局结构。 ### B. 为什么选择 CTC 大多数现代 ASR 模型(如 Whisper)是序列到序列的:它们将音频转换为最可能的文本。缺点是它们会自动纠正错误。 这对于转录是特性,但对于语言学习是 bug。如果我的声调错了,我不希望模型猜测我"想说什么",而是希望它告诉我实际说了什么。 CTC 工作方式不同。它为每一帧音频(约每 40 毫秒)输出概率分布。为了处理对齐,它引入了特殊的 <blank> token。 如果音频是 "hello",原始输出可能类似于: ``` h h h <blank> e e <blank> l l l l <blank> l l o o o ``` 折叠重复并移除 blank 后得到 "hello"。这强制模型逐帧处理实际说的内容。 ### C. 强制对齐 CTC 告诉我们说了什么,但不完全是什么时候说的。 对于一个 3 秒的片段,模型可能输出一个约 150 个时间步的矩阵,每个时间步包含所有 token 的概率。矩阵的大部分只是 <blank>。 如果用户读 "Nǐ hǎo"(ni3, hao3),我们期望两个高概率区域:一个对应 ni3,一个对应 hao3。 我们需要找到通过这个矩阵的单条最优路径,满足: - 从开始到结束 - 按顺序经过 ni3 → hao3 - 最大化总概率 这正是 Viterbi 算法使用动态规划计算的。 ### D. Tokenization 设计 大多数普通话 ASR 系统输出汉字。这隐藏了发音错误,因为书写系统编码的是意义而非发音。 相反,作者为每个拼音音节 + 声调创建了一个 token: - zhong1 是一个 token - zhong4 是完全不同的 token 如果我说错了声调,模型会明确预测错误的 token ID。 作者还将轻声强制规范化为第 5 声(ma5)。这产生了 1254 个 token 的词汇表,加上 <unk> 和 <blank>。 ## 4. 模型训练与优化 ### A. 训练配置 - 数据集:AISHELL-1 + Primewords(约 300 小时) - 数据增强:SpecAugment(时间/频率屏蔽) - 训练硬件:4 × NVIDIA GeForce RTX 4090 - 训练时长:约 8 小时 ### B. 评估指标 - TER(Token Error Rate):整体准确率 - Tone Accuracy:声调 1-5 的准确率 - Confusion Groups:困难初始对之间的错误(如 zh/ch/sh vs z/c/s) ### C. 模型压缩 作者从"中等"模型(约 75M 参数)开始。效果很好,但希望能在浏览器或手机上运行而不耗尽电池。 不断缩小后,惊讶地发现准确率损失很小: | 参数量 | TER | 声调准确率 | |-------|-----|----------| | 75M | 4.83% | 98.47% | | 35M | 5.16% | 98.36% | | 9M | 5.27% | 98.29% | 9M 参数的模型几乎同样好。这强烈表明任务是数据受限的,而不是计算受限的。 FP32 模型约 37MB。经过 INT8 量化后,缩小到约 11MB,准确率下降可忽略不计(TER +0.0003)。足够小,可以通过 onnxruntime-web 即时加载。 ## 5. 技术挑战与解决方案 ### A. 前导静音问题 为了突出错误,需要强制对齐。但作者遇到了一个关于前导静音的棘手 bug。 作者录制自己说"我喜欢…"并在说话前停顿了一秒。模型自信地告诉他第一个音节是错的。置信度得分:0.0。 原因:对齐将静音帧分配给 wo3。当对那个时间跨度内的概率取平均时,压倒性的 <blank> 概率完全淹没了 wo3。 ### B. 解决方案 作者将 UI 跨度(被高亮显示的内容)与评分帧(对置信度有贡献的内容)解耦。 简单地忽略模型确信是静音的帧: ```python def _filter_nonblank_frames(span_logp: torch.Tensor, blank_id: int = 0, thr: float = 0.7): """仅保留 <blank> 概率低于阈值的帧。 如果过滤了所有内容(完全静音),则回退到对整个跨度进行评分。""" p_blank = span_logp[:, blank_id].exp() keep = p_blank < thr if keep.any(): return span_logp[keep] return span_logp # 回退 ``` 这一单一变化将第一个音节的置信度得分从 0.0 提高到了 0.99。 ## 6. 局限性 ### A. 领域偏移 有趣的是,母语人士抱怨他们必须过度发音才能被标记为正确。这可能是一个领域偏移问题:AISHELL 主要是朗读语音,而随意语速更快且更含糊。 ### B. 儿童语音 儿童表现也不好:他们的音高更高,而他们在训练数据中基本不存在。添加像 Common Voice 这样的对话数据集显然是下一步。 # 四、影响分析 ## 1. 技术创新 ### A. 小模型优势 9M 参数的模型在保持高准确率的同时实现了极小的模型大小,展示了: - 端侧 AI 的可行性 - 数据质量比模型大小更重要 - CTC 对发音评估任务的价值 ### B. Tokenization 设计 使用 Pinyin + tone 作为 token 的设计为发音评估任务提供了更细粒度的反馈,相比传统的汉字输出方式。 ## 2. 应用价值 ### A. 语言学习 为普通话学习者提供了实时、准确的发音反馈,解决了没有老师的情况下难以自我纠正的问题。 ### B. 端侧部署 11MB 的模型大小使其可以在浏览器和移动设备上运行,无需服务器支持,保护用户隐私。 ## 3. 技术趋势 ### A. CAPT 系统发展 计算机辅助发音训练(CAPT)系统正在从基于规则的方法向深度学习方法转变。 ### B. 小模型趋势 随着模型压缩技术的发展,小模型在特定任务上的表现越来越接近大模型。 # 五、技术细节 ## 1. Conformer 架构优势 ```mermaid graph LR Input[输入] --> CNN[卷积层] CNN --> Local[局部特征] CNN --> Attn[自注意力层] Attn --> Global[全局特征] Local --> Merge[特征融合] Global --> Merge Merge --> Output[输出] ```  ## 2. CTC 解码流程 ```mermaid sequenceDiagram participant Audio as 音频输入 participant Encoder as Conformer 编码器 participant CTC as CTC 层 participant Viterbi as Viterbi 算法 participant Output as 输出对齐 Audio->>Encoder: 逐帧特征 Encoder->>CTC: 概率分布 CTC->>Viterbi: 概率矩阵 Viterbi->>Output: 最优路径 ```  ## 3. 模型压缩效果 ```mermaid graph LR A[75M 参数] -->|缩减 83%| B[9M 参数] B -->|INT8 量化| C[11MB 模型] A -.->|TER: 4.83%| D[准确率基准] B -.->|TER: 5.27%| D C -.->|TER: 5.30%| D ```  # 六、各方反应 ## 1. 作者反馈 作者在 beta 测试中已经感觉到发音在改善。系统严格且不宽容,正是他所需要的。 ## 2. 用户反馈 - 母语人士需要过度发音才能被标记为正确 - 儿童用户表现不佳 ## 3. 技术社区 该项目的开源和浏览器端实现展示了端侧 AI 的潜力。 *** ## 参考资料 1. [A 9M-parameter Mandarin pronunciation tutor - SimEdw's Blog](https://simedw.com/2026/01/31/ear-pronunication-via-ctc/) 2. [Live Demo - EAR Project](https://simedw.com/projects/ear) 最后修改:2026 年 01 月 31 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏