VoxCeleb 说话人识别挑战

VoxCeleb 说话人识别挑战

VoxSRC 消息:

2020 VoxCeleb Speaker Recognition Challenge (VoxSRC) 将联合 Interspeech 国际会议于 2020 年 10 月 30 日在上海举办。

文章目录

  • VoxCeleb 说话人识别挑战
    • 摘要
    • VoxSRC
    • 度量学习与编码器
    • 高维度数据可视化 TSNE
    • 深度学习平台 NSML
    • 参考文献:

摘要

“Speaker recognition in the wild” 是一项非常具有挑战性的任务,需要面对语音中各种不确定性,例如复杂的噪声、不同程度的背景音、短促的笑声等情况。针对这一问题,可以在 VoxSRC 提供的语料及其各种模型的实验结果,寻找合适的语音段编码器,设计合理的度量学习模型,分析造成性能降低的数据因素,都将成为提升识别性能的潜在解决方案。本文就 VoxSRC 提供的实验结果和相关的论文进行归纳、总结与展望。

VoxSRC

2020 VoxCeleb Speaker Recognition Challenge (VoxSRC) 旨在研究现有的说话人识别方法对来自 “in the wild” 语音数据的识别效果。这次挑战提供了来自 YouTube 名人访问视频的语音语料。相对传统的电话、麦克风语音,这类数据集包含更多的干扰与不确定性。

此次挑战分为 3 项任务,分别是:

  1. 特定训练数据的说话人确认监督任务(Fixed-Full):VoxCeleb2 dev 数据集作为训练数据;
  2. 训练数据不受限的说话人确认监督任务(Open-Full):训练数据可以使用 VoxSRC 测试数据以外的任意数据集;
  3. 特定训练数据说话人确认自监督任务(Fixed-Self):VoxCeleb2 dev 数据集作为训练数据,但无法使用说话人的标签,但可以使用除此以外的其它标签,例如跨模态的视觉帧,但无法使用任意模态的预训练模型。

竞赛举办方为任务 1 与 2 提供了说话人确认监督学习的基准,为任务 3 提供了说话人确认自监督学习的基准。

根据 3 个任务场景,不难看出主办方对于竞赛的想法,针对固定的评估数据:

  1. 针对任务 1,训练集是固定的,该任务旨在设计最佳的学习算法
  2. 针对任务 2,训练集是开放的,该任务除了设计合理的学习算法,还需要选择能够提高评估数据性能的训练数据,因此,该任务旨在跨领域的知识迁移
  3. 针对任务 3,训练集是固定的,无说话人标签,存在跨域标签,该任务旨在跨任务的知识迁移

根据对 3 个任务的分析,可以发现三个任务是依次递进、逐渐复杂的。为了解决这些问题,学习方法的设计、迁移学习方法、跨领域/任务的方法会有利于改善这些问题。

度量学习与编码器

论文 Exploring the Encoding Layer and Loss Function in End-to-End Speaker and Language Recognition System 讨论了几种(段层次)编码器和几种损失函数对说话人识别性能的影响,其中编码器包含 temporal average pooling (TAP)、self-attentive pooling (SAP) 和 learnable dictionary encoding (LDE),损失函数包含 Softmax、Center 和 augular softmax (ASoftmax),并将这些编码器和损失函数整合到端到端模型中,评估算法在 VoxCeleb1 数据集上的效果。以 Cosine 作为评分函数,性能(低于 4.90% EER)的排名分别是:

LDE-ASoftmax (4.56) > TAP-Center (4.75) > SAP-ASoftmax (4.90)。

论文 In defence of metric learning for speaker recognition 讨论了多种损失函数(包含分类损失和度量学习)对 CNN 学习算法的影响,并在 VoxCeleb 数据集上分别评估 VGG-M-40 模型和 Thin ResNet-34 模型的性能,该评估方式与 VoxSRC 任务 1 (Fixed-Full) 一致,其中损失函数包含:

  1. 分类目标:Softmax、AM-Softmax (CosFace) 和 AAM-Softmax (ArcFace);
  2. 度量学习目标:Triplet、Prototypical、Generalised end-to-end (GE2E) 和 Angular Prototypical。

10 × 10 10 \times 10 10×10 对的 ∥ ⋅ ∥ \Vert\cdot\Vert 的平均值作为评分函数,不同损失函数的性能(仅考虑 Thin ResNet-34,因为这里 VGG-M-40 性能较差)排名分别是:

分类目标:AAM-Softmax (2.36) > AM-Softmax (2.40) > Softmax (5.82)

度量学习目标:Angular Prototypical (2.21) > Prototypical (2.34) > GE2E (2.52) > Triplet (2.53)

分类目标中,相比较 AM-Softmax,AAM-Softmax 对算法参数更加敏感,从在 2.36 ~ 10.55 的波动;对比分类损失,度量学习能够更实现更优的性能。

从数据集上看,VoxCeleb2 作为训练数据,对于 VoxCeleb1 的提升效果非常明显,即从 4.56% EER 改善到 2.21% EER,50% 的提升量,可以猜想:数据集的补充,有利于学习算法的改进

高维度数据可视化 TSNE

说话人的特征表示,在解释性上,仍然存在很大的障碍,很多时候,很难了解学习到的说话人特征是怎么样的。2008 年发布的 TSNE 可视化方法,提供了一种高维数据转化为低维流形的方法,为说话人表示提供了一种可行的可视化方案。

TSNE 提供了一种高维特征距离投影为低维特征距离的方法,采用了基于概率的模型来刻画数据点上的距离,其学习过程类似一种数据合成的迭代方法,可以大胆地想象:如果直接将这类方法引入说话人建模,能够改善说话人特征的解释性。

考虑到这类方法的实用性,笔者寻找了 sklearn 关于 TSNE 的实现,它提供了一个手写数字的案例:

from time import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from sklearn import manifold, datasets, discriminant_analysis

# Prepare digits dataset
digits = datasets.load_digits(n_class=6)
X = digits.data
y = digits.target
n_samples, n_features = X.shape
n_neighbors = 30

# Scale and visualize the embedding vectors
def plot_embedding(X, title=None, sub_num=111):
    x_min, x_max = np.min(X, 0), np.max(X, 0)
    X = (X - x_min) / (x_max - x_min)

    # plt.figure()
    ax = plt.subplot(sub_num)
    for i in range(X.shape[0]):
        plt.text(X[i, 0], X[i, 1], str(y[i]),
                 color=plt.cm.Set1(y[i] / 10.),
                 fontdict={'weight': 'bold', 'size': 9})

    if hasattr(offsetbox, 'AnnotationBbox'):
        # only print thumbnails with matplotlib > 1.0
        shown_images = np.array([[1., 1.]])  # just something big
        for i in range(X.shape[0]):
            dist = np.sum((X[i] - shown_images) ** 2, 1)
            if np.min(dist) < 4e-3:
                # don't show points that are too close
                continue
            shown_images = np.r_[shown_images, [X[i]]]
            imagebox = offsetbox.AnnotationBbox(
                offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r),
                X[i])
            ax.add_artist(imagebox)
    plt.xticks([]), plt.yticks([])
    if title is not None:
        plt.title(title)

# Plot images of the digits
print("Showing selected digits")
n_img_per_row = 20
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
for i in range(n_img_per_row):
    ix = 10 * i + 1
    for j in range(n_img_per_row):
        iy = 10 * j + 1
        img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))
plt.figure(figsize=(12, 10))
plt.subplot(2,2,1)
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.title('A selection from the 64-dimensional digits dataset')

# t-SNE embedding of the digits dataset
print("Computing t-SNE embedding")
tsne = manifold.TSNE(n_components=2, init='pca', random_state=0)
t0 = time()
X_tsne = tsne.fit_transform(X)
plot_embedding(X_tsne,
               "t-SNE embedding of the digits (time %.2fs)" %
               (time() - t0), sub_num=222)

# Projection on to the first 2 linear discriminant components
print("Computing Linear Discriminant Analysis projection")
X2 = X.copy()
X2.flat[::X.shape[1] + 1] += 0.01  # Make X invertible
t0 = time()
X_lda = discriminant_analysis.LinearDiscriminantAnalysis(n_components=2
                                                         ).fit_transform(X2, y)
plot_embedding(X_lda,
               "Linear Discriminant projection of the digits (time %.2fs)" %
               (time() - t0), sub_num=223)

# Isomap projection of the digits dataset
print("Computing Isomap projection")
t0 = time()
X_iso = manifold.Isomap(n_neighbors, n_components=2).fit_transform(X)
plot_embedding(X_iso,
               "Isomap projection of the digits (time %.2fs)" %
               (time() - t0), sub_num=224)

print("0 and 1 are Red.\n2 is Blue.\n3 is Green.\n4 is Purple.\n5 is Orange.")
plt.tight_layout()
plt.savefig('t-SNE.png')
VoxCeleb 说话人识别挑战_第1张图片

深度学习平台 NSML

VoxSRC 采用了韩国 NSML 平台,这个平台提供了研究者很多自动化的功能,使开发者可以更专注模型的设计。这与深度学习平台的开发需求是非常吻合的。在国内,也有非常多的深度学习竞赛拥有这这类平台,例如阿里云、腾讯云、百度云、京东云、华为云、ucloud 云。

尽管笔者在单机上的深度学习平台上有所尝试,但是高门槛成为了平台建设的主要困难,这些困难包含技术上的,和设计思路上的。这方面非常希望有读者愿意加入到笔者到团队中来,一起研究。

参考文献:

  1. VoxCeleb Speaker Recognition Challenge (VoxSRC): Chung, J.S., Huh, J., Mun, S., Lee, M., Heo, H.S., Choe, S., Ham, C., Jung, S., Lee, B.-J., Han, I., 2020. In defence of metric learning for speaker recognition. arXiv Prepr. arXiv2003.11982.
  2. 编码器与损失函数对说话人/语音识别的讨论: Cai, W., Chen, J., Li, M., 2018. Exploring the Encoding Layer and Loss Function in End-to-End Speaker and Language Recognition System, in: Odyssey 2018 The Speaker and Language Recognition Workshop. ISCA, Les Sables d’Olonne, France, pp. 74–81. https://doi.org/10.21437/odyssey.2018-11
  3. 高维数据可视化 TSNE: Van Der Maaten, L., Hinton, G., 2008. Visualizing data using t-SNE. J. Mach. Learn. Res. 9, 2579–2625.
  4. 深度学习平台: Sung, N., Kim, M., Jo, H., Yang, Y., Kim, J., Lausen, L., Kim, Y., Lee, G., Kwak, D.-H., Ha, J.-W., Kim, S., 2017. NSML: A Machine Learning Platform That Enables You to Focus on Your Models. CoRR arXiv prep.

作者:王瑞 同济大学 计算机系博士研究生

邮箱:[email protected]

CSDN:https://blog.csdn.net/i_love_home

Github:https://github.com/mechanicalsea

如果大家有兴趣参加 2020 VoxSRC 竞赛,欢迎一起交流~

你可能感兴趣的:(说话人识别,Python)