# التوليد متعدد الوسائط

Multimodal النماذج (من أي شيء إلى أي شيء) هي نماذج لغوية قادرة على معالجة أنواع متنوعة من بيانات الإدخال (مثل النص، والصور، والصوت، أو الفيديو) وتوليد مخرجات بأي من هذه الوسائط. وعلى عكس النماذج أحادية الوسيط أو ذات الوسيط الثابت التقليدية، تتيح هذه النماذج تركيبات مرنة للإدخال والإخراج، مما يمكّن نظامًا واحدًا من التعامل مع مجموعة واسعة من المهام: بدءًا من توليد الصور من النص، وصولاً إلى تحويل الصوت إلى نص، وتوصيف الصور، وفهم الفيديو، وغير ذلك. تشترك هذه المهمة في العديد من أوجه التشابه مع مهمة تحويل النص والصورة إلى نص، لكنها تدعم نطاقًا أوسع من وسائط الإدخال والإخراج.

في هذا الدليل، نقدم نظرة عامة موجزة على نماذج any-to-any ونوضح كيفية استخدامها مع Transformers للاستدلال. على عكس نماذج LLM البصرية، التي تكون عادةً محدودة بمهام الرؤية واللغة، يمكن لنماذج omni-modal أن تقبل أي تركيبة من الأنماط (مثل النص، والصور، والصوت، والفيديو) كمدخلات، وتوليد مخرجات في أنماط مختلفة، مثل النص أو الصور.

لنبدأ بتثبيت التبعيات:

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

لنقم بتهيئة النموذج والمعالج.

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

تتضمن هذه النماذج عادةً [قالب محادثة](../chat_templating) لتنظيم المحادثات عبر الوسائط المختلفة. يمكن أن تجمع المدخلات بين الصور والنص والصوت أو أي صيغ أخرى مدعومة في جولة واحدة. كما قد تتنوع المخرجات (مثل توليد النص أو توليد الصوت) اعتماداً على الإعدادات.

فيما يلي مثال يوفر مدخلًا من نوع "نص + صوت" ويطالب باستجابة نصية.

```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?"},
        ]
    },
]
```

سنقوم الآن باستدعاء طريقة [apply_chat_template()](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin.apply_chat_template) للمعالجات لمعالجة مخرجاتها مسبقاً مع مدخلات الصور.

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

يمكننا الآن تمرير المدخلات المُعالَجة مسبقًا إلى النموذج.

```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](/docs/transformers/main/ar/main_classes/pipelines#transformers.Pipeline). حدد مهمة `"any-to-any"` والنموذج الذي تريد استخدامه.

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

يستخدم المثال أدناه قوالب المحادثة لتنسيق مدخلات النص، ويعتمد على نمط الصوت كبيانات متعددة الوسائط.

```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?"},
         ],
     },
 ]
```

مرّر النص والصورة المُنسّقين بواسطة قالب المحادثة إلى [Pipeline](/docs/transformers/main/ar/main_classes/pipelines#transformers.Pipeline)، و اضبط `return_full_text=False` لإزالة المدخلات من المخرجات المُولَّدة.

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

Any-to-any pipeline also supports generating audio or images with any-to-any models. For that you need to set `generation_mode` parameter. Do not forget to set video sampling to the desired FPS, otherwise the whole video will be loaded without sampling. Here is an example code:

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

