Transformers 文件
MMS
並獲得增強的文件體驗
開始使用
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 在 擴充套件語音技術至 1,000 多種語言 中提出。
論文摘要如下:
擴充套件語音技術的語言覆蓋範圍有可能改善更多人獲取資訊的途徑。然而,目前的語音技術僅限於大約一百種語言,這在全球使用的 7,000 多種語言中只佔很小一部分。大規模多語言語音 (MMS) 專案將支援的語言數量增加了 10-40 倍,具體取決於任務。主要成分是基於公開宗教文字閱讀的新資料集,並有效利用自監督學習。我們構建了覆蓋 1,406 種語言的預訓練 wav2vec 2.0 模型,一個用於 1,107 種語言的單一多語言自動語音識別模型,相同數量語言的語音合成模型,以及一個用於 4,017 種語言的語言識別模型。實驗表明,我們的多語言語音識別模型在 FLEURS 基準的 54 種語言上,將 Whisper 的詞錯誤率減半以上,而訓練資料僅為 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=<your-chosen-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 pipeline,可以這樣載入您選擇的目標語言:
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})
推理
接下來,讓我們看看如何在推理中執行 MMS 並在呼叫 ~PretrainedModel.from_pretrained
之後更改介面卡層。首先,我們使用 資料集 載入不同語言的音訊資料。
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 模型的效能,可以使用語言模型解碼。有關更多詳細資訊,請參閱此處的文件。
語音合成 (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 目錄作為引數傳遞給 `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 檢查點是在小寫、無標點文字上訓練的。預設情況下,`VitsTokenizer` 會透過去除任何大小寫和標點符號來**規範化**輸入,以避免將詞彙外字元傳遞給模型。因此,模型對大小寫和標點符號不敏感,因此在文字提示中應避免使用它們。您可以透過在呼叫分詞器時設定 `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 模型 - 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'
要檢視檢查點支援的所有語言,您可以按如下方式打印出語言 ID:
processor.id2label.values()
音訊預訓練模型
MMS 的 ASR 架構基於 Wav2Vec2 模型,有關如何使用模型進行各種下游任務微調的更多詳細資訊,請參閱 Wav2Vec2 的文件頁面。
MMS-TTS 使用與 VITS 相同的模型架構,請參閱 VITS 的文件頁面 獲取 API 參考。