DEV Community

Cover image for Cara Menggunakan Qwen3.5-Omni: Teks, Audio, Video, dan Kloning Suara via API
Walse
Walse

Posted on • Originally published at apidog.com

Cara Menggunakan Qwen3.5-Omni: Teks, Audio, Video, dan Kloning Suara via API

TL;DR

Qwen3.5-Omni menerima teks, gambar, audio, dan video sebagai masukan dan mengembalikan teks atau ucapan waktu nyata. Akses melalui Alibaba Cloud DashScope API atau jalankan secara lokal melalui HuggingFace Transformers. Panduan ini mencakup penyiapan API, contoh kode yang berfungsi untuk setiap modalitas, kloning suara, dan cara menguji permintaan Anda dengan Apidog.

Coba Apidog hari ini

Yang Sedang Anda Gunakan

Qwen3.5-Omni adalah model tunggal yang menangani empat jenis masukan secara bersamaan: teks, gambar, audio, dan video. Ini mengembalikan teks atau ucapan alami, tergantung pada bagaimana Anda mengonfigurasi permintaan.

Diagram Qwen3.5-Omni

Dirilis 30 Maret 2026, model ini dibangun di atas arsitektur Thinker-Talker dengan inti MoE. Thinker memproses masukan multimodal dan bernalar di atasnya. Talker mengonversi keluaran menjadi ucapan dengan sistem multi-codebook yang memulai streaming audio sebelum respons lengkap selesai.

Tiga varian yang tersedia:

  • Plus: Kualitas tertinggi, terbaik untuk penalaran dan kloning suara
  • Flash: Kecepatan dan kualitas seimbang, cocok untuk kebanyakan aplikasi produksi
  • Light: Latensi terendah, untuk skenario seluler dan edge

Panduan ini menggunakan Flash untuk contoh utama. Ganti dengan Plus jika Anda butuh kualitas maksimal.

Akses API melalui DashScope

DashScope API dari Alibaba Cloud adalah cara utama untuk menjalankan Qwen3.5-Omni secara produksi. Anda perlu akun DashScope dan kunci API.

Langkah 1: Buat akun DashScope

Kunjungi dashscope.aliyuncs.com dan daftar. Jika sudah punya akun Alibaba Cloud, cukup login.

Langkah 2: Dapatkan kunci API Anda

  1. Masuk ke konsol DashScope
  2. Klik Manajemen Kunci API di sidebar kiri
  3. Klik Buat Kunci API
  4. Salin kunci (format: sk-...)

Langkah 3: Instal SDK

pip install dashscope
Enter fullscreen mode Exit fullscreen mode

Atau gunakan endpoint OpenAI-compatible langsung dengan SDK openai:

pip install openai
Enter fullscreen mode Exit fullscreen mode

DashScope menyediakan endpoint OpenAI-compatible di https://dashscope.aliyuncs.com/compatible-mode/v1, artinya Anda hanya perlu menukar base_url dan bisa memakai kode yang sama seperti OpenAI.

Masukan dan Keluaran Teks

Kasus paling sederhana: teks masuk, teks keluar.

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": "Jelaskan perbedaan REST dan GraphQL API secara sederhana."
        }
    ],
)

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

Ganti ke qwen3.5-omni-plus untuk penalaran lebih berat, atau qwen3.5-omni-light jika latensi jadi prioritas.


Masukan Audio: Transkripsi dan Pemahaman

Berikan URL file audio atau audio base64. Model otomatis mentranskripsi dan memahami konten audio tanpa langkah ASR terpisah.

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": "Ringkas keputusan utama dari meeting ini dan sebutkan action item-nya."
                }
            ]
        }
    ],
)

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

Model ini mendukung 113 bahasa untuk pengenalan suara dan otomatis mendeteksi bahasa. Format audio: WAV, MP3, M4A, OGG, FLAC.

Keluaran Audio: Text-to-Speech dalam Respons

Untuk mendapatkan ucapan, set parameter modalities dan konfigurasi keluaran audio:

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": "Jelaskan langkah autentikasi REST API dengan 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"Teks: {text_content}")
print("Audio disimpan ke response.wav")
Enter fullscreen mode Exit fullscreen mode

Tersedia dua suara: Chelsie (perempuan) dan Ethan (laki-laki). TTS mendukung 36 bahasa.

Masukan Gambar: Pemahaman Visual

Kirim URL gambar atau gambar base64 beserta pertanyaan teks:

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": "Jelaskan diagram arsitektur API ini dan identifikasi potensi bottleneck."
                }
            ]
        }
    ],
)

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

Untuk gambar lokal, encode ke base64:

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": "Apa error yang terlihat di screenshot ini?"
                }
            ]
        }
    ],
)
Enter fullscreen mode Exit fullscreen mode

Masukan Video: Memahami Rekaman dan Tangkapan Layar

Video input memungkinkan Qwen3.5-Omni bernalar atas trek visual dan audio secara bersamaan.

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": "Ceritakan apa yang dibangun developer di demo ini dan buatkan kode ekuivalen."
                }
            ]
        }
    ],
)

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

Pengkodean Vibe Audio-Visual

Untuk kasus "vibe coding" (screen recording jadi kode):

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 untuk kualitas generasi kode terbaik
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {
                        "url": f"data:video/mp4;base64,{video_data}"
                    }
                },
                {
                    "type": "text",
                    "text": "Tonton rekaman layar ini dan tulis kode lengkap yang membangun apa yang sedang dibuat. Sertakan semua UI dan interaksinya."
                }
            ]
        }
    ],
)

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

Jendela konteks 256K token cukup untuk sekitar 400 detik video 720p + audio. Untuk yang lebih panjang, potong atau bagi.

Kloning Suara

Kloning suara memungkinkan model merespons dengan suara target. Tersedia di Plus dan Flash via API.

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": "Selamat datang di portal developer Apidog. Ada yang bisa saya bantu hari ini?"
        }
    ],
)

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

Tips kualitas kloning suara:

  • Rekaman bersih tanpa noise latar
  • 15-30 detik lebih baik daripada sangat pendek
  • Gunakan WAV di 16kHz atau lebih tinggi
  • Sampel suara sebaiknya berisi gaya bicara alami

Respons Streaming

Untuk chat suara real-time atau aplikasi interaktif, gunakan streaming agar audio mulai diputar sebelum respons selesai.

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": "Jelaskan perbedaan WebSocket dan 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()  # baris baru setelah teks streaming

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

Format PCM16 cocok untuk streaming karena bisa langsung dialirkan ke output audio.

Percakapan Multi-Giliran dengan Modalitas Campuran

Untuk percakapan nyata yang mencampur berbagai modalitas, kelola riwayat seperti berikut:

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

# Giliran 1: teks
print(send_message([{"type": "text", "text": "API saya sering error 503."}]))

# Giliran 2: tambah gambar (screenshot error log)
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": "Ini screenshot error log-nya. Kenapa bisa terjadi?"}
]))

# Giliran 3: follow-up teks
print(send_message([{"type": "text", "text": "Bagaimana cara mengatasi connection pool exhaustion tadi?"}]))
Enter fullscreen mode Exit fullscreen mode

Jendela konteks 256K memungkinkan percakapan panjang berisi gambar dan audio tanpa masalah pemotongan.

Penyebaran Lokal dengan HuggingFace

Ingin menjalankan Qwen3.5-Omni di infrastruktur sendiri? Ikuti langkah berikut:

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": "Apa yang dibahas di audio ini?"}
        ],
    },
]

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

Kebutuhan VRAM untuk deployment lokal:

Varian Presisi Min VRAM
Plus (30B MoE) BF16 ~40GB
Flash BF16 ~20GB
Light BF16 ~10GB

Untuk inferensi lokal produksi, gunakan vLLM, bukan HuggingFace Transformers. Model MoE berjalan lebih cepat dengan optimasi perutean vLLM.

Menguji Permintaan Qwen3.5-Omni Anda dengan Apidog

Permintaan API multimodal lebih sulit di-debug daripada JSON biasa. Anda akan menghadapi audio/video base64, array konten bertingkat, dan respons yang bisa berisi teks maupun audio. Melakukan semuanya dari terminal akan sangat merepotkan.

Antarmuka Apidog

Apidog menangani ini dengan rapi. Atur endpoint DashScope sebagai koleksi baru, simpan kunci API sebagai variabel environment, dan buat template permintaan untuk tiap modalitas.

Untuk masing-masing varian (Plus, Flash, Light), duplikat permintaan dasar dan ubah parameter model. Jalankan dan bandingkan respons, latensi, serta kualitas dalam satu tampilan.

Anda juga bisa menulis assertion di Apidog untuk verifikasi respons multimodal:

  • Cek choices[0].message.content tidak kosong untuk respons teks
  • Pastikan choices[0].message.audio.data ada saat meminta audio
  • Validasi latensi respons Flash di bawah target

Ini sangat membantu saat memilih varian terbaik untuk produksi.

Penanganan Kesalahan dan Logika Coba Lagi

Batas laju dan timeout sering terjadi pada model multimodal besar, terutama input video. Implementasikan logika retry sejak awal.

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 menit untuk input video besar
)

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. Tunggu {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}. Retry dalam {wait:.1f}s...")
            time.sleep(wait)
    raise RuntimeError(f"Gagal setelah {max_retries} percobaan")
Enter fullscreen mode Exit fullscreen mode

Untuk video input >100MB:

  • Potong ke bagian relevan sebelum upload
  • Turunkan resolusi ke 480p jika visual tidak perlu HD
  • Bagi video panjang jadi segmen, lalu kumpulkan hasil

Masalah Umum dan Perbaikan

“Keluaran audio terdistorsi pada angka atau istilah teknis”

Pastikan gunakan Qwen3.5-Omni (bukan versi lama). Jika self-hosting, gunakan bobot model terbaru dari HuggingFace.

“Model terus berbicara saat interupsi audio dikirim”

Interupsi semantik hanya ada di Flash/Plus. Light mungkin tidak support. Pastikan Anda memakai streaming, bukan batch.

“Kualitas kloning suara buruk”

Gunakan sampel bersih, minimal 15 detik, format WAV 16kHz+. Gunakan tools seperti Audacity untuk menghilangkan noise.

“Masukan video error soal batas token”

256K token setara ~400 detik video 720p. Potong video panjang atau turunkan resolusi/durasi.

“Penyebaran lokal sangat lambat”

Gunakan vLLM, bukan HF Transformers. Model MoE butuh routing vLLM untuk throughput optimal.

FAQ

ID model DashScope mana untuk Qwen3.5-Omni?

Pilih qwen3.5-omni-plus, qwen3.5-omni-flash, atau qwen3.5-omni-light sesuai kebutuhan kualitas/latensi. Untuk awal, gunakan Flash.

Bisakah pakai OpenAI Python SDK dengan DashScope?

Ya. Set base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" dan gunakan kunci DashScope di api_key. Format request/response sama persis.

Bagaimana mengirim beberapa file (audio + gambar) dalam satu permintaan?

Masukkan ke array content sebagai objek bertipe berbeda bersama prompt teks. Semua modalitas bisa ada dalam satu pesan.

Ada batas ukuran file audio/video?

Ada. Untuk file besar, gunakan URL, bukan base64. Upload ke lokasi publik dan kirim URL pada field audio atau video_url.

Cara menonaktifkan output audio dan hanya dapat teks?

Set modalities=["text"] atau hilangkan parameter modalities. Respons hanya teks lebih cepat dan hemat biaya.

Apakah support function/tool calling?

Ya. Gunakan parameter tools dengan definisi fungsi, sama seperti model OpenAI-compatible lain. Model akan mengembalikan objek structured tool call.

Cara optimal menangani rekaman audio panjang?

Untuk <10 jam, kirim satu permintaan. >10 jam, bagi di jeda alami, proses per segmen, gabungkan hasil di aplikasi Anda.

Bagaimana menguji permintaan multimodal sebelum membangun aplikasi?

Gunakan Apidog untuk membuat dan menyimpan template permintaan tiap modalitas. Anda bisa ganti varian model, cek struktur respons, dan tulis assertion kualitas tanpa coding aplikasi.

Top comments (0)