文本翻译

本文主要介绍文本翻译的AI能力和实现方式。

文本翻译是将语音转文字的内容进行不同语种的转换,可支持中、英、日、韩、德、法、俄语间的双向实时互译和音视频文件翻译。打破沟通屏障,降低跨国交流与资料学习的门槛。实时语音翻译价格优惠、延迟低,是极具性价比的服务。

请求参数

参数名

类型

说明

TranslationEnabled

boolean

默认为false。

Translation

object

翻译功能控制参数集合。

Translation.TargetLanguages

list[]

翻译目标语言设置。支持设置 中文(cn)、英语(en)、日语(ja)、韩语(ko)、德语(de)、法语(fr)、俄语(ru)。

在音视频文件转写场景下,目前只支持设置一个目标翻译语言。

示例设置

{
    "Input":{
        ...
    },
    "Parameters":{
        ...
        "TranslationEnabled":true,
        "Translation":{
            "TargetLanguages":[
                "en"
            ]
        },
        ...
    }
}

代码示例

#!/usr/bin/env python
#coding=utf-8

import os
import json
import datetime
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.auth.credentials import AccessKeyCredential

def create_common_request(domain, version, protocolType, method, uri):
    request = CommonRequest()
    request.set_accept_format('json')
    request.set_domain(domain)
    request.set_version(version)
    request.set_protocol_type(protocolType)
    request.set_method(method)
    request.set_uri_pattern(uri)
    request.add_header('Content-Type', 'application/json')
    return request

def init_parameters():
    root = dict()
    root['AppKey'] = '输入您在听悟管控台创建的Appkey'

    # 基本请求参数
    input = dict()
    input['SourceLanguage'] = 'cn'
    input['TaskKey'] = 'task' + datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    input['FileUrl'] = '输入待测试的音频url链接'
    root['Input'] = input

    # AI相关参数,按需设置即可
    parameters = dict()
    # 文本翻译控制相关
    parameters['TranslationEnabled'] = True
    translation = dict()
    translation['TargetLanguages'] = ['en'] # 假设翻译成英文
    parameters['Translation'] = translation
    root['Parameters'] = parameters
    return root

body = init_parameters()
print(body)

# TODO  请通过环境变量设置您的 AccessKeyId 和 AccessKeySecret
credentials = AccessKeyCredential(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
client = AcsClient(region_id='cn-beijing', credential=credentials)

request = create_common_request('tingwu.cn-beijing.aliyuncs.com', '2023-09-30', 'https', 'PUT', '/openapi/tingwu/v2/tasks')
request.add_query_param('type', 'offline')

request.set_content(json.dumps(body).encode('utf-8'))
response = client.do_action_with_exception(request)
print("response: \n" + json.dumps(json.loads(response), indent=4, ensure_ascii=False))
package com.alibaba.tingwu.client.demo.aitest;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.Test;

/**
 * @author tingwu2023
 */
public class TranslationTest {

    @Test
    public void testTranslate() throws ClientException {
        CommonRequest request = createCommonRequest("tingwu.cn-beijing.aliyuncs.com", "2023-09-30", ProtocolType.HTTPS, MethodType.PUT, "/openapi/tingwu/v2/tasks");
        request.putQueryParameter("type", "offline");

        JSONObject root = new JSONObject();
        root.put("AppKey", "输入您在听悟管控台创建的Appkey");
        JSONObject input = new JSONObject();
        input.fluentPut("FileUrl", "输入待测试的音频url链接")
                .fluentPut("SourceLanguage", "cn")
                .fluentPut("TaskKey", "task" + System.currentTimeMillis());
        root.put("Input", input);

        JSONObject parameters = new JSONObject();

        // 翻译
        parameters.put("TranslationEnabled", true);
        JSONObject translation = new JSONObject();
        JSONArray langArry = new JSONArray();
        // 设置目标翻译语言是 英文
        langArry.add("en");
        translation.put("TargetLanguages", langArry);
        parameters.put("Translation", translation);

        root.put("Parameters", parameters);
        System.out.println(root.toJSONString());
        request.setHttpContent(root.toJSONString().getBytes(), "utf-8", FormatType.JSON);

        // TODO 请通过环境变量设置您的AccessKeyId、AccessKeySecret
        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        IAcsClient client = new DefaultAcsClient(profile);
        CommonResponse response = client.getCommonResponse(request);
        System.out.println(response.getData());
    }
    public static CommonRequest createCommonRequest(String domain, String version, ProtocolType protocolType, MethodType method, String uri) {
        // 创建API请求并设置参数
        CommonRequest request = new CommonRequest();
        request.setSysDomain(domain);
        request.setSysVersion(version);
        request.setSysProtocol(protocolType);
        request.setSysMethod(method);
        request.setSysUriPattern(uri);
        request.setHttpContentType(FormatType.JSON);
        return request;
    }
}

示例输出

{
    "Code":"0",
    "Data":{
        "TaskId":"7f849f3f85ec4cc0acez3********",
        "TaskStatus":"COMPLETED",
        "Result":{
            "Translation":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/7f849f3f85ec4cc0ace53bf275166882/7f849f3f85ec4cc0ace53bf275166882_Translation_20231031141959.json?Expires=1698819737&OSSAccessKeyId=LTAI4G********Hj6oX8nt5S&Signature=N%2FjNy********brEmy6Ru5vJm0%3D",
            "Transcription":"http://speech-swap.oss-cn-zhangjiakou.aliyuncs.com/tingwu_data/output/1738248129743478/7f849f3f85ec4cc0ace53bf275166882/7f849f3f85ec4cc0ace53bf275166882_Transcription_20231031141952.json?Expires=1698819737&OSSAccessKeyId=LTAI4G*********Hj6oX8nt5S&Signature=yatEu*********UQ%2F%2Ba38fCHlw4%3D"
        }
    },
    "Message":"success",
    "RequestId":"c88c8ae0-93c9-4d01-b0dd-d8********"
}

其中Translation字段对应的即为文本翻译结果的http url下载链接。

协议解析

上述输出中的翻译结果url中的内容为JSON格式的报文,示例如下所示。

{
    "TaskId":"7f849f3f85ec4cc0ace53bf27********",
    "Translation":{
        "Paragraphs":[
            {
                "ParagraphId":"1698733191989500000",
                "Sentences":[
                    {
                        "SentenceId":1,
                        "Start":70,
                        "End":1780,
                        "Text":"There will be no Internet companies in the future. "
                    }
                ]
            }
        ]
    }
}

具体字段定义如下。

参数名

类型

说明

TaskId

string

创建任务时生成的TaskId。

Translation

object

翻译结果对象。

Translation.Paragraphs

list[]

翻译结果以段落形式组织的集合,和语音识别结果报文对应。

Translation.Paragraphs.ParagraphId

string

段落分段id标识,和语音识别结果中的ParagraphId对应。

Translation.Paragraphs.Sentences

list[]

翻译文本集合。

Translation.Paragraphs.Sentences[i].SentenctId

long

句子id。

Translation.Paragraphs.Sentences[i].Start

long

该段相对于音频起始时间的开始时间,相对时间戳,单位毫秒。

Translation.Paragraphs.Sentences[i].End

long

该段相对于音频起始时间的结束时间,相对时间戳,单位毫秒。

Translation.Paragraphs.Sentences[i].Text

string

翻译文本,和语音识别结果报文对应。

常见问题

翻译功能在什么场景下可以调用?

  • 您可以在创建音视频文件离线转写时,直接设置;

  • 您也可以在离线转写或实时会议结束后,再次发起重跑任务请求(必须基于同一个TaskId)。