DEV Community

Cover image for Qwen3.5-Omni Kullanımı: API ile Metin, Ses, Video ve Ses Klonlama
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

Qwen3.5-Omni Kullanımı: API ile Metin, Ses, Video ve Ses Klonlama

TL;DR

Qwen3.5-Omni; metin, resim, ses ve video gibi girdileri kabul eder ve metin veya gerçek zamanlı konuşma döndürür. Alibaba Cloud DashScope API aracılığıyla erişebilir veya HuggingFace Transformers aracılığıyla yerel olarak çalıştırabilirsiniz. Bu rehberde API kurulumunu, her modalite için çalışan kod örneklerini, ses klonlamayı ve isteklerinizi Apidog ile nasıl test edeceğinizi bulacaksınız.

Apidog'u bugün deneyin

Qwen3.5-Omni ile Neler Yapabilirsiniz?

Qwen3.5-Omni, metin, resim, ses ve video olmak üzere dört giriş türünü aynı anda işleyebilen bir modeldir. İsteğinizin konfigürasyonuna göre metin veya doğal konuşma çıktısı üretebilir.

Qwen3.5-Omni mimarisi

26 Mart 2026'da yayınlanan bu model, MoE tabanlı Thinker-Talker mimarisiyle çalışır. Thinker, multimodal girdileri işler; Talker, tamamlanmadan önce ses akışını başlatan bir sistemle çıktıyı konuşmaya dönüştürür.

Üç varyant mevcut:

  • Plus: En yüksek kalite, ileri akıl yürütme ve ses klonlama için.
  • Flash: Hız ve kalite dengesi, çoğu üretim senaryosu için önerilir.
  • Light: Düşük gecikme, mobil ve edge senaryolarında kullanılır.

Pratikte çoğu örnekte "Flash" kullanılır, maksimum kalite için "Plus" tercih edilir.


DashScope ile API Erişimi

Qwen3.5-Omni'yi üretimde kullanmanın ana yolu, Alibaba Cloud DashScope API'dir. Aşağıdaki adımları izleyerek hızlıca başlayabilirsiniz.

1. DashScope Hesabı Oluşturun

https://dashscope.aliyuncs.com adresinden kaydolun. Alibaba Cloud hesabınız varsa kullanabilirsiniz.

2. API Anahtarınızı Alın

  • DashScope konsoluna giriş yapın.
  • Sol menüden API Anahtar Yönetimi'ne tıklayın.
  • API Anahtarı Oluştur'a basın ve anahtarı kopyalayın (ör: sk-...).

3. SDK Kurulumu

pip install dashscope
Enter fullscreen mode Exit fullscreen mode

veya OpenAI uyumlu uç noktayı kullanmak için:

pip install openai
Enter fullscreen mode Exit fullscreen mode

DashScope, https://dashscope.aliyuncs.com/compatible-mode/v1 adresinde OpenAI uyumlu bir API sunar. Kodunuzda sadece base_url'ü değiştirin.


Metin Girişi ve Çıkışı

En basit kullanım: Metin girişi ile metin çıktısı almak.

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": "REST ve GraphQL API'leri arasındaki farkı basit terimlerle açıkla."
        }
    ],
)
print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

Daha karmaşık işler için qwen3.5-omni-plus veya düşük gecikme için qwen3.5-omni-light kullanabilirsiniz.


Ses Girişi: Transkripsiyon ve Anlama

Ses dosyasını (URL veya base64) doğrudan gönderin. Model, transkripsiyon ve anlama işlemini tek adımda gerçekleştirir.

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": "Bu toplantıda alınan temel kararları özetle ve eylem maddelerini listele."
                }
            ]
        }
    ],
)
print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

Model 113 dili otomatik tanır. Desteklenen formatlar: WAV, MP3, M4A, OGG, FLAC.


Ses Çıkışı: Metinden Konuşmaya

Yanıtta konuşma almak için modalities ve ses parametrelerini ayarlayın.

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": "OAuth 2.0 kullanarak bir REST API'yi kimlik doğrulama adımlarını açıklar mısın?"
        }
    ],
)

text_content = response.choices[0].message.content
audio_data = response.choices[0].message.audio.data

with open("response.wav", "wb") as f:
    f.write(base64.b64decode(audio_data))
print(f"Metin: {text_content}")
print("Ses response.wav'e kaydedildi.")
Enter fullscreen mode Exit fullscreen mode

İki hazır ses: Chelsie (kadın), Ethan (erkek). 36 dilde konuşma üretimi yapılabilir.


Resim Girişi: Görsel Anlama

Bir resim (URL veya base64) ve metin sorusuyla birlikte gönderin.

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": "Bu API mimarisi diyagramını açıkla ve olası darboğazları belirle."
                }
            ]
        }
    ],
)
print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

Yerel resmi base64 olarak gönder:

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": "Bu ekran görüntüsünde hangi hata gösteriliyor?"}
            ]
        }
    ],
)
Enter fullscreen mode Exit fullscreen mode

Video Girişi: Video ve Ekran Kaydı Anlamlandırma

Qwen3.5-Omni, video ve ses parçalarını birlikte işler.

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": "Geliştiricinin bu demoda ne inşa ettiğini açıkla ve eşdeğer kodu yaz."
                }
            ]
        }
    ],
)
print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

Ses-Görsel "Vibe Kodlama"

Bir ekran kaydını geçirip modelden kod ürettirmek için:

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",  # Kod üretimi için Plus tavsiye edilir
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {"url": f"data:video/mp4;base64,{video_data}"}
                },
                {
                    "type": "text",
                    "text": "Bu ekran kaydını izleyin ve gördüğünüz uygulamayı kod olarak çoğaltın. Tüm UI ve etkileşimleri dahil edin."
                }
            ]
        }
    ],
)
print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

256K token pencere, yaklaşık 400 saniye 720p video barındırır. Daha uzun videolar için bölme yapın.


Ses Klonlama

Modelin yanıtını verdiğiniz örnek sesle klonlatabilirsiniz (Plus ve Flash'ta API üzerinden mevcut).

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": "Apidog geliştirici portalına hoş geldiniz. Size bugün nasıl yardımcı olabilirim?"
        }
    ],
)
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

İpuçları:

  • Temiz, arka plansız bir kayıt kullanın.
  • 15-30 saniyelik örnekler idealdir.
  • 16kHz veya üstü WAV formatı.
  • Doğal konuşma içeren örnekler, metin okumasından daha iyidir.

Akış Yanıtları

Gerçek zamanlı sohbet veya uygulamalar için akışlı cevap alın:

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": "WebSocket bağlantılarının HTTP sorgulamadan nasıl farklı olduğunu açıkla."
        }
    ],
    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 formatı doğrudan ses arabelleğine aktarılabilir ve tam dosya beklemeniz gerekmez.


Karma Modalitelerle Çok Turlu Konuşma

Farklı modaliteleri bir konuşmada birleştirerek işleyin:

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

# 1. Tur: metin
print(send_message([{"type": "text", "text": "Sürekli 503 hataları döndüren bir API'im var."}]))

# 2. Tur: resim ekle (hata günlüğü ekran görüntüsü)
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": "İşte hata günlüğü ekran görüntüsü. Buna ne sebep oluyor?"}
]))

# 3. Tur: takip sorusu
print(send_message([{"type": "text", "text": "Bahsettiğiniz bağlantı havuzu tükenmesini nasıl düzeltirim?"}]))
Enter fullscreen mode Exit fullscreen mode

256K bağlam, uzun ve multimodal konuşmalar için yeterlidir.


HuggingFace ile Yerel Dağıtım

Kendi altyapınızda çalıştırmak için:

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": "Siz, Qwen Ekibi, Alibaba Group tarafından geliştirilmiş, işitsel ve görsel girdileri algılayabilen, ayrıca metin ve konuşma üretebilen sanal bir insansınız."}
        ],
    },
    {
        "role": "user",
        "content": [
            {"type": "audio", "audio": "path/to/your/audio.wav"},
            {"type": "text", "text": "Bu seste ne tartışılıyor?"}
        ],
    },
]

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

Yerel dağıtım için minimum GPU bellek:

Varyant Hassasiyet Minimum VRAM
Plus (30B MoE) BF16 ~40GB
Flash BF16 ~20GB
Light BF16 ~10GB

Üretim için vLLM kullanmak performansı artırır.


Apidog ile Qwen3.5-Omni İsteklerini Test Etme

Çok modlu API istekleri karmaşıktır: base64 kodlu medya, iç içe içerik dizileri, çoklu yanıt tipleri. Terminalden test etmek yerine Apidog kullanarak süreci kolaylaştırın.

Apidog ile test

  • DashScope uç noktanızı yeni bir koleksiyon olarak tanımlayın.
  • API anahtarınızı ortam değişkeni olarak yönetin.
  • Her modalite ve varyant (Plus, Flash, Light) için şablonlar oluşturun, kolayca çoğaltıp parametreleri değiştirin.
  • Yanıt, gecikme ve kaliteyi aynı ekranda kıyaslayın.
  • Apidog'da test iddiaları yazabilirsiniz:
    • Metin yanıtı için choices[0].message.content boş mu kontrol edin.
    • Ses çıkışı gerektiren isteklerde choices[0].message.audio.data mevcut mu doğrulayın.
    • Flash varyantında yanıt gecikmesini eşik altında tutun.

Hata Yönetimi ve Retry Mantığı

Büyük modellerde hız sınırı ve zaman aşımı sık görülebilir. Retry mantığını doğrudan kodunuza ekleyin:

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,  # Büyük video için 2 dakika timeout
)

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"Hız sınırı aşıldı. {wait:.1f}s bekleniyor...")
            time.sleep(wait)
        except (APITimeoutError, APIConnectionError) as e:
            if attempt == max_retries - 1:
                raise
            wait = (2 ** attempt) + random.uniform(0, 1)
            print(f"Bağlantı hatası: {e}. {wait:.1f}s içinde tekrar denenecek...")
            time.sleep(wait)
    raise RuntimeError(f"{max_retries} denemeden sonra başarısız oldu")
Enter fullscreen mode Exit fullscreen mode

100MB üzeri video için:

  • Gerekli kısmı kırpın,
  • Çözünürlüğü düşürün (ör. 480p),
  • Uzun kayıtları bölün.

Yaygın Problemler ve Çözümleri

  • "Sayılar veya teknik terimlerde ses bozuk"

    Qwen3.5-Omni'nin güncel sürümünü kullanın. Kendi sunucunuzda çalıştırıyorsanız HuggingFace'den son ağırlıkları alın.

  • "Ses kesintisi çalışmıyor"

    Flash veya Plus varyantına geçin, akışlı yanıt kullanın.

  • "Ses klonlama kalitesi düşük"

    Temiz örnek, en az 15 saniye ve 16kHz/44.1kHz WAV kullanın.

  • "Video girişinde token limiti hatası"

    Video süresi 6 dakikanın altında olmalı; gerekirse kırpın.

  • "Yerel dağıtım yavaş"

    vLLM ile dağıtım yapın, transformer yerine vllm kullanımı performansı artırır.


SSS

Qwen3.5-Omni için hangi DashScope model kimliğini kullanmalıyım?

Kalite ve gecikmeye göre qwen3.5-omni-plus, qwen3.5-omni-flash veya qwen3.5-omni-light. Genellikle Flash ile başlayın.

OpenAI Python SDK'yı DashScope ile kullanabilir miyim?

Evet. base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ayarlayın ve DashScope anahtarınızı kullanın. Format OpenAI ile aynıdır.

Tek istekte birden fazla dosya (ses + resim) nasıl gönderilir?

Her türü content dizisinde ayrı obje olarak gönderin. Dört modalite de aynı mesajda olabilir.

Ses/video dosyaları için boyut sınırı var mı?

DashScope'da istek başına limitler var. Büyük dosyalar için base64 yerine bir URL referansı verin.

Ses çıkışını nasıl kapatır, sadece metin alırım?

modalities=["text"] ayarlayın veya hiç göndermeyin; sadece metin döner.

İşlev/araç çağırma destekleniyor mu?

Evet, standart tools parametresiyle işlev çağırabilirsiniz.

Uzun ses kayıtlarını nasıl işleyebilirim?

10 saatten kısa kayıtları tek seferde, daha uzunları ise bölerek gönderin ve sonuçları birleştirin.

Çok modlu istekleri uygulama yazmadan önce nasıl test ederim?

Her modalite için Apidog'da istek şablonları oluşturun. Model varyantları arasında geçiş yapabilir, yanıtları ve kaliteyi analiz edebilirsiniz. Apidog üzerinden hızlıca test edin.

Top comments (0)