O qwen3-livetranslate-flash traduz arquivos de áudio e vídeo em 18 idiomas. Ele aceita entrada de áudio ou vídeo e retorna texto traduzido, áudio sintetizado ou ambos por meio de uma API de streaming. Para entradas de vídeo, o contexto visual melhora a precisão da tradução (por exemplo, distingue "máscara cirúrgica" de "máscara de baile" com base nos quadros do vídeo).
Antes de começar
- Crie uma chave de API.
- Configure a chave de API como variável de ambiente.
- (Opcional) Caso utilize o SDK da OpenAI, instale o SDK.
Início rápido
Todos os exemplos usam a API de streaming compatível com a OpenAI. Defina os idiomas de origem e destino por meio de translation_options. A entrada padrão é áudio; descomente o bloco de entrada de vídeo em cada exemplo para traduzir arquivos de vídeo.
Especifique
source_langaumenta a precisão. Omita esse parâmetro para ativar a detecção automática de idioma.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
# The following URL is for the Singapore region. When calling, replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
# --- Audio input ---
messages = [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
"format": "wav",
},
}
],
}
]
# --- Video input (uncomment to use) ---
# messages = [
# {
# "role": "user",
# "content": [
# {
# "type": "video_url",
# "video_url": {
# "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4"
# },
# }
# ],
# },
# ]
completion = client.chat.completions.create(
model="qwen3-livetranslate-flash",
messages=messages,
modalities=["text", "audio"],
audio={"voice": "Cherry", "format": "wav"},
stream=True,
stream_options={"include_usage": True},
# translation_options is not a standard OpenAI parameter; pass it through extra_body
extra_body={"translation_options": {"source_lang": "zh", "target_lang": "en"}},
)
for chunk in completion:
print(chunk)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
// The following URL is for the Singapore region. When calling, replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});
// --- Audio input ---
const messages = [
{
role: "user",
content: [
{
type: "input_audio",
input_audio: {
data: "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
format: "wav",
},
},
],
},
];
// --- Video input (uncomment to use) ---
// const messages = [
// {
// role: "user",
// content: [
// {
// type: "video_url",
// video_url: {
// url: "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4",
// },
// },
// ],
// },
// ];
async function main() {
const completion = await client.chat.completions.create({
model: "qwen3-livetranslate-flash",
messages: messages,
modalities: ["text", "audio"],
audio: { voice: "Cherry", format: "wav" },
stream: true,
stream_options: { include_usage: true },
translation_options: { source_lang: "zh", target_lang: "en" },
});
for await (const chunk of completion) {
console.log(JSON.stringify(chunk));
}
}
main();
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-livetranslate-flash",
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
"format": "wav"
}
}
]
}
],
"modalities": ["text", "audio"],
"audio": {
"voice": "Cherry",
"format": "wav"
},
"stream": true,
"stream_options": {
"include_usage": true
},
"translation_options": {
"source_lang": "zh",
"target_lang": "en"
}
}'
Estes exemplos usam uma URL de arquivo público. Para usar um arquivo local, consulte Inserir um arquivo local codificado em Base64.
Parâmetros da solicitação
Entrada
O array messages deve conter exatamente uma mensagem com role definido como user. O campo content armazena o áudio ou vídeo a traduzir:
- Áudio: Defina
typecomoinput_audio. Forneça a URL do arquivo ou os dados codificados em Base64 eminput_audio.datae especifique o formato (por exemplo,wav) eminput_audio.format. - Vídeo: Configure
typecomovideo_url. Informe a URL do arquivo emvideo_url.url.
Opções de tradução
Especifique os idiomas de origem e destino no parâmetro translation_options:
"translation_options": {"source_lang": "zh", "target_lang": "en"}
No SDK para Python, translation_options não é um parâmetro padrão da OpenAI. Passe-o por meio de extra_body:
extra_body={"translation_options": {"source_lang": "zh", "target_lang": "en"}}
Modalidade de saída
Controle o formato de saída com o parâmetro modalities:
**Valor de | Saída |
|---|---|
| Apenas texto traduzido |
| Texto traduzido e áudio sintetizado codificado em Base64 |
Quando a saída incluir áudio, defina a voz no parâmetro audio. Consulte Vozes compatíveis para ver as opções disponíveis.
Restrições
- Apenas turno único: O modelo processa uma tradução por solicitação. Não há suporte para conversas com múltiplos turnos.
- Sem mensagem de sistema: Não há suporte para a função
system. - Apenas streaming: Somente a saída de streaming compatível com a OpenAI tem suporte.
Analisar a resposta
Cada objeto chunk do streaming contém:
- Texto:
chunk.choices[0].delta.content - Áudio:
chunk.choices[0].delta.audio["data"](codificado em Base64, taxa de amostragem de 24 kHz)
Salvar áudio em um arquivo
Concatene todos os fragmentos de áudio em Base64 do fluxo e, após a conclusão do streaming, decodifique e salve o resultado.
Python
import os
from openai import OpenAI
import base64
import numpy as np
import soundfile as sf
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
# The following URL is for the Singapore region. When calling, replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
messages = [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
"format": "wav",
},
}
],
}
]
completion = client.chat.completions.create(
model="qwen3-livetranslate-flash",
messages=messages,
modalities=["text", "audio"],
audio={"voice": "Cherry", "format": "wav"},
stream=True,
stream_options={"include_usage": True},
extra_body={"translation_options": {"source_lang": "zh", "target_lang": "en"}},
)
# Concatenate Base64 fragments, then decode after the stream completes
audio_string = ""
for chunk in completion:
if chunk.choices:
if hasattr(chunk.choices[0].delta, "audio"):
try:
audio_string += chunk.choices[0].delta.audio["data"]
except Exception as e:
print(chunk.choices[0].delta.audio["transcript"])
else:
print(chunk.usage)
wav_bytes = base64.b64decode(audio_string)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
sf.write("output.wav", audio_np, samplerate=24000)
Node.js
import OpenAI from "openai";
import { createWriteStream } from "node:fs";
import { Writer } from "wav";
const client = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
// The following URL is for the Singapore region. When calling, replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});
const messages = [
{
role: "user",
content: [
{
type: "input_audio",
input_audio: {
data: "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
format: "wav",
},
},
],
},
];
const completion = await client.chat.completions.create({
model: "qwen3-livetranslate-flash",
messages: messages,
modalities: ["text", "audio"],
audio: { voice: "Cherry", format: "wav" },
stream: true,
stream_options: { include_usage: true },
translation_options: { source_lang: "zh", target_lang: "en" },
});
// Concatenate Base64 fragments, then decode after the stream completes
let audioString = "";
for await (const chunk of completion) {
if (Array.isArray(chunk.choices) && chunk.choices.length > 0) {
if (chunk.choices[0].delta.audio?.data) {
audioString += chunk.choices[0].delta.audio.data;
}
} else {
console.log(chunk.usage);
}
}
// Save as WAV file
async function saveAudio(base64Data, outputPath) {
const wavBuffer = Buffer.from(base64Data, "base64");
const writer = new Writer({
sampleRate: 24000,
channels: 1,
bitDepth: 16,
});
const outputStream = createWriteStream(outputPath);
writer.pipe(outputStream);
writer.write(wavBuffer);
writer.end();
await new Promise((resolve, reject) => {
outputStream.on("finish", resolve);
outputStream.on("error", reject);
});
console.log(`Audio saved to ${outputPath}`);
}
saveAudio(audioString, "output.wav");
Reprodução em tempo real
Decodifique cada fragmento Base64 ao recebê-lo e reproduza-o diretamente. Essa abordagem requer bibliotecas de áudio específicas para cada plataforma.
Python
Instale pyaudio primeiro:
Plataforma | Instalação |
|---|---|
macOS |
|
Ubuntu / Debian |
|
CentOS |
|
Windows |
|
import os
from openai import OpenAI
import base64
import numpy as np
import pyaudio
import time
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
# The following URL is for the Singapore region. When calling, replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
messages = [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
"format": "wav",
},
}
],
}
]
completion = client.chat.completions.create(
model="qwen3-livetranslate-flash",
messages=messages,
modalities=["text", "audio"],
audio={"voice": "Cherry", "format": "wav"},
stream=True,
stream_options={"include_usage": True},
extra_body={"translation_options": {"source_lang": "zh", "target_lang": "en"}},
)
# Initialize PyAudio for real-time playback
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=24000, output=True)
for chunk in completion:
if chunk.choices:
if hasattr(chunk.choices[0].delta, "audio"):
try:
audio_data = chunk.choices[0].delta.audio["data"]
wav_bytes = base64.b64decode(audio_data)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
stream.write(audio_np.tobytes())
except Exception as e:
print(chunk.choices[0].delta.audio["transcript"])
time.sleep(0.8)
stream.stop_stream()
stream.close()
p.terminate()
Node.js
Instale as dependências primeiro:
Plataforma | Instalação |
|---|---|
macOS |
|
Ubuntu / Debian |
|
Windows |
|
import OpenAI from "openai";
import Speaker from "speaker";
const client = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
// The following URL is for the Singapore region. When calling, replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});
const messages = [
{
role: "user",
content: [
{
type: "input_audio",
input_audio: {
data: "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250211/tixcef/cherry.wav",
format: "wav",
},
},
],
},
];
const completion = await client.chat.completions.create({
model: "qwen3-livetranslate-flash",
messages: messages,
modalities: ["text", "audio"],
audio: { voice: "Cherry", format: "wav" },
stream: true,
stream_options: { include_usage: true },
translation_options: { source_lang: "zh", target_lang: "en" },
});
// Stream audio to speaker in real time
const speaker = new Speaker({
sampleRate: 24000,
channels: 1,
bitDepth: 16,
signed: true,
});
for await (const chunk of completion) {
if (Array.isArray(chunk.choices) && chunk.choices.length > 0) {
if (chunk.choices[0].delta.audio?.data) {
const pcmBuffer = Buffer.from(chunk.choices[0].delta.audio.data, "base64");
speaker.write(pcmBuffer);
}
} else {
console.log(chunk.usage);
}
}
speaker.on("finish", () => console.log("Playback complete"));
speaker.end();
Faturamento
Áudio
Cada segundo de áudio de entrada ou saída consome 12,5 tokens. Áudios com duração inferior a 1 segundo são cobrados como 1 segundo.
Vídeo
O consumo de tokens de vídeo possui dois componentes:
- Tokens de áudio: 12,5 tokens por segundo de áudio. Áudios com duração inferior a 1 segundo são cobrados como 1 segundo.
- Tokens de vídeo: Calculados com base na contagem de quadros e na resolução. A fórmula é:
video_tokens = ceil(frame_count / 2) x (height / 32) x (width / 32) + 2
Onde:
- Os quadros são amostrados a 2 FPS, limitados ao intervalo [4, 128].
- Altura e largura são ajustadas para múltiplos de 32 pixels e redimensionadas dinamicamente para caber no limite total de pixels.
Script em Python para calcular tokens de vídeo
Para preços de tokens, consulte Lista de modelos.
Detalhes do modelo
Modelo | Versão | Janela de contexto | Entrada máxima | Saída máxima |
|---|---|---|---|---|
qwen3-livetranslate-flash | Estável | 53.248 tokens | 49.152 tokens | 4.096 tokens |
qwen3-livetranslate-flash-2025-12-01 | Snapshot | 53.248 tokens | 49.152 tokens | 4.096 tokens |
Atualmente, o qwen3-livetranslate-flash tem as mesmas capacidades do qwen3-livetranslate-flash-2025-12-01.
Idiomas compatíveis
Use estes códigos de idioma para source_lang e target_lang. Alguns idiomas de destino aceitam apenas saída de texto.
Código do idioma | Idioma | Saída compatível |
|---|---|---|
en | Inglês | Áudio, texto |
zh | Chinês | Áudio, texto |
ru | Russo | Áudio, texto |
fr | Francês | Áudio, texto |
de | Alemão | Áudio, texto |
pt | Português | Áudio, texto |
es | Espanhol | Áudio, texto |
it | Italiano | Áudio, texto |
id | Indonésio | Texto |
ko | Coreano | Áudio, texto |
ja | Japonês | Áudio, texto |
vi | Vietnamita | Texto |
th | Tailandês | Texto |
ar | Árabe | Texto |
yue | Cantonês | Áudio, texto |
hi | Hindi | Texto |
el | Grego | Texto |
tr | Turco | Texto |
Vozes compatíveis
Defina o parâmetro voice em audio quando a saída incluir áudio sintetizado.
Nome da voz | **Parâmetro | Descrição | Idiomas compatíveis |
|---|---|---|---|
Cherry | Cherry | Uma jovem alegre, amigável e autêntica. | Chinês, inglês, francês, alemão, russo, italiano, espanhol, português, japonês, coreano |
Nofish | Nofish | Um designer que tem dificuldade em pronunciar consoantes retroflexas. | Chinês, inglês, francês, alemão, russo, italiano, espanhol, português, japonês, coreano |
Shanghai-Jada | Jada | Uma senhora de Xangai agitada e enérgica. | Chinês |
Beijing-Dylan | Dylan | Um jovem que cresceu nos hutongs de Pequim. | Chinês |
Sichuan-Sunny | Sunny | Uma doce garota de Sichuan. | Chinês |
Tianjin-Peter | Peter | Uma voz no estilo de um artista de crosstalk de Tianjin (o papel coadjuvante). | Chinês |
Cantonese-Kiki | Kiki | Uma doce melhor amiga de Hong Kong. | Cantonês |
Sichuan-Eric | Eric | Um homem de Chengdu, Sichuan, não convencional e que se destaca da multidão. | Chinês |
Perguntas frequentes
Quando insiro um arquivo de vídeo, qual conteúdo é traduzido?
O modelo traduz a faixa de áudio do vídeo. As informações visuais melhoram a precisão da tradução.
Por exemplo, se o áudio disser "Isso é uma máscara":
- Se o vídeo mostrar uma máscara cirúrgica, o modelo traduzirá como "Isso é uma máscara cirúrgica".
- Caso o vídeo exiba uma máscara de baile, a tradução será "Isso é uma máscara de baile".
Referência da API
Para obter detalhes completos sobre os parâmetros de entrada e saída, consulte Tradução de áudio e vídeo - Qwen.