语言识别是从多个音频输入样本中识别主要语言的过程。在自然语言处理 (NLP) 中,语言识别是一个重要且具有挑战性的问题。有许多与语言相关的任务,例如在手机上输入文本、查找您喜欢的新闻文章或发现您可能遇到的问题的答案。所有这些任务都由 NLP 模型提供支持。要在特定时间点决定调用哪个模型,我们必须执行语言识别。
本文介绍了使用 Intel® Extension for PyTorch(它是流行的 PyTorch AI 框架的一个版本,针对 Intel® 处理器进行了优化)和 Intel® Neural Compressor(它是一个可以在不牺牲准确性的情况下加速 AI 推理的工具)进行语言识别的深入解决方案和代码示例。
该代码示例演示了如何使用 Hugging Face SpeechBrain* 工具包训练模型进行语言识别,并使用 Intel® AI Analytics Toolkit (AI Kit) 对其进行优化。用户可以修改此代码示例,并使用 Common Voice 数据集识别多达 93 种语言。
建议的语言识别方法
在建议的解决方案中,用户将使用 Intel AI Analytics Toolkit 容器环境来训练模型,并利用针对 PyTorch 优化的 Intel 库执行推理。还可以选择使用 Intel Neural Compressor 对训练好的模型进行量化,以加快推理速度。
数据集
使用了 Common Voice 数据集,具体来说,此代码示例使用了日语和瑞典语的 Common Voice Corpus 11.0。此数据集用于训练一个强调通道注意力、传播和聚合时间延迟神经网络 (ECAPA-TDNN) 模型,该模型使用 Hugging Face SpeechBrain 库实现。时间延迟神经网络 (TDNN),也称为一维卷积神经网络 (1D CNN),是一种多层人工神经网络架构,用于对具有移不变性的模式进行分类,并在网络的每一层建模上下文。ECAPA-TDNN 是一种新的基于 TDNN 的说话人嵌入提取器,用于说话人识别;它构建在原始的 x-vector 架构之上,更加强调通道注意力、传播和聚合。
实现
下载 Common Voice 数据集后,通过将 MP3 文件转换为 WAV 格式进行数据预处理,以避免信息丢失,并将数据分为训练集、验证集和测试集。
使用 Hugging Face SpeechBrain 库,利用 Common Voice 数据集对一个 预训练的 VoxLingua107 模型进行再训练,以便专注于目标语言。VoxLingua107 是一个语音数据集,用于训练对真实世界和多变语音数据效果良好的口语识别模型。该数据集包含 107 种语言的数据。默认使用日语和瑞典语,也可以包含更多语言。然后,此模型用于对测试数据集或用户指定的数据集进行推理。此外,还可以选择利用 SpeechBrain 的语音活动检测 (VAD),在该选项下,仅提取音频文件中的语音片段并将其合并,然后随机选择样本作为模型的输入。此链接提供了执行 VAD 所需的所有工具。为了提高性能,用户可以使用 Intel Neural Compressor 将训练好的模型量化为整型 8 位 (INT8),以降低延迟。
训练
训练脚本的副本已添加到当前工作目录,包括 create_wds_shards.py
- 用于创建 WebDataset 分片,train.py
- 用于执行实际的训练过程,以及 train_ecapa.yaml
- 用于配置训练选项。用于创建 WebDataset 分片和 YAML 文件的脚本已打补丁,以适用于为此代码示例选择的两种语言。
在数据预处理阶段,执行 prepareAllCommonVoice.py
脚本,随机选择指定数量的样本,将输入从 MP3 格式转换为 WAV 格式。其中,80% 的样本将用于训练,10% 用于验证,10% 用于测试。建议输入样本数量至少为 2000 个,这也是默认值。
下一步是使用训练集和验证集创建 WebDataset 分片。这会将音频文件存储为 tar 文件,从而可以在大规模深度学习中编写纯粹的顺序 I/O 流水线,以便从本地存储获得高 I/O 速率——与随机访问相比,速度提高约 3-10 倍。
用户将修改 YAML 文件。这包括设置 WebDataset 分片的最大数量值、输出神经元数量(等于目标语言数量)、遍历整个数据集的 epoch 数量以及批次大小。如果在运行训练脚本时 CPU 或 GPU 内存不足,则应减小批次大小。
在此代码示例中,训练脚本将在 CPU 上执行。运行脚本时,将把“cpu”作为输入参数传入。train_ecapa.yaml
中定义的配置也作为参数传入。
运行训练模型的脚本命令是
python train.py train_ecapa.yaml --device "cpu"
未来,通过 Intel Extension for PyTorch 的更新,train.py 训练脚本将设计用于 Intel® GPU,例如 Intel® Data Center GPU Flex 系列、Intel® Data Center GPU Max 系列和 Intel® Arc™ A 系列。
运行训练脚本,学习如何训练模型并执行训练脚本。建议将第四代 Intel® Xeon® 可扩展处理器用于此迁移学习应用,因为它通过其 Intel® Advanced Matrix Extensions (Intel® AMX) 指令集带来了性能提升。
训练完成后,将生成检查点文件。这些文件用于加载模型以进行推理。
推理
在运行推理之前,关键的一步是修补 SpeechBrain 库的预训练 interfaces.py
文件,以便可以运行 PyTorch TorchScript* 来提高运行时性能。TorchScript 要求模型的输出只能是张量(tensors)。
用户可以选择使用 Common Voice 的测试集或自己的 WAV 格式自定义数据运行推理。以下是推理脚本(inference_custom.py 和 inference_commonVoice.py
)可以使用的选项:
输入选项 | 描述 |
-p | 指定数据路径。 |
-d | 指定波形样本的持续时间。默认值为 3。 |
-s | 指定样本波形的大小,默认值为 100。 |
--vad | (仅适用于 inference_custom.py )启用 VAD 模型以检测活跃语音。VAD 选项将识别音频文件中的语音片段,并构建一个仅包含语音片段的新 .wav 文件。这提高了用作语言识别模型输入的语音数据的质量。 |
--ipex | 使用 Intel Extension for PyTorch 提供的优化运行推理。此选项将对预训练模型应用优化。使用此选项应能改善与延迟相关的性能。 |
--ground_truth_compare | (仅适用于 inference_custom.py )启用预测标签与真实值之间的比较。 |
--verbose | 打印额外的调试信息,例如延迟。 |
必须指定数据路径。默认情况下,将从原始音频文件中随机选择 100 个 3 秒的音频样本作为语言识别模型的输入。
使用在 LibriParty 数据集上预训练的小型卷积循环深度神经网络 (CRDNN) 来处理音频样本并输出检测到语音活动的片段。这可以在推理中使用 --vad
选项。
从下图可以看出,CRDNN 模型提供将检测到语音的时间戳,这些时间戳用于构建仅包含语音的新的、更短的音频文件。从此新的音频文件进行采样将能更好地预测主要口语语言。
自己运行推理脚本。运行推理的示例命令是
python inference_custom.py -p data_custom -d 3 -s 50 --vad
这将对您在 data_custom 文件夹中提供的数据运行推理。此命令对 50 个随机选择的 3 秒音频样本执行带有语音活动检测的推理。
如果您想运行其他语言的代码示例,请下载其他语言的 Common Voice Corpus 11.0 数据集。
使用 Intel Extension for PyTorch 和 Intel Neural Compressor 进行优化
PyTorch
Intel 扩展通过最新的特性和优化扩展了 PyTorch,从而在 Intel 硬件上实现了额外的性能提升。查看如何安装 Intel Extension for PyTorch。该扩展可以作为 Python 模块加载或作为 C++ 库链接。Python 用户可以通过导入 intel_extension_for_pytorch
动态启用它。
- CPU 教程详细介绍了适用于 Intel CPU 的 Intel Extension for PyTorch。源代码可在 master 分支获取。
- GPU 教程详细介绍了适用于 Intel GPU 的 Intel Extension for PyTorch。源代码可在 xpu-master 分支获取。
要使用 Intel Extension for PyTorch 对模型进行推理优化,可以传入 --ipex
选项。模型使用该插件进行优化。TorchScript 加速推理是因为 PyTorch 在图模式(graph mode)下运行。使用此优化运行的命令是
python inference_custom.py -p data_custom -d 3 -s 50 --vad --ipex --verbose
注意:需要 --verbose
选项才能查看延迟测量结果。
自动混合精度(例如 bfloat16 (BF16))支持将在未来版本的代码示例中添加。
Intel Neural Compressor
这是一个在 CPU 或 GPU 上运行的开源 Python 库,它
- 执行模型量化,以减小模型大小并提高深度学习推理部署的速度。
- 自动执行跨多个深度学习框架的流行方法,例如量化、压缩、剪枝和知识蒸馏。
- 是 AI Kit 的一部分
通过运行 quantize_model.py
脚本,同时传入模型路径和验证数据集,可以将模型从 float32 (FP32) 精度量化到 integer-8 (INT8)。以下代码可用于加载此 INT8 模型进行推理:
from neural_compressor.utils.pytorch import load
model_int8 = load("./lang_id_commonvoice_model_INT8", self.language_id)
signal = self.language_id.load_audio(data_path)
prediction = self.model_int8(signal)
请注意,加载量化模型时需要原始模型。使用 quantize_model.py
将训练好的模型从 FP32 量化到 INT8 的命令是
python quantize_model.py -p ./lang_id_commonvoice_model -datapath $COMMON_VOICE_PATH/commonVoiceData/commonVoice/dev
后续步骤?
通过将硬件升级到带有 Intel AMX 的第四代 Intel Xeon 可扩展处理器,并从 Common Voice 数据集中识别多达 93 种不同的语言,来试用上述代码示例。
我们鼓励您了解更多关于 Intel 的其他 AI/ML 框架优化和 端到端工具组合,并将其整合到您的 AI 工作流程中。此外,请访问介绍 Intel 用于准备、构建、部署和扩展 AI 解决方案的 AI 软件开发资源的 AI 与 ML 页面。
有关新的第四代 Intel Xeon 可扩展处理器的更多详细信息,请访问 Intel 的 AI 解决方案平台门户,在那里您可以了解 Intel 如何赋能开发者在这些强大的 CPU 上运行端到端 AI 流水线。
有用资源
- Intel AI 开发者工具和资源
- oneAPI 统一编程模型
- 官方文档 - Intel® Optimization for TensorFlow*
- 官方文档 - Intel® Neural Compressor
- 使用 Intel® AMX 加速 AI 工作负载