一、小牛翻译接口简介
图片翻译API
- 支持格式:png、jpg、jpeg、bmp
- 支持图片尺寸:128px*128px~2048px*2048px
- 支持最大图片大小:10M
- 支持的语种:中、英、日、韩、俄
语音翻译API
- 支持格式:MP3、WAV
- 支持语音时长:60s
- 支持最大文件大小:2M
- 支持的语种:中、英、日、韩、俄
如需要更多语种或更多API接口权限,可以联系小牛官网客服咨询。
备注
①小牛官网提供在线试用功能,可以查看翻译效果,满意再写代码调用。
②小牛官网,每个账号每天赠送100积分,相当于20万字符流量/34页文档页数/34张图片/25次语音翻译。在线和API调用都可使用。(每日自动到账,无需手动领取)
③如需使用文本翻译+文档翻译的API调用,可参考我之前的文章,里面有详细介绍:小牛翻译API接口的服务开通及使用JAVA进行接口调用实例演示_翻译软件是怎么调用翻译接口的-CSDN博客
二、如何调用
1.获取API KEY 和 APP ID
③找到所需的API服务【图片API/语音API】,点击【开通】按钮;
④即可获取对应的 APIKEY 和 APPID。
2.开始集成
可參考官网【图片翻译API开发文档】、【语音翻译API开发文档】。
值得一提的事,小牛是我发现唯一提供终止接口的翻译引擎提供商。文件在翻译过程中,如果停止翻译,不会扣除翻译额度。
三、JAVA集成实例
需要注意的点
1.译后文件类型
图片翻译 API 和语音翻译 API ,获取到翻译后的内容为文本,没有把译后内容直接生成图片或语音的接口。小牛提供的下载接口,图片下载的是docx,语音下载的是txt。
2.权限字符串
这个稍微麻烦些,不过官网开发文档里有详细的权限字符串生成规则可参考。
3.调用示例
官网有不同开发语言的调用示例可供参考。
图片翻译
代码展示
package com.niutrans.platform.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
@Slf4j
public class NiuTransImageApiDemoV2 {
public static String BASE_URL = "https://api.niutrans.com";
public static String UPLOAD_TRANS_URL = BASE_URL + "/v2/image/translate/upload";//上传并翻译接口
public static String GET_INFO_URL = BASE_URL + "/v2/image/translate/status/{file_no}";//获取进度接口
public static String INTERRUPT_URL = BASE_URL + "v2/image/translate/interrupt/{file_no}";// 终止翻译接口
public static String DOWNLOAD_URL = BASE_URL + "/v2/image/translate/download/{file_no}";//下载文件接口
public static String from = "原语语种,例如:zh";
public static String to = "目标语语种,例如:en";
public static String apikey = "您的apikey";//在'控制台->API应用'中查看
public static String appId = "您的appId";//应用唯一标识,在'控制台->API应用'中查看
public static String filePath = "D:\data\test.jpg";//替换为你要翻译的文件路径
public static String saveFilePath = "D:\data\";
public static void main(String[] args) {
String fileNo = uploadAndTrans();
JSONObject documentInfo = getDocumentInfo(fileNo);
while (Integer.parseInt(documentInfo.get("transStatus").toString()) == 103) {
documentInfo = getDocumentInfo(fileNo);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (Integer.parseInt(documentInfo.get("transStatus").toString()) == 105) {
downloadFile(fileNo);
}
}
//上传并翻译文件
public static String uploadAndTrans() {
TreeMap<String, Object> requestParamsMap = new TreeMap();
requestParamsMap.put("from", from);
requestParamsMap.put("to", to);
authStrGenerate(requestParamsMap);
requestParamsMap.put("file", new File(filePath));
String response = null;
try {
response = HttpUtil.post(UPLOAD_TRANS_URL, requestParamsMap);
} catch (Exception e) {
e.printStackTrace();
log.error("上传文档并翻译异常");
}
log.info("上传并翻译结果为:{}", response);
JSONObject jsonObject = JSONUtil.parseObj(response);
JSONObject dataObject = JSONUtil.parseObj(jsonObject.get("data"));
return dataObject.get("fileNo").toString();
}
//获取文件信息
public static JSONObject getDocumentInfo(String fileNo) {
TreeMap<String, Object> requestParamsMap = new TreeMap<>();
authStrGenerate(requestParamsMap);
String response = null;
GET_INFO_URL = GET_INFO_URL.replace("{file_no}", fileNo);
try {
response = HttpUtil.get(GET_INFO_URL, requestParamsMap);
} catch (Exception e) {
e.printStackTrace();
log.error("获取文档信息异常");
}
log.info("文档信息为:{}", response);
JSONObject jsonObject = JSONUtil.parseObj(response);
return JSONUtil.parseObj(JSONUtil.toJsonStr(jsonObject.get("data")));
}
//终止翻译中的文件
public static void interruptTrans(String fileNo) {
TreeMap<String, Object> requestParamsMap = new TreeMap<>();
authStrGenerate(requestParamsMap);
String body = null;
INTERRUPT_URL = INTERRUPT_URL.replace("{file_no}", fileNo);
final HttpRequest request = HttpUtil.createRequest(Method.PUT, INTERRUPT_URL);
request.form(requestParamsMap);
try (final HttpResponse httpResponse = request.execute()){
body = httpResponse.body();
} catch (Exception e) {
e.printStackTrace();
}
log.info("终止结果:{}", body);
}
//下载文件
public static void downloadFile(String fileNo) {
TreeMap<String, Object> requestParamsMap = new TreeMap();
requestParamsMap.put("type", 1);
authStrGenerate(requestParamsMap);
DOWNLOAD_URL = DOWNLOAD_URL.replace("{file_no}", fileNo);
String url = DOWNLOAD_URL + "?" + HttpUtil.toParams(requestParamsMap);
HttpUtil.downloadFile(url, FileUtil.file(saveFilePath));
}
//生成权限字符串
public static void authStrGenerate(TreeMap<String, Object> requestParamsMap) {
requestParamsMap.put("appId", appId);
requestParamsMap.put("apikey", apikey);
requestParamsMap.put("timestamp", System.currentTimeMillis() + "");
StringBuilder requestParamsStr = new StringBuilder("");
Set<String> keys = requestParamsMap.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
requestParamsStr.append("&").append(key).append("=").append(requestParamsMap.get(key));
}
String paramsStr = requestParamsStr.toString().replaceFirst("&", "");
requestParamsMap.put("authStr", SecureUtil.md5(paramsStr));
requestParamsMap.remove("apikey");
}
}
语音翻译
代码展示
package com.niutrans.platform.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
@Slf4j
public class NiuTransVoiceApiDemoV2 {
public static String BASE_URL = "https://api.niutrans.com";
public static String UPLOAD_TRANS_URL = BASE_URL + "/v2/voice/translate/short-voice/upload";//上传并翻译接口
public static String GET_INFO_URL = BASE_URL + "/v2/voice/translate/short-voice/status/{file_no}";//获取进度接口
public static String INTERRUPT_URL = BASE_URL + "v2/voice/translate/short-voice/interrupt/{file_no}";// 终止翻译接口
public static String DOWNLOAD_URL = BASE_URL + "/v2/voice/translate/short-voice/download/{file_no}";//下载文件接口
public static String from = "原语语种,例如:zh";
public static String to = "目标语语种,例如:en";
public static String apikey = "您的apikey";//在'控制台->API应用'中查看
public static String appId = "您的appId";//应用唯一标识,在'控制台->API应用'中查看
public static String filePath = "D:\data\test.mp3";//替换为你要翻译的文件路径
public static String saveFilePath = "D:\data\";
public static void main(String[] args) {
String fileNo = uploadAndTrans();
JSONObject documentInfo = getDocumentInfo(fileNo);
while (Integer.parseInt(documentInfo.get("transStatus").toString()) == 103) {
documentInfo = getDocumentInfo(fileNo);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (Integer.parseInt(documentInfo.get("transStatus").toString()) == 105) {
downloadFile(fileNo);
}
}
//上传并翻译文件
public static String uploadAndTrans() {
TreeMap<String, Object> requestParamsMap = new TreeMap();
requestParamsMap.put("from", from);
requestParamsMap.put("to", to);
authStrGenerate(requestParamsMap);
requestParamsMap.put("file", new File(filePath));
String response = null;
try {
response = HttpUtil.post(UPLOAD_TRANS_URL, requestParamsMap);
} catch (Exception e) {
e.printStackTrace();
log.error("上传文档并翻译异常");
}
log.info("上传并翻译结果为:{}", response);
JSONObject jsonObject = JSONUtil.parseObj(response);
JSONObject dataObject = JSONUtil.parseObj(jsonObject.get("data"));
return dataObject.get("fileNo").toString();
}
//获取文件信息
public static JSONObject getDocumentInfo(String fileNo) {
TreeMap<String, Object> requestParamsMap = new TreeMap<>();
authStrGenerate(requestParamsMap);
String response = null;
GET_INFO_URL = GET_INFO_URL.replace("{file_no}", fileNo);
try {
response = HttpUtil.get(GET_INFO_URL, requestParamsMap);
} catch (Exception e) {
e.printStackTrace();
log.error("获取文档信息异常");
}
log.info("文档信息为:{}", response);
JSONObject jsonObject = JSONUtil.parseObj(response);
return JSONUtil.parseObj(JSONUtil.toJsonStr(jsonObject.get("data")));
}
//终止翻译中的文件
public static void interruptTrans(String fileNo) {
TreeMap<String, Object> requestParamsMap = new TreeMap<>();
authStrGenerate(requestParamsMap);
String body = null;
INTERRUPT_URL = INTERRUPT_URL.replace("{file_no}", fileNo);
final HttpRequest request = HttpUtil.createRequest(Method.PUT, INTERRUPT_URL);
request.form(requestParamsMap);
try (final HttpResponse httpResponse = request.execute()) {
body = httpResponse.body();
} catch (Exception e) {
e.printStackTrace();
}
log.info("终止结果:{}", body);
}
//下载文件
public static void downloadFile(String fileNo) {
TreeMap<String, Object> requestParamsMap = new TreeMap();
requestParamsMap.put("type", 1);
authStrGenerate(requestParamsMap);
DOWNLOAD_URL = DOWNLOAD_URL.replace("{file_no}", fileNo);
String url = DOWNLOAD_URL + "?" + HttpUtil.toParams(requestParamsMap);
HttpUtil.downloadFile(url, FileUtil.file(saveFilePath));
}
//生成权限字符串
public static void authStrGenerate(TreeMap<String, Object> requestParamsMap) {
requestParamsMap.put("appId", appId);
requestParamsMap.put("apikey", apikey);
requestParamsMap.put("timestamp", System.currentTimeMillis() + "");
StringBuilder requestParamsStr = new StringBuilder("");
Set<String> keys = requestParamsMap.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
requestParamsStr.append("&").append(key).append("=").append(requestParamsMap.get(key));
}
String paramsStr = requestParamsStr.toString().replaceFirst("&", "");
requestParamsMap.put("authStr", SecureUtil.md5(paramsStr));
requestParamsMap.remove("apikey");
}
}