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.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Model ini dipublikasikan di HF papers pada 2023-05-22 dan disumbangkan ke Hugging Face Transformers pada 2023-06-20.

MMS

Ikhtisar

Model MMS diusulkan dalam Scaling Speech Technology to 1,000+ Languages oleh 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

Abstrak dari makalah tersebut adalah sebagai berikut:

Memperluas cakupan bahasa dalam teknologi suara berpotensi meningkatkan akses informasi bagi lebih banyak orang. Namun, teknologi suara saat ini terbatas pada sekitar seratus bahasa, yang merupakan bagian kecil dari lebih dari 7.000 bahasa yang dituturkan di seluruh dunia. Proyek Massively Multilingual Speech (MMS) meningkatkan jumlah bahasa yang didukung hingga 10-40 kali, tergantung pada tugasnya. Komponen utamanya adalah dataset baru yang didasarkan pada pembacaan teks keagamaan yang tersedia secara publik dan pemanfaatan self-supervised learning secara efektif. Kami membangun model wav2vec 2.0 yang telah dilatih sebelumnya untuk mencakup 1.406 bahasa, satu model pengenal ucapan otomatis multibahasa untuk 1.107 bahasa, model sintesis suara untuk jumlah bahasa yang sama, serta model identifikasi bahasa untuk 4.017 bahasa. Eksperimen menunjukkan bahwa model pengenal ucapan multibahasa kami mengurangi word error rate Whisper lebih dari setengahnya pada 54 bahasa dari benchmark FLEURS, sementara dilatih pada sebagian kecil data berlabel.

Berikut adalah berbagai model yang diopen-source dalam proyek MMS. Model dan kode ini awalnya dirilis di sini. Kami telah menambahkan mereka ke dalam framework transformers, sehingga lebih mudah digunakan.

Pengenalan Bicara Otomatis (ASR)

Checkpoint model ASR dapat ditemukan di sini: mms-1b-fl102, mms-1b-l1107, mms-1b-all. Untuk akurasi terbaik, gunakan model mms-1b-all.

Tips:

  • Semua model ASR menerima array float yang sesuai dengan waveform mentah dari sinyal ucapan. Waveform mentah harus diproses terlebih dahulu dengan Wav2Vec2FeatureExtractor.
  • Model-model tersebut dilatih menggunakan connectionist temporal classification (CTC) sehingga output model harus didekode menggunakan Wav2Vec2CTCTokenizer.
  • Anda dapat memuat bobot adapter bahasa yang berbeda untuk berbagai bahasa melalui load_adapter(). Adapter bahasa hanya terdiri dari sekitar 2 juta parameter dan karenanya dapat dimuat secara efisien saat dibutuhkan.

Memuat

Secara default, MMS memuat bobot adapter untuk bahasa Inggris. Jika Anda ingin memuat bobot adapter untuk bahasa lain, pastikan untuk menentukan target_lang=<your-chosen-target-lang> serta "ignore_mismatched_sizes=True. Kata kunci ignore_mismatched_sizes=True harus diteruskan untuk memungkinkan kepala model bahasa diukur ulang sesuai dengan kosakata bahasa yang ditentukan. Demikian pula, prosesor harus dimuat dengan bahasa target yang sama

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

Anda dapat mengabaikan peringatan seperti:

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.

Jika Anda ingin menggunakan pipeline ASR, Anda dapat memuat bahasa target pilihan Anda seperti ini:

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

Inferensi

Selanjutnya, mari kita lihat bagaimana kita dapat menjalankan MMS dalam inferensi dan mengubah lapisan adapter setelah memanggil ~PretrainedModel.from_pretrained Pertama, kita memuat data audio dalam berbagai bahasa menggunakan 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"]

Selanjutnya, kami memuat model dan pemroses


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

Sekarang kita memproses data audio, meneruskan data audio yang telah diproses ke model, dan mentranskripsi keluaran model, sama seperti yang biasa kita lakukan untuk 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'

Kita sekarang dapat mempertahankan model yang sama di memori dan cukup mengganti adapter bahasa dengan memanggil fungsi load_adapter() untuk model dan set_target_lang() untuk tokenizer. Kita melewatkan bahasa target sebagai input - "fra" untuk Prancis.

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"

Dengan cara yang sama, bahasa dapat diganti dengan semua bahasa lain yang didukung. Silakan lihat:

processor.tokenizer.vocab.keys()

untuk melihat semua bahasa yang didukung.

Untuk meningkatkan kinerja model ASR lebih lanjut, decoding model bahasa dapat digunakan. Lihat dokumentasi di sini untuk detail lebih lanjut.

Sintesis Ucapan (TTS)

MMS-TTS menggunakan arsitektur model yang sama dengan VITS, yang ditambahkan ke 🤗 Transformers pada v4.33. MMS melatih checkpoint model terpisah untuk masing-masing dari 1100+ bahasa dalam proyek ini. Semua checkpoint yang tersedia dapat ditemukan di Hugging Face Hub: facebook/mms-tts, dan dokumentasi inferensinya di bawah VITS.

Inferensi

Untuk menggunakan model MMS, perbarui terlebih dahulu ke versi terbaru dari pustaka Transformers:

pip install --upgrade transformers accelerate

Karena model berbasis aliran dalam VITS bersifat non-deterministik, praktik yang baik adalah mengatur seed untuk memastikan reproduktibilitas dari output.

  • Untuk bahasa dengan alfabet Romawi, seperti Inggris atau Prancis, tokenizer dapat digunakan secara langsung untuk memproses pra-tekst input. Contoh kode berikut menjalankan forward pass menggunakan checkpoint MMS-TTS bahasa Inggris:
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]

Gelombang hasil yang dihasilkan dapat disimpan sebagai file .wav:

import scipy


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

Atau ditampilkan di Jupyter Notebook / Google Colab:

from IPython.display import Audio


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

Untuk beberapa bahasa dengan alfabet non-Romawi, seperti Arab, Mandarin, atau Hindi, paket perl uroman diperlukan untuk memproses awal teks input ke alfabet Romawi.

Anda dapat memeriksa apakah Anda memerlukan paket uroman untuk bahasa Anda dengan memeriksa atribut is_uroman dari tokenizer yang telah dilatih sebelumnya:

from transformers import VitsTokenizer


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

Jika diperlukan, Anda harus menerapkan paket uroman pada input teks Anda sebelum meneruskannya ke VitsTokenizer, karena saat ini tokenizer tidak mendukung pelaksanaan pra-pemrosesan itu sendiri.

Untuk melakukan ini, pertama klon repositori uroman ke mesin lokal Anda dan atur variabel bash UROMAN ke jalur lokal:

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

Anda dapat memproses pra-tekst input menggunakan potongan kode berikut. Anda dapat mengandalkan variabel bash UROMAN untuk menunjuk ke repositori uroman, atau Anda dapat meneruskan direktori uroman sebagai argumen ke fungsi 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]

Tips:

  • Checkpoint MMS-TTS dilatih pada teks yang huruf kecil dan tanpa tanda baca. Secara default, VitsTokenizer menormalisasi input dengan menghapus kapitalisasi dan tanda baca, untuk menghindari pengiriman karakter di luar kosakata ke model. Oleh karena itu, model tidak bergantung pada kapitalisasi dan tanda baca, sehingga hal-hal ini sebaiknya dihindari dalam prompt teks. Anda dapat menonaktifkan normalisasi dengan mengatur normalize=False dalam panggilan ke tokenizer, tetapi ini akan menyebabkan perilaku yang tidak terduga dan tidak disarankan.
  • Laju bicara dapat divariasikan dengan mengatur atribut model.speaking_rate ke nilai yang dipilih. Demikian pula, keacakan noise dikendalikan oleh 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)

Identifikasi Bahasa (LID)

Berbagai model LID tersedia berdasarkan jumlah bahasa yang dapat dikenali - 126, 256, 512, 1024, 2048, 4017.

Inferensi

Pertama, kami menginstal transformers dan beberapa pustaka lainnya

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

Selanjutnya, kita memuat beberapa sampel audio melalui datasets. Pastikan data audio disampelkan ke 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"]

Selanjutnya, kami memuat model dan pemroses


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

Sekarang kita memproses data audio, lalu meneruskan data audio yang telah diproses ke model untuk mengklasifikasikannya ke dalam sebuah bahasa, persis seperti yang biasa kita lakukan untuk model klasifikasi audio Wav2Vec2 seperti 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'

Untuk melihat semua bahasa yang didukung oleh checkpoint, Anda dapat mencetak id bahasa sebagai berikut:

processor.id2label.values()

Model Pra-Latih Audio

Model pretrained tersedia untuk dua ukuran yang berbeda - 300M , 1Bil.

Arsitektur MMS untuk ASR didasarkan pada model Wav2Vec2, silakan lihat halaman dokumentasi Wav2Vec2 untuk detail lebih lanjut tentang cara melakukan finetune dengan model untuk berbagai tugas downstream.

MMS-TTS menggunakan arsitektur model yang sama dengan VITS, silakan lihat halaman dokumentasi VITS untuk referensi API.

Update on GitHub