语音对话合成数据工程:Schema、口语化与质量闸门

合成对话数据的风险不是“生成得不够多”,而是生成得太像模板、太干净、太不符合语音输入的真实噪声。数量扩大很容易,难的是让样本既覆盖任务,又不把模型训练成只会回答标准文本。

所以语音对话合成数据要先设计质量闸门,再谈规模。

要解决的问题

对话数据要服务下游训练和评测。它既要有结构化 schema,保证字段、意图、实体和状态可控;又要有口语化表达,覆盖停顿、重复、自我修正、n-best 候选和 ASR 错误。

如果只生成标准书面语,模型上线后会被真实口语击穿。如果只追求随机扰动,样本又会失去任务结构。

主线判断

合成语音对话数据真正要模拟的是不确定性,而不是生产更整齐的文本。

对话数据越干净,越可能远离真实语音输入。真正有价值的合成样本,要同时保留 schema 约束、口语化扰动、n-best 不确定性、状态变化和失败原因。它不是文本扩增,而是一个可控的交互模拟器。

最小抽象

一条合成样本至少要包含:

1
2
3
4
5
6
7
8
dialogue_id
turns
intent
entities
state
n-best
quality_flags
reason code

quality_flags 记录口语化、实体覆盖、逻辑一致性、敏感词、重复和异常格式。reason code 说明样本为什么保留、丢弃或需要人工复核。

工程闭环

质量闸门可以分三层。

第一层是 schema 校验:字段是否完整、实体是否在合法范围、状态转移是否合理。

第二层是语言质量:是否过于模板化、是否包含自然口语、是否有重复和自我修正。

第三层是训练影响:加入这批数据后,目标任务指标是否提升,错误类型是否减少,是否引入系统性偏差。

每一批合成数据都应该能回溯到生成配置、过滤规则和评测结果。否则数据越多,问题越难定位。

反直觉点

schema 越严格,不代表数据越好。schema 能保证字段合法,但也容易把样本变成模板填空。模型会学到固定字段顺序,却学不到真实输入里的停顿、重复、修正和候选歧义。

口语化也不是随机加噪。随机插入口头词、重复句子或错别字,可能让文本看起来更像口语,却破坏实体、状态和轮次关系。好的生成流程应该是先生成结构化计划,再生成口语化表达,最后把表达回填到 schema 校验。如果回填失败,这条样本就应该带着 reason code 进入复核,而不是被静默丢弃。

n-best 的价值也常被低估。语音输入里很多错误来自候选不确定性,而不是唯一 transcript 的文字错误。训练样本保留 n-best,可以让模型学会在模糊表达下维持状态。

排障路径

第一批数据不要追求数量,先跑一个小闭环:固定少量 schema,生成样本,做 schema 回填校验,抽查失败样本,再做一次增量训练。每条失败样本都标明原因:字段缺失、状态冲突、实体漂移、轮次不一致、表达模板化,或者过滤规则过严。

如果加入合成数据后指标没有提升,先不要扩大规模。要看错误分布是否变化:是不是边界样本变好了但常规样本变差了,是不是状态跟踪改善但实体抽取下降了,是不是模型学到了模板口吻。

评测设计

离线质量看 schema 通过率、字段覆盖率、实体合法率、轮次一致性、口语化比例、重复率和 quality_flags 分布。训练收益看目标任务指标、状态跟踪错误、实体抽取错误、异常输入恢复能力和真实口语样本泛化。

最重要的是增量评测。一次只加入一批合成策略,记录它改善了哪类错误、引入了哪类新偏差。合成数据的目标不是让训练集变大,而是让错误类型变得可控。

小样本推演

一条合成样本可以先有结构化计划:这一轮要表达哪个 intent,哪些 entities 必须出现,状态从哪里转到哪里。随后再生成口语化表达,比如重复、停顿、自我修正和候选歧义。最后把生成表达重新解析回 schema:如果字段回填失败,这不是小瑕疵,而是训练目标已经漂移。

这样的闭环能避免两类坏数据。第一类是漂亮但无效的文本,看起来像自然对话,实际状态对不上。第二类是合法但僵硬的模板,schema 全过,模型却学不到真实语音输入的不确定性。质量闸门要同时拦住这两类样本。

直接结论

语音对话合成数据的核心不是生成,而是质量治理。先把 schema、quality_flags、n-best、reason code 和评测回流建起来,再扩大规模。没有这些闸门,合成数据会把训练目标污染成系统性偏差。

下一步阅读:ASR 数据质量流水线:伪标签、切分与可追溯评测