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

Bu model 2023-05-22 tarihinde HF papers'ta yayımlandı ve 2023-06-20 tarihinde Hugging Face Transformers'a katkıda bulunuldu.

MMS

Genel Bakış

MMS modeli, 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 ve Michael Auli tarafından Scaling Speech Technology to 1,000+ Languages makalesinde önerilmiştir.

Makalenin özeti aşağıdaki gibidir:

Ses teknolojisinin dil kapsamını genişletmek, çok daha fazla insanın bilgiye erişimini iyileştirme potansiyeline sahiptir. Ancak, mevcut ses teknolojisi yaklaşık yüz dile sınırlıdır ve bu, dünya genelinde konuşulan 7.000'den fazla dilin küçük bir kısmını oluşturur. Massively Multilingual Speech (MMS) projesi, görevine bağlı olarak desteklenen dil sayısını 10-40 kat artırır. Ana bileşenler, kamuya açık dini metinlerin okunmalarına dayalı yeni bir veri seti ve öz-denetimsiz öğrenmenin (self-supervised learning) etkin bir şekilde kullanılmasıdır. 1.406 dili kapsayan önceden eğitilmiş wav2vec 2.0 modelleri, 1.107 dil için tek bir çok dilli otomatik konuşma tanıma modeli, aynı sayıda dil için konuşma sentez modelleri ve 4.017 dil için bir dil tanıma modeli geliştirdik. Deneyler, çok dilli konuşma tanıma modelimizin, etiketli verinin küçük bir kısmıyla eğitilmesine rağmen FLEURS benchmark'undaki 54 dilde Whisper'ın kelime hata oranını (word error rate) yarıdan fazla azalttığını göstermektedir.

MMS projesinde açık kaynaklanan farklı modeller aşağıda listelenmiştir. Modeller ve kodlar ilk olarak burada yayınlanmıştır. Bunları transformers çerçevesine ekleyerek kullanımını kolaylaştırdık.

Otomatik Konuşma Tanıma (ASR)

ASR model kontrol noktaları burada bulunabilir: mms-1b-fl102, mms-1b-l1107, mms-1b-all. En iyi doğruluk için mms-1b-all modelini kullanın.

İpuçları:

  • Tüm ASR modelleri, ses sinyalinin ham dalga formuna karşılık gelen bir float dizisi kabul eder. Ham dalga formu, Wav2Vec2FeatureExtractor ile ön işlenmelidir.
  • Modeller, bağlantısal zamansal sınıflandırma (CTC) kullanılarak eğitildiğinden, model çıktısının Wav2Vec2CTCTokenizer kullanılarak çözümlenmesi gerekir.
  • Farklı diller için farklı dil adaptörü ağırlıklarını load_adapter() üzerinden yükleyebilirsiniz. Dil adaptörleri yalnızca yaklaşık 2 milyon parametreden oluşur ve bu nedenle gerektiğinde verimli bir şekilde anlık olarak yüklenebilir.

Yükleniyor

Varsayılan olarak MMS, İngilizce için adaptör ağırlıklarını yükler. Başka bir dilin adaptör ağırlıklarını yüklemek istiyorsanız, target_lang=<your-chosen-target-lang> ile birlikte "ignore_mismatched_sizes=True parametresini de belirtmeniz gerekir. ignore_mismatched_sizes=True anahtar kelimesi, dil modeli başlığının belirtilen dilin sözlüğüne göre yeniden boyutlandırılmasına izin vermek için iletilmelidir. Benzer şekilde, işlemci de aynı hedef dil ile yüklenmelidir.

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

Aşağıdaki gibi bir uyarıyı güvenle görmezden gelebilirsiniz:

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 hattını kullanmak istiyorsanız, seçtiğiniz hedef dili şu şekilde yükleyebilirsiniz:

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

Çıkarım

Ardından, ~PretrainedModel.from_pretrained çağrıldıktan sonra MMS'i çıkarım (inference) modunda çalıştırma ve adaptör katmanlarını değiştirme yöntemine bakalım. Öncelikle, Datasets kullanarak farklı dillerde ses verilerini yükleriz.

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

Ardından, modeli ve işlemciyi yükleriz


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

Şimdi ses verilerini işler, işlenmiş ses verilerini modele iletir ve model çıktısını, Wav2Vec2ForCTC için genellikle yaptığımız gibi transkribe ederiz.

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'

Artık aynı modeli bellekte tutabilir ve model için load_adapter() işlevini, tokenizer için ise set_target_lang() işlevini çağırarak dil adaptörlerini kolayca değiştirebiliriz. Hedef dili girdi olarak geçiririz - Fransızca için "fra".

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"

Dil, desteklenen diğer tüm diller için aynı şekilde değiştirilebilir. Lütfen şuraya göz atın:

processor.tokenizer.vocab.keys()

desteklenen tüm dilleri görmek için.

ASR modellerinden performansın daha da iyileştirilmesi için dil modeli çözümleme kullanılabilir. Daha fazla ayrıntı için buradaki belgelere bakın.

Ses Sentezi (TTS)

MMS-TTS, v4.33 sürümünde 🤗 Transformers'a eklenen VITS ile aynı model mimarisini kullanır. MMS, projedeki 1100'den fazla dilin her biri için ayrı bir model kontrol noktası eğitir. Kullanılabilir tüm kontrol noktaları Hugging Face Hub'da facebook/mms-tts adresinde ve çıkarım (inference) belgeleri VITS altında bulunabilir.

Çıkarım

MMS modelini kullanmak için önce Transformers kütüphanesinin en son sürümüne güncelleyin:

pip install --upgrade transformers accelerate

VITS'teki akış tabanlı model deterministik olmadığından, çıktıların tekrarlanabilirliğini sağlamak için bir tohum (seed) ayarlamak iyi bir uygulamadır.

  • İngilizce veya Fransızca gibi Latin alfabesi kullanan dillerde, tokenizer metin girdilerini ön işlemek için doğrudan kullanılabilir. Aşağıdaki kod örneği, MMS-TTS İngilizce checkpoint'i kullanılarak bir ileri geçiş (forward pass) çalıştırır:
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]

Oluşturulan dalga formu bir .wav dosyası olarak kaydedilebilir:

import scipy


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

Bir Jupyter Notebook / Google Colab'da görüntülenir:

from IPython.display import Audio


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

Arapça, Mandarin veya Hintçe gibi Latin alfabesi dışındaki alfabelere sahip bazı diller için, metin girdilerini Latin alfabesine dönüştürmek amacıyla uroman perl paketinin kullanılması gerekir.

Diliniz için uroman paketinin gerekip gerekmediğini, önceden eğitilmiş tokenizer'ın is_uroman özniteliğini inceleyerek kontrol edebilirsiniz:

from transformers import VitsTokenizer


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

Gerekli olması durumunda, VitsTokenizer'a geçirmeden önce metin girdilerinize uroman paketini uygulamalısınız, çünkü şu anda tokenizer bu ön işlemleri kendi başına gerçekleştirememektedir.

Bunu yapmak için önce uroman deposunu yerel makinenize klonlayın ve UROMAN bash değişkenini yerel yola ayarlayın:

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

Ardından aşağıdaki kod parçasını kullanarak metin girdisini ön işleme tabi tutabilirsiniz. uroman deposuna işaret etmek için UROMAN bash değişkenini kullanabilir veya uroman dizinini uromanize fonksiyonuna bir argüman olarak iletebilirsiniz:

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]

İpuçları:

  • MMS-TTS checkpoint'ları küçük harfli ve noktalama işareti içermeyen metinler üzerinde eğitilmiştir. Varsayılan olarak VitsTokenizer, modele sözlük dışı karakterler geçilmesini önlemek için girdileri normalize eder; bu işlem büyük/küçük harf ayrımını ve noktalama işaretlerini kaldırır. Dolayısıyla model, büyük/küçük harf ve noktalama işaretlerinden bağımsızdır; bu nedenle metin isteminde bunlardan kaçınılmalıdır. Tokenizer çağrısında normalize=False ayarlayarak normalizasyonu devre dışı bırakabilirsiniz, ancak bu beklenmedik davranışlara yol açar ve önerilmez.
  • Konuşma hızı, model.speaking_rate özniteliği seçilen bir değere ayarlanarak değiştirilebilir. Benzer şekilde, gürültünün rastgeleliği model.noise_scale ile kontrol edilir:
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)

Dil Tanımlama (LID)

Tanıyabildikleri dil sayısına göre farklı LID modelleri mevcuttur: 126, 256, 512, 1024, 2048, 4017.

Çıkarım

Öncelikle, transformers ve bazı diğer kütüphaneleri kurarız

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

Ardından, datasets aracılığıyla birkaç ses örneği yükleriz. Ses verisinin 16000 kHz'e örneklenmiş olduğundan emin olun.

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

Ardından, modeli ve işlemciyi yükleriz


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

Şimdi ses verilerini işleyip, ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition gibi Wav2Vec2 ses sınıflandırma modellerinde genellikle yaptığımız gibi, işlenmiş ses verilerini modele geçirerek onu bir dile sınıflandırıyoruz.

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

Bir kontrol noktasının desteklediği tüm dilleri görmek için dil kimliklerini aşağıdaki gibi yazdırabilirsiniz:

processor.id2label.values()

Ses Ön-Eğitilmiş Modeller

Farklı iki boyut için ön eğitilmiş modeller mevcuttur: 300M ve 1Bil.

ASR için MMS mimarisi Wav2Vec2 modeline dayanmaktadır; çeşitli aşağı akış görevleri için modellerle ince ayar yapma konusunda daha fazla ayrıntı için Wav2Vec2 dokümantasyon sayfasına bakın.

MMS-TTS, VITS ile aynı model mimarisini kullanır; API referansı için VITS'in dokümantasyon sayfasına bakın.

Update on GitHub