# Çok Modlu Üretim

Multimodal (any-to-any) modelleri, çeşitli türlerdeki giriş verilerini (ör. metin, görüntü, ses veya video) işleyebilen ve bu modalitelerden herhangi birinde çıktı üretebilen dil modelleridir. Geleneksel tek modallı veya sabit modallı modellerin aksine, giriş ve çıktının esnek kombinasyonlarına olanak tanıyarak tek bir sistemin geniş bir görev yelpazesini ele almasını sağlar: metinden görüntüye üretimden sese metne transkripsiyona, görüntü altyazılamasına, video anlama ve benzeri görevlere kadar. Bu görev, görüntü-metinden metne göreviyle birçok benzerlik paylaşır, ancak daha geniş bir giriş ve çıktı modalitesi yelpazesini destekler.

Bu kılavuzda, any-to-any modellerine kısa bir genel bakış sunuyor ve bunların Transformers ile çıkarım (inference) için nasıl kullanılacağını gösteriyoruz. Genellikle yalnızca görme ve dil görevleriyle sınırlı olan Vision LLM'lerin aksine, omni-modal modeller girdi olarak herhangi bir modalite kombinasyonunu (ör. metin, görüntü, ses, video) kabul edebilir ve metin veya görüntü gibi farklı modalitelerde çıktı üretebilir.

Bağımlılıkları kurarak başlayalım:

```bash
pip install -q transformers accelerate flash_attn
```

Modeli ve işlemciyi başlatalım.

```python
from transformers import AutoProcessor, AutoModelForMultimodalLM, infer_device
import torch

device = torch.device(infer_device())
model = AutoModelForMultimodalLM.from_pretrained(
    "Qwen/Qwen2.5-Omni-3B",
    dtype=torch.bfloat16,
    attn_implementation="flash_attention_2",
).to(device)

processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-Omni-3B")
```

Bu modeller, modallar arası konuşmaları yapılandırmak için genellikle bir [söyleşim şablonu](../chat_templating) içerir. Girdiler, tek bir turda görsel, metin, ses veya diğer desteklenen biçimlerin karışımını içerebilir. Çıktılar da yapılandırmaya bağlı olarak değişebilir (ör. metin üretimi veya ses üretimi).

Aşağıda, "metin + ses" girdisi sağlayıp metin yanıtı isteyen bir örnek yer almaktadır.

```python
messages = [
    {
        "role": "user",
        "content": [
            {"type": "audio", "url": "https://huggingface.co/datasets/raushan-testing-hf/audio-test/resolve/main/f2641_0_throatclearing.wav"},
            {"type": "text", "text": "What do you hear in this audio?"},
        ]
    },
]
```

Şimdi, çıktıyı ve görüntü girdilerini ön işlemek için işlemcilerin [apply_chat_template()](/docs/transformers/main/tr/main_classes/processors#transformers.ProcessorMixin.apply_chat_template) yöntemini çağıracağız.

```python
inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
    add_generation_prompt=True,
)
```

Artık ön işlenmiş girdileri modele iletebiliriz.

```python
with torch.no_grad():
    generated_ids = model.generate(**inputs, max_new_tokens=100)
generated_texts = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(generated_texts)
```

## Pipeline

Başlamak için en hızlı yol [Pipeline](/docs/transformers/main/tr/main_classes/pipelines#transformers.Pipeline) API'sini kullanmaktır. `"any-to-any"` görevini ve kullanmak istediğiniz modeli belirtin.

```python
from transformers import pipeline
pipe = pipeline("any-to-any", model="mistralai/Voxtral-Mini-3B-2507")
```

Aşağıdaki örnek, metin girdilerini biçimlendirmek için sohbet şablonlarını kullanır ve ses modunu çok modlu veri olarak kullanır.

```python
messages = [
     {
         "role": "user",
         "content": [
             {
                 "type": "audio",
                 "url": "https://huggingface.co/datasets/raushan-testing-hf/audio-test/resolve/main/glass-breaking-151256.mp3",
             },
             {"type": "text", "text": "What do you hear in this audio?"},
         ],
     },
 ]
```

Sohbet şablonu biçimlendirilmiş metni ve görüntüyü [Pipeline](/docs/transformers/main/tr/main_classes/pipelines#transformers.Pipeline) nesnesine iletin ve üretilen çıktıdan girdiyi kaldırmak için `return_full_text=False` değerini ayarlayın.

```python
outputs = pipe(text=messages, max_new_tokens=20, return_full_text=False)
outputs[0]["generated_text"]
```

Any-to-any pipeline, any-to-any modellerle ses veya görüntü üretmeyi de destekler. Bunun için `generation_mode` parametresini ayarlamanız gerekir. Video örnekleme oranını istediğiniz FPS değerine ayarlamayı unutmayın; aksi halde video örnekleme yapılmadan tamamen yüklenir. Aşağıda örnek bir kod bulunmaktadır:

```python
import soundfile as sf
pipe = pipeline("any-to-any", model="Qwen/Qwen2.5-Omni-3B")
messages = [
    {
        "role": "user",
        "content": [
            {"type": "video", "path": "https://huggingface.co/datasets/raushan-testing-hf/videos-test/resolve/main/Cooking_cake.mp4"},
            {"type": "text", "text": "Describe this video."},
        ],
    },
]
output = pipe(text=messages, fps=1, load_audio_from_video=True, max_new_tokens=20, generation_mode="audio")
sf.write("generated_audio.wav", out[0]["generated_audio"])
```

