怎么做一个应用测试:老外说中文说得准不准
本文系统介绍了中文口语自动评测(CAPT)的技术实现方案。核心采用标准文本与发音比对思路,通过ASR识别、强制对齐和音素比对计算发音准确度。特别针对中文特点,重点处理声母韵母混淆、声调识别等问题,并评估流利度和可理解度。文章推荐直接调用微软、阿里云等现成API实现快速部署,也详细讲解了自建系统的技术路线,包括ASR选型、对齐处理、GOP打分等关键环节。最后针对外语学习者提出优化建议,如母语特定错误
“老外说中文说得准不准”其实就是做一个中文口语自动评测(CAPT),行业里早就有一整套套路,可以直接抄。下面我按“做法 → 要点 → 能用的模型/API → 怎么落到你现在的系统”来讲。
一、核心思路:别只看ASR转写,要看“该怎么读”和“实际怎么读”
判断准确度要有参照。参照一般来自两种地方:
1. 标准文本参照:系统知道他此刻应该读哪句话、哪个词、哪个字(比如课文朗读、跟读、跟老师念)。
2. 目标音素参照:系统知道这句话的理想语音序列应该是哪些声母-韵母-声调。
所以典型流程是👇:
1. 输入标准文本(比如“我想喝水”)。
2. 语音识别 + 强制对齐(forced alignment):对齐出“我/想/喝/水”的起止时间、每个字的声母韵母。
3. 按音素/音节打分:比较“模型认为他说的声音” vs “这句标准读法应该出现的声音”,算出一个“好坏度”。
4. 再合成到词/句层面,给出 0~100 分、错误位置、错误类型(声母错、韵母错、声调错、漏读/增读)。
这就是最经典的 GOP(Goodness of Pronunciation)→ 扩展GOP → 深度学习打分模型 路线。
⸻
二、中文要特别干的几件事
中文和英文不一样,要特别看这几条:
1. 声母-韵母准确度
• 判是不是把 zh / z / j,ch / c / q,sh / s / x 搞混了
• 判 n / l、r / l、h / f、ü / u 这些典型外教错音
• 方法:forced alignment 出来以后,拿到对应音素的 posterior / likelihood ,再做一个“该音素 vs 实际声学帧”的对比,低于阈值就判错。
2. 声调(Tone)准确度
• 对外国人学中文,声调往往比分母还重要,要单独一个子模型。
• 通常会提取 F0曲线 + 能量 + 时长,跑一个声调分类器(1/2/3/4/轻声),再跟标准文本里的调号比。
• 错误要能细分成:调型错(3说成2)、轻声没读轻、变调没做(比如“一、七、八在四声前变调”这类你也可以做规则+识别)。
3. 语调/流利度
• 外国人可能每个字都对,但“机械”“一字一顿”,这要扣“流利度/连贯度”,可以用:
• 语速(syllables / sec)
• 停顿次数和位置(是不是老在词中间停)
• 重复和回读
• 这一段可以用 ASR 的时间戳直接算,或者上一个小的 prosody 模型。
4. 可理解度(intelligibility)
• 有的音你能听出来他想说啥,但声学模型很困惑,这个时候可以用“识别 top-k 置信度”来估一个“我能不能听懂”。
• 简单做法:跑一遍普通 ASR,把识别结果跟标准文本做 CER(字错率),字错率太高说明可理解度差。
⸻
三、能直接用的API / 服务(你现在就能接)
这里有现成的,真的不用从0写:
1. 微软 Azure Speech → Pronunciation Assessment
• 支持中文(zh-CN),能给出 Accuracy / Fluency / Completeness,还能标哪一段读错了,还能返回音素级别。
• 你只要把“标准文本 + 录音”一起发上去,它就能告诉你“这个字发不准”。适合外教平台、中文学习APP。
2. 阿里云 智能语音评测
• 有“中文朗读/跟读/对话评测”,会给准确度、完整度、流利度,也能看到音节级别的错误。
• 优点:国内部署方便,延迟低,支持移动端场景。
3. 腾讯云 语音评测(EduScore/朗读评测)
• 就是给教育场景做的,支持字、词、句、篇、自由说,看发音是否标准,也有打分。
4. 科大讯飞 口语评测
• 做教育起家的,中文口语测评比较成熟,能到声母韵母级别,还能配错误码。
👉 你的业务如果是“老外上你的平台学中文,要一个评分回去”,优先用这些API,你就省掉整套声学建模 + 对齐的活,前端录音 ➜ 后端丢评测 ➜ 存结果。
⸻
四、如果你要自己做(私有化 / 内网 / 要定制错误类型)
可以这样搭一条 pipeline:
1. ASR或声学前端
• 选一个支持中文的开源模型:Wenet、FunASR、SenseVoice-small、Paraformer 这一类
• 要能输出 ctc/attn 的对齐信息 或者你再跑一个 蒙版force alignment(montreal forced aligner for Chinese / AISHELL-FA)
2. 对齐到音节/音素
• 把标准文本转成拼音+声调(pypinyin就行),再映射成你的声学模型的音素表
• 用对齐把每个音素的起止时间切出来
3. GOP/扩展GOP打分
• 对每个音素算一个 log posterior,和这个位置所有音素的最大值做差,得到一个“发音好坏分”
• 阈值你自己定,还可以做“按L1语言分别定阈值”,比如英语母语常错的你阈值设宽一点
4. 语调/声调模型
• 从切出来的音节段提 F0 / 能量 / 时长 → LSTM/Transformer 分类成 1/2/3/4/轻
• 和标准文本的声调一对比,就知道哪几个调错
5. 规则层
• 中文有一堆变调、儿化、轻声,你要不认,就会把对的判成错;所以要在打分之前先按规则改一下“期望发音序列”
6. 结果融合
• 最后给用户的不是“0/1”,而是:
{
“overall”: 86,
“accuracy”: 82,
“fluency”: 91,
“complete”: 100,
“errors”: [
{“char”: “上”, “phone”: “shang4”, “problem”: “tone”, “suggest”: “读成了3声”},
{“char”: “学”, “phone”: “xue2”, “problem”: “initial”, “suggest”: “x 不要读成 s”}
]
}
⸻
五、怎么特别针对“外国人”做得更准?
这是你问的重点👇
1. 做“母语特定错误模板”:
• 英语母语:卷舌 vs 不卷舌,/ʐ/→/z/,ü→u
• 韩语母语:送气/不送气,入声消失
• 俄语母语:前后鼻音
你可以根据用户的“母语”选一套错误解释,这样评测看起来很聪明。
2. 把“能不能听懂”跟“是不是标准普通话”分开:
• 很多老外说得不标准,但其实听得懂;
• 所以可以并行:ASR CER 用来做“能不能听懂”,音素打分用来做“标准度”,最后出两条分。
3. 给建议而不是只有分:
• “你的声调整体偏高,建议先练2、3声对比”
• “zh / z 经常混,先练卷舌,再练平舌”
这个只要你在打分阶段记录错得最多的几类音,再套一个模板就行。
⸻
六、落地到你的场景怎么串
你之前在做“孩子语音/说话人识别”“批量处理”“Python + FastAPI + 调模型服务”这一套都写过了,我们可以直接类比写一个:
1. 前端录音(5~15秒)→ 16k wav
2. FastAPI 收到后:
• 如果你走云:转成指定格式 → 调“语音评测API” → 拿回打分JSON
• 如果你走自研:送到 ASR/对齐服务 → 再送到“中文发音打分服务”
3. 把 JSON 打平后存在你现在的数据库里,就和你做 OCR 质检那种结构化输出是一样的。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)