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.
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.
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
- Masuk ke konsol DashScope
- Klik Manajemen Kunci API di sidebar kiri
- Klik Buat Kunci API
- Salin kunci (format:
sk-...)
Langkah 3: Instal SDK
pip install dashscope
Atau gunakan endpoint OpenAI-compatible langsung dengan SDK openai:
pip install openai
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)
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)
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")
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)
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?"
}
]
}
],
)
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)
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)
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))
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)
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?"}]))
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
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)
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.
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.contenttidak kosong untuk respons teks - Pastikan
choices[0].message.audio.dataada 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")
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)