Transformers documentation

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

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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

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

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

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

pip install -q transformers accelerate flash_attn

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

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

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

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

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() للمعالجات لمعالجة مخرجاتها مسبقاً مع مدخلات الصور.

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

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

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. حدد مهمة "any-to-any" والنموذج الذي تريد استخدامه.

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

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

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، و اضبط return_full_text=False لإزالة المدخلات من المخرجات المُولَّدة.

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:

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"])
Update on GitHub