千问图像翻译.md 18 KB

百炼平台千问图像翻译API调用指南

模型概述

通义千问-图像翻译模型(Qwen-MT-Image)可精准翻译图像中的文字,并保留原始排版。该模型还支持领域提示、敏感词过滤、术语干预等自定义功能。

重要提示:本文档仅适用于"中国大陆(北京)"地域,且必须使用该地域的API Key。

模型特点

  • 精准翻译图像中的文字
  • 保留原始排版格式
  • 支持领域提示
  • 支持敏感词过滤
  • 支持术语干预
  • 支持主体识别(可选择是否翻译主体上的文字)

模型定价

模型名称 计费单价 任务下发接口RPS限制 同时处理中任务数量
qwen-mt-image $0.000431/张 1 2

计费规则

  • 按成功生成的图像张数计费
  • 当任务成功(task_statusSUCCEEDED)并成功生成图像后,会计费
  • 如果图像中无可翻译文本,或在启用主体识别功能后,非主体部分无文字时,任务仍会成功正常计费,此时接口会返回No text detected for translation的提示

支持的语种

进行图像翻译时,源语种或目标语种必须至少有一种是中文或英文。不支持在两个非中、英语种之间直接翻译(例如,从日语翻译为韩语)。

语种(中文名) 英文全称 编码 支持作为源语种 支持作为目标语种
简体中文 Chinese zh
英文 English en
韩语 Korean ko
日语 Japanese ja
俄语 Russian ru
西班牙语 Spanish es
法语 French fr
葡萄牙语 Portuguese pt
意大利语 Italian it
德语 Germany de
越南语 Vietnamese vi
马来语 Malay ms
泰语 Thai th
印尼语 Indonesian id
阿拉伯语 Arabian ar

提示:若不确定源语种,可将source_lang设置为auto进行自动检测。

API调用流程

由于图像翻译耗时较长,API采用异步模式,调用流程分两步:

  1. 创建任务获取任务ID:发送请求创建任务,返回任务ID(task_id)
  2. 根据任务ID查询结果:使用task_id轮询任务状态,直到任务完成并获得图像URL

步骤1:创建任务

接口地址

POST https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/image-synthesis

请求头

  • Content-Type: application/json(必选)
  • Authorization: Bearer {API_KEY}(必选)
  • X-DashScope-Async: enable(必选,缺少此请求头将报错)

请求参数

参数名 类型 必选 说明
model string 模型名称,固定为qwen-mt-image
input object 输入参数对象
input.image_url string 图像的公网可访问URL(支持HTTP/HTTPS)
input.source_lang string 源语种(支持语种全称、编码或auto
input.target_lang string 目标语种(支持语种全称或编码)
input.ext object 扩展字段
input.ext.domainHint string 领域提示(仅支持英文,不超过200个单词)
input.ext.sensitives array 敏感词列表(完全匹配,对大小写敏感)
input.ext.terminologies array 术语干预列表
input.ext.config object 配置参数
input.ext.config.skipImgSegment bool 是否跳过主体检测(默认false)

图像要求

  • 格式:JPG、JPEG、PNG、BMP、PNM、PPM、TIFF、WEBP
  • 尺寸:宽度和高度均需在15-8192像素范围内,宽高比在1:10至10:1范围内
  • 大小:不超过10MB
  • URL中包含中文等非ASCII字符需进行URL编码

Python示例

import os
import requests
import json

def create_image_translation_task(image_url, source_lang, target_lang):
    """
    创建图像翻译任务
    
    Args:
        image_url: 图像URL
        source_lang: 源语种
        target_lang: 目标语种
    
    Returns:
        task_id: 任务ID
    """
    api_key = os.getenv('DASHSCOPE_API_KEY')
    if not api_key:
        raise ValueError("请设置DASHSCOPE_API_KEY环境变量")
    
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/image-synthesis"
    
    headers = {
        'X-DashScope-Async': 'enable',
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json'
    }
    
    payload = {
        "model": "qwen-mt-image",
        "input": {
            "image_url": image_url,
            "source_lang": source_lang,
            "target_lang": target_lang
        }
    }
    
    response = requests.post(url, headers=headers, json=payload)
    
    if response.status_code == 200:
        result = response.json()
        task_id = result['output']['task_id']
        print(f"任务创建成功,task_id: {task_id}")
        return task_id
    else:
        print(f"任务创建失败: {response.text}")
        return None

# 使用示例
if __name__ == "__main__":
    image_url = "https://example.com/image.jpg"
    task_id = create_image_translation_task(
        image_url=image_url,
        source_lang="en",
        target_lang="zh"
    )

带扩展参数的示例

def create_advanced_translation_task(image_url, source_lang, target_lang, 
                                     domain_hint=None, sensitives=None, 
                                     terminologies=None, skip_img_segment=False):
    """
    创建带高级参数的图像翻译任务
    """
    api_key = os.getenv('DASHSCOPE_API_KEY')
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/image-synthesis"
    
    headers = {
        'X-DashScope-Async': 'enable',
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json'
    }
    
    payload = {
        "model": "qwen-mt-image",
        "input": {
            "image_url": image_url,
            "source_lang": source_lang,
            "target_lang": target_lang
        }
    }
    
    # 添加扩展参数
    ext = {}
    if domain_hint:
        ext["domainHint"] = domain_hint
    if sensitives:
        ext["sensitives"] = sensitives
    if terminologies:
        ext["terminologies"] = terminologies
    
    config = {}
    if skip_img_segment:
        config["skipImgSegment"] = skip_img_segment
    if config:
        ext["config"] = config
    
    if ext:
        payload["input"]["ext"] = ext
    
    response = requests.post(url, headers=headers, json=payload)
    
    if response.status_code == 200:
        result = response.json()
        return result['output']['task_id']
    else:
        print(f"任务创建失败: {response.text}")
        return None

# 使用示例
task_id = create_advanced_translation_task(
    image_url="https://example.com/image.jpg",
    source_lang="zh",
    target_lang="en",
    domain_hint="These sentences are from an e-commerce platform",
    sensitives=["全场9折", "七天无理由退换"],
    terminologies=[
        {"src": "应用程序接口", "tgt": "API"},
        {"src": "机器学习", "tgt": "ML"}
    ],
    skip_img_segment=False
)

响应示例

成功响应:

{
    "output": {
        "task_status": "PENDING",
        "task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
    },
    "request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}

失败响应:

{
    "code": "InvalidApiKey",
    "message": "Invalid API-key provided.",
    "request_id": "fb53c4ec-1c12-4fc4-a580-xxxxxx"
}

步骤2:查询任务结果

接口地址

GET https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}

请求头

  • Authorization: Bearer {API_KEY}(必选)

注意事项

  • 模型处理耗时约15秒,建议采用轮询机制,设置合理的查询间隔(如5秒)
  • task_id有效期为24小时,若ID不存在或已过期,任务状态将返回UNKNOWN
  • 任务成功后返回的url有效期为24小时,请及时下载并保存图像

Python示例

import time

def query_task_result(task_id, max_retries=60, interval=5):
    """
    查询任务结果
    
    Args:
        task_id: 任务ID
        max_retries: 最大重试次数
        interval: 查询间隔(秒)
    
    Returns:
        result: 任务结果
    """
    api_key = os.getenv('DASHSCOPE_API_KEY')
    url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}"
    
    headers = {
        'Authorization': f'Bearer {api_key}'
    }
    
    for i in range(max_retries):
        response = requests.get(url, headers=headers)
        
        if response.status_code == 200:
            result = response.json()
            task_status = result['output']['task_status']
            
            print(f"查询第{i+1}次,任务状态: {task_status}")
            
            if task_status == 'SUCCEEDED':
                print("任务执行成功!")
                return result
            elif task_status == 'FAILED':
                print(f"任务执行失败: {result['output'].get('message', '未知错误')}")
                return result
            elif task_status in ['PENDING', 'RUNNING']:
                time.sleep(interval)
                continue
            else:
                print(f"未知任务状态: {task_status}")
                return result
        else:
            print(f"查询失败: {response.text}")
            return None
    
    print("查询超时")
    return None

# 使用示例
result = query_task_result(task_id)
if result and result['output']['task_status'] == 'SUCCEEDED':
    image_url = result['output']['image_url']
    print(f"翻译后的图像URL: {image_url}")

响应示例

成功响应:

{
    "request_id": "5fec62eb-bf94-91f8-b9f4-f7f758e4e27e",
    "output": {
        "task_id": "72c52225-8444-4cab-ad0c-xxxxxx",
        "task_status": "SUCCEEDED",
        "submit_time": "2025-08-13 18:11:16.954",
        "scheduled_time": "2025-08-13 18:11:17.003",
        "end_time": "2025-08-13 18:11:23.860",
        "image_url": "http://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxx?Expires=xxx"
    },
    "usage": {
        "image_count": 1
    }
}

失败响应:

{
    "request_id": "daad9007-6acd-9fb3-a6bc-d55902b9c9ff",
    "output": {
        "task_id": "fe8aa114-d9f1-4f76-b598-xxxxxx",
        "task_status": "FAILED",
        "submit_time": "2025-08-20 09:54:21.911",
        "scheduled_time": "2025-08-20 09:54:21.984",
        "end_time": "2025-08-20 12:55:00.818",
        "code": "InternalError",
        "message": "xxxxxx"
    }
}

完整示例

import os
import requests
import time

class QwenImageTranslator:
    """通义千问图像翻译客户端"""
    
    def __init__(self, api_key=None):
        self.api_key = api_key or os.getenv('DASHSCOPE_API_KEY')
        if not self.api_key:
            raise ValueError("请设置DASHSCOPE_API_KEY环境变量或传入api_key参数")
        
        self.base_url = "https://dashscope.aliyuncs.com/api/v1"
    
    def create_task(self, image_url, source_lang, target_lang, **kwargs):
        """创建翻译任务"""
        url = f"{self.base_url}/services/aigc/image2image/image-synthesis"
        
        headers = {
            'X-DashScope-Async': 'enable',
            'Authorization': f'Bearer {self.api_key}',
            'Content-Type': 'application/json'
        }
        
        payload = {
            "model": "qwen-mt-image",
            "input": {
                "image_url": image_url,
                "source_lang": source_lang,
                "target_lang": target_lang
            }
        }
        
        # 处理扩展参数
        ext = {}
        if 'domain_hint' in kwargs:
            ext["domainHint"] = kwargs['domain_hint']
        if 'sensitives' in kwargs:
            ext["sensitives"] = kwargs['sensitives']
        if 'terminologies' in kwargs:
            ext["terminologies"] = kwargs['terminologies']
        
        config = {}
        if 'skip_img_segment' in kwargs:
            config["skipImgSegment"] = kwargs['skip_img_segment']
        if config:
            ext["config"] = config
        
        if ext:
            payload["input"]["ext"] = ext
        
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        
        result = response.json()
        return result['output']['task_id']
    
    def query_task(self, task_id):
        """查询任务状态"""
        url = f"{self.base_url}/tasks/{task_id}"
        
        headers = {
            'Authorization': f'Bearer {self.api_key}'
        }
        
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        return response.json()
    
    def wait_for_result(self, task_id, max_retries=60, interval=5):
        """等待任务完成"""
        for i in range(max_retries):
            result = self.query_task(task_id)
            task_status = result['output']['task_status']
            
            print(f"查询第{i+1}次,任务状态: {task_status}")
            
            if task_status == 'SUCCEEDED':
                return result
            elif task_status == 'FAILED':
                raise Exception(f"任务失败: {result['output'].get('message', '未知错误')}")
            elif task_status in ['PENDING', 'RUNNING']:
                time.sleep(interval)
            else:
                raise Exception(f"未知任务状态: {task_status}")
        
        raise TimeoutError("任务查询超时")
    
    def translate_image(self, image_url, source_lang, target_lang, **kwargs):
        """翻译图像(一站式方法)"""
        # 创建任务
        task_id = self.create_task(image_url, source_lang, target_lang, **kwargs)
        print(f"任务创建成功,task_id: {task_id}")
        
        # 等待结果
        result = self.wait_for_result(task_id)
        
        return result['output']['image_url']
    
    @staticmethod
    def download_image(image_url, save_path):
        """下载图像到本地"""
        response = requests.get(image_url, stream=True, timeout=300)
        response.raise_for_status()
        
        with open(save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        
        print(f"图像已保存到: {save_path}")

# 使用示例
if __name__ == "__main__":
    translator = QwenImageTranslator()
    
    # 基础翻译
    translated_url = translator.translate_image(
        image_url="https://example.com/image.jpg",
        source_lang="en",
        target_lang="zh"
    )
    print(f"翻译后的图像URL: {translated_url}")
    
    # 下载图像
    translator.download_image(translated_url, "translated_image.jpg")
    
    # 高级翻译(带扩展参数)
    translated_url = translator.translate_image(
        image_url="https://example.com/image.jpg",
        source_lang="zh",
        target_lang="en",
        domain_hint="E-commerce product description",
        sensitives=["促销", "打折"],
        terminologies=[{"src": "人工智能", "tgt": "AI"}],
        skip_img_segment=False
    )

图像访问权限配置

图像存储于阿里云OSS,链接允许公开访问,仅在24小时内有效。如果业务系统因安全策略无法访问阿里云OSS链接,请将以下OSS域名加入网络访问白名单:

dashscope-result-bj.oss-cn-beijing.aliyuncs.com
dashscope-result-hz.oss-cn-hangzhou.aliyuncs.com
dashscope-result-sh.oss-cn-shanghai.aliyuncs.com
dashscope-result-wlcb.oss-cn-wulanchabu.aliyuncs.com
dashscope-result-zjk.oss-cn-zhangjiakou.aliyuncs.com
dashscope-result-sz.oss-cn-shenzhen.aliyuncs.com
dashscope-result-hy.oss-cn-heyuan.aliyuncs.com
dashscope-result-cd.oss-cn-chengdu.aliyuncs.com
dashscope-result-gz.oss-cn-guangzhou.aliyuncs.com
dashscope-result-wlcb-acdr-1.oss-cn-wulanchabu-acdr-1.aliyuncs.com

常见问题

Q: 如何将临时的图像链接转为永久链接?

A: 临时链接无法直接转为永久链接。需通过后端服务下载图像,再上传至对象存储服务(如阿里云OSS)以生成新的永久链接。

示例代码:

import requests

def download_and_save_image(image_url, save_path):
    try:
        response = requests.get(image_url, stream=True, timeout=300)
        response.raise_for_status()
        with open(save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"图像已成功下载到: {save_path}")
        # 此处可以接上传到永久存储的逻辑
    except requests.exceptions.RequestException as e:
        print(f"图像下载失败: {e}")

if __name__ == '__main__':
    image_url = "http://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxx?Expires=xxx"
    save_path = "image-translation.jpg"
    download_and_save_image(image_url, save_path)

Q: 如何查看模型调用量?

A: 模型调用完一小时后,请在模型观测页面,查看模型的调用次数、成功率等指标。

注意事项

  1. API Key配置:必须使用"中国大陆(北京)"地域的API Key
  2. 异步调用:必须在请求头中设置X-DashScope-Async: enable
  3. 任务有效期:task_id和图像URL有效期均为24小时
  4. 语种限制:源语种或目标语种必须至少有一种是中文或英文
  5. 图像要求:注意图像格式、尺寸和大小限制
  6. 计费规则:即使图像中无可翻译文本,任务成功后仍会计费
  7. 轮询间隔:建议设置5秒的查询间隔,避免频繁请求

参考资料