

术语表是开播前投入产出比最高的一项准备,前提是你配对了地方。它不是一份表,是两份:一份让系统听对这个词,一份让系统译成你要的说法。只做后者是最常见的错误。
两层分别在解决什么
| 层 | 输入 | 它能修的问题 | 典型实现 |
|---|---|---|---|
| 识别层 | 音频 | 品牌名、型号、生造词被听成别的词 | Azure phrase list、Google PhraseSet |
| 翻译层 | 已识别的文本 | 词听对了但译法不固定或不该翻 | Azure dynamic dictionary、Google glossary |
顺序是不可交换的。翻译层拿到的是识别层吐出来的字符串——如果那串字已经错了,翻译层的匹配规则再严密也无从下手。
Google 在语音识别的最佳实践文档里把这个前提写得很清楚:识别器的词汇量很大,但不在词汇表里的术语和专有名词不会被识别出来,所以要用词与短语提示把它们加进去。品牌名恰好是最典型的一类。
识别层:它是运行时偏置,不是训练
两家主流服务的做法是同一个思路,都不需要训练模型:
Azure AI Speech 的 phrase list 在开始识别之前提供一组词或短语,抬高它们被识别出来的概率。官方文档强调它是「just-in-time」的运行时特性,适用于实时转写,批量转写不支持。这一点对直播没有影响,但如果你打算用离线批量转写来做验证,要注意这条路上是没有 phrase list 的。
Google Cloud Speech-to-Text 的模型适配用 PhraseSet 资源承载短语。官方说明里有一条容易被忽略:提供多词短语时,系统不仅更容易按顺序识别出整个短语,也会提高识别出其中单个词的概率。所以「XX 精华二代」这样的完整说法,比拆成三个孤立词条更有用。
权重:官方给的区间,以及为什么不要拉满
这是最容易凭感觉乱调的一处,两家都给了明确数值。
Azure 的 phrase list weight 取值范围是 0.0 到 2.0,1.0 是默认权重,0.0 等于关闭,2.0 是最大影响。这个设置作用于整份列表,不是逐条设置。
Google 的 boost 必须是大于 0 的浮点数,官方标注的实用上限是 20,并且明确建议用二分法去找合适的值,同时在请求里保留带 boost 和不带 boost 两种写法。
真正重要的是官方文档里紧跟着的那句话:boost 越高,误识别为该词的概率也越高。 这解释了一个很常见的现象——加了术语表之后,品牌名对了,但别的地方冒出了新错误。发音接近的普通词被系统优先替换成了术语表里的条目。
所以调法是:先用默认权重,只有确认某个词仍然听不对时再单独提权,每次提完都要回归验证一遍。
翻译层:固定译法,或者干脆别翻
翻译层的能力边界比很多人以为的窄,值得逐条对照官方说明。
Azure Translator 的 dynamic dictionary 允许在请求文本里内联标注译法,写法是 <mstrans:dictionary translation="译文">原文</mstrans:dictionary>。它有两条硬性要求:源语言必须显式传 From 参数、不能用自动检测;源语言和目标语言之中必须有一个是英语。更关键的是文档里的这句限定——这个功能只对专有名词、产品名这类复合名词是安全的。也就是说,指望用它去固定一句口头禅或者一个动词短语的译法,是在用错工具。
Google Cloud Translation 的 glossary 是独立的资源,支持两种形态:单向词表(指定一个源语言到目标语言的译法)和等价词集(同一个词在多种语言里的对应写法)。有两个细节会直接影响命中率:
- 默认区分大小写。 你可以在应用词表时对全部条目忽略大小写,但如果表里既有需要区分的也有不需要的,官方建议保留默认行为,并把需要忽略大小写的词按两种写法都收进去。
- 停用词会被跳过。 Cloud Translation 有一份停用词名单,落在名单上的词即使写进了词表,匹配也会被忽略。
完全不翻译是另一条路。Azure 提供了 notranslate 类名和 translate="no" 属性两种标注方式,但官方注明这两种写法只在输入的 textType 设为 HTML 时生效——这是按设计如此,纯文本模式下写了也不起作用。
一条术语该记什么
一条有用的术语记录不止「原文—译文」两列。按上面两层的能力,至少要有四列:
| 列 | 作用 | 例子 |
|---|---|---|
| 标准写法 | 识别层期望输出的形态 | 品牌的正式中文名 |
| 常见误识 | 用来判断这条是否命中 | 上一场里它被听成了什么 |
| 是否翻译 | 决定走 dictionary 还是走不翻译标注 | 品牌名通常保留原样 |
| 固定译法 | 需要翻译时的唯一写法 | 目标语言里的官方叫法 |
「常见误识」这一列不是给系统用的,是给你自己用的:它是判断这条术语有没有生效的唯一依据。没有这一列,你只能凭感觉说「好像准了一点」。
规模控制
术语表不是越大越好,两家的官方文档都给了信号。
Azure 直接写了建议值:单份 phrase list 不应超过 500 条,需要更大规模的词表时应当转向自定义模型(Custom Speech)而不是继续往列表里加。Google 那边没有给同样直白的软上限,但 boost 会提高误识率这条本身就是规模的天花板——词条越多,互相干扰的机会越多。
实践上的判断标准很简单:一条术语如果连续三场都没有在直播里出现过,就该从表里删掉。 它对准确率没有贡献,只在增加误触发的面积。
怎么验证它真的生效了
不要靠开播时的主观感受,用一段固定音频做回归:
- 从真实直播里截取一段包含全部目标术语的音频,五到十分钟即可;
- 人工写出这段音频的准确文本,作为参照;
- 在不加术语表的条件下跑一遍识别,导出结果;
- 加上术语表再跑一遍,导出结果;
- 对比两份结果里的三类变化:目标术语是否改对了、原本正确的词有没有被带错、译文里的品牌名是否统一。
第 4 步里的第二项才是重点。只统计「新加的词命中了几个」会系统性地高估术语表的收益,而偏置带来的新错误恰恰分布在你没有关注的地方。
跑完这一轮,你会得到一个具体的判断:这份术语表值不值得继续加词,还是已经到了该改用自定义模型的规模。
操作步骤
- 1
先从录音里找出真正错的词
从上一场直播录一段真实音频,离线跑一遍识别,人工标出错的字词。术语表的条目应该来自这份错误清单,而不是凭印象列出的商品名。
- 2
把词加进识别层的提示列表
Azure AI Speech 对应的是 phrase list,在开始识别前提供,不需要训练模型;Google Cloud Speech-to-Text 对应的是模型适配里的 PhraseSet。两者都是运行时生效的偏置,不是重新训练。
- 3
按官方上限调权重,不要一次拉满
Azure 的 phrase list weight 取值范围是 0.0 到 2.0,默认 1.0,0.0 表示关闭;Google 的 boost 必须大于 0,官方标注的实用上限是 20,并建议用二分法找合适值。
- 4
在翻译层把品牌名固定下来
Azure Translator 可以用 dynamic dictionary 在请求里内联指定译法,Google Cloud Translation 则是建一份 glossary 资源。两者都要求你事先知道想要的译文,而不是让模型自由发挥。
- 5
用同一段音频做回归验证
配置前后跑同一段录音,对比同一批词的识别与译文结果。只看新加的词是否命中还不够,要确认原本正确的词没有因为偏置而被带错。
- 6
每场之后增量维护并控制规模
每场直播后从错误清单里补几条、删掉不再出现的条目。Azure 官方建议单份 phrase list 不超过 500 条,超过这个量级就应该转向自定义模型而不是继续堆词条。
常见问题
- 只配翻译层的术语表行不行?
- 不行,这是最常见的误区。翻译层的术语表按输入文本做匹配,如果识别阶段已经把品牌名听成了别的词,翻译层拿到的就是错的字符串,匹配不上任何条目。识别层和翻译层必须各配一份。
- 术语表的词条是不是越多越好?
- 不是。Google 官方在 boost 参数的说明里写得很直接:提高偏置的同时也会提高误识别为该词的概率。词条越多、权重越高,把正常词错误地识别成术语的情况就越多。Azure 则直接给出了单份不超过 500 条的建议。
- 为什么加了术语表反而出现了新的错误?
- 典型的偏置副作用。系统被要求优先输出术语表里的词,发音接近的普通词就会被替换掉。处理办法是降权重,而不是继续加词。Google 官方建议用二分法找合适的 boost 值,并在请求里同时保留带权重和不带权重的写法。
- 价格和数字能靠术语表固定格式吗?
- 一般不能。识别服务通常带有逆文本规范化,会把口语数字自动转成书面符号形态,Azure 官方文档明确说明这个过程不可配置。数字的可靠做法是在话术上放慢、必要时重复一遍,而不是指望术语表。

