论文:Property-Aware Multi-Speaker Data Simulation: A Probabilistic Modelling Technique for Synthetic Data Generation
作者:Tae Jin Park, He Huang, Coleman Hooper, Nithin Koluguri, Kunal Dhawan, Ante Jukic, Jagadeesh Balam, Boris Ginsburg
时间:2023
会议:CHiME-7 Workshop 2023
任务:Multi-speaker Data Simulation / Speaker Diarization / VAD
前言
语音方面的任务,数据增强/仿真是常见操作。之前针对多说话人 ASR 场景,大家通常是拿有说话人标签的数据集,将不同说话人交叉一句句拼接起来,还需要强制对齐时间戳打标签,生成 rttm 文件。做的再精细一点,还会在不同句子之间加随机比例的重叠(overlap),模仿会议场景的抢话/打断。
这篇文章提出了一套多说话人语料数据仿真的方法,把多说话人数据模拟,从"混音工程"推进到"属性可控的概率生成过程"。
一、模拟器的输入参数
论文把系统拆成了两层:一层负责规定"总体想生成什么风格的数据",一层负责决定"每个 session 具体长什么样"。
1.1 用户直接设定的全局参数
最核心的输入包括:
- session 总时长 L S L_S LS
- session 数量 N S N_S NS
- 每个 session 的 speaker 数 N s p k N_{\mathrm{spk}} Nspk
- turn probability p t u r n p_{\mathrm{turn}} pturn
- overlap ratio 的均值和方差: μ o , σ o 2 \mu_o, \sigma_o^2 μo,σo2
- silence ratio 的均值和方差: μ s , σ s 2 \mu_s, \sigma_s^2 μs,σs2
这些参数决定的是希望最终数据集整体呈现出什么统计风格。
注意
- μ s , σ s 2 \mu_s, \sigma_s^2 μs,σs2 说的是 session 级 silence ratio 在整个数据集上的均值和方差
- μ o , σ o 2 \mu_o, \sigma_o^2 μo,σo2 说的是 session 级 overlap ratio 在整个数据集上的均值和方差
不是"单段静音时长"的均值和方差,也不是"单段重叠时长"的均值和方差。
1.2 每个 session 内部再随机采样的变量
进入具体某个 session 之后,论文还会继续采样一些 session 级变量,例如:
- sentence length: s l s_l sl
- silence length: m ~ s \tilde{m}_s m~s
- overlap length: m ~ o \tilde{m}_o m~o
全局参数决定总体效果,session 级随机变量决定这一段的效果。保证整体统计可控,单个 session 仍然保留随机性和多样性。
仿真代码已开源,YAML 中罗列了主要的控制参数和说明。
二、用 Beta 分布建模 silence / overlap
silence ratio 和 overlap ratio 都是比例量,天然落在 [ 0 , 1 ] [0,1] [0,1],所以用 Beta 分布建模。
给定均值和方差:
- silence: μ s , σ s 2 \mu_s, \sigma_s^2 μs,σs2
- overlap: μ o , σ o 2 \mu_o, \sigma_o^2 μo,σo2
通过矩估计转成 Beta 分布参数:
α ( o , s ) = μ ( o , s ) 2 ( 1 − μ ( o , s ) ) σ ( o , s ) 2 − μ ( o , s ) \alpha_{(o,s)} = \frac{\mu_{(o,s)}^2(1-\mu_{(o,s)})}{\sigma_{(o,s)}^2} - \mu_{(o,s)} α(o,s)=σ(o,s)2μ(o,s)2(1−μ(o,s))−μ(o,s)
β ( o , s ) = μ ( o , s ) ( 1 − μ ( o , s ) ) 2 σ ( o , s ) 2 − ( 1 − μ ( o , s ) ) \beta_{(o,s)} = \frac{\mu_{(o,s)}(1-\mu_{(o,s)})^2}{\sigma_{(o,s)}^2} - (1-\mu_{(o,s)}) β(o,s)=σ(o,s)2μ(o,s)(1−μ(o,s))2−(1−μ(o,s))
要满足标准 Beta 分布,需保证
0 < μ ( o , s ) < 1 0 < \mu_{(o,s)} < 1 0<μ(o,s)<1
0 < σ ( o , s ) 2 < μ ( o , s ) ( 1 − μ ( o , s ) ) 0 < \sigma_{(o,s)}^2 < \mu_{(o,s)}(1-\mu_{(o,s)}) 0<σ(o,s)2<μ(o,s)(1−μ(o,s))
使得
α ( o , s ) > 0 , β ( o , s ) > 0 \alpha_{(o,s)} > 0,\quad \beta_{(o,s)} > 0 α(o,s)>0,β(o,s)>0
代码里不满足上述条件,无法构成标准 Beta 分布,会报错。
之后,对每个 session 分别采样:
X μ s ∼ B e t a ( α s , β s ) X_{\mu_s} \sim \mathrm{Beta}(\alpha_s,\beta_s) Xμs∼Beta(αs,βs)
X μ o ∼ B e t a ( α o , β o ) X_{\mu_o} \sim \mathrm{Beta}(\alpha_o,\beta_o) Xμo∼Beta(αo,βo)
这里是让每个 session 围绕全局统计目标去波动。
- μ s , μ o \mu_s, \mu_o μs,μo 决定总体想要的风格
- X μ s , X μ o X_{\mu_s}, X_{\mu_o} Xμs,Xμo 决定某个 session 自己的目标风格
注意这里的"均值和方差"是在说 session-level ratio 的分布。后面估计 m ~ s , m ~ o \tilde{m}_s,\tilde{m}_o m~s,m~o 并再用 Gamma 分布采样时,讨论的是"单次静音/重叠持续时长"的随机性,是另一层统计量。
三、用 Negative Binomial 分布建模句子长度
除了静音和重叠,每一轮对话句子长度也是一个关键变量。论文把句子长度 s l s_l sl 看成一个离散随机变量,并假设它服从 Negative Binomial 分布
s l ∼ N B ( k w , p w ) s_l \sim \mathrm{NB}(k_w, p_w) sl∼NB(kw,pw)
其概率质量函数写成
P N B ( X = n ) = ( n + k w − 1 k w − 1 ) p w k w ( 1 − p w ) n , n = 0 , 1 , 2 , ... P_{\mathrm{NB}}(X=n) = \binom{n+k_w-1}{k_w-1} p_w^{k_w}(1-p_w)^n,\quad n=0,1,2,\ldots PNB(X=n)=(kw−1n+kw−1)pwkw(1−pw)n,n=0,1,2,...
句子长度本质上对应离散计数变量"词数"。 而真实语音里的句长通常带有明显波动,甚至有长尾,所以 Negative Binomial 比简单的 Poisson 更灵活。
在实际生成时,论文会:
- 先采样句子长度 s l s_l sl
- 再从强制对齐的数据里,按当前 speaker 取出相应数量的词
- 拼出一段新的句子
四、在线纠偏
因为每个 session 是动态生成的,每句话、静音、重叠都是逐条添加,如何保证最终的结果是往确定的统计量上靠。
论文在生成过程中持续计算当前 session 和目标属性之间的 discrepancy,然后动态决定下一步该补 silence 还是补 overlap。
设当前已经生成的 session 长度为 L ~ S \tilde{L}S L~S,累计静音长度为 L ~ s i l \tilde{L}{sil} L~sil,累计发音长度为 L ~ s p c h \tilde{L}{spch} L~spch,累计重叠语音长度为 O ~ s p c h \tilde{O}{spch} O~spch。
论文定义了两个 discrepancy:
Δ S = L ~ s i l L ~ S − μ s \Delta_S = \frac{\tilde{L}_{sil}}{\tilde{L}_S} - \mu_s ΔS=L~SL~sil−μs
Δ O = O ~ s p c h L ~ s p c h − μ o \Delta_O = \frac{\tilde{O}{spch}}{\tilde{L}{spch}} - \mu_o ΔO=L~spchO~spch−μo
直觉上:
- Δ S \Delta_S ΔS 描述"当前静音比例"和"目标静音比例"的差距
- Δ O \Delta_O ΔO 描述"当前重叠比例"和"目标重叠比例"的差距
然后系统根据这两个偏差,哪个更小,越小(考虑正负号)表示越缺少,就补哪个。当然,后续还会判断补多少 silence 或 overlap,如果两个偏差都为正,会补 0。
如果当前 overlap 不够,应该再补多少 overlap。
对应的目标方程是:
X μ o = m ~ o + O ~ s p c h L ~ s p c h − m ~ o X_{\mu_o} = \frac{\tilde{m}o + \tilde{O}{spch}}{\tilde{L}_{spch} - \tilde{m}_o} Xμo=L~spch−m~om~o+O~spch
这里:
- m ~ o \tilde{m}_o m~o 是"理论上这一步应该补多少 overlap"
- O ~ s p c h \tilde{O}_{spch} O~spch 是当前已累计的 overlap 语音量
解得
m ~ o = X μ o L ~ s p c h − O ~ s p c h X μ o + 1 \tilde{m}o = \frac{X{\mu_o}\tilde{L}{spch} - \tilde{O}{spch}}{X_{\mu_o} + 1} m~o=Xμo+1XμoL~spch−O~spch
同理,对于 silence
X μ s = m ~ s + L ~ s i l m ~ s + L ~ S X_{\mu_s} = \frac{\tilde{m}s + \tilde{L}{sil}}{\tilde{m}_s + \tilde{L}_S} Xμs=m~s+L~Sm~s+L~sil
其中:
- m ~ s \tilde{m}_s m~s 是当前应该补的 silence 理论量
- L ~ s i l \tilde{L}_{sil} L~sil 是当前累计静音时长
解得
m ~ s = L ~ s i l − X μ s L ~ S X μ s − 1 \tilde{m}s = \frac{\tilde{L}{sil} - X_{\mu_s}\tilde{L}S}{X{\mu_s} - 1} m~s=Xμs−1L~sil−XμsL~S
五、用 Gamma 分布建模静音和重叠的补充量
上面算出的 m ~ s \tilde{m}_s m~s 和 m ~ o \tilde{m}_o m~o,直接生成的会话会非常机械,随机性不足。
Gamma 分布天然定义在正实数上,且能通过均值和方差灵活控制形状,比较适合建模连续变量 silence / overlap。
于是论文把理论目标长度当作均值,再从 Gamma 分布里采样实际长度。
k = m ~ 2 σ 2 k = \frac{\tilde{m}^2}{\sigma^2} k=σ2m~2
θ = σ 2 m ~ \theta = \frac{\sigma^2}{\tilde{m}} θ=m~σ2
x Δ t ∼ Γ ( k , θ ) x_{\Delta t} \sim \Gamma(k,\theta) xΔt∼Γ(k,θ)
六、仿真流程
整个仿真流程有以下 6 步:
- 用户给定目标会话属性:speaker 数、turn probability、silence / overlap 的均值和方差
- 对每个 session,从 Beta 分布采样一个 session 级目标 silence ratio 和 overlap ratio
- 按 Negative Binomial 采样一句话该有多少词,再从 forced alignment 数据里拼出一句话
- 根据当前 session 的累计 silence / overlap 和目标统计,计算 discrepancy
- 若当前更缺 silence,就估计应补的静音时长;若更缺 overlap,就估计应补的重叠时长
- 再从对应的 Gamma 分布里采样实际长度,插入到会话里,持续循环直到达到目标 session 时长
七、实验结果
7.1 与真实数据统计的对比
论文拿 CHAES 和 AMI 做对比,观察 simulated dataset 和 real-world dataset 的 silence / overlap 统计。
| 数据集 | 指标 | 模拟数据 | 真实数据 |
|---|---|---|---|
| CHAES | silence ratio mean | 0.1409 | 0.1473 |
| CHAES | overlap ratio mean | 0.0759 | 0.0754 |
| AMI | silence ratio mean | 0.1804 | 0.1814 |
| AMI | overlap ratio mean | 0.1711 | 0.1473 |
结论
- CHAES 上,模拟值和真实值已经贴得很近。
- AMI 上,silence ratio 也拟合得不错。
- AMI 的 overlap ratio 还有偏差,但整体方向并没有跑偏。
这里论文并没有讲是用什么数据来进行仿真的。
7.2 VAD 实验
用模拟数据训模型,在多个数据集上报告 AUROC
| 训练设置 | DH3 dev | VoxConv dev | AMI dev | CH109 |
|---|---|---|---|---|
| D1, μ s = 0.5 \mu_s=0.5 μs=0.5 | 87.71 | 96.15 | 95.70 | 88.07 |
| D1, μ s = 0.3 \mu_s=0.3 μs=0.3 + gain aug | 89.83 | 96.19 | 94.69 | 91.04 |
| + D2 + noise aug | 93.96 | 97.42 | 96.04 | 92.43 |
结论
- 时间戳如果太松,会明显伤害 VAD。 因为 segment 两端混入太多非语音时,模型学到的边界会变脏。
- gain perturbation 很重要。 否则模型更容易漏掉低能量语音。
- overlap 不能在模拟时随便处理。 因为 overlapping speech 会直接提高 missed detection 风险。
7.3 diarization 实验
作者在这里验证了 overlap 属性对结果的影响。
常规 diarization 数据集
| 训练数据设置 | DH3 eval | VoxConverse test | AMI eval | CH109 |
|---|---|---|---|---|
| LibriVox-3Kh, μ o = 0.07 \mu_o=0.07 μo=0.07 | 14.49 | 6.01 | 15.96 | 9.94 |
| LibriVox-3Kh, μ o = 0.15 \mu_o=0.15 μo=0.15 | 14.38 | 5.72 | 15.89 | 10.03 |
CHiME7 dev 集
| 训练数据设置 | CHiME6 dev | Dipco dev | Mixer6 dev |
|---|---|---|---|
| LibriVox-3Kh, μ o = 0.07 \mu_o=0.07 μo=0.07 | 45.01 | 32.50 | 17.35 |
| LibriVox-3Kh, μ o = 0.15 \mu_o=0.15 μo=0.15 | 44.37 | 31.07 | 17.13 |
在 CHiME6 / DipCo / Mixer6 这类更接近会议场景的数据上,较高 overlap 效果更好。
原文中没有仿真数据和真实数据结果的比较,没有仿真数据训练量的消融实验。
八、总结
本文利用统计属性构造更加可控的、精细化的仿真数据。用 Beta 分布建模 session 级的 silence / overlap 比例,用 Negative Binomial 建模句长,用 discrepancy + Gamma sampling 做在线纠偏。这套仿真工具在后续的 sortformer 系列论文中发挥了作用。