# 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](https://huggingface.co/papers/2305.13516) 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, dünya genelinde konuşulan 7.000'den fazla dilin küçük bir kesitini oluşturan yaklaşık yüz dille sınırlıdır. Massively Multilingual Speech (MMS) projesi, görevine bağlı olarak desteklenen dil sayısını 10-40 kat artırır. Temel unsurlar, kamuya açık dini metinlerin okumalarına dayalı yeni bir veri seti ve öz-denetimli öğ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 oluşturduk. Deneyler, çok dilli konuşma tanıma modelimizin, etiketli verinin küçük bir kesiti üzerinde 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](https://github.com/facebookresearch/fairseq/tree/main/examples/mms) 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](https://huggingface.co/facebook/mms-1b-fl102), [mms-1b-l1107](https://huggingface.co/facebook/mms-1b-l1107), [mms-1b-all](https://huggingface.co/facebook/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](/docs/transformers/main/tr/model_doc/wav2vec2#transformers.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](/docs/transformers/main/tr/model_doc/wav2vec2#transformers.Wav2Vec2CTCTokenizer) kullanılarak çözümlenmesi gerekir.
- Farklı diller için farklı dil adaptör ağırlıklarını [load_adapter()](/docs/transformers/main/tr/model_doc/wav2vec2#transformers.Wav2Vec2ForCTC.load_adapter) üzerinden yükleyebilirsiniz. Dil adaptörleri yalnızca yaklaşık 2 milyon parametreden oluştuğu için gerektiğinde verimli bir şekilde anında 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>` ve `"ignore_mismatched_sizes=True` parametrelerini 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.

```python
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:

```text
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:

```python
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ırmanın ve adaptör katmanlarını değiştirme yollarına bakalım. Öncelikle, [Datasets](https://github.com/huggingface/datasets) kullanarak farklı dillerde ses verilerini yükleriz.

```python
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

```python

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](/docs/transformers/main/tr/model_doc/wav2vec2#transformers.Wav2Vec2ForCTC) için genellikle yaptığımız gibi transkribe ederiz.

```py
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()](/docs/transformers/main/tr/model_doc/wav2vec2#transformers.Wav2Vec2ForCTC.load_adapter) ve tokenizer için [set_target_lang()](/docs/transformers/main/tr/model_doc/wav2vec2#transformers.Wav2Vec2CTCTokenizer.set_target_lang) işlevlerini çağırarak dil adaptörlerini kolayca değiştirebiliriz. Hedef dili girdi olarak geçiririz - Fransızca için `"fra"`.

```py
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:

```py
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](https://huggingface.co/facebook/mms-1b-all) 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](https://huggingface.co/models?sort=trending&search=facebook%2Fmms-tts) adresinde ve çıkarım (inference) belgeleri [VITS](./vits) altında bulunabilir.

#### Çıkarım

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

```bash
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 diller için, tokenizer doğrudan kullanılabilir
metin girdilerini ön işleme. Aşağıdaki kod örneği, MMS-TTS İngilizce kontrol noktasını kullanarak bir ileri geçiş çalıştırır:

```python
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:

```python
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:

```python
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`](https://github.com/isi-nlp/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:

```python
from transformers import VitsTokenizer

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

Gerekliyse, `VitsTokenizer`'a geçirmeden **önce** metin girdilerinize uroman paketini uygulamalısınız, çünkü şu anda tokenizer ön işlemleri kendi başına gerçekleştirmeyi desteklememektedir.

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

```bash
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:

```python
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:

```python
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](https://huggingface.co/facebook/mms-lid-126), [256](https://huggingface.co/facebook/mms-lid-256), [512](https://huggingface.co/facebook/mms-lid-512), [1024](https://huggingface.co/facebook/mms-lid-1024), [2048](https://huggingface.co/facebook/mms-lid-2048), [4017](https://huggingface.co/facebook/mms-lid-4017).

#### Çıkarım

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

```bash
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.

```python
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

```python

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](https://huggingface.co/harshit345/xlsr-wav2vec-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.

```py
# 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:

```py
processor.id2label.values()
```

### Ses Ön-Eğitilmiş Modeller

Farklı iki boyut için ön eğitilmiş modeller mevcuttur: [300M](https://huggingface.co/facebook/mms-300m) ve [1Bil](https://huggingface.co/facebook/mms-1b).

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'nin belgeleri sayfasına](./wav2vec2) bakın.

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

