1. 概述

机器翻译技术(Machine Translation),简称MT,是利用计算机将一种自然语言转换为另一种自然语言的过程。灵云MT技术,支持中英互译,维汉互译。

本文档旨在讲解如何快速地集成灵云MT功能到开发者应用中。关于各服务接口更详细的说明,请参考灵云SDK开发手册。在集成过程中如有疑问,可登录灵云开发者论坛,查找答案或与其他开发者交流。

1.1 概念解释

名称 说明
Session Session用来标记一个能力运行过程的上下文。一个应用最多可同时创建的Session数受到授权的限制
云端翻译 由云端服务器提供翻译结果的方式。使用云端能力需要加上hci_mt_cloud_tran模块

1.2 能力定义(capkey)

  • 云端能力
capkey 说明
mt.cloud.en2cn 翻译-英译汉
mt.cloud.cn2en 翻译-汉译英
mt.cloud.cn2uy 翻译-汉译维
mt.cloud.uy2cn 翻译-维译汉

1.3 识别流程

2. MT能力使用说明

2.1 准备工作

下载机器翻译SDK并解压缩。

2.2 使用Android版SDK

2.2.1 库目录文件介绍

  • 必选模块

    • libhci_curl.so
    • libhci_sys.so
    • libhci_sys_jni.so
    • libstlport_shared.so
    • libhci_mt.so
    • libhci_mt_jni.so
  • 云端识别

    • libhci_mt_cloud_trans.so
  • 本地识别

    • 暂不支持

2.2.2 添加用户权限

在工程 AndroidManifest.xml 文件中添加如下权限。

  <!--通常需要设置一些sd卡路径(例如日志路径)为可写,因此需要能够写外部存储 -->

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  <!--以下访问网络的权限均需要打开-->

  <!--连接网络权限,用于执行云端能力 -->
  <uses-permission android:name="android.permission.INTERNET" />
  <!--读取网络信息状态 -->
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <!--获取当前wifi状态 -->
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <!--允许程序改变网络连接状态 -->
  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  <!--读取手机信息权限 -->
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

  <!--以下访问权限可选-->

  <!--手机定位信息-->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

2.3 使用C++版SDK

  • 必选模块

    • hci_sys.dll
    • libhci_curl.dll
    • hci_mt.dll
  • 云端识别

    • hci_mt_cloud_recog.dll
  • 本地识别

    • 暂不支持

2.4 使用iOS版SDK

  • 必选模块

    • libcurl_device_simulator_iOS5.1.1.a
    • libhci_sys_device_simulator_iOS5.1.1.a
    • libhci_mt_device_simulator_iOS5.1.1.a
  • 云端识别

    • libhci_mt_cloud_trans_device_simulator_iOS5.1.1.a
  • 适配器选择(只选其一)

    • libhci_mt_only_cloud_adapter_device_simulator_iOS5.1.1.a(只使用云端能力)

3. MT能力集成说明

本章节主要讲述MT能力的集成过程,开发者可根据本章内容完成MT能力的简单调用。本章节以云端识别为例讲述MT能力的集成调用流程,调用顺序参考识别流程

3.1 通用模块初始化

在调用MT能力之前,需要初始化灵云SDK的SYS通用模块。详见灵云SDK开发手册

Android示例代码

// 创建初始化参数辅助类
InitParam initparam = new InitParam();
// 授权文件所在路径,此项必填
String authDirPath = context.getFilesDir().getAbsolutePath();;
initparam.addParam(InitParam.AuthParam.PARAM_KEY_AUTH_PATH, authDirPath);
// 灵云云服务的接口地址,此项必填
initparam.addParam(InitParam.AuthParam.PARAM_KEY_CLOUD_URL, "http://api.hcicloud.com:8888");
// 开发者密钥,此项必填,由捷通华声提供
initparam.addParam(InitParam.AuthParam.PARAM_KEY_DEVELOPER_KEY, "01234567890");
// 应用程序序号,此项必填,由捷通华声提供
initparam.addParam(InitParam.AuthParam.PARAM_KEY_APP_KEY, "1234abcd");
// 日志的路径,可选,如果不传或者为空则不生成日志
String logDirPath = "/storage/emulated/0/sinovoice/com.sinovoice.example/log";
initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_FILE_PATH, logDirPath);
//日志等级,0=无,1=错误,2=警告,3=信息,4=细节,5=调试
//SDK将输出小于等于logLevel的日志信息
initparam.addParam(InitParam.LogParam.PARAM_KEY_LOG_LEVEL, "5");
// 灵云系统初始化
// 第二个参数在Android平台下,必须为当前的Context
int errCode = HciCloudSys.hciInit(initparam.getStringConfig(), this);
if(errCode != HciErrorCode.HCI_ERR_NONE) {
    // "系统初始化失败"
    return;
}

C++示例代码

HCI_ERR_CODE err_code = HCI_ERR_NONE;
//配置串是由"字段=值"的形式给出的一个字符串,多个字段之间以','隔开。字段名不分大小写。
string init_config = "";
//灵云应用序号
init_config += "appKey=1234abcd";
//灵云开发者密钥
init_config += ",developerKey=1234567890";
//灵云云服务的接口地址
init_config += ",cloudUrl=http://api.hcicloud.com:8888";
//授权文件所在路径,保证可写
init_config += ",authpath=../../bin";
//日志的路径
init_config += ",logfilepath=../../bin";
//日志的等级
init_config += ",loglevel=5";
//日志文件的大小
init_config += ",logfilesize=512";
//其他配置使用默认值,不再添加,如果想设置可以参考开发手册
err_code = hci_init( init_config.c_str() );

iOS示例代码

HCI_ERR_CODE errCode = HCI_ERR_NONE;
// appkey, developerKey, cloudUrl, authPath为必填项。
// 其他可配置信息请查询灵云SDK开发手册hci_init函数说明。
NSString *appkey = @"";           //开发者社区申请所得
NSString *developerKey = @"";     //开发者社区申请所得
NSString *cloudUrl = @"";         //开发者社区申请所得
NSString *authPath = @"";         //授权文件所在路径,一般设置为沙盒Document路径
NSString *config = [NSString stringWithFormat:@"appkey=%@,
                                                developerKey=%@,
                                                cloudUrl=%@,
                                                authPath=%@",
                                                appkey,
                                                developerKey,
                                                cloudUrl, 
                                                authPath];
errCode = hci_init(config.UTF8String);
if (errCode != HCI_ERR_NONE && errCode != HCI_ERR_SYS_ALREADY_INIT) {
    NSLog(@"hci_init failed, error: %d", errCode);
} else {
     NSLog(@"hci_init success");
}

常见errcode,详见灵云SDK开发手册

3.2 授权检测

在初始化灵云SDK的通用模块后,还需要调用授权检测函数获取云端授权。

Android示例代码

// 获取授权
private int checkAuthAndUpdateAuth() {
    // 获取系统授权到期时间
    int initResult;
    AuthExpireTime objExpireTime = new AuthExpireTime();
    initResult = HciCloudSys.hciGetAuthExpireTime(objExpireTime);
    if (initResult == HciErrorCode.HCI_ERR_NONE) {
        // 显示授权日期,如用户不需要关注该值,此处代码可忽略
        Date date = new Date(objExpireTime.getExpireTime() * 1000);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.CHINA);
        Log.i(TAG, "expire time: " + sdf.format(date));

        if (objExpireTime.getExpireTime() * 1000 > System.currentTimeMillis()) {
            Log.i(TAG, "checkAuth success");
            return initResult;
        }
    }

    // 获取过期时间失败或者已经过期
    initResult = HciCloudSys.hciCheckAuth();
    if (initResult == HciErrorCode.HCI_ERR_NONE) {
        Log.i(TAG, "checkAuth success");
        return initResult;
    } else {
        Log.e(TAG, "checkAuth failed: " + initResult);
        return initResult;
    }
}

C++示例代码

//获取过期时间
int64 expire_time;
int64 current_time = (int64)time( NULL );
HCI_ERR_CODE err_code = hci_get_auth_expire_time( &expire_time );
if( err_code == HCI_ERR_NONE )
{
    //获取成功则判断是否过期
    if( expire_time > current_time )
    {
        //没有过期
        printf( "auth can use continue\n" );
        return true;
    }
}
//获取过期时间失败或已经过期
//手动调用更新授权
err_code = hci_check_auth();
if( err_code == HCI_ERR_NONE )
{
    //更新成功
    printf( "check auth success \n" );
    return true;
}
else
{
    //更新失败
    printf( "check auth return (%d)\n", err_code);
    return false;
}

iOS示例代码

//获取过期时间
int64 expireTime;
int64 currentTime = (int64)time(NULL);
HCI_ERR_CODE errCode = hci_get_auth_expire_time(&expireTime);
if (errCode == HCI_ERR_NONE) {
    if (expireTime < currentTime) {
        errCode = hci_check_auth();
        if(errCode == HCI_ERR_NONE){
            NSLog(@"check auth success");
            return YES;
        }else{
            NSLog(@"check auth failed, error: %@", errCode);
            return NO;
        }
    }else{
        //没有过期
        NSLog(@"auth can use continue");
        return YES;
    }
}
//读取授权文件出现错误
else if(errCode == HCI_ERR_SYS_AUTHFILE_INVALID){
    errCode = hci_check_auth();
    if(errCode == HCI_ERR_NONE){
        NSLog(@"check auth success");
        return YES;
    }else{
        NSLog(@"check auth failed, error: %@", errCode);
        return NO;
    }
}else{
    NSLog(@"check auth failed, error: %@", errCode);
    return NO;
}

3.3 MT初始化

在初始化灵通用模块和获取授权成功后,我们还需要调用初始化函数初始化MT能力。

  • Android代码 ```java MtInitParam mtInitParam = new MtInitParam(); //设置本地资源库的路径 MtInitParam.addParam(MtInitParam.PARAM_KEY_DATA_PATH, "/storage/emulated/0/sinovoice/com.sinovoice.example/data");

MtInitParam.addParam(MtInitParam.PARAM_KEY_INIT_CAP_KEYS, "mt.cloud.cn2en"); int errCode = HciCloudMt.hciMtInit(mtInitParam.getStringConfig());


* C++代码 

```cpp 
char * pszMtInitConfig = "dataPath=document/mt,initCapKeys=mt.cloud.cn2en";
errCode = hci_mt_init(pszMtInitConfig);
if (err_code != HCI_ERR_NONE)
{
    printf("hci_mt_init return (%d) \n",err_code);
    return;
}
printf( "hci_mt_init success\n" );

iOS示例代码

 //initCapKeys为必填项。其他可配置信息请查询开发手册hci_mt_init函数说明。
  NSString *initCapKeys = @"mt.cloud.cn2en";
  NSString *config = [NSString stringWithFormat:@"initCapKeys =%@", initCapKeys];
  HCI_ERR_CODE errCode = HCI_ERR_NONE;
  errCode = hci_mt_init(config.UTF8String);
  if (errCode != HCI_ERR_NONE){
      NSLog(@"hci_mt_init failed, error:%@", errCode);
      eturn NO;
  }
  NSLog(@"hci_mt_init success");
  return YES;

常见errcode,详见灵云SDK开发手册

对于使用本地多能力时,可以使用initCapKeys传入需要使用的所有能力,以';'隔开。 initCapKeys的作用是告知SDK,需要预先准备哪些能力并提前加载对应的库资源,提高执行效率。

以HWR能力为例:

Android示例代码

initParam.addParam(HwrInitParam.PARAM_KEY_INIT_CAP_KEYS, 
                   "hwr.local.letter;hwr.local.freestylus;hwr.local.associateword");

C++示例代码

//HWR 初始化
string hwr_init_config = "dataPath=";
hwr_init_config += data_path;
hwr_init_config += ",initCapkeys=";
hwr_init_config += "hwr.local.letter;hwr.local.freestylus;hwr.local.associateword";

iOS示例代码

//本地能力所需本地资源所在路径
NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:Nil];  
//initCapKeys为必填项。其他可配置信息请查询开发手册hci_hwr_init函数说明。
NSString *initCapKeys = @"hwr.local.letter;hwr.local.freestylus;hwr.local.associateword";
NSString *config = [NSString stringWithFormat:@"initCapKeys = %@,dataPath = %@", 
                    initCapKeys,dataPath];

3.4 开启会话(session)

MT 是通过会话(session)来管理识别过程的。在MT能力初始化成功之后,需要通过开启识别会话来完成识别。详见灵云SDK开发手册

  • Android代码

    MtConfig sessionConfig = new MtConfig();
    //调用具体能力需要相应的capkey
    sessionConfig.addParam(MtConfig.SessionConfig.PARAM_KEY_CAP_KEY, 
              "mt.cloud.cn2en");
    Session session = new Session();
    // 开始会话
    errCode = HciCloudMt.hciMtSessionStart(sessionConfig.getStringConfig(), 
              session);
    
  • C++代码

int nSessionId = 0;
//调用具体能力需要相应的capkey
char * pszSessionConfig = "capKey=mt.cloud.cn2en";
errCode = hci_mt_session_start(pszSessionConfig, &nSessionId);
if( err_code != HCI_ERR_NONE )
{
    printf( "hci_mt_session_start return (%d)\n", err_code);
    return false;
}

iOS示例代码

// 开启session
HCI_ERR_CODE errCode = HCI_ERR_NONE;
NSString *config = @"capKey=mt.cloud.cn2en";
int sessionID;            // 开启会话成功后,会返回的会话ID
errCode = hci_mt_session_start(config.UTF8String, &sessionID);
if (errCode != HCI_ERR_NONE){
    NSLog(@"hci_mt_session_start failed, error:%@", errCode);
    return NO;
}
NSLog(@"hci_mt_session_start success");
return YES;

3.5 翻译

在启动会话(session)成功后,即可可以进行 MT 识别过程。识别功能通过调用识别函数完成。配置参数详见灵云SDK开发手册

Android示例代码

MtTransResult mtResult = new MtTransResult();
errCode = HciCloudMt.hciMtTrans(session, "今天天气真好","", mtResult);
if (errCode == HciErrorCode.HCI_ERR_NONE) {
    if (transResult.getTransResult() != null) {
        //翻译结果
        String utf8 = transResult.getTransResult();
    }
}

C++示例代码

MT_TRANS_RESULT mtResult;   
//翻译,这里使用默认配置,请参见开发手册
string pszRecogConfig = "";
string transText = "今天天气真好。";
errCode = hci_mt_trans(sessionId,(char *)transText.c_str(),
            pszRecogConfig.c_str(), &mtResult);
if (errCode != HCI_ERR_NONE) {
    printf("hci_mt_trans failed, error:%d", errCode);
}else{
    printf@("识别结果:%s",mtResult.pszText);
    errCode = hci_mt_free_trans_result(&mtResult);
}
errCode = hci_mt_session_stop(sessionId);
if (errCode != HCI_ERR_NONE)
{
    printf("hci_mt_session_stop return (%d)",errCode);
}

iOS示例代码


MT_TRANS_RESULT mtResult;   
//翻译,这里使用默认配置,请参见开发手册
NSString *pszRecogConfig = @"";
NSString *transText = @"今天天气真好。";
errCode = hci_mt_trans(sessionId,(char *)transText.UTF8String,
                        pszRecogConfig.UTF8String, &mtResult);
if (errCode != HCI_ERR_NONE) {
    NSLog(@"hci_mt_trans failed, error:%d", errCode);
}else{
    NSLog@(@"识别结果:%@",[NSString stringWithCString:mtResult.pszText 
                                            encoding:NSUTF8StringEncoding]);
    errCode = hci_mt_free_trans_result(&mtResult);
}
errCode = hci_mt_session_stop(sessionId);
if (errCode != HCI_ERR_NONE){
    NSLog(@"hci_mt_session_stop return (%d)",errCode);
}

常见errcode,详见灵云SDK开发手册

3.6 结束识别

最后我们需要反初始化,依次关闭会话,终止 MT 能力,关闭灵云系统。

Android示例代码

//关闭MT识别会话
//session为已开启的会话
errCode = HciCloudMt.hciMtSessionStop(session);
//终止MT能力
errCode = HciCloudMt.hciMtRelease();
//终止灵云系统
errCode = HciCloudSys.hciRelease();

C++示例代码

//关闭MT识别会话
errCode = hci_mt_session_stop(nSessionId);
//终止MT能力
errCode = hci_mt_release();
//终止灵云系统
errCode = hci_release();

iOS示例代码

//结束session后,调用hci_mt_release和hci_release函数结束能力调用
HCI_ERR_CODE errCode = HCI_ERR_NONE;
errCode = hci_mt_session_stop(sessionID);  //sessionID:已经开启的会话的sessionID
if (errCode != HCI_ERR_NONE){
    NSLog(@"hci_mt_session_stop failed, error:%@", errCode);
    return NO;
}
NSLog(@"hci_mt_session_stop success");
errCode  = hci_mt_release();
if (errCode != HCI_ERR_NONE){
    NSLog(@"hci_mt_release failed, error:%@", errCode);
    return NO;
}
NSLog(@"hci_mt_release success");
errCode  = hci_release();
if (errCode != HCI_ERR_NONE){
    NSLog(@"hci_release failed, error:%@", errCode);
    return NO;
}
NSLog(@"hci_release success");
return YES;

常见errcode,详见灵云SDK开发手册

4. FAQ

Q: 我运行你们的 SDK 报 19 号错误:START LOG FAILED, 应该如何解决? A: 出现此问题,一般由两种原因造成。

工程文件里引入了中文路径,导致SDK启动时,读写对应的日志路径报错。 日志文件定义的路径由于权限问题不可读写,比如在 Android 平台上运行时,没有 WRITE_EXTERNAL_STORAGE的权限。

Q: 我运行你们的 SDK 报 11 号错误:SERVICE_RESPONSE_FAILED ,应该如何解决? A: 此问题原因较为复杂,可能是传入的参数问题与服务器不匹配,如调用私有云时,没有传入 property 等配置项。也可能是服务端内部的返回原因,请联系技术支持排查。

Q: 我运行你们的SDK报 7 号错误:CONFIG_UNSUPPORT ,应该如何解决? A: 与 11号错误类似,还是配置串问题,7 号错误原因为传入了不支持的配置串。请仔细检查各接口传入的所有配置串,并联系技术支持排查。

Q: 我运行你们的SDK报 9 号错误: SERVICE_TIMEOUT ,应该如何解决? A: 这个是因为您请求我们服务器到返回结果的时间,超过了上限。请检查网络环境相关的原因,并协助提供日志。

Q: 我运行你们的 SDK 报 16 号错误: SESSION_INVALID ,应该如何解决? A: 这个需要检查详细的代码调用过程,调用每个能力核心接口时,都是需要传入 sessionid 的,如果在 sessionstart 的时候,已经发生了错误,或者使用的id,并不是 sessionstart 时候创建的,就会返回此错误,请联系技术支持排查。

Q: 我运行你们的 SDK 报 0 号错误: ERROR NONE,应该如何解决? A: SDK 报 0 号错误, ERROR NONE,代表执行成功,请您继续后续的集成。

results matching ""

    No results matching ""