Transformers 文档

MMS

Hugging Face's logo
加入 Hugging Face 社区

并获取增强的文档体验

开始使用

MMS

PyTorch TensorFlow Flax

概述

MMS 模型由 Vineel Pratap、Andros Tjandra、Bowen Shi、Paden Tomasello、Arun Babu、Sayani Kundu、Ali Elkahky、Zhaoheng Ni、Apoorv Vyas、Maryam Fazel-Zarandi、Alexei Baevski、Yossi Adi、Xiaohui Zhang、Wei-Ning Hsu、Alexis Conneau、Michael Auli 在Scaling Speech Technology to 1,000+ Languages 一文中提出。

该论文的摘要如下:

扩展语音技术的语言覆盖范围有可能改善更多人获取信息的机会。然而,当前的语音技术仅限于大约一百种语言,这只是全球 7000 多种语言中的一小部分。“大规模多语言语音 (MMS) ”项目将支持的语言数量增加了 10-40 倍,具体取决于任务。主要成分是基于公开可用的宗教文本的阅读的新数据集,并有效地利用了自监督学习。我们构建了涵盖 1,406 种语言的预训练 wav2vec 2.0 模型,一个用于 1,107 种语言的单一多语言自动语音识别模型,相同数量语言的语音合成模型,以及一个用于 4,017 种语言的语言识别模型。实验表明,我们的多语言语音识别模型在 FLEURS 基准测试的 54 种语言上的词错误率比 Whisper 降低了一半以上,同时在少量标记数据上进行了训练。

以下是 MMS 项目中开源的不同模型。这些模型和代码最初在这里发布。我们已将它们添加到 transformers 框架中,使其更易于使用。

自动语音识别 (ASR)

ASR 模型 checkpoints 可以在这里找到:mms-1b-fl102mms-1b-l1107mms-1b-all。为了获得最佳准确率,请使用 mms-1b-all 模型。

提示

  • 所有 ASR 模型都接受对应于语音信号原始波形的浮点数组。原始波形应使用 Wav2Vec2FeatureExtractor 进行预处理。
  • 这些模型是使用连接时序分类 (CTC) 训练的,因此模型输出必须使用 Wav2Vec2CTCTokenizer 进行解码。
  • 您可以通过 load_adapter() 为不同的语言加载不同的语言适配器权重。语言适配器仅包含大约 200 万个参数,因此可以在需要时高效地动态加载。

加载

默认情况下,MMS 加载英语的适配器权重。如果要加载另一种语言的适配器权重,请确保指定 target_lang=<your-chosen-target-lang> 以及 "ignore_mismatched_sizes=Trueignore_mismatched_sizes=True 关键字必须传递,以允许根据指定语言的词汇表调整语言模型头的大小。同样,处理器应加载相同的目标语言

from transformers import Wav2Vec2ForCTC, AutoProcessor

model_id = "facebook/mms-1b-all"
target_lang = "fra"

processor = AutoProcessor.from_pretrained(model_id, target_lang=target_lang)
model = Wav2Vec2ForCTC.from_pretrained(model_id, target_lang=target_lang, ignore_mismatched_sizes=True)

您可以安全地忽略如下警告:

Some weights of Wav2Vec2ForCTC were not initialized from the model checkpoint at facebook/mms-1b-all and are newly initialized because the shapes did not match:
- lm_head.bias: found shape torch.Size([154]) in the checkpoint and torch.Size([314]) in the model instantiated
- lm_head.weight: found shape torch.Size([154, 1280]) in the checkpoint and torch.Size([314, 1280]) in the model instantiated
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.

如果要使用 ASR 管道,可以按如下方式加载您选择的目标语言

from transformers import pipeline

model_id = "facebook/mms-1b-all"
target_lang = "fra"

pipe = pipeline(model=model_id, model_kwargs={"target_lang": "fra", "ignore_mismatched_sizes": True})

推理

接下来,让我们看看如何在调用 ~PretrainedModel.from_pretrained 后在推理中运行 MMS 并更改适配器层。首先,我们使用 Datasets 加载不同语言的音频数据。

from datasets import load_dataset, Audio

# English
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "en", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
en_sample = next(iter(stream_data))["audio"]["array"]

# French
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "fr", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
fr_sample = next(iter(stream_data))["audio"]["array"]

接下来,我们加载模型和处理器

from transformers import Wav2Vec2ForCTC, AutoProcessor
import torch

model_id = "facebook/mms-1b-all"

processor = AutoProcessor.from_pretrained(model_id)
model = Wav2Vec2ForCTC.from_pretrained(model_id)

现在我们处理音频数据,将处理后的音频数据传递给模型并转录模型输出,就像我们通常对 Wav2Vec2ForCTC 所做的那样。

inputs = processor(en_sample, sampling_rate=16_000, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs).logits

ids = torch.argmax(outputs, dim=-1)[0]
transcription = processor.decode(ids)
# 'joe keton disapproved of films and buster also had reservations about the media'

我们现在可以将同一模型保留在内存中,并通过为模型调用便捷的 load_adapter() 函数以及为 tokenizer 调用 set_target_lang() 函数来简单地切换语言适配器。我们将目标语言作为输入传递 - 法语为 "fra"

processor.tokenizer.set_target_lang("fra")
model.load_adapter("fra")

inputs = processor(fr_sample, sampling_rate=16_000, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs).logits

ids = torch.argmax(outputs, dim=-1)[0]
transcription = processor.decode(ids)
# "ce dernier est volé tout au long de l'histoire romaine"

以相同的方式,语言可以切换为所有其他支持的语言。请查看

processor.tokenizer.vocab.keys()

以查看所有支持的语言。

为了进一步提高 ASR 模型的性能,可以使用语言模型解码。有关更多详细信息,请参阅 此处 的文档。

语音合成 (TTS)

MMS-TTS 使用与 VITS 相同的模型架构,该架构已在 v4.33 中添加到 🤗 Transformers。MMS 为项目中的 1100 多种语言中的每一种语言训练一个单独的模型 checkpoint。所有可用的 checkpoints 都可以在 Hugging Face Hub 上找到:facebook/mms-tts,推理文档位于 VITS 下。

推理

要使用 MMS 模型,请首先更新到最新版本的 Transformers 库

pip install --upgrade transformers accelerate

由于 VITS 中的基于流的模型是非确定性的,因此最好设置种子以确保输出的可重复性。

  • 对于具有罗马字母表的语言(例如英语或法语),可以直接使用 tokenizer 来预处理文本输入。以下代码示例使用 MMS-TTS 英语 checkpoint 运行前向传递
import torch
from transformers import VitsTokenizer, VitsModel, set_seed

tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng")
model = VitsModel.from_pretrained("facebook/mms-tts-eng")

inputs = tokenizer(text="Hello - my dog is cute", return_tensors="pt")

set_seed(555)  # make deterministic

with torch.no_grad():
   outputs = model(**inputs)

waveform = outputs.waveform[0]

生成的波形可以保存为 .wav 文件

import scipy

scipy.io.wavfile.write("synthesized_speech.wav", rate=model.config.sampling_rate, data=waveform)

或在 Jupyter Notebook / Google Colab 中显示

from IPython.display import Audio

Audio(waveform, rate=model.config.sampling_rate)

对于某些具有非罗马字母表的语言(例如阿拉伯语、普通话或印地语),需要 uroman perl 包来将文本输入预处理为罗马字母表。

您可以通过检查预训练 tokenizeris_uroman 属性来检查您的语言是否需要 uroman

from transformers import VitsTokenizer

tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng")
print(tokenizer.is_uroman)

如果需要,您应该在将 uroman 包应用于文本输入之前将其传递给 VitsTokenizer,因为目前 tokenizer 不支持自行执行预处理。

为此,首先将 uroman 存储库克隆到本地计算机,并将 bash 变量 UROMAN 设置为本地路径

git clone https://github.com/isi-nlp/uroman.git
cd uroman
export UROMAN=$(pwd)

然后,您可以使用以下代码片段预处理文本输入。您可以依赖于使用 bash 变量 UROMAN 指向 uroman 存储库,也可以将 uroman 目录作为参数传递给 uromanize 函数

import torch
from transformers import VitsTokenizer, VitsModel, set_seed
import os
import subprocess

tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-kor")
model = VitsModel.from_pretrained("facebook/mms-tts-kor")

def uromanize(input_string, uroman_path):
    """Convert non-Roman strings to Roman using the `uroman` perl package."""
    script_path = os.path.join(uroman_path, "bin", "uroman.pl")

    command = ["perl", script_path]

    process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # Execute the perl command
    stdout, stderr = process.communicate(input=input_string.encode())

    if process.returncode != 0:
        raise ValueError(f"Error {process.returncode}: {stderr.decode()}")

    # Return the output as a string and skip the new-line character at the end
    return stdout.decode()[:-1]

text = "이봐 무슨 일이야"
uromanized_text = uromanize(text, uroman_path=os.environ["UROMAN"])

inputs = tokenizer(text=uromanized_text, return_tensors="pt")

set_seed(555)  # make deterministic
with torch.no_grad():
   outputs = model(inputs["input_ids"])

waveform = outputs.waveform[0]

提示

  • MMS-TTS checkpoints 在小写、无标点符号的文本上进行训练。默认情况下,VitsTokenizer 通过删除任何大小写和标点符号来规范化输入,以避免将词汇表外字符传递给模型。因此,该模型对大小写和标点符号不可知,因此应在文本提示中避免使用这些符号。您可以通过在调用 tokenizer 时设置 normalize=False 来禁用规范化,但这会导致意外行为,因此不建议这样做。
  • 可以通过将属性 model.speaking_rate 设置为选定值来改变语速。同样,噪声的随机性由 model.noise_scale 控制
import torch
from transformers import VitsTokenizer, VitsModel, set_seed

tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng")
model = VitsModel.from_pretrained("facebook/mms-tts-eng")

inputs = tokenizer(text="Hello - my dog is cute", return_tensors="pt")

# make deterministic
set_seed(555)  

# make speech faster and more noisy
model.speaking_rate = 1.5
model.noise_scale = 0.8

with torch.no_grad():
   outputs = model(**inputs)

语言识别 (LID)

不同的 LID 模型可根据它们可以识别的语言数量提供 - 126256512102420484017

推理

首先,我们安装 transformers 和其他一些库

pip install torch accelerate datasets[audio]
pip install --upgrade transformers

接下来,我们通过 datasets 加载几个音频样本。确保音频数据采样到 16000 kHz。

from datasets import load_dataset, Audio

# English
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "en", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
en_sample = next(iter(stream_data))["audio"]["array"]

# Arabic
stream_data = load_dataset("mozilla-foundation/common_voice_13_0", "ar", split="test", streaming=True)
stream_data = stream_data.cast_column("audio", Audio(sampling_rate=16000))
ar_sample = next(iter(stream_data))["audio"]["array"]

接下来,我们加载模型和处理器

from transformers import Wav2Vec2ForSequenceClassification, AutoFeatureExtractor
import torch

model_id = "facebook/mms-lid-126"

processor = AutoFeatureExtractor.from_pretrained(model_id)
model = Wav2Vec2ForSequenceClassification.from_pretrained(model_id)

现在我们处理音频数据,将处理后的音频数据传递给模型以将其分类为语言,就像我们通常对 Wav2Vec2 音频分类模型(例如 ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition)所做的那样

# English
inputs = processor(en_sample, sampling_rate=16_000, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs).logits

lang_id = torch.argmax(outputs, dim=-1)[0].item()
detected_lang = model.config.id2label[lang_id]
# 'eng'

# Arabic
inputs = processor(ar_sample, sampling_rate=16_000, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs).logits

lang_id = torch.argmax(outputs, dim=-1)[0].item()
detected_lang = model.config.id2label[lang_id]
# 'ara'

要查看 checkpoint 的所有支持语言,您可以按如下方式打印语言 ID

processor.id2label.values()

音频预训练模型

预训练模型有两种不同的大小 - 300M1Bil

用于 ASR 架构的 MMS 基于 Wav2Vec2 模型,有关如何使用模型微调各种下游任务的更多详细信息,请参阅 Wav2Vec2 的文档页面

MMS-TTS 使用与 VITS 相同的模型架构,有关 API 参考,请参阅 VITS 的文档页面

< > 在 GitHub 上更新