Transformers documentation
MMS
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ındanormalize=Falseayarlayarak 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ğimodel.noise_scaleile 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.
Update on GitHubASR 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.