跳转到主要内容
语音转语音

实时语音/音视频翻译-千问

本文介绍千问实时语音/音视频翻译模型的能力、支持的模型和接入方式。模型可结合音频与图像输入进行实时翻译,输出目标语种的文本或语音,适用于实时语音交流和视频翻译等场景。

在线体验参见通过函数计算一键部署。

功能特性

  • 多语言支持:支持 60 种语言互译,其中 29 种支持音频+文本输出、31 种仅支持文本输出,覆盖中文、英语、法语、德语、俄语、日语、韩语、西班牙语、葡萄牙语、阿拉伯语等主流语种。
  • 视觉增强:利用视觉内容提升翻译准确性。模型通过分析画面中的口型、动作和文字,改善在嘈杂环境下或一词多义场景中的翻译效果。
  • 2.3 秒时延:实现低至 2.3 秒的同传时延。
  • 实时说话人分离:支持在多人交替发言时区分不同说话人及其发言内容,让听众清晰了解“谁说了什么”。
  • 无损同传:通过语义单元预测技术,解决跨语言语序问题。实时翻译质量接近离线翻译结果。
  • 音色自然:生成音色自然的拟人语音。模型能根据源语音内容,自适应调节语气和情感。
  • 配置热词:通过热词提升特定词汇的翻译准确性。
  • 声音复刻:支持复刻发言人音色用于翻译播报,让输出听起来像本人说外语。支持服务端实时复刻和使用预先复刻的固定音色。

如何使用

1. 配置连接

连接时通过 model 指定支持的模型。使用 qwen3.8-livetranslate-flash-realtime 时,连接地址和完整示例参见快速开始。以下连接示例使用 qwen3.8-livetranslate-flash-realtime。 qwen3.8-livetranslate-flash-realtime 模型通过 WebSocket 协议接入,连接时需要以下配置项:
qwen3.5-livetranslate-flash-realtime 除 WebSocket 外,还支持通过 AOQ 和 WebRTC 协议接入;如果是客户端对接,且更看重稳定的延迟、弱网下的交互能力、实时双工的降噪与回声消除,可优先考虑 AOQ,协议对比与选型请参见Realtime API 概述。
配置项说明
调用地址wss://maas.qianwenaiapi.com/api-ws/v1/realtime
查询参数查询参数为model,需指定为访问的模型名。示例:?model=qwen3.8-livetranslate-flash-realtime
消息头使用 Bearer Token 鉴权:Authorization: Bearer DASHSCOPE_API_KEY > DASHSCOPE_API_KEY 是您在千问AI平台上申请的API-KEY。
可通过以下 Python 示例代码建立连接。
# 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-livetranslate-flash-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()

2. 配置语种、输出模态与音色

  • qwen3.8-livetranslate-flash-realtime
  • qwen3.5-livetranslate-flash-realtime
通过 session.update 配置会话:
  • 目标语种:通过 session.translation.language 配置,例如 en 表示英语。
  • 输出模态:通过 session.output_modalities 配置,["text"] 为仅文本,["text", "audio"] 为文本和音频。
  • 原文识别:通过 conversation.item.input_audio_transcription.delta 接收识别增量,通过 conversation.item.input_audio_transcription.completed 接收完整结果。
  • 音频与音色:默认输入为 16000 Hz PCM,输出为 24000 Hz PCM,音色为 Tina。完整会话结构参见服务端事件。

3. 输入音频与图片

客户端通过 input_audio_buffer.append 和 input_image_buffer.append 事件发送 Base64 编码的音频和图片数据。音频输入是必需的;图片输入是可选的。
图片可以来自本地文件,或从视频流中实时采集。
以下 VAD 与 Manual 模式配置适用于 qwen3.5-livetranslate-flash-realtime。qwen3.8-livetranslate-flash-realtime 的默认断句配置为 audio.input.turn_detection.type = speaker_detection,持续发送音频后由服务端生成响应。 模型判断一段语音"说完了"的方式,取决于turn_detection参数配置的 VAD 模式或 Manual 模式:

4. 接收模型响应

  • qwen3.8-livetranslate-flash-realtime
  • qwen3.5-livetranslate-flash-realtime
根据输出模态接收响应:
  • 仅文本:累加 response.text.delta 的 delta 字段获得译文。
  • 文本和音频:累加 response.audio_transcript.delta 的 delta 字段获得译文,并对 response.audio.delta 的 delta 字段进行 Base64 解码,获取音频分片。
收到 response.done 表示本次响应结束。事件字段参见服务端事件。

5. 结束会话

音频发送完毕后,客户端必须发送 session.finish 事件通知服务端,然后等待服务端返回 session.finished 事件后再关闭 WebSocket 连接。
如果不发送 session.finish,服务端无法得知音频输入已完成,会导致最后一段语音的识别和翻译结果丢失,连接也可能长时间处于等待状态。请务必在关闭连接前发送该事件。

支持的模型

推荐模型

模型名称版本上下文长度最大输入最大输出
(Token数)
qwen3.8-livetranslate-flash-realtime稳定版53248491524096
qwen3.5-livetranslate-flash-realtime
当前能力等同 qwen3.5-livetranslate-flash-realtime-2026-05-19
稳定版53248491524096
qwen3.5-livetranslate-flash-realtime-2026-05-19快照版

旧版模型

以下模型仍在服务中,但不再作为首选推荐。新场景建议使用上方的新一代模型,以获得更优的翻译质量与性价比。
模型名称版本上下文长度最大输入最大输出
(Token数)
qwen3-livetranslate-flash-realtime
当前能力等同 qwen3-livetranslate-flash-realtime-2025-09-22
稳定版53248491524096
qwen3-livetranslate-flash-realtime-2025-09-22快照版

快速开始

  • qwen3.8-livetranslate-flash-realtime
  • qwen3.5-livetranslate-flash-realtime

翻译本地音频

安装 websocket-client(pip install websocket-client),并设置以下环境变量:
  • DASHSCOPE_API_KEY:API Key。
  • INPUT_PCM_FILE:待翻译音频的本地路径。此示例使用单声道、16 位、16000 Hz 的无文件头 PCM 音频。
示例将音频翻译为英语,打印译文,并将 24000 Hz、单声道、16 位 PCM 输出保存为 translation.pcm。连接后配置会话,发送音频,最后通过 session.finish 请求结束,收到 session.finished 后关闭连接。
import base64
import json
import os
import threading
import time

import websocket

model = "qwen3.8-livetranslate-flash-realtime"
api_key = os.environ["DASHSCOPE_API_KEY"]
audio_file = os.environ["INPUT_PCM_FILE"]
url = f"wss://maas.qianwenaiapi.com/api-ws/v1/realtime?model={model}"
ws = websocket.create_connection(
    url, header={"Authorization": f"Bearer {api_key}"}, timeout=30
)

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

send_errors = []

def send_audio():
    try:
        with open(audio_file, "rb") as source:
            while chunk := source.read(3200):
                ws.send(json.dumps({
                    "type": "input_audio_buffer.append",
                    "audio": base64.b64encode(chunk).decode("ascii"),
                }))
                time.sleep(0.1)
        ws.send(json.dumps({"type": "session.finish"}))
    except Exception as error:
        send_errors.append(error)

try:
    receive()
    ws.send(json.dumps({
        "type": "session.update",
        "session": {
            "output_modalities": ["text", "audio"],
            "translation": {"language": "en"},
        },
    }))
    while receive().get("type") != "session.updated":
        pass
    sender = threading.Thread(target=send_audio, daemon=True)
    sender.start()
    with open("translation.pcm", "wb") as output:
        while True:
            event = receive()
            event_type = event.get("type")
            if event_type in ("response.text.delta", "response.audio_transcript.delta"):
                print(event["delta"], end="", flush=True)
            elif event_type == "response.audio.delta":
                output.write(base64.b64decode(event["delta"]))
            elif event_type == "session.finished":
                break
    sender.join(timeout=5)
    if send_errors:
        raise send_errors[0]
    print()
finally:
    ws.close()

声音复刻

模型支持发言人声音复刻功能,支持使用预先复刻的固定音色,也支持由服务端实时复刻,让翻译播报听起来像本人说外语。适用于跨语言演讲、个人主播、视频翻译等需要保留个人音色的场景。 在 session.update 中设置以下参数启用:
  • session.enable_voice_clone:设置为 true,启用声音复刻。
  • session.voice_clone_options.frequency:控制声音复刻时机,取值如下:
    • never:不在服务端复刻,使用用户预先复刻好的音色。此时 session.voice 需设置为用户自己的复刻音色 ID。
    • once:服务端在会话开始时基于输入音频复刻一次音色,后续翻译输出复用该音色。适合单人演讲场景。此时 session.voice 需设置为 default。
    • always:服务端在每次生成翻译音频前实时复刻,音色跟随输入动态变化。适合双人及以上对话场景。此时 session.voice 需设置为 default。
  • session.voice:指定输出音色,取值取决于 frequency 的设置。
    • 设置为 default:搭配 frequency 为 once 或 always 使用,由服务端复刻输入音频的音色,复刻完成前使用默认音色过渡。
    • 设置为用户复刻的音色 ID(如 qwen-translate-vc-xxx-yyy-zzz):搭配 frequency 为 never 使用。需提前通过声音复刻API准备音色,targetModel 需指定为实际使用的翻译模型。
当 frequency 为 once 或 always 时,voice 必须设置为 default,不可设置为其他预设音色,否则服务端会返回错误。

声音复刻配置示例

使用预先复刻的音色(音质稳定,推荐需要固定音色的场景):
{
    "type": "session.update",
    "session": {
        "modalities": ["text","audio"],
        "voice": "qwen-translate-vc-xxx-yyy-zzz",
        "translation": {
            "language": "en"
        },
        "enable_voice_clone": true,
        "voice_clone_options": {
            "frequency": "never"
        }
    }
}
服务端复刻一次(适合单人演讲):
{
    "type": "session.update",
    "session": {
        "modalities": ["text","audio"],
        "voice": "default",
        "translation": {
            "language": "en"
        },
        "enable_voice_clone": true,
        "voice_clone_options": {
            "frequency": "once"
        }
    }
}
服务端每次复刻(适合多人对话):
{
    "type": "session.update",
    "session": {
        "modalities": ["text","audio"],
        "voice": "default",
        "translation": {
            "language": "en"
        },
        "enable_voice_clone": true,
        "voice_clone_options": {
            "frequency": "always"
        }
    }
}

利用图像提升翻译准确率

qwen3.5-livetranslate-flash-realtime 模型可以接收图像输入,辅助音频翻译,适用于同音异义、低频专有名词识别场景。建议每秒发送不超过2张图片。 将以下示例图片下载到本地:口罩.png面具.png 将以下代码下载到livetranslate_client.py同级目录并运行,向麦克风说"What is mask?",在输入口罩图片时,模型会翻译为“什么是口罩?”;输入面具图片时,模型会翻译为“什么是面具?”
import os
import time
import json
import asyncio
import contextlib
import functools

from livetranslate_client import LiveTranslateClient

IMAGE_PATH = "口罩.png"
# IMAGE_PATH = "面具.png"

def print_banner():
    print("=" * 60)
    print("  基于千问 qwen3.5-livetranslate-flash-realtime —— 单轮交互示例 (mask)")
    print("=" * 60 + "\n")

async def stream_microphone_once(client: LiveTranslateClient, image_bytes: bytes):
    pa = client.pyaudio_instance
    stream = pa.open(
        format=client.input_format,
        channels=client.input_channels,
        rate=client.input_rate,
        input=True,
        frames_per_buffer=client.input_chunk,
    )
    print(f"[INFO] 开始录音,请讲话……")
    loop = asyncio.get_event_loop()
    last_img_time = 0.0
    frame_interval = 0.5  # 2 fps
    try:
        while client.is_connected:
            data = await loop.run_in_executor(None, stream.read, client.input_chunk)
            await client.send_audio_chunk(data)

            # 每 0.5 秒追加一帧图片
            now = time.time()
            if now - last_img_time >= frame_interval:
                await client.send_image_frame(image_bytes)
                last_img_time = now
    finally:
        stream.stop_stream()
        stream.close()

async def main():
    print_banner()
    api_key = os.environ.get("DASHSCOPE_API_KEY")
    if not api_key:
        print("[ERROR] 请先在环境变量 DASHSCOPE_API_KEY 中配置 API KEY")
        return

    client = LiveTranslateClient(api_key=api_key, target_language="zh", audio_enabled=True)

    def on_text(text: str):
        print(text, end="", flush=True)

    try:
        await client.connect()
        client.start_audio_player()
        message_task = asyncio.create_task(client.handle_server_messages(on_text))
        with open(IMAGE_PATH, "rb") as f:
            img_bytes = f.read()
        await stream_microphone_once(client, img_bytes)
        await asyncio.sleep(15)
    finally:
        await client.close()
        if not message_task.done():
            message_task.cancel()
            with contextlib.suppress(asyncio.CancelledError):
                await message_task

if __name__ == "__main__":
    asyncio.run(main())

通过函数计算一键部署

控制台暂不支持体验。可通过以下方式一键部署:
  1. 打开我们写好的函数计算模板,填入 API Key, 单击创建并部署默认环境即可在线体验。
  2. 等待约一分钟,在 环境详情 > 环境信息 中获取访问域名,将访问域名的http改成https(例如https://qwen-livetranslate-flash-realtime.fcv3.xxx.cn-hangzhou.fc.devsapp.net/),通过该链接与模型交互。
    此链接使用自签名证书,仅用于临时测试。首次访问时,浏览器会显示安全警告,这是预期行为,请勿在生产环境使用。如需继续,请按浏览器提示操作(如点击“高级” → “继续前往(不安全)”)。
如需开通访问控制权限,请跟随页面指引操作。
通过资源信息-函数资源查看项目源代码。
函数计算与千问AI平台均为新用户提供免费额度,可以覆盖简单调试所需成本,额度耗尽后按量计费。只有在访问的情况下会产生费用。

交互流程

  • qwen3.8-livetranslate-flash-realtime
  • qwen3.5-livetranslate-flash-realtime
默认通过服务端断句生成响应,以下列出主要交互环节。事件字段详见服务端事件。
阶段客户端操作服务端事件
创建和配置会话建立连接,发送 session.updatesession.created、session.updated
输入音频input_audio_buffer.append原文通过 conversation.item.input_audio_transcription.delta 增量返回,完成后返回 conversation.item.input_audio_transcription.completed。
接收译文与音频持续接收服务端事件译文通过 response.text.delta(仅文本)或 response.audio_transcript.delta(文本和音频)返回;音频通过 response.audio.delta 返回。response.done 表示一次响应完成。
结束会话session.finish收到 session.finished 后关闭连接。
音频发送结束后,必须发送 session.finish 事件并等待 session.finished 响应后再断开连接。如果直接关闭 WebSocket 而不发送 session.finish,服务端无法得知音频输入已结束,将导致最后一段语音的识别和翻译结果丢失。

API 参考

通过 AOQ 接入的流程和示例,请参见AOQ 接入。支持的模型及版本请参见模型与协议支持范围。

计费说明

  • Qwen3.8-LiveTranslate-Flash-Realtime、Qwen3.5-LiveTranslate-Flash-Realtime
    • 音频:输入每秒音频消耗 7 Token,输出每秒音频消耗 12.5 Token。
    • 图片:每输入 32*32 像素消耗 0.5 Token。
  • Qwen3-LiveTranslate-Flash-Realtime
    • 音频:输入或输出每秒音频均消耗 12.5 Token。
    • 图片:每输入 28*28 像素消耗 0.5 Token。
    • 文本:启用源语言语音识别功能后,服务除返回翻译结果外,还会返回输入音频的语音识别文本(即源语言原文),该识别文本将按输出文本的 Token 标准计费。
各模型的 Token 单价请参见模型调用计费。

限流说明

模型的限流规则请参见限流。

支持的语种

下表中的语种代码可用于指定源语种与目标语种。
部分目标语种仅支持输出文本,不支持输出音频。老模型 qwen3-livetranslate-flash-realtime 仅支持以下 18 种语种:en、zh、ru、fr、de、pt、es、it、id、ko、ja、vi、th、ar、yue、hi、el、tr。
语种代码语种支持的输出模态
zh中文音频+文本
en英语音频+文本
ar阿拉伯语音频+文本
de德语音频+文本
fr法语音频+文本
es西班牙语音频+文本
pt葡萄牙语音频+文本
id印度尼西亚语音频+文本
it意大利语音频+文本
ko韩语音频+文本
ru俄语音频+文本
th泰语音频+文本
vi越南语音频+文本
ja日语音频+文本
tr土耳其语音频+文本
hi印地语音频+文本
ms马来语音频+文本
nl荷兰语音频+文本
ur乌尔都语音频+文本
nb挪威语音频+文本
sv瑞典语音频+文本
da丹麦语音频+文本
he希伯来语音频+文本
fi芬兰语音频+文本
pl波兰语音频+文本
is冰岛语音频+文本
cs捷克语音频+文本
fil菲律宾语音频+文本
fa波斯语音频+文本
yue粤语文本
el希腊语文本
af南非荷兰语文本
ast阿斯图里亚斯语文本
be白俄罗斯语文本
bg保加利亚语文本
bn孟加拉语文本
bs波斯尼亚语文本
ca加泰罗尼亚语文本
ceb宿务语文本
et爱沙尼亚语文本
gl加利西亚语文本
gu古吉拉特语文本
hr克罗地亚语文本
hu匈牙利语文本
jv爪哇语文本
kk哈萨克语文本
kn卡纳达语文本
ky柯尔克孜语文本
lv拉脱维亚语文本
mk马其顿语文本
ml马拉雅拉姆语文本
mr马拉地语文本
pa旁遮普语文本
ro罗马尼亚语文本
sk斯洛伐克语文本
sl斯洛文尼亚语文本
sw斯瓦希里语文本
tg塔吉克语文本
az阿塞拜疆语文本
uk乌克兰语文本

支持的音色

实时翻译支持的音色与voice参数取值参见音色列表。