Qwen-Omni-Realtime 是千问推出的实时音视频聊天模型。能同时理解流式的音频与图像输入(例如从视频流中实时抽取的连续图像帧),并实时输出高质量的文本与音频。
支持的地域:北京、新加坡,需使用各地域的 API Key。
在线体验:请参见如何在线体验 Qwen-Omni-Realtime 模型?
如何使用
1. 建立连接
Qwen-Omni-Realtime 模型通过 WebSocket 协议接入,可通过以下 Python 示例代码建立连接。也可通过DashScope SDK 建立连接。
WebSocket 原生连接
连接时需要以下配置项:
|
配置项 |
说明 |
|
调用地址 |
中国内地(北京):wss://dashscope.aliyuncs.com/api-ws/v1/realtime 国际(新加坡):wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime |
|
查询参数 |
查询参数为model,需指定为访问的模型名。示例: |
|
请求头 |
使用 Bearer Token 鉴权:Authorization: Bearer DASHSCOPE_API_KEY DASHSCOPE_API_KEY 是您在百炼上申请的API Key。 |
# pip install websocket-client
import json
import websocket
import os
API_KEY=os.getenv("DASHSCOPE_API_KEY")
API_URL = "wss://dashscope.aliyuncs.com/api-ws/v1/realtime?model=qwen3.5-omni-plus-realtime"
headers = [
"Authorization: Bearer " + API_KEY
]
def on_open(ws):
print(f"Connected to server: {API_URL}")
def on_message(ws, message):
data = json.loads(message)
print("Received event:", json.dumps(data, indent=2))
def on_error(ws, error):
print("Error:", error)
ws = websocket.WebSocketApp(
API_URL,
header=headers,
on_open=on_open,
on_message=on_message,
on_error=on_error
)
ws.run_forever()
DashScope SDK
# SDK 版本不低于1.23.9
import os
import json
from dashscope.audio.qwen_omni import OmniRealtimeConversation,OmniRealtimeCallback
import dashscope
# 若没有配置 API Key,请将下行改为 dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
class PrintCallback(OmniRealtimeCallback):
def on_open(self) -> None:
print("Connected Successfully")
def on_event(self, response: dict) -> None:
print("Received event:")
print(json.dumps(response, indent=2, ensure_ascii=False))
def on_close(self, close_status_code: int, close_msg: str) -> None:
print(f"Connection closed (code={close_status_code}, msg={close_msg}).")
callback = PrintCallback()
conversation = OmniRealtimeConversation(
model="qwen3.5-omni-plus-realtime",
callback=callback,
# 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime
url="wss://dashscope.aliyuncs.com/api-ws/v1/realtime"
)
try:
conversation.connect()
print("Conversation started. Press Ctrl+C to exit.")
conversation.thread.join()
except KeyboardInterrupt:
conversation.close()// SDK 版本不低于 2.20.9
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) throws InterruptedException, NoApiKeyException {
CountDownLatch latch = new CountDownLatch(1);
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen3.5-omni-plus-realtime")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
// 以下为北京地域url,若使用新加坡地域的模型,需将url替换为:wss://dashscope-intl.aliyuncs.com/api-ws/v1/realtime
.url("wss://dashscope.aliyuncs.com/api-ws/v1/realtime")
.build();
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
@Override
public void onOpen() {
System.out.println("Connected Successfully");
}
@Override
public void onEvent(JsonObject message) {
System.out.println(message);
}
@Override
public void onClose(int code, String reason) {
System.out.println("connection closed code: " + code + ", reason: " + reason);
latch.countDown();
}
});
conversation.connect();
latch.await();
conversation.close(1000, "bye");
System.exit(0);
}
}2. 配置会话
发送客户端事件session.update:
{
// 该事件的id,由客户端生成
"event_id": "event_ToPZqeobitzUJnt3QqtWg",
// 事件类型,固定为session.update
"type": "session.update",
// 会话配置
"session": {
// 输出模态,支持设置为["text"](仅输出文本)或["text","audio"](输出文本与音频)。
"modalities": [
"text",
"audio"
],
// 输出音频的音色
"voice": "Ethan",
// 输入音频格式,当前仅支持设置为pcm。
"input_audio_format": "pcm",
// 输出音频格式,当前仅支持设置为pcm。
"output_audio_format": "pcm",
// 系统消息,用于设定模型的目标或角色。
"instructions": "你是某五星级酒店的AI客服专员,请准确且友好地解答客户关于房型、设施、价格、预订政策的咨询。请始终以专业和乐于助人的态度回应,杜绝提供未经证实或超出酒店服务范围的信息。",
// 是否开启语音活动检测。若需启用,需传入一个配置对象,服务端将据此自动检测语音起止。
// 设置为null表示由客户端决定何时发起模型响应。
"turn_detection": {
// VAD类型,取值为server_vad或semantic_vad。使用qwen3.5-omni-realtime模型时推荐设为semantic_vad。
"type": "semantic_vad",
// VAD检测阈值。建议在嘈杂的环境中增加,在安静的环境中降低。
"threshold": 0.5,
// 检测语音停止的静音持续时间,超过此值后会触发模型响应
"silence_duration_ms": 800
}
}
}
3. 输入音频与图片
客户端通过input_audio_buffer.append和 input_image_buffer.append 事件发送 Base64 编码的音频和图片数据到服务端缓冲区。音频输入是必需的;图片输入是可选的。
图片可以来自本地文件,或从视频流中实时采集。
启用服务端VAD时,服务端会在检测到语音结束时自动提交数据并触发响应。禁用VAD时(手动模式),客户端必须在发送完数据后,主动调用input_audio_buffer.commit事件来提交。
4. 接收模型响应
模型的响应格式取决于配置的输出模态。
-
仅输出文本
通过response.text.delta事件接收流式文本,response.text.done事件获取完整文本。
-
输出文本+音频
-
文本:通过response.audio_transcript.delta事件接收流式文本,response.audio_transcript.done事件获取完整文本。
-
音频:通过response.audio.delta事件获取 Base64 编码的流式输出音频数据。response.audio.done事件标志音频数据生成完成。
-
模型选型
Qwen3.5-Omni-Realtime 是千问最新推出的实时多模态模型,相比于上一代的 Qwen3-Omni-Flash-Realtime:
-
智能水平
模型智力大幅提升,与 Qwen3.5-Plus 智能水平相当。
-
联网搜索
原生支持联网搜索(WebSearch),模型可自主判断是否需要搜索来回应即时问题。详见联网搜索。
-
工具调用
支持 Function Calling,模型可自主判断是否需要调用外部工具,实现与外部系统的交互。详见Qwen-Omni-Realtime 系列。
-
语义打断
自动识别对话意图,避免附和声和无意义背景音触发打断。
-
语音控制
通过语音指令控制声音大小、语速和情绪,如“语速快一些”、“声音大一些”、“用开心的语气”等。
-
支持的语言
支持 113 种语种和方言的语音识别,以及 36 种语种和方言的语音生成。
-
支持的音色
支持 55 种音色(47 种多语言 + 8 种方言),具体可查看音色列表。
-
声音复刻
qwen3.5-omni-plus-realtime 和 qwen3.5-omni-flash-realtime 支持声音复刻功能,可使用自定义音色进行实时对话。详见声音复刻。
模型的名称、上下文、价格、快照版本等信息请参见百炼控制台;并发限流条件请参考限流。
使用限制
-
联网搜索和工具调用不兼容,不可同时开启。
-
单次 WebSocket 会话最长可持续 120 分钟,达到此上限后服务将主动关闭连接。
-
模型会维护对话历史上下文,当对话轮次或累计时长超过以下限制时,将自动丢弃更早的历史信息。最大时长指模型上下文中能保留的音频或视频(图像帧)累计时长上限。
由于视频以抽帧方式输入(建议 1 帧/秒),视频最大时长即模型能保留的图像帧累计时长。例如 240 秒表示模型最多保留最近 240 秒内收到的帧,超过后更早的帧将被丢弃。
qwen3-omni-flash-realtime 最大轮次为 8 轮,一般会先触及轮次限制,时长限制为模型的上下文长度限制,不再单独列出。
模型
音频最大轮次
视频最大轮次
音频最大时长
视频最大时长
qwen3.5-omni-plus-realtime
100轮
50轮
600秒
240秒
qwen3.5-omni-flash-realtime
80轮
50轮
480秒
120秒
qwen3-omni-flash-realtime
8轮
8轮
—
—
快速开始
请选择您熟悉的编程语言,通过以下步骤快速体验与 Realtime 模型实时对话的功能。
DashScope Python SDK
-
准备运行环境
您的 Python 版本需要不低于 3.10。
首先根据您的操作系统安装 pyaudio。
macOS
brew install portaudio && pip install pyaudio
Debian/Ubuntu
-
若未使用虚拟环境,可直接通过系统包管理器安装:
sudo apt-get install python3-pyaudio -
若使用虚拟环境,需先安装编译依赖:
sudo apt update sudo apt install -y python3-dev portaudio19-dev然后在已激活的虚拟环境中使用 pip 安装:
pip install pyaudio
CentOS
sudo yum install -y portaudio portaudio-devel && pip install pyaudio
Windows
pip install pyaudio
安装完成后,通过 pip 安装依赖:
pip install websocket-client dashscope
-
选择交互模式
-
VAD 模式(Voice Activity Detection,自动检测语音起止)
服务端自动判断用户何时开始与停止说话并作出回应。
-
Manual 模式(按下即说,松开即发送)
客户端控制语音起止。用户说话结束后,客户端需主动发送消息至服务端。
VAD 模式
新建一个 python 文件,命名为vad_dash.py,并将以下代码复制到文件中:
运行
vad_dash.py,通过麦克风即可与 Qwen-Omni-Realtime 模型实时对话,系统会检测您的音频起始位置并自动发送到服务器,无需您手动发送。Manual 模式
新建一个 python 文件,命名为
manual_dash.py,并将以下代码复制进文件中:运行
manual_dash.py,按 Enter 键开始说话,再按一次获取模型响应的音频。 -
DashScope Java SDK
选择交互模式
-
VAD 模式(Voice Activity Detection,自动检测语音起止)
Realtime API 自动判断用户何时开始与停止说话并作出回应。
-
Manual 模式(按下即说,松开即发送)
客户端控制语音起止。用户说话结束后,客户端需主动发送消息至服务端。
VAD 模式
运行OmniServerVad.main()方法,通过麦克风即可与 Realtime 模型实时对话,系统会检测您的音频起始位置并自动发送到服务器,无需您手动发送。
Manual 模式
运行OmniWithoutServerVad.main()方法,按 Enter 键开始录音,录音过程中再次按 Enter 键停止录音并发送,随后将接收并播放模型响应。
WebSocket(Python)
-
准备运行环境
您的 Python 版本需要不低于 3.10。
首先根据您的操作系统来安装 pyaudio。
macOS
brew install portaudio && pip install pyaudioDebian/Ubuntu
sudo apt-get install python3-pyaudio 或者 pip install pyaudio推荐使用
pip install pyaudio。如果安装失败,请先根据您的操作系统安装portaudio依赖。CentOS
sudo yum install -y portaudio portaudio-devel && pip install pyaudioWindows
pip install pyaudio安装完成后,通过 pip 安装 websocket 相关的依赖:
pip install websockets==15.0.1 -
创建客户端
在本地新建一个 python 文件,命名为
omni_realtime_client.py,并将以下代码复制进文件中: -
选择交互模式
-
VAD 模式(Voice Activity Detection,自动检测语音起止)
Realtime API 自动判断用户何时开始与停止说话并作出回应。
-
Manual 模式(按下即说,松开即发送)
客户端控制语音起止。用户说话结束后,客户端需主动发送消息至服务端。
VAD 模式
在
omni_realtime_client.py的同级目录下新建另一个 python 文件,命名为vad_mode.py,并将以下代码复制进文件中:运行
vad_mode.py,通过麦克风即可与 Realtime 模型实时对话,系统会检测您的音频起始位置并自动发送到服务器,无需您手动发送。Manual 模式
在
omni_realtime_client.py的同级目录下新建另一个 python 文件,命名为manual_mode.py,并将以下代码复制进文件中:运行
manual_mode.py,按 Enter 键开始说话,再按一次获取模型响应的音频。 -
交互流程
VAD 模式
将session.update事件的session.turn_detection.type 设为"server_vad"或"semantic_vad"以启用 VAD 模式。适用于语音通话场景。
交互流程如下:
-
服务端检测到语音开始,发送input_audio_buffer.speech_started 事件。
-
客户端随时发送 input_audio_buffer.append与input_image_buffer.append 事件追加音频与图片至缓冲区。
发送 input_image_buffer.append 事件前,至少发送过一次 input_audio_buffer.append 事件。
-
服务端检测到语音结束,发送input_audio_buffer.speech_stopped 事件。
-
服务端发送input_audio_buffer.committed 事件提交音频缓冲区。
-
服务端发送 conversation.item.created 事件,包含从缓冲区创建的用户消息项。
|
生命周期 |
客户端事件 |
服务端事件 |
|
会话初始化 |
会话配置 |
会话已创建 会话配置已更新 |
|
用户音频输入 |
添加音频到缓冲区 添加图片到缓冲区 |
input_audio_buffer.speech_started 检测到语音开始 input_audio_buffer.speech_stopped 检测到语音结束 服务器收到提交的音频 |
|
服务器音频输出 |
无 |
服务端开始生成响应 响应时有新的输出内容 对话项被创建 新的输出内容添加到assistant message response.audio_transcript.delta 增量生成的转录文字 模型增量生成的音频 response.audio_transcript.done 文本转录完成 音频生成完成 Assistant message 的文本或音频内容流式输出完成 Assistant message 的整个输出项流式传输完成 响应完成 |
Manual 模式
将session.update事件的session.turn_detection 设为 null 以启用 Manual 模式。此模式下,客户端通过显式发送input_audio_buffer.commit 和response.create事件请求服务器响应。适用于按下即说场景,如聊天软件中的发送语音。
交互流程如下:
-
客户端随时发送 input_audio_buffer.append与input_image_buffer.append事件追加音频与图片至缓冲区。
发送 input_image_buffer.append 事件前,至少发送过一次 input_audio_buffer.append 事件。
-
客户端发送input_audio_buffer.commit事件提交音频缓冲区与图像缓冲区,告知服务端本轮的用户输入(音频及图片)已全部发送完毕。
-
服务端响应 input_audio_buffer.committed事件。
-
客户端发送response.create事件,等待服务端返回模型的输出。
-
服务端响应conversation.item.created事件。
|
生命周期 |
客户端事件 |
服务端事件 |
|
会话初始化 |
会话配置 |
会话已创建 会话配置已更新 |
|
用户音频输入 |
添加音频到缓冲区 添加图片到缓冲区 提交音频与图片到服务器 创建模型响应 |
服务器收到提交的音频 |
|
服务器音频输出 |
清除缓冲区的音频 |
服务端开始生成响应 响应时有新的输出内容 对话项被创建 新的输出内容添加到assistant message 项 response.audio_transcript.delta 增量生成的转录文字 模型增量生成的音频 response.audio_transcript.done 完成文本转录 完成音频生成 Assistant message 的文本或音频内容流式输出完成 Assistant message 的整个输出项流式传输完成 响应完成 |
联网搜索
联网搜索功能使模型能够基于实时检索数据进行回复,适用于股票价格、天气预报等需要即时信息的场景。模型可自主判断是否需要搜索来回应用户的即时问题。
联网搜索仅Qwen3.5-Omni-Realtime模型支持,且默认关闭,需通过session.update事件启用。
计费请参考计费说明中的agent策略。
启用方式
在 session.update 事件中添加以下参数:
-
enable_search:设置为true启用联网搜索功能。 -
search_options.enable_source:设置为true返回搜索结果来源列表。
参数详情请参见session.update。
响应格式
启用联网搜索后,response.done 事件中的 usage 会新增 plugins 字段,用于记录搜索计量信息:
{
"usage": {
"total_tokens": 2937,
"input_tokens": 2554,
"output_tokens": 383,
"input_tokens_details": {
"text_tokens": 2512,
"audio_tokens": 42
},
"output_tokens_details": {
"text_tokens": 90,
"audio_tokens": 293
},
"plugins": {
"search": {
"count": 1,
"strategy": "agent"
}
}
}
}
代码示例
以下示例展示如何在实时对话中启用联网搜索功能。
DashScope Python SDK
在 update_session 调用中传入 enable_search 和 search_options 参数:
import os
import base64
import time
import json
import pyaudio
from dashscope.audio.qwen_omni import MultiModality, AudioFormat, OmniRealtimeCallback, OmniRealtimeConversation
import dashscope
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY')
url = 'wss://dashscope.aliyuncs.com/api-ws/v1/realtime'
model = 'qwen3.5-omni-plus-realtime'
voice = 'Tina'
class SearchCallback(OmniRealtimeCallback):
def __init__(self, pya):
self.pya = pya
self.out = None
def on_open(self):
self.out = self.pya.open(format=pyaudio.paInt16, channels=1, rate=24000, output=True)
def on_event(self, response):
if response['type'] == 'response.audio.delta':
self.out.write(base64.b64decode(response['delta']))
elif response['type'] == 'conversation.item.input_audio_transcription.completed':
print(f"[User] {response['transcript']}")
elif response['type'] == 'response.audio_transcript.done':
print(f"[LLM] {response['transcript']}")
elif response['type'] == 'response.done':
usage = response.get('response', {}).get('usage', {})
plugins = usage.get('plugins', {})
if plugins.get('search'):
print(f"[Search] count={plugins['search']['count']}, strategy={plugins['search']['strategy']}")
pya = pyaudio.PyAudio()
callback = SearchCallback(pya)
conv = OmniRealtimeConversation(model=model, callback=callback, url=url)
conv.connect()
conv.update_session(
output_modalities=[MultiModality.AUDIO, MultiModality.TEXT],
voice=voice,
instructions="你是个人助理小云",
enable_search=True,
search_options={'enable_source': True}
)
mic = pya.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)
print("联网搜索已启用,对着麦克风说话 (Ctrl+C 退出)...")
try:
while True:
audio_data = mic.read(3200, exception_on_overflow=False)
conv.append_audio(base64.b64encode(audio_data).decode())
time.sleep(0.01)
except KeyboardInterrupt:
conv.close()
mic.close()
callback.out.close()
pya.terminate()
print("\n对话结束")
DashScope Java SDK
在 updateSession 中通过 parameters 传入联网搜索配置:
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import javax.sound.sampled.*;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
public class OmniSearch {
static class SequentialAudioPlayer {
private final SourceDataLine line;
private final Queue<byte[]> audioQueue = new ConcurrentLinkedQueue<>();
private final Thread playerThread;
private final AtomicBoolean shouldStop = new AtomicBoolean(false);
public SequentialAudioPlayer() throws LineUnavailableException {
AudioFormat format = new AudioFormat(24000, 16, 1, true, false);
line = AudioSystem.getSourceDataLine(format);
line.open(format);
line.start();
playerThread = new Thread(() -> {
while (!shouldStop.get()) {
byte[] audio = audioQueue.poll();
if (audio != null) {
line.write(audio, 0, audio.length);
} else {
try { Thread.sleep(10); } catch (InterruptedException ignored) {}
}
}
}, "AudioPlayer");
playerThread.start();
}
public void play(String base64Audio) {
audioQueue.add(Base64.getDecoder().decode(base64Audio));
}
public void close() {
shouldStop.set(true);
try { playerThread.join(1000); } catch (InterruptedException ignored) {}
line.drain();
line.close();
}
}
public static void main(String[] args) {
try {
SequentialAudioPlayer player = new SequentialAudioPlayer();
AtomicBoolean shouldStop = new AtomicBoolean(false);
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen3.5-omni-plus-realtime")
.apikey(System.getenv("DASHSCOPE_API_KEY"))
.url("wss://dashscope.aliyuncs.com/api-ws/v1/realtime")
.build();
OmniRealtimeConversation conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
@Override public void onOpen() {
System.out.println("连接已建立");
}
@Override public void onClose(int code, String reason) {
System.out.println("连接已关闭");
shouldStop.set(true);
}
@Override public void onEvent(JsonObject event) {
String type = event.get("type").getAsString();
if ("response.audio.delta".equals(type)) {
player.play(event.get("delta").getAsString());
} else if ("response.audio_transcript.done".equals(type)) {
System.out.println("[LLM] " + event.get("transcript").getAsString());
} else if ("response.done".equals(type)) {
JsonObject response = event.getAsJsonObject("response");
if (response != null && response.has("usage")) {
JsonObject usage = response.getAsJsonObject("usage");
if (usage.has("plugins")) {
JsonObject plugins = usage.getAsJsonObject("plugins");
if (plugins.has("search")) {
JsonObject search = plugins.getAsJsonObject("search");
System.out.println("[Search] count=" + search.get("count").getAsInt()
+ ", strategy=" + search.get("strategy").getAsString());
}
}
}
}
}
});
conversation.connect();
conversation.updateSession(OmniRealtimeConfig.builder()
.modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
.voice("Tina")
.enableTurnDetection(true)
.enableInputAudioTranscription(true)
.parameters(Map.of(
"instructions", "你是个人助理小云",
"enable_search", true,
"search_options", Map.of("enable_source", true)
))
.build()
);
System.out.println("联网搜索已启用,请开始说话(按Ctrl+C退出)...");
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
TargetDataLine mic = AudioSystem.getTargetDataLine(format);
mic.open(format);
mic.start();
ByteBuffer buffer = ByteBuffer.allocate(3200);
while (!shouldStop.get()) {
int bytesRead = mic.read(buffer.array(), 0, buffer.capacity());
if (bytesRead > 0) {
conversation.appendAudio(Base64.getEncoder().encodeToString(buffer.array()));
}
Thread.sleep(20);
}
conversation.close(1000, "正常结束");
player.close();
mic.close();
} catch (NoApiKeyException e) {
System.err.println("未找到API KEY: 请设置环境变量 DASHSCOPE_API_KEY");
} catch (Exception e) {
e.printStackTrace();
}
}
}
WebSocket(Python)
在 session.update 的 JSON 中添加 enable_search 和 search_options 字段:
import json
import os
import websocket
import base64
import pyaudio
import threading
API_KEY = os.getenv("DASHSCOPE_API_KEY")
API_URL = "wss://dashscope.aliyuncs.com/api-ws/v1/realtime?model=qwen3.5-omni-plus-realtime"
pya = pyaudio.PyAudio()
out_stream = pya.open(format=pyaudio.paInt16, channels=1, rate=24000, output=True)
def on_open(ws):
ws.send(json.dumps({
"type": "session.update",
"session": {
"modalities": ["text", "audio"],
"voice": "Tina",
"instructions": "你是个人助理小云",
"input_audio_format": "pcm",
"output_audio_format": "pcm",
"enable_search": True,
"search_options": {
"enable_source": True
}
}
}))
print("联网搜索已启用,对着麦克风说话...")
def send_audio():
mic = pya.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)
try:
while True:
audio = mic.read(3200, exception_on_overflow=False)
ws.send(json.dumps({
"type": "input_audio_buffer.append",
"audio": base64.b64encode(audio).decode()
}))
except Exception:
mic.close()
threading.Thread(target=send_audio, daemon=True).start()
def on_message(ws, message):
event = json.loads(message)
if event["type"] == "response.audio.delta":
out_stream.write(base64.b64decode(event["delta"]))
elif event["type"] == "response.audio_transcript.done":
print(f"[LLM] {event['transcript']}")
elif event["type"] == "response.done":
usage = event.get("response", {}).get("usage", {})
plugins = usage.get("plugins", {})
if plugins.get("search"):
print(f"[Search] count={plugins['search']['count']}, strategy={plugins['search']['strategy']}")
def on_error(ws, error):
print(f"Error: {error}")
headers = ["Authorization: Bearer " + API_KEY]
ws = websocket.WebSocketApp(API_URL, header=headers, on_open=on_open, on_message=on_message, on_error=on_error)
ws.run_forever()
API 参考
计费与限流
计费规则
Qwen-Omni-Realtime 模型根据不同模态(音频、图像)对应的Token数计费。计费详情请参见百炼控制台。
限流
模型限流规则请参见限流。
常见问题
如何在线体验 Qwen-Omni-Realtime 模型?
A:您可以通过以下方式一键部署:
-
访问函数计算模板,部署类型选择直接部署,百炼 API-KEY 填入您的 API Key;单击创建并部署默认环境。
-
等待约一分钟,在环境详情的环境信息中获取访问域名,将访问域名的
http改成https(示例:https://omni-realtime.fcv3.xxxx.cn-hangzhou.fc.devsapp.net),修改后的 HTTPS 链接指向一个可在线体验的 Web 应用,可通过它与模型进行实时视频或语音通话。
此链接使用自签名证书,仅用于临时测试。首次访问时,浏览器会显示安全警告,这是预期行为,请勿在生产环境使用。如需继续,请按浏览器提示操作(如点击“高级” → “继续前往(不安全)”)。
通过资源信息-函数资源查看项目源代码。
函数计算与阿里云百炼均为新用户提供免费额度,可以覆盖简单调试所需成本,额度耗尽后按量计费。只有在访问的情况下会产生费用。
怎么向模型输入图片?
A:通过客户端发送input_image_buffer.append事件。
-
VAD 模式
该模式会根据语音检测情况自动提交音频与图片,请在服务端响应input_audio_buffer.speech_stopped前发送input_image_buffer.append事件。
-
Manual 模式
参见Manual 模式代码,将图片输入与提交的两部分代码取消注释,即可传入本地图片。
若用于视频通话场景,可以对视频抽帧,建议以 1张/秒 的频率向服务端发送图像。input_image_buffer.append 事件。 DashScope SDK 代码请参见Omni-Realtime 示例代码。
错误码
如果模型调用失败并返回报错信息,请参见错误信息进行解决。
音色列表
Qwen-Omni-Realtime模型的音色列表可参见音色列表。