DEV Community

Cover image for كيفية استخدام Qwen3.5-Omni: نص، صوت، فيديو، واستنساخ صوتي عبر API
Yusuf Khalidd
Yusuf Khalidd

Posted on • Originally published at apidog.com

كيفية استخدام Qwen3.5-Omni: نص، صوت، فيديو، واستنساخ صوتي عبر API

باختصار

يقبل Qwen3.5-Omni النصوص والصور والصوت والفيديو كمدخلات ويعيد نصًا أو كلامًا في الوقت الفعلي. يمكنك الوصول إليه عبر واجهة برمجة تطبيقات Alibaba Cloud DashScope أو تشغيله محليًا عبر HuggingFace Transformers. يغطي هذا الدليل إعداد واجهة برمجة التطبيقات، وأمثلة تعليمات برمجية عملية لكل وسيلة، واستنساخ الصوت، وكيفية اختبار طلباتك باستخدام Apidog.

جرّب Apidog اليوم

ما تتعامل معه

Qwen3.5-Omni هو نموذج واحد يدعم أربعة أنواع من المدخلات: النص، الصور، الصوت، والفيديو. ويعيد إما نصًا أو كلامًا طبيعيًا حسب تهيئة الطلب.

نموذج Qwen3.5-Omni متعدد الوسائط

تم إطلاقه في 30 مارس 2026، وهو مبني على بنية Thinker-Talker مع MoE backbone. Thinker يعالج المدخلات متعددة الوسائط ويقوم بالتعليل، Talker يحول المخرجات إلى كلام عبر نظام multi-codebook ويبدأ ببث الصوت قبل اكتمال الاستجابة.

الأنواع المتاحة:

  • Plus: أعلى جودة، الأفضل للتعليل واستنساخ الصوت
  • Flash: توازن بين السرعة والجودة، موصى به لمعظم الاستخدامات
  • Light: أقل زمن استجابة، لسيناريوهات الأجهزة المحمولة

الدليل يستخدم Flash للأمثلة الافتراضية. استخدم Plus عندما تحتاج أقصى جودة.

الوصول إلى واجهة برمجة التطبيقات (API) عبر DashScope

واجهة برمجة تطبيقات DashScope من Alibaba Cloud هي الطريقة الأساسية لتشغيل Qwen3.5-Omni في الإنتاج. ستحتاج إلى حساب ومفتاح API.

الخطوة 1: إنشاء حساب DashScope

  • انتقل إلى dashscope.aliyuncs.com وسجل حسابك. إذا كان لديك حساب Alibaba Cloud، استخدمه.

الخطوة 2: الحصول على مفتاح API

  1. سجل الدخول إلى لوحة DashScope
  2. من الشريط الجانبي الأيسر اختر إدارة مفتاح API
  3. اضغط إنشاء مفتاح API
  4. انسخ المفتاح (التنسيق: sk-...)

الخطوة 3: تثبيت حزمة SDK

pip install dashscope
Enter fullscreen mode Exit fullscreen mode

أو استخدم نقطة نهاية متوافقة مع OpenAI عبر حزمة openai:

pip install openai
Enter fullscreen mode Exit fullscreen mode

DashScope توفر واجهة متوافقة مع OpenAI عبر

https://dashscope.aliyuncs.com/compatible-mode/v1

يمكنك ببساطة تبديل base_url واستخدام نفس الكود.

المدخلات والمخرجات النصية

أبسط حالة: نص مدخل، نص مخرج.

from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

response = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    messages=[
        {
            "role": "user",
            "content": "Explain the difference between REST and GraphQL APIs in plain terms."
        }
    ],
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode
  • بدّل إلى qwen3.5-omni-plus لمهام أكثر تعقيدًا، أو qwen3.5-omni-light لزمن استجابة أقل.

مدخلات الصوت: النسخ والفهم

مرر ملف صوتي كعنوان URL أو base64. النموذج ينسخ ويفهم الصوت مباشرةً.

import base64
from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

with open("meeting_recording.wav", "rb") as f:
    audio_data = base64.b64encode(f.read()).decode("utf-8")

response = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": audio_data,
                        "format": "wav"
                    }
                },
                {
                    "type": "text",
                    "text": "Summarize the key decisions made in this meeting and list any action items."
                }
            ]
        }
    ],
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode
  • يدعم النموذج 113 لغة للتعرف على الكلام.
  • تنسيقات الصوت المدعومة: WAV، MP3، M4A، OGG، FLAC.

مخرجات الصوت: تحويل النص إلى كلام

للحصول على صوت بدلاً من النص، فعّل مخرج الصوت عبر معلمة modalities:

from openai import OpenAI
import base64

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

response = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    modalities=["text", "audio"],
    audio={"voice": "Chelsie", "format": "wav"},
    messages=[
        {
            "role": "user",
            "content": "Describe the steps to authenticate a REST API using OAuth 2.0."
        }
    ],
)

text_content = response.choices[0].message.content
audio_data = response.choices[0].message.audio.data  # base64-encoded WAV

with open("response.wav", "wb") as f:
    f.write(base64.b64decode(audio_data))

print(f"Text: {text_content}")
print("Audio saved to response.wav")
Enter fullscreen mode Exit fullscreen mode
  • الأصوات المتاحة: Chelsie (أنثى) وEthan (ذكر)
  • يدعم التوليد الصوتي في 36 لغة.

مدخلات الصورة: الفهم البصري

مرر صورة كعنوان URL أو data URL (base64):

from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

response = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://example.com/api-diagram.png"
                    }
                },
                {
                    "type": "text",
                    "text": "Describe this API architecture diagram and identify any potential bottlenecks."
                }
            ]
        }
    ],
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

للصور المحلية:

import base64

with open("screenshot.png", "rb") as f:
    image_data = base64.b64encode(f.read()).decode("utf-8")

image_url = f"data:image/png;base64,{image_data}"

response = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": image_url}
                },
                {
                    "type": "text",
                    "text": "What error is shown in this screenshot?"
                }
            ]
        }
    ],
)
Enter fullscreen mode Exit fullscreen mode

مدخلات الفيديو: فهم التسجيلات والشروحات

Qwen3.5-Omni يحلل الفيديو (صوت وصورة) ويستنتج الكود أو يلخص ما يجري.

from openai import OpenAI
import base64

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

response = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {
                        "url": "https://example.com/product-demo.mp4"
                    }
                },
                {
                    "type": "text",
                    "text": "Describe what the developer is building in this demo and write equivalent code."
                }
            ]
        }
    ],
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

الترميز البصري السمعي (Audio-Visual Vibe Coding)

تمرير تسجيل شاشة وتوليد الكود المقابل:

with open("screen_recording.mp4", "rb") as f:
    video_data = base64.b64encode(f.read()).decode("utf-8")

response = client.chat.completions.create(
    model="qwen3.5-omni-plus",  # Plus لأفضل جودة توليد كود
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {
                        "url": f"data:video/mp4;base64,{video_data}"
                    }
                },
                {
                    "type": "text",
                    "text": "Watch this screen recording and write the complete code that replicates what you see being built. Include all the UI components and their interactions."
                }
            ]
        }
    ],
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode
  • نافذة السياق 256K رمز تكفي حتى 400 ثانية فيديو 720p مع صوت.
  • للتسجيلات الأطول: قص أو قسم الفيديو.

استنساخ الصوت

استنساخ الصوت يتيح لك إعطاء النموذج عينة صوتية ليجيب بنفس الصوت. متاح في Plus وFlash.

import base64
from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

with open("voice_sample.wav", "rb") as f:
    voice_sample = base64.b64encode(f.read()).decode("utf-8")

response = client.chat.completions.create(
    model="qwen3.5-omni-plus",
    modalities=["text", "audio"],
    audio={
        "voice": "custom",
        "format": "wav",
        "voice_sample": {
            "data": voice_sample,
            "format": "wav"
        }
    },
    messages=[
        {
            "role": "user",
            "content": "Welcome to the Apidog developer portal. How can I help you today?"
        }
    ],
)

audio_data = response.choices[0].message.audio.data
with open("cloned_response.wav", "wb") as f:
    f.write(base64.b64decode(audio_data))
Enter fullscreen mode Exit fullscreen mode

نصائح لتحسين الجودة:

  • استخدم تسجيلًا نظيفًا وخالٍ من الضوضاء
  • 15–30 ثانية أفضل من المقاطع القصيرة
  • WAV بتردد 16kHz أو أعلى
  • يفضل أن يحتوي المثال على كلام عفوي وليس نصًا مقروءًا فقط

تدفق الاستجابات (Streaming)

للحصول على استجابات صوتية أو تفاعلية في الوقت الحقيقي، فعّل خيار stream:

from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

stream = client.chat.completions.create(
    model="qwen3.5-omni-flash",
    modalities=["text", "audio"],
    audio={"voice": "Ethan", "format": "pcm16"},
    messages=[
        {
            "role": "user",
            "content": "Explain how WebSocket connections differ from HTTP polling."
        }
    ],
    stream=True,
)

audio_chunks = []
text_chunks = []

for chunk in stream:
    delta = chunk.choices[0].delta
    if hasattr(delta, "audio") and delta.audio:
        if delta.audio.get("data"):
            audio_chunks.append(delta.audio["data"])
    if delta.content:
        text_chunks.append(delta.content)
        print(delta.content, end="", flush=True)

print()

if audio_chunks:
    import base64
    full_audio = b"".join(base64.b64decode(chunk) for chunk in audio_chunks)
    with open("streamed_response.pcm", "wb") as f:
        f.write(full_audio)
Enter fullscreen mode Exit fullscreen mode
  • PCM16 مثالي للتدفق المباشر.

محادثة متعددة الأدوار بوسائل مختلطة

لإدارة سجل محادثة بمدخلات متنوعة:

from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
)

conversation = []

def send_message(content_parts):
    conversation.append({"role": "user", "content": content_parts})

    response = client.chat.completions.create(
        model="qwen3.5-omni-flash",
        messages=conversation,
    )

    reply = response.choices[0].message.content
    conversation.append({"role": "assistant", "content": reply})
    return reply

# Turn 1: نص فقط
print(send_message([{"type": "text", "text": "I have an API that keeps returning 503 errors."}]))

# Turn 2: صورة (screenshot)
import base64
with open("error_log.png", "rb") as f:
    img = base64.b64encode(f.read()).decode()

print(send_message([
    {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img}"}},
    {"type": "text", "text": "Here's the error log screenshot. What's causing this?"}
]))

# Turn 3: متابعة نصية
print(send_message([{"type": "text", "text": "How do I fix the connection pool exhaustion you mentioned?"}]))
Enter fullscreen mode Exit fullscreen mode
  • نافذة السياق الكبيرة (256K رمز) تدعم محادثات طويلة بوسائط متعددة.

النشر المحلي باستخدام HuggingFace

لتشغيل النموذج على البنية التحتية الخاصة بك:

pip install transformers==4.57.3
pip install accelerate
pip install qwen-omni-utils -U
pip install -U flash-attn --no-build-isolation
Enter fullscreen mode Exit fullscreen mode

مثال:

import soundfile as sf
from transformers import Qwen3OmniMoeForConditionalGeneration, Qwen3OmniMoeProcessor
from qwen_omni_utils import process_mm_info

model_path = "Qwen/Qwen3-Omni-30B-A3B-Instruct"

model = Qwen3OmniMoeForConditionalGeneration.from_pretrained(
    model_path,
    device_map="auto",
    attn_implementation="flash_attention_2",
)
processor = Qwen3OmniMoeProcessor.from_pretrained(model_path)

conversation = [
    {
        "role": "system",
        "content": [
            {"type": "text", "text": "You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group, capable of perceiving auditory and visual inputs, as well as generating text and speech."}
        ],
    },
    {
        "role": "user",
        "content": [
            {"type": "audio", "audio": "path/to/your/audio.wav"},
            {"type": "text", "text": "What is being discussed in this audio?"}
        ],
    },
]

text = processor.apply_chat_template(
    conversation,
    add_generation_prompt=True,
    tokenize=False,
)
audios, images, videos = process_mm_info(conversation, use_audio_in_video=True)
inputs = processor(
    text=text,
    audio=audios,
    images=images,
    videos=videos,
    return_tensors="pt",
    padding=True,
)
inputs = inputs.to(model.device).to(model.dtype)

text_ids, audio_output = model.generate(**inputs, speaker="Chelsie")

text_response = processor.batch_decode(text_ids, skip_special_tokens=True)[0]
sf.write("local_response.wav", audio_output.reshape(-1).cpu().numpy(), samplerate=24000)

print(text_response)
Enter fullscreen mode Exit fullscreen mode

متطلبات ذاكرة GPU:

النوع الدقة الحد الأدنى لـ VRAM
Plus (30B MoE) BF16 ~40GB
Flash BF16 ~20GB
Light BF16 ~10GB
  • للاستدلال في الإنتاج، استخدم vLLM وليس HuggingFace Transformers لنماذج MoE.

اختبار طلبات Qwen3.5-Omni باستخدام Apidog

طلبات الـ API متعددة الوسائط أصعب في التصحيح من JSON العادي بسبب الصوت والفيديو المشفرين، والمصفوفات المتداخلة، والاستجابات المختلطة.

اختبار طلبات Qwen3.5-Omni باستخدام Apidog

Apidog يجعل ذلك أسهل:

  • أنشئ نقطة نهاية DashScope كمجموعة جديدة
  • خزّن مفتاح API كمتغير بيئة
  • أنشئ قوالب طلبات لكل وسيلة
  • كرر الطلبات مع تغيير نوع النموذج وقارن النتائج مباشرةً
  • أضف تأكيدات اختبار مثل:
    • تحقق من أن choices[0].message.content غير فارغ للنص
    • تحقق من وجود choices[0].message.audio.data للصوت
    • تحقق من زمن استجابة Flash

هذا يمكّنك من اتخاذ قرار عملي حول النموذج المناسب للإنتاج.

معالجة الأخطاء ومنطق إعادة المحاولة

النماذج متعددة الوسائط غالبًا ما تتعرض لحدود السرعة أو المهلات، خاصة لمدخلات الفيديو. أضف منطق إعادة المحاولة:

import time
import random
from openai import OpenAI, RateLimitError, APITimeoutError, APIConnectionError

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="sk-YOUR_DASHSCOPE_KEY",
    timeout=120,  # 2 دقيقة للمدخلات الكبيرة
)

def call_with_retry(messages, model="qwen3.5-omni-flash", max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(
                model=model,
                messages=messages,
            )
        except RateLimitError:
            wait = (2 ** attempt) + random.uniform(0, 1)
            print(f"Rate limit hit. Waiting {wait:.1f}s...")
            time.sleep(wait)
        except (APITimeoutError, APIConnectionError) as e:
            if attempt == max_retries - 1:
                raise
            wait = (2 ** attempt) + random.uniform(0, 1)
            print(f"Connection error: {e}. Retrying in {wait:.1f}s...")
            time.sleep(wait)
    raise RuntimeError(f"Failed after {max_retries} attempts")
Enter fullscreen mode Exit fullscreen mode

للملفات الكبيرة:

  • قص إلى الجزء المهم
  • خفض الدقة إلى 480p عند الإمكان
  • قسم التسجيلات الطويلة وجمّع النتائج

المشكلات الشائعة والإصلاحات

"مخرجات الصوت مشوهة على الأرقام أو المصطلحات التقنية"

استخدم Qwen3.5-Omni الأحدث. إذا كنت تستضيف محليًا، استخدم أحدث weights من HuggingFace.

"النموذج يستمر في الكلام عند إرسال مقاطعة صوتية"

المقاطعة الفورية مدعومة في Flash/Plus فقط، وليس Light. يجب تفعيل البث (streaming).

"جودة استنساخ الصوت رديئة"

استخدم عينة صوت نظيفة، خالية من الضوضاء، مدة كافية (15 ثانية+)، تنسيق WAV.

"مدخلات الفيديو ترجع خطأ حول حدود الرموز"

الحد 256K رمز (≈6 دقائق فيديو 720p). قلل المدة أو الدقة.

"النشر المحلي بطيء جدًا"

استخدم vLLM وليس HuggingFace Transformers للاستدلال في الإنتاج.

الأسئلة الشائعة

ما هو معرف نموذج DashScope الذي أستخدمه لـ Qwen3.5-Omni؟

استخدم qwen3.5-omni-plus أو qwen3.5-omni-flash أو qwen3.5-omni-light حسب متطلباتك. ابدأ بـ Flash.

هل يمكنني استخدام حزمة OpenAI Python SDK مع DashScope؟

نعم. عيّن

base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"

واستخدم مفتاحك من DashScope كـ api_key.

كيف أرسل ملفات متعددة (صوت + صورة) في طلب واحد؟

ضعها جميعًا في مصفوفة content ككائنات منفصلة مع نوع محدد. كل وسائط ممكنة في نفس الرسالة.

هل هناك حد لحجم ملفات الصوت أو الفيديو؟

نعم. للملفات الكبيرة استخدم URL بدلاً من base64. استضف الملف ومرر الرابط في audio أو video_url.

كيف أوقف مخرجات الصوت وأحصل على نص فقط؟

عيّن modalities=["text"] أو احذف معلمة modalities. الاستجابات النصية أسرع وأقل تكلفة.

هل يدعم استدعاء الدالة/الأداة؟

نعم. استخدم معلمة tools القياسية. النموذج يعيد كائنات منظمة لتنفيذها في كودك.

ما هي أفضل طريقة للتعامل مع التسجيلات الصوتية الطويلة؟

للملفات أقل من 10 ساعات أرسلها دفعة واحدة. للأطول، قسمها عند نقاط توقف طبيعية وجمّع النتائج.

كيف أختبر طلباتي متعددة الوسائط قبل بناء تطبيق كامل؟

استخدم Apidog لبناء وحفظ قوالب الطلبات لكل وسيلة، فحص الاستجابات، وكتابة تأكيدات جودة المخرجات دون الحاجة لكود التطبيق مسبقًا.

Top comments (0)