作者:Arm 工程部工程师 Marcus Corbin
近年来,我们与电视的交互方式发生了改变。过去,我们需要通过多次按键来操控屏幕键盘,如今则可以直接通过语音进行交互。尽管这极大地改善了数字电视 (DTV) 的用户体验,但仍有更大的潜力来提供沉浸式和引人入胜的体验。设想一下,当你对电视说“推荐一部电影”或“我今天有哪些日程安排”,电视能够根据你的声音识别出你的身份,并提供个性化的回复。这正是说话人识别技术所能实现的功能。说话人识别是指根据说话人的语音特征,而非具体的话语内容来识别说话人的过程。
项目背景
当前的人工智能 (AI) 趋势正在推动新模型不断扩大规模,并提高性能。虽然这些大模型能够带来令人瞩目的结果,但由于高昂的成本、潜在的安全风险和延迟问题,使得边缘 AI 成为更具吸引力的解决方案。
说话人识别旨在解决两个主要任务,即说话人辨认和说话人确认。说话人辨认旨在从已录入的数据库中识别说话人的身份,而说话人确认则用于验证说话的是否是他们所宣称的人物,主要用于安全应用。说话人识别是一个开放集问题,即说话人可以是系统中已录入的已知用户,也可以是未知的说话人或“访客”说话人。
说话人识别技术已问世多年,而近期所采用的深度神经网络 (DNN) 显著提升了该技术的识别精度。本文将介绍采用 DNN 进行说话人识别的研究项目成果。这项技术能够在不依赖云端推理的情况下,在基于 Arm 平台的设备上运行。我们将对说话人识别系统的工作原理进行总体概述,并深入探讨此项目中使用的设计和实现方法。本文将讨论关键的性能结果和量化部分,并在结论部分概述研究发现,并指出未来有前景的研究方向。
基于 DNN 的说话人识别系统工作原理
图 1 展示了典型的说话人识别系统。如图所示,原始音频输入被传递到预处理阶段,以提取音频的关键特征。预处理后的音频被传递到模型中,由模型进行嵌入提取。模型会输出音频输入的向量表示,称为嵌入。
嵌入可以使用评分函数(通常是余弦相似度[1])进行比较,分数越高,表示两个嵌入越相似。如果得分高于某个阈值,就可以判定这两个嵌入的说话人是吻合的。
设计与实现
模型细节
在研究哪种模型适合此项目时,我们考虑了模型大小、模型精度,以及推理时间。在最终的实现方案中使用了 TitaNet Small 模型,该模型基于 Koluguri 等人在 2021 年发表的论文《TitaNet:利用一维深度可分离卷积和全局上下文的说话人表示神经模型》[2],以及 Han 等人在 2020 年提出的 ContextNet 编码器-解码器架构[3]。此外,该模型采用了加性角度边界损失进行端到端训练,有助于优化说话人嵌入之间的余弦距离。
TitaNet Small 模型的大小仅为 TitaNet Large 的一半多,论文报告的误差分别为 1.15% 和 0.68%。这意味着 TitaNet Small 在模型大小和精度之间实现了良好的折衷,同时即使在资源有限的环境中也能提供优异的推理时间。
与大多数基于语音的机器学习 (ML) 模型一样,TitaNet Small 不接受原始音频作为输入。计算音频特征需要进行预处理。此项目中采用了梅尔频谱 (Mel Spectrogram)[4] 音频处理技术。
在说话人识别系统中,支持不同长度的音频输入非常实用。特别是在录入过程中,用户可以随时停止录音。这意味着专为处理音频而设计的 ML 模型通常将动态轴作为输入,使其能够处理不同长度的音频输入。然而遗憾的是,许多可用的 TensorFlow Lite (TFLite) 推理后端要么对动态输入轴的支持有限,要么根本不支持。
该应用是围绕一个具有动态输入的模型设计的。尽管如此,为了在仅支持固定轴的 GPU 代理上测试 TFLite 的推理,还导出了一个固定轴模型。
实现
图 2 展示了应用结构的总体框图。该应用是为安卓系统开发的,但软件栈可以轻松移植到其他热门的数字电视操作系统上。
大部分应用逻辑和性能关键型工作都由应用的 C++ 层处理。TitaNet Small 模型最初使用 PyTorch 框架开发。虽然 PyTorch 适合测试和开发模型,但为了尽可能提高端侧的推理性能,该模型被转换为 TFLite。
转换 ML 模型通常颇具挑战。虽然有许多可用的工具,但要找到支持模型算子的合适工具并非易事。在此项目中,模型首先被导出为 ONNX 格式,然后使用 “onnx-tensorflow”[5] 工具将其转换为 TensorFlow 模型。
转换为 TensorFlow 格式后,使用 TensorFlow 库提供的 TFLiteConverter 来导出 TFLite 模型。此外,还利用 TFLite 的训练后量化优化功能生成了一个量化模型。
该应用支持预录音频和实时音频。图 3 是预录数据页面的截图。如图所示,当所选的两个音频片段来自同一个说话人时,系统验证结果显示吻合。反之亦然,当所选的两个音频片段来自不同说话人时,系统报告为不同说话人。
在实时数据模式下,该应用可通过分析实时音频输入来识别说话人。麦克风会持续录制传入的音频,当录制的音频足够多时,就会执行识别管线。新用户可以被录入系统。如果无法识别说话人,系统将显示检测到未知说话人。
性能结果
该应用的关键性能指标是管线执行时间和 CPU/GPU 利用率。管线执行时间非常重要,因为管线执行得越快,处理器就有越多时间处理数字电视上运行的其他任务。了解 CPU/GPU 利用率有助于全面了解应用在运行推理时如何有效地利用可用资源。它还能显示了推理运行之间的情况。
通过对管线的测试,我们发现推理时间在管线执行时间中占大部分。图 5 展示了归一化的管线时序。因此,了解不同设备和后端对推理的影响非常重要。我们使用 Arm Streamline Performance Analyzer[6] 进行时序性能基准测试并采集 CPU/GPU 利用率信息。
为了比较不同设备的管线执行时间,我们使用 TFLite 的 XNNPack 后端,在四核 Arm Cortex-A76 CPU 和四核 Cortex-A55 CPU 处理器上运行应用。然后,仅使用每个处理器的单个核心重复测试。图 6 汇总了测试结果。
正如预期的那样,Cortex-A76 的平均管线执行时间比 Cortex-A55 更短,这表明更强性能的硬件提供了更快的执行速度。图中也显示了四核执行相对于单核执行的显著增益。四核 Cortex-A76 的平均速度最多提高了三倍,四核 Cortex-A55 的平均速度则最多提高了 3.8 倍。尽管并非所有的管线都可以并行化处理,但推理的大部分过程因此而获得了性能改善。
管线运行时间越短,CPU 就能有更多时间运行其他任务,从而提供更出色的整体用户体验。这些测试还证明,可以在单个 Cortex-A55 核心上运行说话人识别技术,并仍能达到可接受的推理时间。尽管如此,这种方法对用户界面的响应速度有明显影响。
Arm Mali GPU 还可用于 ML 工作负载,从而进一步降低 CPU 利用率,为其他任务留出更多空间。如前所述,(在撰写本文时)TFLite 的 GPU 代理需使用固定轴模型。图 7 显示了固定轴模型间的比较。在四核 Cortex-A76 上运行与在 GPU 代理和四核 Cortex-A76 之间分割执行进行了比较。
TitaNet Small 模型中的某些算子不支持 GPU 执行,这意味着这些算子会退回到 CPU 执行。因此,使用 GPU 代理的平均推理时间比使用 CPU 慢了 21.8%。然而,在使用 GPU 代理时,CPU 利用率减少了 51.2%。图 8 展示了这一情况。
这些结果表明,在 GPU 活跃度较低的情况下,可以卸载部分工作负载,从而减轻 CPU 的压力。在 GPU 上运行推理可实现负载平衡,并充分利用所有可用硬件。
这里展示的推理时间是在四核 Arm Mali-G610 GPU 上运行时收集的,使用的是 GPU 代理 2.16 版本。由于具体的配置和对算子的支持会直接影响执行速度,因此不同硬件、模型和应用的执行时间都不尽相同。
量化
模型量化是一种可降低运行推理的计算和内存成本的优化技术。具体做法是用较小的数据类型来表示权重和激活,例如用 8 位整数代替 32 位浮点数。
训练后量化是在模型转换过程中进行的一种优化技术。顾名思义,它可以对已经训练好的模型进行量化,主要分为三种技术:动态范围量化、全整数量化、Float16 量化。本文仅探讨动态范围量化,因为这种技术在转换过程中不需要代表性数据集。动态范围量化是指仅将模型权重量化为整数。该模型在执行时尽可能混合使用整数和浮点运算操作。如果无法实现,执行将退回到 Float32。
TitaNet Small 量化模型实现了约 10% 的速度提升,内存占用减少了约 50%。虽然训练后的量化会致使质量略有下降,但利大于弊。在我们的实验中,模型精度的降低几乎可以忽略不计。
结论
由 Arm 技术赋能的数字电视能够运行边缘 AI 工作负载,改善用户体验,同时维护数据隐私。讲话是我们自然的交流方式。要简化用户与电视的交互方式,重要的是不仅要理解用户所说的内容,还要知晓说话人的身份。我们的研究结果表明,高性能 Arm CPU 为说话人识别技术与日程安排、语音转文本以及未来的端侧大语言模型 (LLM) 等其他 AI 语音任务的结合提供了可能性。
* 本文为 Arm 原创文章,转载请留言联系获得授权并注明出处。
作者:Marcus Corbin
文章来源:Arm社区
推荐阅读