今天把腾讯云的机器翻译 TMT API 接入到我的 字幕翻译 - 字幕工具箱 中。

接入过程还是比较顺利的,但也有一些小坑,记录如下。
tmt
机器翻译_智能翻译_自动翻译-腾讯云
腾讯云机器翻译 TMT 是基于百亿级数据积累和领先算法,提供文本翻译、文档翻译、图片翻译等多项翻译能力。支持术语定制功能,对翻译结果进行干预,有效提升翻译准确率。可广泛应用于产品本地化、社交媒体、在线教育、智能硬件、在线会议和出国旅行等场景。
tmt 不光支持文本翻译,还支持文档翻译、图片翻译等多项翻译能力。我这里只用到了文本翻译。
计费
机器翻译 计费概述_腾讯云
腾讯云机器翻译提供预付费和后付费两种主要计费模式,开通服务后,按“免费额度 > 预付费 > 后付费”的顺序进行扣费。

文本翻译的免费额度为每月 500 万字符,超过免费额度后按量计费,每 100 万字符 58 元。
接入指南
机器翻译 文本翻译_腾讯云
开通服务
接入服务的前提是需要先开通服务,开通后可以在控制台查看到 SecretId 和 SecretKey。密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取。
安装SDK
官方建议优先使用SDK接入简化开发。我网站服务端是Nodejs,所以:Tencent Cloud SDK 3.0 for Node.js: GitHub, Gitee
官方SDK是非常大而全的,包含了腾讯云的所有产品的API,安装时可以指定产品名称和版本号来安装对应的SDK。比如,我只用到tmt,所以只安装tmt的SDK:
|
npm install tencentcloud-sdk-nodejs-tmt --save
|
示例代码
API Explorer - 云 API - 控制台
有两种文本翻译的API:TextTranslate 和 TextTranslateBatch。TextTranslate 是单条翻译,TextTranslateBatch 是批量翻译。
腾讯官方提供了API Explorer,可以在线测试API并生成示例代码。以下是一个简单的文本批量翻译(TextTranslateBatch)示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher
const tencentcloud = require("tencentcloud-sdk-nodejs-tmt");
const TmtClient = tencentcloud.tmt.v20180321.Client;
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性
// 以下代码示例仅供参考,建议采用更安全的方式来使用密钥
// 请参见:https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
const clientConfig = {
credential: {
secretId: process.env.TENCENTCLOUD_SECRET_ID,
secretKey: process.env.TENCENTCLOUD_SECRET_KEY,
},
// 使用临时密钥示例
/*
credential: {
secretId: "SecretId",
secretKey: "SecretKey",
token: "Token",
}
*/
region: "",
profile: {
httpProfile: {
endpoint: "tmt.tencentcloudapi.com",
},
},
};
// 实例化要请求产品的client对象,clientProfile是可选的
const client = new TmtClient(clientConfig);
const params = {};
client.TextTranslateBatch(params).then(
(data) => {
console.log(data);
},
(err) => {
console.error("error", err);
}
);
|
注意事项
接口请求域名: tmt.tencentcloudapi.com 。默认接口请求频率限制:5次/秒。超过5次就会报错:
|
our current request times equals to `9` in a second, which exceeds the frequency limit `5` for a second. Please reduce the frequency of calls.
|
请求频率限制
为了避免请求频率超过限制,可以在代码中添加限流控制。以下是一个简单的限流实现,确保每秒最多发送5个请求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
// 添加限流队列控制变量
let requestQueue: Array<() => void> = [];
let isProcessingQueue = false;
let lastRequestTime = 0;
// 限流处理函数 - 确保每秒不超过5个请求
async function processQueue() {
if (isProcessingQueue || requestQueue.length === 0) return;
isProcessingQueue = true;
while (requestQueue.length > 0) {
const now = Date.now();
// 确保请求间隔至少200ms (每秒最多5个请求)
const timeToWait = Math.max(0, lastRequestTime + 200 - now);
if (timeToWait > 0) {
await new Promise(resolve => setTimeout(resolve, timeToWait));
}
const request = requestQueue.shift();
if (request) {
lastRequestTime = Date.now();
request(); // 执行请求
}
}
isProcessingQueue = false;
}
// 添加翻译请求到队列
function queueTranslationRequest(params: any): Promise<any> {
return new Promise((resolve, reject) => {
const request = () => {
tmtClient.TextTranslateBatch(params).then(
(result) => {
resolve(result);
},
(error) => {
reject(error);
}
);
};
requestQueue.push(request);
processQueue(); // 开始处理队列
});
}
|
这样可以确保每秒最多发送5个请求,避免超过频率限制。
请求参数
请求参数中的Source
和 Target
字段需要使用小写的语言代码。因为我的字幕翻译工具箱要适配很多接口,所以也定义了语言代码的映射:
|
// 构建请求参数
const params = {
Source: SourceLanguages[inputLanguage].toLowerCase() || 'zh',
Target: TargetLanguages[OutputLanguage].toLowerCase() || 'en',
ProjectId: 0,
SourceTextList: sourceTextList
};
|