【说话人日志】DOVER-Lap:overlap-aware diarization 输出融合算法

论文:DOVER-Lap: A Method for Combining Overlap-aware Diarization Outputs

作者:Desh Raj, Leibny Paola Garcia-Perera, Zili Huang, Shinji Watanabe, Daniel Povey, Andreas Stolcke, Sanjeev Khudanpur

时间:2020

arXiv:2011.01997

任务:Speaker Diarization Output Combination,把多个 diarization 系统的输出融合成一个更好的结果

前言

我们的目标是将多个 diarization 系统的输出结果进行投票融合。

之前已经有 DOVER 方法了,但它有两个局限:

  • 不支持 overlap-aware 输出,默认每个时间区域最多只有一个 speaker;
  • label mapping 是 greedy incremental,融合结果强依赖输入顺序。

论文提出 DOVER-Lap 在 DOVER 的基础上改了两件事:用全局 label mapping 替代 pair-wise incremental mapping;用 overlap-aware voting 允许一个区域输出多个 speaker。


一、问题定义

设一共有 K K K 个 diarization hypothesis

H 1 , H 2 , ... , H K H_1,H_2,\ldots,H_K H1,H2,...,HK

第 k k k 个 hypothesis 有 N k N_k Nk 个 speaker

{ H k 1 , H k 2 , ... , H k N k } \{H_k^1,H_k^2,\ldots,H_k^{N_k}\} {Hk1,Hk2,...,HkNk}

每个 hypothesis 可以表示成一组时间区间和 speaker 标签

H k = { ( Δ k , θ , H k n ) : n ∈ { 1 , ... , N k } } H_k=\{(\Delta_{k,\theta},H_k^n):n\in\{1,\ldots,N_k\}\} Hk={(Δk,θ,Hkn):n∈{1,...,Nk}}

其中

Δ k , θ = [ t k , θ , t k , θ + 1 ] \Delta_{k,\theta}=[t_{k,\theta},t_{k,\theta+1}] Δk,θ=[tk,θ,tk,θ+1]

目标是找到一个融合后的 diarization 输出

H ^ = f ( H 1 , H 2 , ... , H K ) \hat{H}=f(H_1,H_2,\ldots,H_K) H^=f(H1,H2,...,HK)

使得它相对未知真实参考标注的 diarization error 尽可能低。

这里有两个子问题:

  1. label mapping:不同系统的 speaker label 怎么对齐
  2. label voting:对齐后,每个时间区域应该输出哪些 speaker

DOVER 和 DOVER-Lap 的差异,也体现在这两个阶段。


二、DOVER-Lap label mapping

2.1 用全局 cost tensor 做 label mapping

假设有 K K K 个 hypothesis,第 k k k 个 hypothesis 有 N k N_k Nk 个 speaker。

DOVER-Lap 构造一个 K K K 维 cost tensor:

C ∈ R N 1 × N 2 × ⋯ × N K C\in\mathbb{R}^{N_1\times N_2\times\cdots\times N_K} C∈RN1×N2×⋯×NK

例如:

text 复制代码
H1 有 2 个 speaker: A1, A2
H2 有 3 个 speaker: B1, B2, B3
H3 有 2 个 speaker: C1, C2

那么:

K = 3 K=3 K=3

N 1 = 2 , N 2 = 3 , N 3 = 2 N_1=2,\quad N_2=3,\quad N_3=2 N1=2,N2=3,N3=2

所以 cost tensor 是:

C ∈ R 2 × 3 × 2 C\in\mathbb{R}^{2\times 3\times 2} C∈R2×3×2

它不是二维矩阵,而是三维数组。

可以想象成一个立方体:

text 复制代码
维度 1:H1 的 speaker 选择,有 2 种
维度 2:H2 的 speaker 选择,有 3 种
维度 3:H3 的 speaker 选择,有 2 种

所以这个 tensor 总共有 2 × 3 × 2 = 12 2\times 3\times 2=12 2×3×2=12 个元素。

每个元素都是一个数。

例如:

text 复制代码
C(1,1,1)
C(1,1,2)
C(1,2,1)
C(1,2,2)
...
C(2,3,2)

每一个 C ( i 1 , i 2 , i 3 ) C(i_1,i_2,i_3) C(i1,i2,i3) 都是一个 标量 cost

每个元素 C ( i 1 , ... , i K ) C(i_1,\ldots,i_K) C(i1,...,iK) 表示"如果把第 1 个系统的第 i 1 i_1 i1 个 speaker、第 2 个系统的第 i 2 i_2 i2 个 speaker、......、第 K K K 个系统的第 i K i_K iK 个 speaker 映射成同一个全局 speaker,这个映射组合的代价是多少"。

i k i_k ik:在第 k k k 个 hypothesis 里选择第几个 speaker label。

比如 C ( 2 , 3 , 1 ) C(2,3,1) C(2,3,1) 这个数值表示

text 复制代码
如果我们把 A2、B3、C1 认为是同一个全局 speaker,这个假设的代价是多少?

所以

  • ( 2 , 3 , 1 ) (2,3,1) (2,3,1) 是索引 tuple;
  • ( A 2 , B 3 , C 1 ) (A2,B3,C1) (A2,B3,C1) 是对应的 speaker label tuple;
  • C ( 2 , 3 , 1 ) C(2,3,1) C(2,3,1) 是这个 tuple 的 cost 数值。

给定一个 tuple ( i 1 , i 2 , ... , i K ) (i_1,i_2,\ldots,i_K) (i1,i2,...,iK),DOVER-Lap 把所有 pair-wise similarity 加起来:

C ( i 1 , ... , i K ) = − ∑ 1 ≤ p < q ≤ K M i p , i q C(i_1,\ldots,i_K)=-\sum_{1\le p<q\le K}M_{i_p,i_q} C(i1,...,iK)=−1≤p<q≤K∑Mip,iq

其中, M a b M_{ab} Mab 代表相对重叠
M a b = d u r ( a ∩ b ) d u r ( a ) + d u r ( b ) M_{ab}=\frac{\mathrm{dur}(a\cap b)}{\mathrm{dur}(a)+\mathrm{dur}(b)} Mab=dur(a)+dur(b)dur(a∩b)

这里有一个负号,因为后面要做最小代价匹配。

直觉是:

  • 如果这些 speaker 轨迹彼此重叠很多,说明它们可能是同一个真实 speaker;
  • 此时 ∑ M \sum M ∑M 很大;
  • 加负号后 cost 很小;
  • greedy matching 会优先选它们。

2.2 label mapping

DOVER-Lap 的 label mapping 阶段最终要输出的是

M = { ( i 1 , i 2 , ... , i K ) , ... } \mathcal{M}=\{(i_1,i_2,\ldots,i_K),\ldots\} M={(i1,i2,...,iK),...}

也就是一组 speaker tuple。

比如有 3 个 diarization 输出:

text 复制代码
H1: A1, A2
H2: B1, B2
H3: C1, C2

如果算法最终输出

text 复制代码
M = {
  (A1, B2, C1),
  (A2, B1, C2)
}

它的意思就是

text 复制代码
global speaker 1 = A1 / B2 / C1
global speaker 2 = A2 / B1 / C2

DOVER-Lap 的 label mapping 阶段要解决的问题是

从所有可能的 speaker tuple 中,选出一组不冲突的 tuple,让所有系统里的 speaker label 都被合理对齐到全局 speaker 空间。

这其实是 weighted K K K-partite matching。

当 K = 2 K=2 K=2 时,它退化成普通 bipartite matching,可以用 Hungarian algorithm 多项式求解。

但当 K > 2 K>2 K>2 时,这个问题是 NP-hard。

所以 DOVER-Lap 使用 greedy approximation。

2.3 greedy approximation

初始化

设所有还没有被 mapping 的 speaker label 集合为:

R = { ( H k , n ) : k ∈ { 1 , ... , K } , n ∈ { 1 , ... , N k } } R=\{(H_k,n):k\in\{1,\ldots,K\},n\in\{1,\ldots,N_k\}\} R={(Hk,n):k∈{1,...,K},n∈{1,...,Nk}}

最终 mapping 结果为:

M = ∅ \mathcal{M}=\varnothing M=∅

只要 R R R 还不为空,就重复:

  1. 从 cost tensor 中找出至少包含一个未映射 label 的 tuple;
  2. 按 cost 从小到大排序;
  3. 依次扫描这些 tuple;
  4. 如果当前 tuple 与本轮已选 tuple 不冲突,就加入本轮 matching;
  5. 一轮结束后,把本轮选中的 tuple 加入最终 mapping;
  6. 从 R R R 中移除这些已经覆盖的 speaker label。

不冲突是指当前 tuple 中的 speaker label 不能已经出现在本轮已选 tuple 里。

用伪代码表示:

text 复制代码
输入:cost tensor C
输出:mapping tuple 集合 M

R = 所有 speaker labels
M = 空集

while R 非空:
    S = 所有至少包含一个 R 中 label 的 tuple
    S = 按 C(tuple) 从小到大排序
    M0 = 空集
    for tuple in S:
        if tuple 与 M0 不冲突:
            M0 = M0 ∪ {tuple}
    M = M ∪ M0
    R = R \ M0

这个算法不是精确最优,但它有两个明显优势:

  • 比 DOVER 的 pair-wise incremental mapping 更全局;
  • 实际运行很快,论文中 i7 CPU 上几秒即可完成。

举个例子

假设有 3 个系统:

text 复制代码
H1: A1, A2
H2: B1, B2
H3: C1, C2

真实情况假设是:

text 复制代码
global speaker X = A1 / B2 / C1
global speaker Y = A2 / B1 / C2

也就是说正确 mapping 应该是:

text 复制代码
(A1, B2, C1)
(A2, B1, C2)

现在我们根据 pairwise overlap 算出每个 tuple 的 cost。

假设 cost 如下,越小越好:

tuple cost 解释
( A 1 , B 2 , C 1 ) (A1,B2,C1) (A1,B2,C1) -2.63 三者高度重叠,很可能同一人
( A 2 , B 1 , C 2 ) (A2,B1,C2) (A2,B1,C2) -2.60 三者高度重叠,很可能同一人
( A 1 , B 1 , C 1 ) (A1,B1,C1) (A1,B1,C1) -1.20 有部分重叠,但不够好
( A 2 , B 2 , C 2 ) (A2,B2,C2) (A2,B2,C2) -1.10 有部分重叠,但不够好
( A 1 , B 2 , C 2 ) (A1,B2,C2) (A1,B2,C2) -0.80 不太像同一人
( A 1 , B 1 , C 2 ) (A1,B1,C2) (A1,B1,C2) -0.50 不太像同一人
( A 2 , B 1 , C 1 ) (A2,B1,C1) (A2,B1,C1) -0.40 不太像同一人
( A 2 , B 2 , C 1 ) (A2,B2,C1) (A2,B2,C1) -0.20 不太像同一人

贪心算法第一步:

按 cost 从小到大排序。

排序后最靠前的是:

text 复制代码
1. (A1, B2, C1), cost = -2.63
2. (A2, B1, C2), cost = -2.60
3. (A1, B1, C1), cost = -1.20
...

然后开始扫描。

第一个 tuple

看到:

text 复制代码
(A1, B2, C1)

当前 matching 为空,所以没有冲突。

加入:

text 复制代码
M0 = {(A1, B2, C1)}

它占用了:

text 复制代码
A1, B2, C1

第二个 tuple

看到:

text 复制代码
(A2, B1, C2)

它占用:

text 复制代码
A2, B1, C2

和已有的:

text 复制代码
A1, B2, C1

没有任何重复 label。

所以也加入:

text 复制代码
M0 = {
  (A1, B2, C1),
  (A2, B1, C2)
}

现在所有 speaker label 都覆盖了:

text 复制代码
A1, A2
B1, B2
C1, C2

最终 mapping 就是:

text 复制代码
global speaker 1 = A1 / B2 / C1
global speaker 2 = A2 / B1 / C2

这个例子里,贪心算法得到了正确结果。

需要注意不同 hypothesis 里的 speaker 数可能不一样。

例如:

text 复制代码
H1: A1, A2
H2: B1, B2, B3
H3: C1, C2

这里 H 2 H2 H2 多了一个 speaker B3

第一轮可能选出:

text 复制代码
(A1, B2, C1)
(A2, B1, C2)

这时:

text 复制代码
A1, A2, B1, B2, C1, C2

都覆盖了,但:

text 复制代码
B3

还没覆盖。

所以 R R R 还不为空。

下一轮要继续找至少包含 B3 的 tuple。

比如可能选:

text 复制代码
(A1, B3, C1)

这表示:

text 复制代码
B3 可能是一个额外/不稳定的 speaker label,它被并入 A1/C1 对应的全局 speaker

或者如果它确实是新 speaker,也可能会形成新的全局映射关系,具体取决于候选 cost。

所以多轮机制主要是为了处理:

  • 各系统 speaker 数不一样;
  • 有些系统 split 了某个 speaker;
  • 有些系统 merge 了某些 speaker;
  • 某些 speaker 只在部分系统中出现。

2.4 和 DOVER mapping 的区别

DOVER:

text 复制代码
只看当前两个 hypothesis
一步一步向后合并

DOVER-Lap:

text 复制代码
同时利用所有 hypothesis 之间的 pair-wise overlap
构造全局 cost tensor
再做 greedy K-partite matching

DOVER-Lap 对输入顺序不那么敏感,也不容易被最开始的一次错误 mapping 带偏。

它不保证数学上全局最优,但在 diarization 场景里通常有效。


三、DOVER-Lap 的 overlap-aware label voting


图1 DOVER-Lap 流程图

完成 label mapping 后,所有 hypothesis 的 speaker label 已经在同一个全局空间里。

接下来要做 voting。

3.1 先把时间切成最小区域

如图 1 所示,和 DOVER 一样,DOVER-Lap 会用所有输入 hypothesis 的 speaker 边界切分音频。

例如所有边界合起来是:

text 复制代码
τ0, τ1, τ2, ..., τT

那么就得到很多小区域:

text 复制代码
[τ0,τ1], [τ1,τ2], ..., [τT-1,τT]

每个区域内部,各 hypothesis 的 speaker 活动集合不变。

3.2 估计该区域应该有几个 speaker

设某个区域为 T T T。

第 k k k 个 hypothesis 在该区域预测了 n T k n_T^k nTk 个 speaker。

例如:

text 复制代码
系统 1: A + B -> n_T^1 = 2
系统 2: A + B -> n_T^2 = 2
系统 3: A     -> n_T^3 = 1

DOVER-Lap 先估计融合结果中这个区域应该有几个 speaker:

n ^ T = ⌊ ∑ k = 1 K α k n T k ⌉ \hat{n}T=\left\lfloor\sum{k=1}^{K}\alpha_k n_T^k\right\rceil n^T=⌊k=1∑KαknTk⌉

其中:

  • α k \alpha_k αk 是归一化后的系统权重;
  • ∑ k α k = 1 \sum_k\alpha_k=1 ∑kαk=1;
  • ⌊ ⋅ ⌉ \lfloor\cdot\rceil ⌊⋅⌉ 表示四舍五入到最近整数。

论文中的权重来自 DOVER 类似的 rank-based weighting。

可以先给每个系统一个 rank weight

w k = 1 k 0.1 w_k=\frac{1}{k^{0.1}} wk=k0.11

再归一化

α k = w k ∑ j = 1 K w j \alpha_k=\frac{w_k}{\sum_{j=1}^{K}w_j} αk=∑j=1Kwjwk

3.3 再选出票数最高的 speaker

估计出 n ^ T \hat{n}_T n^T 后,DOVER-Lap 对每个 speaker 计算加权票数

v T ( s ) = ∑ k = 1 K α k 1 ( s ∈ A T k ) v_T(s)=\sum_{k=1}^{K}\alpha_k\mathbb{1}(s\in A_T^k) vT(s)=k=1∑Kαk1(s∈ATk)

其中

符号 含义
v T ( s ) v_T(s) vT(s) speaker s s s 在区域 T T T 的加权票数
A T k A_T^k ATk 第 k k k 个 hypothesis 在区域 T T T 预测的 speaker 集合
1 ( s ∈ A T k ) \mathbb{1}(s\in A_T^k) 1(s∈ATk) 如果系统 k k k 在区域 T T T 预测 speaker s s s 活跃,则为 1

然后选择票数最高的 n ^ T \hat{n}_T n^T 个 speaker

A ^ T = T o p K s ( v T ( s ) , n ^ T ) \hat{A}T=\mathrm{TopK}{s}(v_T(s),\hat{n}_T) A^T=TopKs(vT(s),n^T)

最终,区域 T T T 的输出 speaker 集合就是 A ^ T \hat{A}_T A^T。

回到刚才的例子

text 复制代码
系统 1: A + B
系统 2: A + B
系统 3: A

假设三个系统权重差不多,那么

n ^ T = r o u n d ( 2 + 2 + 1 3 ) = 2 \hat{n}_T=\mathrm{round}\left(\frac{2+2+1}{3}\right)=2 n^T=round(32+2+1)=2

然后 speaker 票数大致是

text 复制代码
A: 3 票
B: 2 票

DOVER-Lap 会选择 top-2

text 复制代码
A + B

而原始 DOVER 只能输出一个 speaker,可能只输出

text 复制代码
A

四、复杂度分析

设有 K K K 个 hypothesis,每个 hypothesis 平均有 N N N 个 speaker。

DOVER 的 label mapping 使用 Hungarian algorithm 逐步两两匹配。

复杂度大致为

O ( K N 3 ) O(KN^3) O(KN3)

DOVER-Lap 需要先计算 cost tensor,再做 greedy matching。

cost tensor 的 pair-wise overlap 计算复杂度约为

O ( K 2 N 2 ) O(K^2N^2) O(K2N2)

greedy matching 需要排序所有 N K N^K NK 个 tuple,摊还复杂度约为

O ( K N K log ⁡ N ) O(KN^K\log N) O(KNKlogN)

一般实际 diarization 融合里:

  • 系统数量 K K K 通常不大;
  • 每个 session 的 speaker 数 N N N 通常也不大;
  • 论文实现中几秒内可以跑完。

因此它适合作为 offline diarization 系统的后处理融合模块。


五、实验结果

论文在两个数据集上验证 DOVER-Lap:

  1. AMI mix-headset
  2. LibriCSS

还展示了它可以用于多通道后融合。

5.1 AMI:DOVER-Lap 能超过单个最好系统

AMI mix-headset 的 dev/test overlap 比例大约都是 20 % 20\% 20%。

论文融合了三个 overlap-aware diarization 系统:

  • VB-based overlap assignment
  • overlap-aware spectral clustering
  • region proposal network

结果如下:

方法 Dev DER Test DER
VB-based overlap assignment 22.0 21.5
Overlap-aware spectral clustering 24.5 23.6
Region proposal network 35.3 25.5
输入系统平均 27.3 23.5
DOVER 36.5 30.5
DOVER + global mapping 26.0 25.0
DOVER-Lap,不带 rank weighting 24.1 22.8
DOVER-Lap,带 rank weighting 21.6 20.5

结论

  1. 原始 DOVER 在 overlap 场景下反而很差。

    它只能输出单 speaker,overlap 区域会产生大量 missed speech。

  2. 只把 mapping 改成 global mapping,就能明显降低 confusion。

  3. 完整 DOVER-Lap 加 rank weighting 后,在 dev/test 上超过单个最好系统。

5.2 LibriCSS:不同系统优势互补

LibriCSS 是模拟会议数据,overlap 条件从 0 % 0\% 0% 到 40 % 40\% 40%。

论文融合了:

  • VB
  • overlap-aware SC
  • RPN
  • TS-VAD

平均 DER 结果:

方法 Average DER
VB 8.6
SC 9.3
RPN 9.5
TS-VAD 7.4
DOVER-Lap 5.4

分解错误如下:

方法 Miss FA Confusion DER
VB 1.7 0.5 6.4 8.6
SC 2.5 1.1 5.7 9.3
RPN 2.9 3.3 3.3 9.5
TS-VAD 3.2 1.3 2.9 7.4
DOVER-Lap 2.7 0.7 2.0 5.4

结论

  1. VB / SC 的 detection 更好,Miss 和 FA 较低;
  2. RPN / TS-VAD 的 speaker confusion 更低;
  3. DOVER-Lap 把两类系统的优点结合起来,最终 DER 最低。

5.3 多通道后融合:不做 beamforming 也能融合

DOVER-Lap 不只可以融合不同系统,也可以融合不同通道。

text 复制代码
7 个麦克风通道
  -> 每个通道单独跑 diarization
  -> 得到 7 个 hypothesis
  -> 用 DOVER-Lap 后融合

在 LibriCSS 7 通道实验中:

方法 Miss FA Confusion DER
7-channel average 2.58 0.96 5.86 9.40
7-channel best 2.59 0.99 5.53 9.11
WPE + Beamforming 2.91 0.96 5.86 9.33
DOVER-Lap late fusion 3.60 0.66 4.76 9.02

结论

  1. 可以不做 beamforming;
  2. 不依赖前端增强;
  3. 可以直接融合每个通道的 diarization 输出;
  4. 对 ad-hoc microphone array 有潜在价值。

六、总结

DOVER-Lap 将 DOVER 推广到了重叠场景,适合多个不同 diarization 系统、同一个系统有多个配置、或是多通道 diarization 输出,是一种强有力的后融合算法。

相关推荐
暗夜猎手-大魔王1 小时前
转载--AI Agent 架构设计:Agent 的自我欺骗(OpenClaw、Claude Code、Hermes Agent 对比)
人工智能
智枢圈1 小时前
Function-Calling与工具使用
人工智能
司南-70491 小时前
Dense结构下的 大模型系统架构研究
服务器·人工智能·后端
GISer_Jing1 小时前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习
叼烟扛炮1 小时前
C++第四讲:类和对象(下)
c++·算法·类和对象
漫游的渔夫1 小时前
前端开发者做 Agent:别只会执行,用 4 类失败策略让 AI 知道怎么停
前端·人工智能·typescript
Rabitebla1 小时前
vector 的骨架:三根指针、模板陷阱与迭代器失效的第一现场
开发语言·数据结构·c++·算法
娃娃略1 小时前
Frame
人工智能·深度学习·机器学习
Python私教2 小时前
Pure-Admin-Thin 深度解析:完整版和精简版到底怎么选?
vue.js·人工智能·开源