跳转到主要内容
全模态

实时音视频理解

通过 WebSocket 或 WebRTC 接入 Qwen-Omni 系列模型,实现音频和视频的低延迟实时对话。

使用方法

1. 建立连接

通用 WebSocket 和 WebRTC 建连示例使用 qwen3.8-omni-flash-realtime;型号专属配置示例使用各自标注的模型。 Qwen-Omni-Realtime 支持 WebSocket 和 WebRTC 两种协议接入。WebSocket 适合服务端集成和快速接入;WebRTC 适合浏览器端、低延迟语音场景,音频通过 UDP 直接传输,内置回声消除和降噪。该模型除以上两种协议外,还支持通过 AOQ 协议接入;如果是客户端对接,且更看重稳定的延迟、弱网下的交互能力、实时双工的降噪与回声消除,可优先考虑 AOQ,协议对比与选型请参见 Realtime API 概述。 连接相关的限制(会话时长、关闭连接耗时等)参见使用限制。
  • WebSocket
  • WebRTC
  • AOQ
  • 原生 WebSocket 连接
  • DashScope SDK
所需配置项如下:
配置项说明
接入地址wss://maas.qianwenaiapi.com/api-ws/v1/realtime
查询参数查询参数为 model,设置为要访问的模型名称。参见模型选择。示例:?model=qwen3.8-omni-flash-realtime
请求头使用 Bearer Token 认证:Authorization: Bearer $DASHSCOPE_API_KEY。DASHSCOPE_API_KEY 是你在千问AI平台上申请的 API Key。
# pip install websocket-client
import json
import websocket
import os

API_KEY=os.getenv("DASHSCOPE_API_KEY")
API_URL = "wss://maas.qianwenaiapi.com/api-ws/v1/realtime?model=qwen3.8-omni-flash-realtime"

headers = [
  "Authorization: Bearer " + API_KEY
]

def on_open(ws):
  print(f"已连接到服务器: {API_URL}")
def on_message(ws, message):
  data = json.loads(message)
  print("收到事件:", json.dumps(data, indent=2))
def on_error(ws, error):
  print("错误:", error)

ws = websocket.WebSocketApp(
  API_URL,
  header=headers,
  on_open=on_open,
  on_message=on_message,
  on_error=on_error
)

ws.run_forever()

2. 配置会话

发送 session.update 客户端事件: 通过 session.update 配置输出模态、音色、音频格式和 VAD。下面是 Qwen3.8-Omni-Flash-Realtime 的 WebSocket Manual 模式配置,与最小音频问答示例一致:
{
  "type": "session.update",
  "session": {
    "modalities": [
      "text",
      "audio"
    ],
    "turn_detection": null,
    "audio": {
      "input": {
        "format": {
          "type": "pcm",
          "sample_rate": 16000,
          "sample_format": "s16le",
          "channels": 1,
          "packing": "interleaved",
          "channel_layout": "mono"
        }
      },
      "output": {
        "voice": "longanlingxin",
        "format": {
          "type": "pcm",
          "sample_rate": 24000
        }
      }
    }
  }
}
以下示例使用 Qwen3.5-Omni-Realtime 的 Ethan 音色和 semantic_vad 配置。
{
  // 事件 ID,由客户端生成
  "event_id": "event_ToPZqeobitzUJnt3QqtWg",
  // 事件类型,固定为 session.update
  "type": "session.update",
  // 会话配置
  "session": {
    // 输出模态。支持 ["text"](仅文本)或 ["text", "audio"](文本和音频)
    "modalities": [
      "text",
      "audio"
    ],
    // 输出音色
    "voice": "Ethan",
    // 推荐写法:同时配置音频格式和采样率(仅 qwen3.5-omni-plus-realtime / qwen3.5-omni-flash-realtime 支持)
    // 输入格式:pcm / wav,默认 pcm;采样率:8000/16000/24000/48000,默认 16000
    // 输出格式:pcm / wav,默认 pcm;采样率:8000/16000/24000/48000,默认 24000
    "audio": {
      "input": {
        "format": {
          "type": "pcm",
          "sample_rate": 16000
        }
      },
      "output": {
        "format": {
          "type": "pcm",
          "sample_rate": 24000
        }
      }
    },
    // 系统消息,用于设置模型的目标或角色
    "instructions": "你是某五星级酒店的AI客服专员,请准确且友好地解答客户关于房型、设施、价格、预订政策的咨询。请始终以专业和乐于助人的态度回应,杜绝提供未经证实或超出酒店服务范围的信息。",
    // 是否启用语音活动检测。启用时传入配置对象,服务端会自动检测说话的开始和结束。
    // 设为 null 则由客户端决定何时触发模型响应
    "turn_detection": {
      // VAD 类型
      "type": "semantic_vad",
      // VAD 检测阈值。嘈杂环境调高,安静环境调低
      "threshold": 0.5,
      // 检测语音停止的静音持续时间,超过此值后会触发模型响应。取值范围 200-6000,默认 800。金融核实等短回答场景建议 500-600。
      "silence_duration_ms": 800
    }
  }
}
音频格式与采样率可配置能力仅适用于 qwen3.5-omni-plus-realtime 和 qwen3.5-omni-flash-realtime 模型,历史兼容字段 input_audio_format / output_audio_format 仍有效,建议采用 audio.input.format / audio.output.format 字段。
每通会话结束后,发送 session.finish 事件关闭会话,或直接断开 WebSocket 连接。同一会话不关闭会导致上下文持续累积。 多通道音频、视频聚合和 MCP 的配置及 SDK 示例见扩展会话配置。

3. 输入音频和图像

  • WebSocket
  • WebRTC
音频输入是推荐的主要输入方式;图片输入可选。模型也支持纯文本输入:通过 conversation.item.create 发送 input_text 类型内容,无需音频,适用于非实时对话场景。模型目录标注的"支持文本输入"包括用户纯文本对话、system instructions 和 function_call_output。输入方式取决于接入协议。
启用服务端语音活动检测(VAD)时,服务端会自动提交数据并在检测到说话结束时触发响应。未启用 VAD(手动模式)时,客户端必须调用 input_audio_buffer.commit 事件来提交数据。

4. 接收模型响应

模型响应的格式取决于配置的输出模态。
  • WebSocket
  • WebRTC

模型选型

实时音视频对话优先使用 Qwen3.8-Omni-Flash-Realtime,接收流式音视频输入,返回文本与音频,支持自定义 Function Calling、MCP、多通道音频和声音复刻。接入方式见建立连接。 支持 113 种语种和方言的语音识别,以及 36 种语种和方言的语音生成;音色及试听见音色列表。
Qwen3.5-Omni-Realtime 系列模型是千问的实时多模态模型,相比于上一代的 Qwen3-Omni-Flash-Realtime:
  • 智能水平 在文本生成、音频理解、图像理解能力上均有显著提升,更适合复杂任务和多轮对话场景。
  • 语义打断 自动识别对话意图,避免附和声和无意义背景音触发打断。
  • 响应速度 Qwen3.5-Omni-Flash-Realtime 总响应约 5.1 秒,Qwen3.5-Omni-Plus-Realtime 约 5.8 秒,flash 比 plus 快约 0.7 秒。对响应时效性敏感的场景建议优先选用 flash 版本。

使用限制

qwen3.8-omni-flash-realtime 的全部输入 Token 总数上限为 196608,输入长度计算规则与 Qwen3.5-Omni-Realtime 一致。
  • 功能互斥:联网搜索和工具调用不兼容,不可同时开启。
  • 会话时长:单个 WebSocket 会话最长可持续 120 分钟,达到此上限后服务将主动关闭连接。
  • 关闭连接耗时:调用 close() 关闭 WebSocket 连接时,若连接刚建立即关闭(无会话交互),关闭耗时约 5-10 秒,此为正常现象。服务端需完成音频流处理、上下文缓存及推理资源初始化后才能响应关闭请求。建议异步执行 close() 操作,避免阻塞主流程。

对话历史上下文限制

模型会维护对话历史上下文,当对话轮次或累计时长超过以下限制时,将自动丢弃更早的历史信息。最大时长指模型上下文中能保留的音频或视频(图像帧)累计时长上限。该时长不是整个会话的持续时间。
模型音频最大轮次视频最大轮次音频最大时长视频最大时长
qwen3.8-omni-flash-realtime100 轮50 轮600 秒240 秒
qwen3.5-omni-plus-realtime100 轮50 轮600 秒240 秒
qwen3.5-omni-flash-realtime80 轮50 轮480 秒120 秒
qwen3-omni-flash-realtime8 轮8 轮——
  • 由于视频以抽帧方式输入(建议 1 帧/秒),视频最大时长即模型能保留的图像帧累计时长。例如 240 秒表示模型最多保留最近 240 秒内收到的帧,超过后更早的帧将被丢弃。
  • qwen3-omni-flash-realtime 最大轮次为 8 轮,一般会先触及轮次限制,其时长限制即模型的上下文长度限制,不再单独列出。

快速开始

获取 API Key并设置为环境变量。

最小音频问答

先配置 API Key,安装 websocket-client。将 REALTIME_WS_URL 设为建立连接中的完整 WebSocket 地址。将 PCM_FILE 设为一段短的 16 kHz、16-bit little-endian、单声道、无文件头 PCM 语音文件路径。 示例使用 Manual 模式:等待会话配置生效后发送音频、提交缓冲区,再请求回复。文本打印到终端,音频写入 reply.pcm(24 kHz PCM,非 WAV 文件)。 在 macOS 或 Linux 终端中执行以下命令:
python3 -m pip install websocket-client
export REALTIME_WS_URL="wss://maas.qianwenaiapi.com/api-ws/v1/realtime"
export PCM_FILE="./input.pcm"
如果已有单声道、16 kHz、16-bit PCM 编码的 input.wav,可用 Python 提取 PCM 音频。此步骤检查格式,不进行重采样。
import wave
from pathlib import Path

with wave.open("input.wav", "rb") as source:
    if (source.getnchannels(), source.getframerate(), source.getsampwidth(),
            source.getcomptype()) != (1, 16000, 2, "NONE"):
        raise ValueError("Expected mono 16 kHz, 16-bit PCM WAV audio.")
    Path("input.pcm").write_bytes(source.readframes(source.getnframes()))
准备好输入后,运行以下客户端:
import base64
import json
import os
from pathlib import Path
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
import websocket

parts = urlsplit(os.environ["REALTIME_WS_URL"])
query = dict(parse_qsl(parts.query))
query["model"] = "qwen3.8-omni-flash-realtime"
url = urlunsplit((parts.scheme, parts.netloc, parts.path, urlencode(query), ""))
audio = Path(os.environ["PCM_FILE"]).read_bytes()
if not audio or len(audio) % 2:
    raise ValueError("Provide non-empty 16-bit mono PCM audio.")

ws = websocket.create_connection(
    url,
    header=["Authorization: Bearer " + os.environ["DASHSCOPE_API_KEY"]],
    timeout=30,
)

def receive():
    event = json.loads(ws.recv())
    if event["type"] == "error":
        raise RuntimeError(event.get("error"))
    return event

try:
    while receive()["type"] != "session.created":
        pass
    ws.send(json.dumps({
        "type": "session.update",
        "session": {
            "modalities": ["text", "audio"],
            "turn_detection": None,
            "audio": {
                "input": {"format": {
                    "type": "pcm", "sample_rate": 16000,
                    "sample_format": "s16le", "channels": 1,
                    "packing": "interleaved", "channel_layout": "mono",
                }},
                "output": {
                    "voice": "longanlingxin",
                    "format": {"type": "pcm", "sample_rate": 24000},
                },
            },
        },
    }))
    while receive()["type"] != "session.updated":
        pass
    for offset in range(0, len(audio), 3200):
        ws.send(json.dumps({
            "type": "input_audio_buffer.append",
            "audio": base64.b64encode(audio[offset:offset + 3200]).decode("ascii"),
        }))
    ws.send(json.dumps({"type": "input_audio_buffer.commit"}))
    while receive()["type"] != "input_audio_buffer.committed":
        pass
    ws.send(json.dumps({"type": "response.create"}))
    with open("reply.pcm", "wb") as output:
        while True:
            event = receive()
            if event["type"] == "response.audio.delta":
                output.write(base64.b64decode(event["delta"]))
            elif event["type"] in ("response.audio_transcript.delta", "response.text.delta"):
                print(event["delta"], end="", flush=True)
            elif event["type"] == "response.done":
                print("\nResponse status:", event["response"]["status"])
                break
finally:
    ws.close()
成功收到回复后,将 reply.pcm 包装为 WAV 文件,再使用音频播放器播放:
import wave
from pathlib import Path

with wave.open("reply.wav", "wb") as target:
    target.setnchannels(1)
    target.setsampwidth(2)
    target.setframerate(24000)
    target.writeframes(Path("reply.pcm").read_bytes())

SDK 实时录音示例

  • DashScope Python SDK
  • DashScope Java SDK
  • WebSocket(Python)
  • WebRTC
准备运行环境Python 版本需为 3.10 或以上。首先根据操作系统安装 PyAudio。
  • macOS
  • Debian/Ubuntu
  • CentOS
  • Windows
brew install portaudio && pip install pyaudio
安装完成后,使用 pip 安装剩余依赖:
pip install websocket-client dashscope
选择交互模式
  • VAD 模式(自动检测说话的开始和结束) 服务端自动判断用户何时开始和停止说话并作出响应。
  • 手动模式(按住说话,松开发送) 由客户端控制说话的开始和结束。用户说完后,客户端需主动向服务端发送消息。
  • VAD 模式
  • 手动模式
新建 Python 文件 vad_dash.py,将以下代码复制到文件中:
# 依赖: dashscope >= 1.23.9, pyaudio
import os
import base64
import time
import pyaudio
from dashscope.audio.qwen_omni import MultiModality, AudioFormat,OmniRealtimeCallback,OmniRealtimeConversation
import dashscope

# 配置参数: 接入地址, API Key, 音色, 模型, 模型角色
url = 'wss://maas.qianwenaiapi.com/api-ws/v1/realtime'
# 配置 API Key。如果未设置环境变量,请将下一行替换为 dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY')
# 指定音色
voice = 'Tina'
# 指定模型
model = 'qwen3.8-omni-flash-realtime'
# 指定模型角色
instructions = "你是小云,一个私人助手。请用幽默风趣的方式回答用户的问题。"
class SimpleCallback(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.delta':
      # 流式预览:text为已确认前缀,stash为待确认后缀
      preview = response.get('text', '') + response.get('stash', '')
      print(f"\r[用户] {preview}", end='', flush=True)
    elif response['type'] == 'conversation.item.input_audio_transcription.completed':
      # 转录完成,打印最终文本并换行
      print(f"\r[用户] {response['transcript']}")
    elif response['type'] == 'response.audio_transcript.done':
      # 打印模型回复的文本
      print(f"[模型] {response['transcript']}")

# 1. 初始化音频设备
pya = pyaudio.PyAudio()
# 2. 创建回调函数和会话
callback = SimpleCallback(pya)
conv = OmniRealtimeConversation(model=model, callback=callback, url=url)
# 3. 建立连接并配置会话
conv.connect()
conv.update_session(output_modalities=[MultiModality.AUDIO, MultiModality.TEXT], voice=voice, instructions=instructions)
# 4. 初始化音频输入
mic = pya.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)
# 5. 主循环处理音频输入
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会话已结束")
运行 vad_dash.py,即可通过麦克风与 Qwen-Omni-Realtime 进行实时对话。系统会自动检测说话的开始和结束并发送到服务端,无需手动操作。
GitHub 示例代码从 GitHub 下载完整示例代码,包括:
  1. 音频对话:通过麦克风捕获实时音频,VAD 模式(enable_turn_detection = True),支持语音打断。
  2. 音视频对话:通过麦克风和摄像头捕获实时音频和视频,VAD 模式,支持语音打断。
  3. 本地调用:使用本地音频和图像作为输入,手动模式(enable_turn_detection = False)。
请使用耳机进行音频播放,避免回声触发语音打断。
VAD/手动模式交互流程以及 Qwen3.8-Omni-Flash-Realtime MCP 交互流程(工具发现、调用、审批与续接),参见交互流程。

多通道音频、视频聚合与 MCP

以下配置适用于 Qwen3.8-Omni-Flash-Realtime,按需在首次输入音频前配置。
  • 多通道音频(WebSocket 接入):在首段音频前设置 session.audio.input.format。支持 1、2、4 声道;多通道必须为 PCM、16000 Hz、s16le、interleaved。2 声道使用 raw_mic_array,4 声道使用 foa_ambix。字段约束和 JSON 片段见客户端事件。
  • 视频聚合:session.video.input.representation_compact 默认为 none;设为 normal 可聚合视频表征,降低计算开销,适用于不依赖细粒度视觉信息的场景。也必须在首段音频前配置,开始输入后不得修改。
  • 音色:默认音色为 Tina。新接入使用 session.audio.output.voice,它优先于兼容字段 session.voice。支持 longanlingxin(龙安灵心,知心温暖音)等音色。使用方式和声音复刻入口见音色列表。
  • MCP:在 session.tools 中配置公网 HTTPS MCP Streamable HTTP 服务;默认需要审批。先确认工具发现完成,再发起需要该工具的 Response。执行结果、拒绝和失败处理以及续答步骤见交互流程。

SDK 配置视频聚合

Qwen3.8-Omni-Flash-Realtime 使用 DashScope Python SDK 1.26.5 及以上版本,或 Java SDK 2.22.15 及以上版本。视频聚合参数通过 SDK 透传:Python 在 update_session 中传入 video,Java 通过 OmniRealtimeConfig.builder().parameters(...) 传入。 以下示例配置一个 Manual 模式会话:文本与音频输出、Tina 音色、关闭输入转写,并启用视频聚合。先按下方 SDK 示例建立连接,将模型设为 qwen3.8-omni-flash-realtime,用本例替换该示例的会话配置调用,在首段音频输入前调用一次。conversation 为已连接的 SDK 会话。SDK 会同时发送音色、VAD 等配置;如需其他音色、VAD 或转写设置,在同一次调用中完整设置。Java 需导入 java.util.Arrays、java.util.Map、java.util.HashMap、com.alibaba.dashscope.audio.omni.OmniRealtimeConfig 和 com.alibaba.dashscope.audio.omni.OmniRealtimeModality。
from dashscope.audio.qwen_omni import MultiModality

conversation.update_session(
    output_modalities=[MultiModality.AUDIO, MultiModality.TEXT],
    voice="Tina",
    enable_turn_detection=False,
    enable_input_audio_transcription=False,
    video={
        "input": {
            "representation_compact": "normal",
        },
    },
)

联网搜索

联网搜索功能允许模型使用实时检索到的信息进行回复,适用于需要最新信息的场景,如股票价格、天气预报等。模型会自主决定是否进行联网搜索。
Qwen3.8-Omni-Flash-Realtime 和 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
  • DashScope Java SDK
  • WebSocket(Python)
在 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://maas.qianwenaiapi.com/api-ws/v1/realtime'
model = 'qwen3.8-omni-flash-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.delta':
      preview = response.get('text', '') + response.get('stash', '')
      print(f"\r[用户] {preview}", end='', flush=True)
    elif response['type'] == 'conversation.item.input_audio_transcription.completed':
      print(f"\r[用户] {response['transcript']}")
    elif response['type'] == 'response.audio_transcript.done':
      print(f"[模型] {response['transcript']}")
    elif response['type'] == 'response.done':
      usage = response.get('response', {}).get('usage', {})
      plugins = usage.get('plugins', {})
      if plugins.get('search'):
        print(f"[搜索] 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对话已结束")

API 参考

计费与限流

计费规则

Qwen-Omni-Realtime 按不同输入模态(如音频和图像)消耗的 Token 数量计费。有关计费的详细信息,请参阅计费说明。 输出语音时,qwen3.8-omni-flash-realtime 的音频及对应文本分别按音频输出和文本输出单价计费;Qwen3.5-Omni-Realtime 系列仅对音频计费,对应文本不计费。 MCP 工具调用不额外收费,模型推理仍按模型价格计费。调用流程与使用限制见交互流程。
在多轮实时对话中,模型每次生成响应时,需要将上下文窗口内的所有历史对话内容(包括之前各轮的音频、图片和文本)与本轮新增输入一并作为输入 Token 进行处理。因此,输入 Token 会随对话轮次的增加而逐轮累积,而非仅计算当前轮次的新增输入。例如,假设一段 10 秒的音频输入转换为 70 个 Token(Qwen3.5-Omni-Realtime 系列模型),在第 3 轮对话时,该音频仍在上下文窗口内,则它依然会被计入第 3 轮的输入 Token。实际计费的输入 Token 数 = 上下文窗口内所有历史轮次的内容 Token 数 + 本轮新增输入的 Token 数。
  • 音频
  • 图片
  • 视频
  • Qwen3.8-Omni-Flash-Realtime、Qwen3.5-Omni-Realtime:输入音频总 Token 数 = 音频时长(秒)x 7;输出音频总 Token 数 = 音频时长(秒)x 12.5
  • Qwen3-Omni-Flash-Realtime:输入与输出音频的总 Token 数 = 音频时长(秒)x 12.5
  • Qwen-Omni-Turbo-Realtime:输入与输出音频的总 Token 数 = 音频时长(秒)x 25
若音频时长不足 1 秒,按 1 秒计算。qwen3.8-omni-flash-realtime 开启空间音频输入时,音频输入 Token 数为普通音频的 2 倍,2 通道和 4 通道的倍数相同。

限流

有关模型限流规则的详细信息,请参阅限流说明。

常见问题

怎么向模型输入图片?

A:输入方式取决于接入协议。 WebSocket:通过客户端发送 input_image_buffer.append 事件。
  • VAD 模式:该模式会根据语音检测情况自动提交音频与图片,请在服务端响应前发送 input_image_buffer.append 事件。
  • Manual 模式:参见快速开始中的手动模式代码,将图片输入与提交的两部分代码取消注释,即可传入本地图片。
WebRTC:通过视频轨道(RTP)发送画面帧,无需发送 input_image_buffer.append 事件。 若用于视频通话场景,可以对视频抽帧,建议以 1张/秒 的频率向服务端发送图像。DashScope SDK 代码请参见 Omni-Realtime 示例代码。

收不到 ASR 转录文本(transcript)怎么办?

A:如果您收不到 conversation.item.input_audio_transcription.completed 事件,或事件中的 transcript 字段为空,请按以下顺序排查。
  1. 确认已开启输入音频转录。转录事件由 session.update 的 enable_input_audio_transcription 参数控制,该参数默认为 true。关闭该参数后,服务端不会下发 conversation.item.input_audio_transcription.completed 事件,这是预期行为,并非异常,请确认会话配置中该参数为 true。
  2. 监听转录失败事件。除 completed 事件外,请同时监听 conversation.item.input_audio_transcription.failed 事件。转录失败时,该事件会通过 error.code、error.message 和 error.param 返回失败原因,可据此定位是参数问题还是音频问题。
  3. 升级 DashScope SDK。较低版本的 DashScope SDK 可能不支持输入音频转录相关参数,导致配置未生效,请将 DashScope SDK 升级到较新版本后重试。
  4. 检查 VAD 配置与网络。语音活动检测由 session.turn_detection 配置,type 取值为 server_vad 或 semantic_vad。VAD 灵敏度与实际环境不匹配(例如在嘈杂环境中阈值过低)会导致音频分段异常,进而影响转录结果,可参见本文档"2. 配置会话"章节调整 threshold 与 silence_duration_ms。此外,网络不稳定会造成 WebSocket 连接中断,导致转录事件丢失,请确认连接在整个会话期间保持稳定。
  5. 显式指定转录模型。可通过 session.update 的 input_audio_transcription_model 参数指定 ASR 转录模型(例如 qwen3-asr-flash-realtime)。未显式指定时,服务端使用默认转录模型;当默认模型的转录效果不满足需求时,建议显式指定。

错误码

调用失败时,请参阅错误码。

音色列表

各全模态模型支持的音色、试听样例和 voice 参数取值,见全模态音色列表。
实时音视频理解 - 千问AI平台