Transformers documentation

MMS

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Mô hình này được công bố trên HF papers vào ngày 2023-05-22 và được đóng góp cho Hugging Face Transformers vào ngày 2023-06-20.

MMS

Tổng quan

Mô hình MMS được đề xuất trong Scaling Speech Technology to 1,000+ Languages bởi 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

Tóm tắt từ bài báo như sau:

Mở rộng phạm vi ngôn ngữ của công nghệ giọng nói có tiềm năng cải thiện khả năng tiếp cận thông tin cho nhiều người hơn. Tuy nhiên, công nghệ giọng nói hiện tại chỉ giới hạn ở khoảng một trăm ngôn ngữ, một tỷ lệ nhỏ so với hơn 7.000 ngôn ngữ được sử dụng trên toàn thế giới. Dự án Massively Multilingual Speech (MMS) tăng số lượng ngôn ngữ được hỗ trợ lên 10-40 lần, tùy thuộc vào tác vụ. Các thành phần chính là một bộ dữ liệu mới dựa trên việc đọc các văn bản tôn giáo có sẵn công khai và việc khai thác hiệu quả học tự giám sát. Chúng tôi đã xây dựng các mô hình wav2vec 2.0 được huấn luyện trước bao phủ 1.406 ngôn ngữ, một mô hình nhận dạng giọng nói tự động đa ngôn ngữ duy nhất cho 1.107 ngôn ngữ, các mô hình tổng hợp giọng nói cho cùng số lượng ngôn ngữ đó, cũng như một mô hình nhận dạng ngôn ngữ cho 4.017 ngôn ngữ. Các thí nghiệm cho thấy mô hình nhận dạng giọng nói đa ngôn ngữ của chúng tôi giảm hơn một nửa tỷ lệ lỗi từ của Whisper trên 54 ngôn ngữ của bộ chuẩn FLEURS trong khi chỉ được huấn luyện trên một phần nhỏ dữ liệu có nhãn.

Dưới đây là các mô hình mã nguồn mở trong dự án MMS. Các mô hình và mã nguồn ban đầu được phát hành tại đây. Chúng tôi đã thêm chúng vào framework transformers, giúp việc sử dụng trở nên dễ dàng hơn.

Nhận dạng giọng nói tự động (ASR)

Các checkpoint của mô hình ASR có thể được tìm thấy tại đây: mms-1b-fl102, mms-1b-l1107, mms-1b-all. Để đạt độ chính xác tốt nhất, hãy sử dụng mô hình mms-1b-all.

Mẹo:

  • Tất cả các mô hình ASR đều nhận một mảng float tương ứng với dạng sóng thô của tín hiệu giọng nói. Dạng sóng thô nên được tiền xử lý bằng Wav2Vec2FeatureExtractor.
  • Các mô hình được huấn luyện bằng phân loại thời gian kết nối (CTC) nên đầu ra của mô hình phải được giải mã bằng Wav2Vec2CTCTokenizer.
  • Bạn có thể tải trọng số adapter ngôn ngữ khác nhau cho các ngôn ngữ khác nhau thông qua load_adapter(). Các adapter ngôn ngữ chỉ bao gồm khoảng 2 triệu tham số và do đó có thể được tải hiệu quả khi cần.

Đang tải

Mặc định, MMS nạp trọng số adapter cho tiếng Anh. Nếu bạn muốn nạp trọng số adapter của một ngôn ngữ khác, hãy đảm bảo chỉ định target_lang=<your-chosen-target-lang> cũng như "ignore_mismatched_sizes=True. Từ khóa ignore_mismatched_sizes=True phải được truyền vào để cho phép phần đầu của mô hình ngôn ngữ được thay đổi kích thước theo từ vựng của ngôn ngữ được chỉ định. Tương tự, bộ xử lý cũng nên được nạp với cùng ngôn ngữ đích

from transformers import AutoProcessor, Wav2Vec2ForCTC


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, device_map="auto")

Bạn có thể an tâm bỏ qua một cảnh báo như:

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.

Nếu bạn muốn sử dụng pipeline ASR, bạn có thể tải ngôn ngữ đích đã chọn như sau:

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})

Suy luận

Tiếp theo, hãy xem cách chúng ta có thể chạy MMS ở chế độ suy luận và thay đổi các lớp adapter sau khi đã gọi ~PretrainedModel.from_pretrained Trước tiên, chúng ta tải dữ liệu âm thanh bằng các ngôn ngữ khác nhau bằng cách sử dụng Datasets.

from datasets import Audio, load_dataset


# 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"]

Tiếp theo, chúng ta tải mô hình và bộ xử lý


from transformers import AutoProcessor, Wav2Vec2ForCTC


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

processor = AutoProcessor.from_pretrained(model_id)
model = Wav2Vec2ForCTC.from_pretrained(model_id, device_map="auto")

Bây giờ chúng ta xử lý dữ liệu âm thanh, truyền dữ liệu âm thanh đã xử lý vào mô hình và chuyển văn bản từ đầu ra của mô hình, giống như cách chúng ta thường làm với Wav2Vec2ForCTC.

inputs = processor(en_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

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'

Bây giờ chúng ta có thể giữ cùng một mô hình trong bộ nhớ và chỉ cần chuyển đổi các bộ thích ứng ngôn ngữ bằng cách gọi tiện lợi load_adapter() cho mô hình và set_target_lang() cho bộ phân từ. Chúng ta truyền ngôn ngữ đích làm đầu vào - "fra" cho tiếng Pháp.

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

inputs = processor(fr_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

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"

Tương tự, ngôn ngữ có thể được thay đổi cho tất cả các ngôn ngữ khác được hỗ trợ. Vui lòng xem:

processor.tokenizer.vocab.keys()

để xem tất cả các ngôn ngữ được hỗ trợ.

Để cải thiện hiệu suất từ các mô hình ASR, có thể sử dụng giải mã mô hình ngôn ngữ. Xem tài liệu tại đây để biết thêm chi tiết.

Tổng hợp giọng nói (TTS)

MMS-TTS sử dụng cùng kiến trúc mô hình với VITS, được thêm vào 🤗 Transformers từ v4.33. MMS huấn luyện một checkpoint mô hình riêng cho từng ngôn ngữ trong số hơn 1100 ngôn ngữ của dự án. Tất cả các checkpoint khả dụng có thể tìm thấy trên Hugging Face Hub: facebook/mms-tts, và tài liệu suy luận nằm dưới VITS.

Suy luận

Để sử dụng mô hình MMS, trước tiên hãy cập nhật lên phiên bản mới nhất của thư viện Transformers:

pip install --upgrade transformers accelerate

Vì mô hình dựa trên luồng trong VITS là phi tất định, nên việc đặt một hạt giống (seed) là một thực hành tốt để đảm bảo khả năng tái lập của các đầu ra.

  • Đối với các ngôn ngữ sử dụng bảng chữ cái La-tinh, chẳng hạn như tiếng Anh hoặc tiếng Pháp, tokenizer có thể được sử dụng trực tiếp để tiền xử lý các đầu vào văn bản. Ví dụ mã sau chạy một bước truyền tiến (forward pass) sử dụng checkpoint tiếng Anh của MMS-TTS:
import torch

from transformers import VitsModel, VitsTokenizer, set_seed


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

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

set_seed(555)  # make deterministic

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

waveform = outputs.waveform[0]

Biên độ sóng thu được có thể được lưu dưới dạng tệp .wav:

import scipy


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

Hoặc hiển thị trong Jupyter Notebook / Google Colab:

from IPython.display import Audio


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

Đối với một số ngôn ngữ có bảng chữ cái không phải Latin, chẳng hạn như tiếng Ả Rập, tiếng Trung hoặc tiếng Hindi, gói perl uroman là bắt buộc để tiền xử lý các đầu vào văn bản sang bảng chữ cái Latin.

Bạn có thể kiểm tra xem ngôn ngữ của mình có yêu cầu gói uroman hay không bằng cách xem thuộc tính is_uroman của tokenizer đã được huấn luyện trước:

from transformers import VitsTokenizer


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

Nếu cần, bạn nên áp dụng gói uroman cho các đầu vào văn bản trước khi truyền chúng vào VitsTokenizer, vì hiện tại bộ phân từ không hỗ trợ tự thực hiện tiền xử lý.

Để thực hiện điều này, trước tiên hãy clone kho uroman về máy cục bộ của bạn và đặt biến bash UROMAN thành đường dẫn cục bộ:

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

Sau đó, bạn có thể tiền xử lý đầu vào văn bản bằng đoạn mã sau. Bạn có thể dựa vào biến bash UROMAN để trỏ đến kho uroman, hoặc truyền thư mục uroman như một đối số cho hàm uromanize:

import os
import subprocess

import torch

from transformers import VitsModel, VitsTokenizer, set_seed


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

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").to(model.device)

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

waveform = outputs.waveform[0]

Mẹo:

  • Các checkpoint MMS-TTS được huấn luyện trên văn bản viết thường, không có dấu câu. Mặc định, VitsTokenizer sẽ chuẩn hóa đầu vào bằng cách loại bỏ mọi kiểu viết hoa và dấu câu, nhằm tránh truyền các ký tự ngoài từ vựng cho mô hình. Do đó, mô hình không phụ thuộc vào kiểu viết hoa và dấu câu, vì vậy nên tránh sử dụng chúng trong văn bản prompt. Bạn có thể tắt chuẩn hóa bằng cách đặt normalize=False trong lời gọi tokenizer, nhưng điều này sẽ dẫn đến hành vi không mong muốn và không được khuyến khích.
  • Tốc độ nói có thể được thay đổi bằng cách đặt thuộc tính model.speaking_rate thành một giá trị mong muốn. Tương tự, mức độ ngẫu nhiên của nhiễu được kiểm soát bởi model.noise_scale:
import torch

from transformers import VitsModel, VitsTokenizer, set_seed


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

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

# 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)

Nhận dạng ngôn ngữ (LID)

Có các mô hình LID khác nhau tùy thuộc vào số lượng ngôn ngữ mà chúng có thể nhận diện - 126, 256, 512, 1024, 2048, 4017.

Suy luận

Đầu tiên, chúng ta cài đặt transformers và một số thư viện khác

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

Tiếp theo, chúng ta nạp một vài mẫu âm thanh thông qua datasets. Hãy đảm bảo rằng dữ liệu âm thanh được lấy mẫu ở 16000 kHz.

from datasets import Audio, load_dataset


# 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"]

Tiếp theo, chúng ta tải mô hình và bộ xử lý


from transformers import AutoFeatureExtractor, Wav2Vec2ForSequenceClassification


model_id = "facebook/mms-lid-126"

processor = AutoFeatureExtractor.from_pretrained(model_id)
model = Wav2Vec2ForSequenceClassification.from_pretrained(model_id, device_map="auto")

Bây giờ chúng ta xử lý dữ liệu âm thanh, truyền dữ liệu âm thanh đã xử lý vào mô hình để phân loại nó thành một ngôn ngữ, giống như cách chúng ta thường làm với các mô hình phân loại âm thanh Wav2Vec2 như ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition

# English
inputs = processor(en_sample, sampling_rate=16_000, return_tensors="pt").to(model.device)

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").to(model.device)

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'

Để xem tất cả các ngôn ngữ được hỗ trợ của một checkpoint, bạn có thể in ra các id ngôn ngữ như sau:

processor.id2label.values()

Mô hình tiền huấn luyện cho Âm thanh

Các mô hình được huấn luyện trước có sẵn cho hai kích thước khác nhau - 300M , 1Bil.

Kiến trúc MMS cho ASR dựa trên mô hình Wav2Vec2, hãy tham khảo trang tài liệu của Wav2Vec2 để biết thêm chi tiết về cách tinh chỉnh với các mô hình cho nhiều tác vụ downstream khác nhau.

MMS-TTS sử dụng cùng kiến trúc mô hình với VITS, hãy tham khảo trang tài liệu của VITS để xem tham chiếu API.

Update on GitHub