MMS
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/mms
概述
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 在将语音技术扩展到 1000 多种语言中提出的。
论文的摘要如下:
扩大语音技术的语言覆盖范围有可能提高更多人获取信息的机会。然而,当前的语音技术仅限于大约 100 种语言,这只是全球约 7000 种语言中的一小部分。大规模多语言语音(MMS)项目通过 10-40 倍增加了支持的语言数量,具体取决于任务。主要成分是基于公开可用宗教文本的新数据集,并有效地利用自监督学习。我们构建了覆盖 1406 种语言的预训练 wav2vec 2.0 模型,一种单一的支持 1107 种语言的多语言自动语音识别模型,以及相同数量语言的语音合成模型,以及支持 4017 种语言的语言识别模型。实验表明,我们的多语言语音识别模型在 FLEURS 基准测试的 54 种语言上将 Whisper 的词错误率减少了一半以上,同时在训练时仅使用了少量标记数据。
以下是 MMS 项目中开源的不同模型。这些模型和代码最初发布在这里。我们已将它们添加到transformers
框架中,使其更易于使用。
自动语音识别(ASR)
ASR 模型的检查点可以在这里找到:mms-1b-fl102,mms-1b-l1107,mms-1b-all。为了获得最佳准确性,请使用mms-1b-all
模型。
提示:
- 所有 ASR 模型都接受一个与语音信号的原始波形对应的浮点数组。原始波形应该使用 Wav2Vec2FeatureExtractor 进行预处理。
- 这些模型是使用连接主义时间分类(CTC)进行训练的,因此必须使用 Wav2Vec2CTCTokenizer 对模型输出进行解码。
- 您可以通过 load_adapter()为不同语言加载不同的语言适配器权重。语言适配器仅包含大约 200 万个参数,因此在需要时可以高效地动态加载。
加载
默认情况下,MMS 会加载英语的适配器权重。如果您想加载另一种语言的适配器权重,请确保指定target_lang=
以及"ignore_mismatched_sizes=True
。必须传递ignore_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()函数为模型和 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 模型的性能,可以使用语言模型解码。有关更多详细信息,请参阅此处的文档here。
语音合成(TTS)
MMS-TTS 使用与 VITS 相同的模型架构,该架构在 v4.33 中添加到🤗 Transformers 中。MMS 为项目中的 1100 多种语言中的每种语言训练了一个单独的模型检查点。所有可用的检查点都可以在 Hugging Face Hub 上找到:facebook/mms-tts,以及VITS下的推理文档。
推理
要使用 MMS 模型,首先更新到 Transformers 库的最新版本:
pip install --upgrade transformers accelerate
由于 VITS 中的基于流的模型是非确定性的,因此最好设置一个种子以确保输出的可重现性。
- 对于具有罗马字母表的语言,例如英语或法语,可以直接使用分词器对文本输入进行预处理。以下代码示例使用 MMS-TTS 英语检查点运行前向传递:
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 包对文本输入进行预处理为罗马字母表。
您可以通过检查预训练的tokenizer
的is_uroman
属性来检查您的语言是否需要uroman
包:
from transformers import VitsTokenizer tokenizer = VitsTokenizer.from_pretrained("facebook/mms-tts-eng") print(tokenizer.is_uroman)
如果需要,在将文本输入传递给VitsTokenizer
之前,应该将 uroman 包应用于您的文本输入之前,因为目前分词器不支持执行预处理。
为了做到这一点,首先将 uroman 存储库克隆到本地计算机,并将 bash 变量UROMAN
设置为本地路径:
git clone https://github.com/isi-nlp/uroman.git cd uroman export UROMAN=$(pwd)
然后,您可以使用以下代码片段对文本输入进行预处理。您可以依赖使用 bash 变量UROMAN
指向 uroman 存储库,或者可以将 uroman 目录作为参数传递给uromaize
函数:
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 = "이봐 무슨 일이야" uromaized_text = uromanize(text, uroman_path=os.environ["UROMAN"]) inputs = tokenizer(text=uromaized_text, return_tensors="pt") set_seed(555) # make deterministic with torch.no_grad(): outputs = model(inputs["input_ids"]) waveform = outputs.waveform[0]
提示:
- MMS-TTS 检查点是在小写、无标点的文本上训练的。默认情况下,
VitsTokenizer
通过删除任何大小写和标点来规范化输入,以避免将超出词汇表的字符传递给模型。因此,模型对大小写和标点不敏感,因此应避免在文本提示中使用它们。您可以通过在调用分词器时设置noramlize=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 模型 - 126,256,512,1024,2048,4017。
推理
首先,我们安装 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'
查看检查点支持的所有语言,可以按照以下方式打印语言标识符:
processor.id2label.values()
音频预训练模型
ASR 架构的 MMS 基于 Wav2Vec2 模型,请参考 Wav2Vec2 的文档页面以获取有关如何针对各种下游任务微调模型的更多详细信息。
MMS-TTS 使用与 VITS 相同的模型架构,请参考 VITS 的文档页面获取 API 参考。
MusicGen
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/musicgen
概述
MusicGen 模型是由 Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi 和 Alexandre Défossez 在论文Simple and Controllable Music Generation中提出的。
MusicGen 是一个单阶段自回归 Transformer 模型,能够生成高质量的音乐样本,其条件是文本描述或音频提示。文本描述通过一个冻结的文本编码器模型传递,以获得一系列隐藏状态表示。然后训练 MusicGen 来预测离散的音频标记,或称为音频代码,这些标记是通过音频压缩模型(如 EnCodec)解码以恢复音频波形。
通过高效的标记交错模式,MusicGen 不需要自监督的文本/音频提示语义表示,从而消除了预测一组码书(例如分层或上采样)所需级联多个模型的需要。相反,它能够在单次前向传递中生成所有码书。
论文摘要如下:
我们解决了条件音乐生成的任务。我们引入了 MusicGen,一个单一语言模型(LM),它在几个流的压缩离散音乐表示(即标记)上运行。与以往的工作不同,MusicGen 由单阶段 Transformer LM 和高效的标记交错模式组成,消除了级联多个模型的需要,例如分层或上采样。遵循这种方法,我们展示了 MusicGen 如何能够生成高质量的样本,同时在文本描述或旋律特征的条件下,允许更好地控制生成的输出。我们进行了广泛的实证评估,考虑了自动和人类研究,显示所提出的方法在标准文本到音乐基准上优于评估的基线。通过消融研究,我们阐明了构成 MusicGen 的每个组件的重要性。
该模型由sanchit-gandhi贡献。原始代码可以在这里找到。预训练检查点可以在Hugging Face Hub上找到。
使用提示
- 在从这里下载原始检查点后,您可以使用位于
src/transformers/models/musicgen/convert_musicgen_transformers.py
的转换脚本进行转换,命令如下:
python src/transformers/models/musicgen/convert_musicgen_transformers.py \ --checkpoint small --pytorch_dump_folder /output/path --safe_serialization
生成
MusicGen 兼容两种生成模式:贪婪和抽样。实际上,抽样比贪婪产生的结果显著更好,因此我们鼓励尽可能使用抽样模式。抽样默认启用,并且可以通过在调用MusicgenForConditionalGeneration.generate()
时设置do_sample=True
来明确指定,或通过覆盖模型的生成配置(见下文)来指定。
生成受正弦位置嵌入的限制,输入限制为 30 秒。也就是说,MusicGen 不能生成超过 30 秒的音频(1503 个标记),输入音频通过音频提示生成也会对此限制有所贡献,因此,给定 20 秒的音频输入,MusicGen 不能生成超过额外 10 秒的音频。
Transformers 支持 MusicGen 的单声道(1 通道)和立体声(2 通道)变体。单声道版本生成一组代码书。立体声版本生成 2 组代码书,每个通道(左/右)各一个,并且每组代码书通过音频压缩模型独立解码。每个通道的音频流合并以产生最终的立体声输出。
无条件生成
无条件(或’null’)生成的输入可以通过方法MusicgenForConditionalGeneration.get_unconditional_inputs()
获得:
>>> from transformers import MusicgenForConditionalGeneration >>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") >>> unconditional_inputs = model.get_unconditional_inputs(num_samples=1) >>> audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)
音频输出是一个形状为(batch_size, num_channels, sequence_length)
的三维 Torch 张量。要听生成的音频样本,可以在 ipynb 笔记本中播放它们:
from IPython.display import Audio sampling_rate = model.config.audio_encoder.sampling_rate Audio(audio_values[0].numpy(), rate=sampling_rate)
或者使用第三方库(例如scipy
)将它们保存为.wav
文件:
>>> import scipy >>> sampling_rate = model.config.audio_encoder.sampling_rate >>> scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].numpy())
文本条件生成
模型可以通过使用 MusicgenProcessor 预处理输入来生成受文本提示条件的音频样本:
>>> from transformers import AutoProcessor, MusicgenForConditionalGeneration >>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small") >>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") >>> inputs = processor( ... text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"], ... padding=True, ... return_tensors="pt", ... ) >>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
guidance_scale
用于分类器自由引导(CFG),设置条件对数(从文本提示预测)和无条件对数(从无条件或’null’提示预测)之间的权重。更高的引导比例鼓励模型生成更与输入提示密切相关的样本,通常以音频质量较差为代价。通过设置guidance_scale > 1
启用 CFG。为获得最佳结果,请使用guidance_scale=3
(默认值)。
音频提示生成
相同的 MusicgenProcessor 可用于预处理用于音频延续的音频提示。在以下示例中,我们使用🤗 Datasets 库加载音频文件,可以通过以下命令进行 pip 安装:
pip install --upgrade pip pip install datasets[audio]
>>> from transformers import AutoProcessor, MusicgenForConditionalGeneration >>> from datasets import load_dataset >>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small") >>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") >>> dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True) >>> sample = next(iter(dataset))["audio"] >>> # take the first half of the audio sample >>> sample["array"] = sample["array"][: len(sample["array"]) // 2] >>> inputs = processor( ... audio=sample["array"], ... sampling_rate=sample["sampling_rate"], ... text=["80s blues track with groovy saxophone"], ... padding=True, ... return_tensors="pt", ... ) >>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
对于批量音频提示生成,可以通过使用 MusicgenProcessor 类对生成的audio_values
进行后处理,以去除填充:
>>> from transformers import AutoProcessor, MusicgenForConditionalGeneration >>> from datasets import load_dataset >>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small") >>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") >>> dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True) >>> sample = next(iter(dataset))["audio"] >>> # take the first quarter of the audio sample >>> sample_1 = sample["array"][: len(sample["array"]) // 4] >>> # take the first half of the audio sample >>> sample_2 = sample["array"][: len(sample["array"]) // 2] >>> inputs = processor( ... audio=[sample_1, sample_2], ... sampling_rate=sample["sampling_rate"], ... text=["80s blues track with groovy saxophone", "90s rock song with loud guitars and heavy drums"], ... padding=True, ... return_tensors="pt", ... ) >>> audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256) >>> # post-process to remove padding from the batched audio >>> audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)
生成配置
控制生成过程的默认参数,例如采样、引导比例和生成的标记数量,可以在模型的生成配置中找到,并根据需要进行更新:
>>> from transformers import MusicgenForConditionalGeneration >>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small") >>> # inspect the default generation config >>> model.generation_config >>> # increase the guidance scale to 4.0 >>> model.generation_config.guidance_scale = 4.0 >>> # decrease the max length to 256 tokens >>> model.generation_config.max_length = 256
请注意,传递给生成方法的任何参数都将覆盖生成配置中的参数,因此在调用生成时设置do_sample=False
将覆盖生成配置中model.generation_config.do_sample
的设置。
Transformers 4.37 中文文档(七十六)(2)https://developer.aliyun.com/article/1564177