演示:使用 NAVER LABS Europe 的新语音资源进行法语口语理解
在这篇博客文章中,我们展示了 NAVER LABS Europe 最近发布并将于 2024 年 Interspeech 大会上展示的语音资源。Speech-MASSIVE 数据集是一个多语言口语理解 (SLU) 数据集,包含丰富的元数据信息,而 mHuBERT-147 模型是一个紧凑而强大的语音基础模型,仅有 95M 参数,支持 147 种语言。在这里,我们展示了一个我们利用这两种资源为法语构建的简单级联 SLU 应用。您可以在以下网址查看我们的演示:
您可以在 HuggingFace Spaces 查看我们的演示: https://huggingface.co/spaces/naver/French-SLU-DEMO-Interspeech2024
目录:
Speech-MASSIVE:一个用于 SLU 及其他领域的多语言语音数据集
SLU 涉及使用自然语言处理 (NLP) 解释口语输入。Alexa 和 Siri 等语音助手是 SLU 应用的真实示例。SLU 中的核心任务包括意图分类(确定话语背后的目标或命令)和槽位填充(从话语中提取特定详细信息,例如日期或音乐流派)。然而,由于录音、验证的复杂性和相关成本,收集 SLU 数据面临挑战。此外,大多数现有数据集主要以英语为中心,限制了语言多样性和跨语言应用。
为了弥补这些空白,我们引入了 Speech-MASSIVE,这是一个基于 MASSIVE 语料库的翻译和注释构建的多语言 SLU 数据集。该数据集通过众包方式策划,并有严格的质量控制,涵盖 12 种语言(阿拉伯语、德语、西班牙语、法语、匈牙利语、韩语、荷兰语、波兰语、欧洲葡萄牙语、俄语、土耳其语和越南语),涵盖 8 个语系和 4 种不同的文字,总共有超过 83,000 条口语话语。
利用 Speech-MASSIVE,我们还在各种系统和资源配置下建立了基线模型,以促进广泛的比较。您可以在我们的论文中阅读实验的详细信息。我们希望此资源有助于推进多语言 SLU 研究,并鼓励开发强大的端到端和级联模型。该数据集根据 CC BY-NC-SA 4.0 许可在 HuggingFace 上免费提供。
- 训练集和开发集可在此处获取:https://huggingface.co/datasets/FBK-MT/Speech-MASSIVE
- 测试集可在此处获取:https://huggingface.co/datasets/FBK-MT/Speech-MASSIVE-test
- 基线端到端 (E2E) SLU 模型的代码可在此处获取:https://github.com/hlt-mt/speech-massive
以下是 Speech-MASSIVE 数据的样子。我们的数据集是一个完全对齐的 12 种不同语言的语音数据集,这意味着该数据集也可以用于这 12 种语言的 ASR 和 ST。
语言 | 话语 | 音频 | 意图 | 槽位 | 说话者年龄 | 说话者性别 | ... | 说话者居住地 |
---|---|---|---|---|---|---|---|---|
法语 | allumer les lumières du disco | 音频 | iot_hue_lighton | allumer les [device_type : lumières] du [device_type : disco] | 56 | 男性 | ... | 法国 |
德语 | mach die discobeleuchtung an | 音频 | iot_hue_lighton | mach die [device_type : discobeleuchtung] an | 20 | 女性 | ... | 德国 |
阿拉伯语 | شغل لمبات الديسكو | 音频 | iot_hue_lighton | شغل [device_type : لمبات الديسكو] | 32 | 女性 | ... | 英国 |
西班牙语 | pon las luces de discoteca | 音频 | iot_hue_lighton | pon las luces de discoteca | 23 | 男性 | ... | 墨西哥 |
匈牙利语 | kapcsold be a diszkófényeket | 音频 | iot_hue_lighton | kapcsold be a [device_type : diszkófényeket] | 23 | 女性 | ... | 匈牙利 |
韩语 | 디스코 불 켜 | 音频 | iot_hue_lighton | [device_type : 디스코 불] 켜 | 34 | 男性 | ... | 澳大利亚 |
荷兰语 | zet de disco lichten aan | 音频 | iot_hue_lighton | zet de [device_type : disco lichten] aan | 23 | 女性 | ... | 荷兰 |
波兰语 | włącz światła dyskotekowe | 音频 | iot_hue_lighton | włącz [device_type : światła dyskotekowe] | 24 | 女性 | ... | 波兰 |
葡萄牙语 | ligar as luzes de discoteca | 音频 | iot_hue_lighton | ligar as [device_type : luzes de discoteca] | 22 | 男性 | ... | 葡萄牙 |
俄语 | включи диско освещение | 音频 | iot_hue_lighton | включи [device_type : диско освещение] | 32 | 女性 | ... | 英国 |
土耳其语 | disko ışıklarını aç | 音频 | iot_hue_lighton | [device_type : disko ışıklarını] aç | 31 | 女性 | ... | 英国 |
越南语 | mở các đèn disco lên | 音频 | iot_hue_lighton | mở [device_type : các đèn disco] lên | 33 | 女性 | ... | 美国 |
下面是如何加载数据集的示例
from datasets import load_dataset, interleave_datasets, concatenate_datasets
# creating full train set by interleaving between German and French
speech_massive_de = load_dataset("FBK-MT/Speech-MASSIVE", "de-DE")
speech_massive_fr = load_dataset("FBK-MT/Speech-MASSIVE", "fr-FR")
speech_massive_train_de_fr = interleave_datasets([speech_massive_de['train'], speech_massive_fr['train']])
# creating train_115 few-shot set by concatenating Korean and Russian
speech_massive_ko = load_dataset("FBK-MT/Speech-MASSIVE", "ko-KR")
speech_massive_ru = load_dataset("FBK-MT/Speech-MASSIVE", "ru-RU")
Speech_massive_train_115_ko_ru = concatenate_datasets([speech_massive_ko['train_115'], speech_massive_ru['train_115']])
mHuBERT-147:一个紧凑的多语言 HuBERT 模型
语音表示模型构成了大多数现代语音相关技术的基础。这些模型使用无监督学习在大量数据集上进行训练,深度编码器网络从中学习捕获丰富、细致的语音模式。一旦训练完成,它们就可以应用于各种语音应用,即使只有少量标记数据也能取得令人印象深刻的结果。
mHuBERT-147 是一个紧凑但高效的多语言语音表示模型,支持 147 种语言。它在性能和效率之间实现了卓越的平衡,在 ML-SUPERB(10 分钟/1 小时)排行榜中分别排名第 2 和第 1,同时比其竞争对手小 3 到 10 倍。此外,我们的模型训练数据量比同类多语言模型少近五倍,这凸显了数据管理在高效自监督学习中的关键作用。
您可以在 HuggingFace 上探索 mHuBERT-147 模型,它根据 CC BY-NC-SA 4.0 许可证提供。
- 模型:https://huggingface.co/utter-project/mHuBERT-147
- 以前的版本:https://huggingface.co/collections/utter-project/mhubert-147-models-665f1c1dea9a5601a1bfc905
- 预处理脚本:https://github.com/utter-project/mHuBERT-147-scripts
- 训练脚本:https://github.com/utter-project/fairseq
在下一节中,我们将解释如何加载 mHuBERT-147 以进行 ASR 微调。
构建法语 SLU 应用
在此演示中,我们展示了一个简单的级联法语 SLU 解决方案,它利用了 Speech-MASSIVE 和 mHuBERT-147。我们首先使用 mHuBERT-147 作为骨干,构建一个比 Whisper 更小更好的法语 ASR 模型,用于 Speech-MASSIVE。然后,我们将 ASR 预测输入到经过微调的 mT5 模型中,用于槽位填充和意图分类的自然语言理解 (NLU) 任务。通过将 ASR 和 NLU 结合起来,我们构建了一个简单的级联 SLU 系统。
1. 使用 mHuBERT-147 构建法语 ASR 模型
我们使用 mHuBERT-147 模型作为骨干训练了一个基于 CTC 的 ASR 模型。尽管其尺寸紧凑,但 mHuBERT-147 效率极高,使其成为推理速度至关重要部署的更好选择。
该法语 ASR 模型可在此处获取:https://huggingface.co/naver/mHuBERT-147-ASR-fr
训练
我们创建了 mHubertForCTC 类,它几乎与现有的 HubertForCTC 类完全相同。主要区别在于我们在 Transformer 堆栈的末尾、lm_head 之前添加了一些额外的隐藏层。我们发现,在编码器堆栈末尾添加额外的容量通常有助于模型更有效地学习生成目标语言中的字符。
class mHubertForCTC(HubertPreTrainedModel):
def __init__(self, config, target_lang: Optional[str] = None):
super().__init__(config)
self.hubert = HubertModel(config)
self.dropout = nn.Dropout(config.final_dropout)
output_hidden_size = config.hidden_size
self.has_interface = config.add_interface
# NN layers on top of the trainable stack
if config.add_interface:
self.interface = nn.ModuleList([VanillaNN(output_hidden_size,output_hidden_size) for i in range(config.num_interface_layers)])
self.lm_head = nn.Linear(output_hidden_size, config.vocab_size)
self.post_init()
我们的隐藏层是简单定义的神经网络,由线性投影和 ReLU 激活组成。
class VanillaNN(nn.Module):
def __init__(self, input_dim, output_dim):
"""
simple NN with ReLU activation (no norm)
"""
super().__init__()
self.linear = nn.Linear(input_dim, output_dim)
self.act_fn = nn.ReLU()
def forward(self, hidden_states: torch.FloatTensor):
hidden_states = self.linear(hidden_states)
hidden_states = self.act_fn(hidden_states)
return hidden_states
要从现有的预训练 mHuBERT-147 模型初始化 ASR 模型,首先我们需要创建一个处理器。您可以从现有的 HuggingFace 文章(此处和此处)了解更多信息。
tokenizer = Wav2Vec2CTCTokenizer(your_vocab_file, unk_token="[UNK]", pad_token="[PAD]", word_delimiter_token="|")
feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained('utter-project/mHuBERT-147')
processor = Wav2Vec2Processor(feature_extractor=feature_extractor, tokenizer=tokenizer)
对于我们的 ASR 训练,我们然后使用 mHubertForCTC 类的新参数扩展 HubertConfig 文件。
# load Hubert default config
config = HubertConfig.from_pretrained('utter-project/mHuBERT-147')
# add CTC-related tokens
config.pad_token_id = processor.tokenizer.pad_token_id
config.ctc_token_id = processor.tokenizer.convert_tokens_to_ids('[CTC]')
config.vocab_size = len(processor.tokenizer)
# add our extra hidden layers
config.add_interface = True
config.num_interface_layers = 3
# update the dropout parameter
config.final_dropout = 0.3
完成此操作后,我们可以实例化一个新的 mHubertForCTC 模型。请注意,在使用此模型之前我们仍然需要对其进行训练!
model = mHubertForCTC.from_pretrained('utter-project/mHuBERT-147', config=config)
提示:一般来说,对于 mHuBERT-147 的微调,我们建议 final_dropout > 0.1。如果您在训练期间遇到不稳定性,请考虑改用 fp32 训练。
推理
我们的 ASR 推理脚本可在此处获取:https://huggingface.co/naver/mHuBERT-147-ASR-fr/tree/main/inference_code
推理就像这样简单
from inference_code.run_inference import load_asr_model, run_asr_inference
audio_struct = librosa.load(your_audio_file, sr=16000)
model, processor = load_asr_model()
prediction = run_inference(model, processor, your_audio_file)
在此演示中,我们使用来自三个法语数据集的 123 小时语音训练了 ASR 模型:fleurs-102、CommonVoice v17.0(下采样)和 Speech-MASSIVE。我们使用 Whisper 归一化进行训练和评估。这个小巧的法语 ASR 模型在 Speech-MASSIVE 开发集和测试集上能够超越 whisper-large-v2。
开发集词错误率 (WER) | 开发集字符错误率 (CER) | 测试集词错误率 (WER) | 测试集字符错误率 (CER) | |
---|---|---|---|---|
Whisper-large-v3 | 10.2 | 4.4 | 11.1 | 4.7 |
mHuBERT-147-ASR-fr | 9.2 | 2.6 | 9.6 | 2.9 |
2. 利用 mT5 进行自然语言理解 (NLU)
现在我们能够将法语语音转换为文本,下一步是生成一个能够给出话语背后意图的 NLU 模型。为此,我们以序列到序列的方式对 mT5 模型进行 NLU 任务的微调。在这种设置中,源序列将是 N 个单词,目标序列将是相应的槽位加上意图 (N+1)。
具体来说,输入数据如下例所示。正如以前的工作中所建议的,我们还在源序列前加上“Annotate: ”,以便提示 mT5 模型进行 NLU 任务。
Source - Annotate: allume les lumières dans la cuisine
Target - Other Other Other Other Other house_place iot_hue_lighton
在此演示中,我们使用的 mT5 模型仅针对来自 speech-MASSIVE 的法语 NLU 数据进行了微调,但很容易将其扩展到多语言设置。您可以在我们的 Speech-MASSIVE 论文中探索不同的 NLU 设置和模型。
我们演示中使用的法语 NLU 模型可在此处获取:https://huggingface.co/Beomseok-LEE/NLU-Speech-MASSIVE-finetune
以下是加载它的方法
from transformers import AutoConfig, AutoModelForSeq2SeqLM, AutoTokenizer
config=AutoConfig.from_pretrained("Beomseok-LEE/NLU-Speech-MASSIVE-finetune")
tokenizer=AutoTokenizer.from_pretrained("Beomseok-LEE/NLU-Speech-MASSIVE-finetune")
model=AutoModelForSeq2SeqLM.from_pretrained("Beomseok-LEE/NLU-Speech-MASSIVE-finetune")
然后,NLU 推理代码非常简单。我们只需在输入字符串(在本例中为 ASR 输出)前加上“Annotate: ”,并将其传递给我们微调的 NLU 模型。
example = "Annotate: " + example
input_values = tokenizer(example, max_length=128, padding=False, truncation=True, return_tensors="pt").input_ids
with torch.no_grad():
pred_ids = model.generate(input_values)
prediction = tokenizer.decode(pred_ids[0], skip_special_tokens=True)
splitted_pred = prediction.strip().split()
由于我们的 NLU 模型以序列到序列的方式进行训练,因此输出将由槽位填充令牌和意图分类令牌组成,因此我们将模型输出拆分为相应的部分,如下所示
slots_prediction = splitted_pred[:-1]
intent_prediction = splitted_pred[-1]
现在,我们拥有了级联 SLU 系统的所有组件!
3. 演示时间!
我们的演示托管在 HuggingFace Spaces,可在以下网址访问:https://huggingface.co/spaces/naver/French-SLU-DEMO-Interspeech2024
如果您会法语,请尝试使用麦克风。如果您不会,只需点击演示页面上提供的示例即可尽情玩乐!
请注意,演示仅使用 CPU 资源,因此处理时间可能会有所不同。
2024 年 Interspeech 大会见
如果您想了解更多关于我们的资源或 NAVER LABS Europe 的信息,请随时在 2024 年 Interspeech 大会上寻找我们。两位作者(Beomseok Lee 和 Marcely Zanon Boito)都将在那里待一整周!
我们的演讲:
9 月 2 日星期一,下午 4:00 至 4:20
- “Speech-MASSIVE:一个用于 SLU 及其他领域的多语言语音数据集”,Beomseok Lee、Ioan Calapodescu、Marco Gaido、Matteo Negri、Laurent Besacier
- 地点:Iasso 会议室
- 论文:https://arxiv.org/abs/2408.03900
9 月 4 日星期三,下午 4:00 至 6:00
- “mHuBERT-147:一个紧凑的多语言 HuBERT 模型”,Marcely Zanon Boito、Vivek Iyer、Nikolaos Lagos、Laurent Besacier、Ioan Calapodescu
- 地点:海报区 2A
- 论文:https://arxiv.org/abs/2406.06371
关于我们:
NAVER LABS EUROPE 交互系统组旨在使机器人能够安全地与人类、其他机器人和系统进行交互。我们的研究结合了人机交互、自然语言处理、语音、信息检索、数据管理和低代码/无代码编程方面的专业知识。通过利用多模态数据和模型,我们相信我们可以为机器人服务创建更健壮和用户友好的界面。这项以多模态为中心的工作也涵盖了多任务处理和多语言性。
了解更多信息,请访问:https://europe.naverlabs.com/research/multimodal-nlp-for-hri/
这篇博客文章由 Beomseok Lee 和 Marcely Zanon Boito 撰写。我们感谢 Laurent Besacier 和 Ioan Calapodescu 审阅其内容。
致谢:
这是由欧盟“地平线欧洲研究与创新计划”资助的欧洲项目 UTTER(扩展现实统一转录与翻译)的成果,资助协议号为 101070631。欲了解更多信息,请访问 https://he-utter.eu/