接口说明

SDK目录结构

目录名

内容说明

example

model

  1. 存放SDK中需要的翻译模型

  2. 存放鉴权需要的文件,需保证model目录可写

  3. 存放用户自定义的翻译记忆库和干预文件

├── model

│ ├── alitranxmvf // 模型文件

│ ├── alitranxmvfsse // 模型文件

│ ├── alitranxmvfste // 模型文件

│ ├── alitranxst // 模型文件

│ ├── force.dict.user // 用户自定义术语干预词典

│ └── sent_memory.dict.user // 用户自定义翻译记忆库

├── lib

│ └── libalitranx.en2zh.x86.so // 离线翻译动态库

├── demo

│ ├── demo // 离线翻译demo可执行程序

│ ├── demo_test.in.en // 离线翻译demo测试输入文件

│ ├── index_builder // 用于构建术语干预索引的工具

│ ├── Makefile // 离线翻译demo编译makefile参考

│ ├── trans_demo.cpp // 离线翻译调用demo程序

│ └── translator_interface.h // 离线翻译头文件

└── doc

└── readme.pdf // 离线翻译SDK使用说明

lib

  1. 存放SDK对应程序动态库

demo

  1. 存放离线翻译头文件

  2. 存放离线翻译调用示例程序

  3. 存放离线翻译调用编译命令示例makefile

  4. 存放离线翻译调用测试输入

  5. 存放离线翻译调用demo可执行程序,需要根据具体环境重新编译

  6. 存放术语干预索引构建工具

doc

  1. 存放离线翻译SDK使用说明文档

SDK集成流程

  1. 下载SDK到本地并解压,下载链接:SDK下载

  2. 申请SDK设备授权,具体授权激活方法参见 开通授权

  3. 编写应用程序

-> 3.1 接口参数说明:(详细接口定义在translator_interface.h)

接口名

参数名

参数类型

参数说明

是否必须

init

初始化接口

ak_id

string

授权校验阿里云账号AccessKey ID,获取方式请参见 开通授权

ak_secret

string

授权校验阿里云账号AccessKey Secret,获取方式请参见 开通授权

app_key

string

授权校验Appkey,获取方式请参见 开通授权

model_path

string

模型文件路径,需要保证路径下有源语向到目标语向所需要的模型文件

thread_count

int

翻译计算的线程数,一般不超过cpu核数,默认为1

translate

翻译接口

input

string

翻译原文

result

string

翻译译文

-> 3.2 集成步骤:

step1: Load translate library
        
void* 
 handle  
= 
 dlopen(trans_lib_path.c_str(), RTLD_LAZY);

step2: Create translator instance
       alitranx::CreateTranslatorInsFunc* create_translator_ins = 
                            (alitranx::CreateTranslatorInsFunc*)dlsym(handle, "create_translator");
       alitranx::TranslatorInterface* translator = create_translator_ins();   

step3: Init translator
           translator->init(ak_id, ak_secret, app_key, model_path, thread_count);

step4: Do translate
       translator->translate(input, result);

step5: Destroy translator
       alitranx::DestroyTranslatorInsFunc* destroy_translator_ins = 
                            (alitranx::DestroyTranslatorInsFunc*)dlsym(handle, "destroy_translator");

step6: Close translate library
       dlclose(handle);

step7: Compile
       g++ -std=c++11 demo.cpp -O3 -lpthread -ldl -o demo

-> 3.3 demo程序参考:

#include <iostream>
#include <fstream>
#include <dlfcn.h>
#include <vector>
#include "translator_interface.h"

int main(int argc, char* argv[]) {
    if (argc != 7) {
      std::cout << "Arguments Error! You must give six arguments!" << std::endl;
      std::cout << "argument 1: ak_id. eg: ABCD" << std::endl;
      std::cout << "argument 2: ak_secret. eg: ABCD" << std::endl;
      std::cout << "argument 3: app_key. eg: ABCD" << std::endl;
      std::cout << "argument 4: model_path. eg: ./model" << std::endl;
      std::cout << "argument 5: the path for lib. eg: ../lib/libalitranx.en2zh.x86.so" << std::endl;
      std::cout << "argument 6: the path for test_input_file. eg: ./demo_test.in" << std::endl;
      return -1;
    }

    std::string ak_id = argv[1];
    std::string ak_secret = argv[2];
    std::string app_key = argv[3];
    std::string model_path = argv[4];
    std::string trans_lib_path = argv[5];
    std::string test_file_path = argv[6];

    // step1: Load translate library
    void* handle = dlopen(trans_lib_path.c_str(), RTLD_LAZY);
    if (!handle) {
        std::cout << "dlopen " <<  trans_lib_path << " failed" << dlerror();
        return -1;
    }

    // step2: Create translator instance
    alitranx::CreateTranslatorInsFunc* create_translator_ins =
      (alitranx::CreateTranslatorInsFunc*)dlsym(handle, "create_translator");
    char* dlsym_error = dlerror();
    if (dlsym_error)  {
        std::cout << "create_translator_ins dlsym error, " << dlsym_error << std::endl;
        return -1;
    }
    alitranx::TranslatorInterface* translator = create_translator_ins();

    int thread_count = 2;

    // step3: Init translator
    if (translator->init(
          ak_id,
          ak_secret,
          app_key,
          model_path,
          thread_count) == false) {
        std::cout << "Init Failed" << std::endl;
        return -1;
    }

    std::ifstream in;
    in.open(test_file_path, std::ios::in);
    if (!in.is_open()) {
      std::cout <<  "open test file fail, path: " << test_file_path << std::endl;
      return -1;
    }

    std::vector<std::string> inputs;
    std::string line;
    while (getline(in, line)) inputs.push_back(line);
    in.close();

    // step4: Do translate
    for (auto input : inputs) {
        std::string result;
        if (translator->translate(input, result) == false) {
            std::cout << "translate failed for input: " << input << std::endl;
            return -1;
        }

                                std::cout << result << std::endl;
    }

    // step5: Destroy translator
    alitranx::DestroyTranslatorInsFunc* destroy_translator_ins =
      (alitranx::DestroyTranslatorInsFunc*)dlsym(handle, "destroy_translator");
    dlsym_error = dlerror();
    if (dlsym_error)  {
        std::cout << "destroy_translator_ins dlsym error, " << dlsym_error << std::endl;
        return -1;
    }
    destroy_translator_ins(translator);

    // step6: Close translate library
    dlclose(handle);
    return 0;
}

SDK用户翻译干预

自定义翻译记忆库干预

翻译记忆库功能允许用户自行上传翻译原文和给定的译文,当翻译系统接收到的输入已经存在于翻译记忆库中时,翻译系统会不进行机器翻译, 而是直接返回翻译记忆中的译文。翻译记忆库的文件位置model/sent_memory.dict.user,其内容格式为:原文\t译文。修改完该文件后,重新初始化SDK即可生效。

自定义术语干预

术语干预的文件位置为model/force.dict.user,其内容格式为:术语原文\t译文。当用户需要更改术语时,可以按照该格式准备好文件替换原先路径下的force.dict.user,然后通过SDK自带的索引构建工具demo/index_builder构建干预索引,构建完成后,重新初始化SDK生效。

注意:

a. 每个SDK都在demo目录里有专属对应的索引构建工具,并不适用于其他SDK.

b. 修改的术语文件必须要构建索引才能生效。

c. 术语干预的原理为通过给定术语译文与原机翻译文的对比和计算,让术语翻译出现在机翻译文中,视机翻译文和原译文的差异大小,有可能会导致干预后结果存在错乱; 此外,术语干预仅适用于专有实体名词,对于其他类别的词进行干预也有可能存在造成一定的翻译错乱问题。

阿里云首页 机器翻译 相关技术圈