语言识别是从多个音频输入样本中识别主要语言的过程。在自然语言处理(NLP)中,语言识别是一个重要的问题,也是一个具有挑战性的问题。有许多与语言相关的任务,例如在手机上输入文本、找到你喜欢的新闻文章,或者发现你可能有的问题的答案。所有这些任务都是由 NLP 模型驱动的。为了决定在特定时间点调用哪个模型,我们必须执行语言识别。
本文深入介绍了使用 Intel® Extension for PyTorch 的详细解决方案和代码示例,这是针对 Intel®处理器优化的流行 PyTorch AI 框架的版本,以及 Intel® Neural Compressor,这是一个用于加速 AI 推理而不牺牲准确性的工具。
代码示例演示了如何使用 Hugging Face SpeechBrain*工具包训练一个用于语言识别的模型,并使用 Intel® AI Analytics Toolkit(AI Kit)对其进行优化。用户可以修改代码示例,并使用 Common Voice 数据集识别多达 93 种语言。
语言识别的提出方法
在所提出的解决方案中,用户将使用英特尔 AI 分析工具包容器环境来训练模型并利用英特尔优化的 PyTorch 库进行推理。还可以选择使用英特尔神经压缩器量化训练好的模型以加快推理速度。
数据集
使用 Common Voice 数据集,对于此代码示例,具体使用的是日语和瑞典语的 Common Voice 语料库 11.0。该数据集用于训练强调通道注意力、传播和聚合时间延迟神经网络(ECAPA-TDNN),该神经网络使用 Hugging Face SpeechBrain 库实现。时间延迟神经网络(TDNNs),也称为一维卷积神经网络(1D CNNs),是一种多层人工神经网络架构,用于具有平移不变性和在每个网络层中建模上下文的模式分类。ECAPA-TDNN 是一种基于 TDNN 的说话人嵌入提取器,用于说话人验证;它基于原始 x-vector 架构,并更加重视通道注意力、传播和聚合。
实现
下载完 Common Voice 数据集后,数据通过将 MP3 文件转换为 WAV 格式进行预处理,以避免信息丢失,并分为训练集、验证集和测试集。
使用 Hugging Face SpeechBrain 库,用 Common Voice 数据集重新训练预训练的 VoxLingua107 模型,以关注感兴趣的语种。VoxLingua107 是一个用于训练与真实世界和多变语音数据兼容的语音识别模型的语音数据集。此数据集包含 107 种语言的数据。默认情况下,使用日语和瑞典语,并可添加更多语言。然后,该模型用于在测试数据集或用户指定的数据集上进行推理。此外,还有选项使用 SpeechBrain 的语音活动检测(VAD),仅从音频文件中提取并合并语音段,然后在样本随机选择输入模型之前。此链接提供了执行 VAD 所需的所有工具。为了提高性能,用户可以使用 Intel Neural Compressor 将训练好的模型量化为 INT8,以降低延迟。
训练
训练脚本的副本已添加到当前工作目录,包括 create_wds_shards.py
- 用于创建 WebDataset 分片, train.py
- 用于执行实际训练过程,以及 train_ecapa.yaml
- 用于配置训练选项。创建 WebDataset 分片和 YAML 文件的脚本已修复,以支持本代码示例中选择的两种语言。
在数据预处理阶段, prepareAllCommonVoice.py
脚本用于随机选择指定数量的样本,将输入从 MP3 格式转换为 WAV 格式。其中,80%的样本用于训练,10%用于验证,10%用于测试。建议输入样本数量至少为 2000 个,默认值即为 2000。
在下一步中,将从训练集和验证集创建 WebDataset 分片。这会将音频文件存储为 tar 文件,允许编写纯顺序 I/O 管道,以实现从本地存储的高 I/O 速率进行大规模深度学习——比随机访问快约 3x-10x。
用户将修改 YAML 文件。这包括设置 WebDataset 分片的最大数字、输出神经元到感兴趣的语言数量、整个数据集的训练轮数以及批大小。如果训练脚本运行时 CPU 或 GPU 内存不足,应减小批大小。
在此代码示例中,训练脚本将以 CPU 执行。在运行脚本时,“cpu”将作为输入参数传递。 train_ecapa.yaml
中定义的配置也将作为参数传递。
运行脚本以训练模型的命令是:
python train.py train_ecapa.yaml --device "cpu"
未来,训练脚本 train.py 将被设计为与 Intel® GPU(如 Intel®数据中心 GPU Flex 系列、Intel®数据中心 GPU Max 系列和 Intel® Arc™ A 系列)兼容,并包含来自 Intel PyTorch 扩展的更新。
运行训练脚本以了解如何训练模型并执行训练脚本。由于通过其 Intel®高级矩阵扩展(Intel® AMX)指令集提高了性能,因此建议使用第 4 代 Intel® Xeon®可扩展处理器来运行此迁移学习应用。
训练完成后,将提供检查点文件。这些文件用于加载模型进行推理。
推理
在运行推理之前的关键步骤是修补 SpeechBrain 库的预训练 interfaces.py
文件,以便运行 PyTorch TorchScript*以改进运行时间。TorchScript 要求模型的输出只能是张量。
用户可以选择使用 Common Voice 的测试集或自己的自定义 WAV 格式数据运行推理。以下是可以与推理脚本( inference_custom.py and inference_commonVoice.py
)一起运行的选项:
输入选项 | 描述 |
-p | 指定数据路径。 |
-d | 指定波形样本的持续时间。默认值为 3。 |
-s | 指定样本波形的尺寸,默认为 100。 |
--vad | (`inference_custom.py` 仅限) 启用 VAD 模型检测活动语音。VAD 选项将识别音频文件中的语音段,并构建一个只包含语音段的新的 .wav 文件。这提高了作为语言识别模型输入的语音数据质量。 |
--ipex | 使用英特尔 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 扩展和 Intel Neural Compressor 进行优化
PyTorch
Intel 扩展通过最新的功能和优化扩展了 PyTorch,为 Intel 硬件提供额外的性能提升。查看如何安装 Intel 扩展的 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 来加速推理。使用此优化运行的命令是:
python inference_custom.py -p data_custom -d 3 -s 50 --vad --ipex --verbose
注意:查看延迟测量值需要 --verbose
选项。
代码示例的下一个版本将添加对 bfloat16(BF16)等自动混合精度支持。
英特尔神经网络压缩器
这是一个开源的 Python 库,可在 CPU 或 GPU 上运行:
- 执行模型量化以减小模型大小并提高深度学习推理部署的速度。
- 自动化跨多个深度学习框架的流行方法,如量化、压缩、剪枝和知识蒸馏。
- 是 AI 套件的一部分。
通过运行 quantize_model.py
脚本,将模型从 float32(FP32)精度量化为整数 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
接下来是什么?
尝试通过升级硬件到第 4 代英特尔至强可扩展处理器并使用英特尔 AMX,从 Common Voice 数据集中识别多达 93 种不同的语言。
我们鼓励您了解更多关于英特尔其他 AI/ML 框架优化和端到端工具集的信息,并将其融入您的 AI 工作流程中。同时,访问 AI & ML 页面,了解英特尔 AI 软件开发资源,包括准备、构建、部署和扩展您的 AI 解决方案。
想了解更多关于第 4 代英特尔至强可扩展处理器的详细信息,请访问英特尔 AI 解决方案平台门户,了解英特尔如何赋能开发者在这些强大的 CPU 上运行端到端 AI 管道。
有用资源
- 英特尔 AI 开发者工具和资源
- oneAPI 统一编程模型
- 官方文档 - 英特尔® TensorFlow 优化*
- 官方文档 - Intel® 神经压榨器
- 使用 Intel® AMX 加速 AI 工作负载