中英泰混说:同一句话里切换语言的识别难点
在泰国的会议、直播和客服通话里,一句话里夹着英文品牌名、缩写或中文人名是很平常的事。对说话人来说毫无障碍,对语音识别却是一类单独的难题。本文说明混说识别的错误通常集中在哪里,以及评测时怎样计分,才不会把“写法不同”当成“听错了”。
1. 什么是混说,难在哪里
混说(code-switching)指同一个说话人在一段话里交替使用几种语言。发生在句子内部的,叫句内切换,比如泰语句子里嵌入一个英文产品名,这是最难的一种。
难点来自三个方面:
- 数据。训练音频大多一条一种语言,模型很少见到切换发生的那一刻,不知道前一个词是泰语时,后一个词还可能是什么。
- 发音。泰语音节末尾能出现的辅音很少,英文词进入泰语后会按泰语的规则改读。比如 ball 写作 บอล,末尾读成 n 的音。泰国人说出来的英文词,和母语者的录音并不一样,模型在英语数据里学到的声学线索不能直接照搬。
- 文字。模型不只要听出是哪个词,还要决定用哪种文字写出来。同一个词可以写成拉丁字母,也可以写成泰文,两种写法都有人用,参考答案里只会有一种。
2. 常见的出错位置
品牌名与产品名
Shopee、LINE、Grab 这类词,产品界面里写拉丁字母,口头聊天里常被写成泰文,比如 ช้อปปี้、ไลน์。模型可能输出其中任何一种,也可能输出一串读音相近、但根本不是这个品牌的泰语词。品牌名同时是普通词时,情况更糟。
外来词的写法
有些外来词的泰文写法已经固定,比如 คอมพิวเตอร์ 几乎不会有人写成 computer。有些没有固定写法,比如“meeting”,既有人写 meeting,也有人写 มีตติ้ง。后一类词,是评测里争议最多的地方。
中文人名与地名
中文人名夹在泰语句子里,说话人可能按普通话读,也可能按潮汕话等方言的读音来读。无论哪种,读音和汉字都不是一一对应的:李明和李铭读音完全相同,只靠音频没法区分,要靠上下文或者人名词表。
语种边界
错误通常出现在切换点前后的一两个词。切换的片段比较长时,模型还可能整段判断错语种,把一小句英文写成发音相近的泰文。
数字、缩写和单位
5G、KPI、“สองล้าน”(两百万)和“2 ล้าน”,说出来的和写出来的并不一致,泰文数字 ๑๒๓ 与阿拉伯数字 123 也混着用。语言一多,可选的写法成倍增加。
声调
泰语和汉语都有声调,但声调系统不同。夹进来的中文词有时会被按泰语的语调说出,声调这条线索就变弱了,模型更依赖上下文,而上下文恰恰在切换处最少。
3. 两种常见思路,各自在哪里失败
处理多语言语音,常见的有两种思路。
一种是先判断语种,再交给对应语言的模型。句与句之间切换时,它没有问题:这一句泰语,下一句英文,各走各的。但句内切换就行不通了:语种判断以整句甚至整段为单位,一句话里的英文词会被当成泰语去识别,写出发音相近的泰文。
另一种是一个模型同时支持几种语言,词表里放着多种文字。它可以在句内切换,但不同语言的词会在同一个词表里互相竞争。训练数据里切换的样本少时,模型倾向于留在句子的底座语言里,把嵌入的词往底座语言上“拉”。
两种思路都要用带切换的评测集来检验。单语测试集上的成绩好,推不出混说也好。
4. 计分:WER 和 CER 都不够用
泰语没有空格,WER 取决于分词器,这一点我们在另一篇讲泰语分词与评测的文章里说过;汉语也一样。英文通常按词计,按字符算会放大差异。一行混合文本里,没有哪个单位能同时适合三种文字。
常用的办法是混合错误率(MER):每种文字用各自合适的单位,把一句话切成 token,再统一算编辑距离。
MER = (S + D + I) / N
S、D、I 分别是替换、删除、插入的 token 数,N 是参考文本的 token 数。token 的切法是:
- 泰文:按字符,元音和声调符号也各算一个。
- 汉字:按字。
- 英文字母和数字:连续的一串算一个词。
下面用一个例子看看这个口径。
- 参考:ผมคุยกับ 李明 เรื่อง Shopee
- 识别 A:ผมคุยกับ 李名 เรื่อง shopee。规范化之后只有“名/明”一个 token 不同,错 1 个,大小写不算错。
- 识别 B:ผมคุยกับ 李明 เรื่อง ช้อปปี้。读音完全正确,但品牌名写成了泰文,错 7 个:1 个替换加 6 个插入。
- 含义:我跟李明聊过 Shopee 的事。
B 的例子说明了为什么文字的约定必须先定好。一个英文词在参考里只占 1 个 token,拼错一个字母只扣 1 分;换成泰文来写,却是 7 个字符,要扣 7 分,而听到的内容其实一样。
MER 还有一个盲点:分母主要是泰文字符,英文词和汉字名字占比很小。整体 MER 看起来很低,专有名词上可能错得很多。所以除了总的 MER,还要报告分语种的错误率,以及只在语种切换处的 token 上算的错误率。
5. 计分前的规范化
规范化要对参考和识别结果做同样的处理,规则在评测之前写好:
- Unicode 统一用 NFKC,全角字母转成半角,泰文符号的顺序按 [符号顺序规则] 处理。
- 英文统一成小写;计算字词错误率时去掉全部标点(如需单独评测标点,先将全角与半角标点统一)。
- 汉字统一简繁写法。
- 数字写法统一:泰文数字和阿拉伯数字视为同一种;口语数字和书面写法,按标注规范选定一种。
最关键的是外来词的规范,建议写成三条:
- 品牌名、产品名、缩写,保留原文的拉丁字母。
- 已经有通行泰文写法的外来词,按泰文写,比如 คอมพิวเตอร์。
- 中文人名和地名,写汉字。
别名表只收规范里明确允许的写法。它必须在跑评测之前确定,对所有系统用同一份,并且和结果一起公开。别名表是最容易悄悄调出好分数的地方,事后增减的别名,不能算作规范化。
6. 评测集怎么搭
- 用真实对话,而不是照着词表朗读。朗读的品牌名发音太标准,和真实使用差得很远。
- 标注按同一份规范做,由两个人各标一遍,分歧通过修订规范解决,而不是个案处理。
- 给每句话记录用了哪几种语言、切换了几次,以及切换的类型:嵌入一个词、嵌入一个短语,还是整句切换。按这些分组报告,才能看出错误是不是随切换变多而上升,又是哪一种切换最难。
- 测试集里出现的品牌和人名,不能进入训练数据,也不能进入调优时用的词表。
我们的自建混说集的规模、版本和测试日期,见公开评测页。
7. 我们的做法
在产品里,同一句话里的英文品牌名和中文人名,按说话人实际说的语种输出,不强行音译成泰文。评测上,混说集的主指标是 MER,测试集、规范化规则和计算方法见公开评测页。