transcat是一个翻译服务管理工具,主要任务是协调和管理多个不同的翻译服务(如Google,彩云小译,腾讯翻译君等)。特色功能是负载均衡,可以自由组合不同的翻译服务来实现负载均衡。
transcat提供了兼容沉浸式翻译(Immersive translate)的API,具体配置请参考: 沉浸式翻译API
服务名称 | 支持情况 | 需要申请API Key | 限流建议(cap/window) | 申请指南 |
---|---|---|---|---|
是 | 否 | 10/1 | ||
微软翻译 | 是 | 否 | 5/1 | |
DeepLX | 是 | 否 | 1/1 | |
腾讯翻译君 | 是 | 是 | 5/1 | 点击进入 |
百度翻译 | 是 | 是 | 10/1(高级认证) | 点击进入 |
彩云小译 | 是 | 是 | 10/1 | 点击进入 |
阿里翻译 | Working | 是 | 点击进入 | |
OpenAI | 是 | 是 | 1/1 | 点击进入 |
Azure | 是 | 是 | 点击进入 |
注: 强烈【不推荐】在沉浸式翻译下使用DeepLX,很容易触发429限流导致一段时间无法使用DeepLX。如果要使用OpenAI,推荐使用多几个Key做负载均衡。
启动服务需要加载一个配置文件,格式如下:
{
"server_address": "127.0.0.1",
"app_key": "app_key",
"server_port": "8086",
"datasource": {
"type": "sqlite"
},
"services": [
{
"name": "google_translate1",
"type": "google",
"proxy": "http://127.0.0.1:7890",
"weight": 3,
"limit": 500000
},
{
"name": "tencent",
"type": "tencent",
"app_key": "app_key",
"app_id": "app_id",
"region": "region",
"weight": 2,
"limit": 500000,
"ratelimit": {
"type": "token-bucket",
"capacity": 5,
"time_window": 1
}
},
{
"name": "caiyun1",
"type": "caiyun",
"app_key": "app_key",
"weight": 2,
"limit": 1000000,
"ratelimit": {
"type": "token-bucket",
"capacity": 10,
"time_window": 1
}
},
],
"mode": "select",
"load-balance-rule": "weight"
}
-
server_address
- 服务器监听地址,默认为127.0.0.1 -
server_port
- 监听端口,默认8010 -
app_key
- 认证的Key -
assets_dir
: 资源文件输出目录,比如log、sqlite3的数据库文件等,docker环境下此参数会被忽略。 -
mode
工作模式- select - 手动选择翻译服务(services)中的一个
- load-balance - 程序自动负载均衡选择翻译服务,支持3种负载均衡策略
-
load-balance-rule
: 只有mode为load-balance这个配置才会被加载,可选项:- weight - 根据service中配置的权重负载均衡,比如a、b,c的weight分别为1,2,3; 如果有7个请求,分别会命中1,2,3个请求命中a、b,c。
- round-robin - 轮询选择
- usage - 根据当前剩余用量选择,用量计算公式为: usage = limit - currentUsage。每次调用某个翻译服务,它的usage都会增加。比如翻译
HelloWorld
命中了caiyun
,那么它的usage会增加10(字符长度)。
-
services - 翻译服务数组
name
- 名字可以随意起,不过必须唯一,否则启动会报错type
- 翻译服务类型,目前支持下面服务- googlex - Google翻译,直接调用它网页的API,不需要填写密钥。
- bingx - 微软的翻译,直接调用它网页的API,不需要填写密钥。
- baidu - 百度翻译,需要填写密钥。如果要用,建议高级认证,因为普通用户1秒限流1个请求。
- tencent - 腾讯翻译君,需要填写申请到的密钥。
- caiyun - 彩云小译,需要填写申请到的密钥。
- openai - 目前支持
gpt-3.5-turbo
和gpt4
- azure - 微软azure翻译,需要填写申请到的密钥和地区
- deeplx - 推荐只在standalone模式下使用
app_key
- 你翻译服务的app_key(或者叫token),根据你翻译服务来填写app_id
- 翻译服务app_id,目前baidu和tencent都有这个参数mode
- 一个数组,标识引擎工作在什么样的mode下,可多选。- 留空(默认) - 支持任何工作模式
- select - 该引擎只会在select模式下工作
- load-balance - 该引擎只会在load-balance模式下工作
- standalone - select和load-balance都不可用,但可以在单独调用时指定调用该引擎翻译
weight
- 负载均衡权重,只有mode是load-balance会起作用。limit
- 每月的token数,当mode是load-balance,且rule为usage,这个值的大小会影响优先级proxy
- http代理,如果设置了,翻译服务会使用代理访问互联网。比如: http://127.0.0.1:7890ratelimit
- 配置限流,比如capacity=10, time_window=1,那么1秒内,最多只能接受10个请求- type - 目前仅支持
token-bucket
- capacity - token数量
- time_window - 时间窗口
- type - 目前仅支持
python flight.py --config config.json
请先从release中下载最新版本到本地,执行下面命令
# 把{version}替换为你下载的版本
python -m pip install transcat-{version}.tar.gz
# 安装完后,通过下面命令启动服务
transcat --config config.json
上面两种方式,本地必须先安装python,推荐使用最新版。请把上面命令中的python替换为你实际本地的python版本,最低支持到3.7.0。
获取镜像
你可以通过Docker Hub和源代码构建的方式获得镜像
-
从Docker Hub获取
transcat的镜像支持x86-64以及ARM-64架构,所以Apple Silicon的用户可以放心从Docker hub中下载镜像。
transcat的docker地址是: 点击进入,使用下面命令从docker hub中下载镜像。
docker pull bigbyto/transcat:${version}
具体支持的version请进入docker hub中查看。
-
从源码中构建镜像
# Clone最新的代码 git clone https://github.com/xingty/transcat # 进入transcat cd transcat # 构建镜像,${version}替换为具体的版本,可参考setup.py中的version docker build -t bigbyto/transcat:${version}
从镜像构建并启动容器
docker run --name transcat \
-e TRANSCAT_PORT=8020 \
-dp 8020:8020 \
--mount "type=bind,src=/var/data/transcat/,target=/var/data/transcat/" \
bigbyto/transcat:${version}
上面的参数分别含义如下:
--name
- 容器的名称,可以随意指定-e TRANSCAT_PORT=8020
- 容器内服务监听的端口,该参数优先级高于config.json
中的server_port
。-dp
- 后台启动容器,且映射本机的8020到容器的8020。请注意容器的端口必须和TRANSCAT_PORT
一致。--mount
- src是本地存放配置文件的目录,config.json放在这个目录下,请【不要】改target。
启动容器
当容器存在且处于停止状态,可通过下面命令重新启动容器
docker container start transcat
上面命令中的"transcat"为创建容器时的名称。
配置代理
请注意,使用容器的方式启动,意味着本机和容器的网络环境互相隔离,如果你的代理位于本机,必须要打通本机和容器的网络环境才能生效。
如果要在容器中使用transcat且需要配置HTTP代理,推荐把代理也容器化并置于同一个网络环境中,这样可以省去不少的麻烦。
沉浸式翻译目前有一个DeeplX接口,transcat对它DeeplX的接口做了兼容,使用请按照下面步骤配置:
-
点击扩展的"选项"进入扩展主页
-
点击主页下方的"开发者设置",开启 Beta 测试特性
-
基本设置中找到 DeepLX,输入自建 transcat的URL,如: http://127.0.0.1:8010/api/translate/deeplx/adapter?show_engine=1&disable_cache=0&app_key=key
app_key
是必填项,该参数的值是config文件中的app_key。show_engine
参数为1时,翻译文字后面会带上翻译服务类型。比如#请求翻译原文: hello,world! #show_engine = 1: 你好,世界 - (by google) #show_engine = 0: 你好,世界
disable_cache
默认为0。transcat会缓存翻译结果,如果下次翻译命中缓存,默认会直接从缓存中取出。如果disable_cache
= 1,那么将忽略缓存直接调用翻译服务查询新的结果。注意: 沉浸式翻译本身就会缓存翻译结果,因此如果你的参数有变动,请换一个网页查看效果。 -
设置并发量
DeeplX默认的并发数1秒限制了3个,我们需要改变一下这个值提高翻译速度,请点击展开详细配置
这里的并发数可以根据实际情况配置。请注意,这里的配置并非越大越好,因为很多翻译服务存在限流,需要根据你翻译服务的短板配置,打个比方:
假如config.json配置了4个翻译服务
- googlex - weight: 4
- bingx - weight: 3
- caiyun - weight: 2
- tencent - weight: 2
已知腾讯翻译君的API限流策略为每秒5个请求,按照上面的配置,weight=2,即每11个请求,就会有2个落在腾讯翻译君上。
假如我们把沉浸式翻译的并发请求数设为30,那么可以计算落在腾讯翻译君的QPS = 2 / 11 * 30 = 5.45,已经超过了腾讯翻译君的API限制,这种情况要么调整weight,要么减少沉浸式翻译的并发数,否则触发限流,反而会影响翻译响应速度。
-
设置段落
建议设置为3。段落会合并多行为一个http请求,从而降低并发请求数量,提高响应速度。但这个值也不是越大越好,如果段落太多,超出了翻译服务支持的最大字数,transcat会自动截断分批次请求,这样就会降低响应时间。
点击进入安装transcat的bob插件
transcat提供了一些REST-API,可以通过API更改mode等,目前支持的API如下:
-
POST:
/translate/deeplx/adapter
-
Content-Type:
application/json
-
Authorization:
Bareer app_key
-
query params
- app_key - 配置文件中的app_key,该选项必填
- show_engine - 0: 不显示翻译引擎 1-显示翻译引擎,默认为0
- disable_cache - 是否禁止cache 0: 不禁止 1-禁止,默认为1
-
body
{ "text": "hello world", "source_lang": "en", "target_lang": "zh" }
-
Response
{ "code": 200, "id": 123321, "data": "你好 世界", "alternatives": [] }
运行时改变mode,如把select改为load-balance
-
PUT:
/translate/mode/switch
-
Content-Type:
application/x-www-form-urlencoded
-
Params
- mode -
[select | load-balance]
- rule -
[weight | round-robin | usage]
,当mode为load-balance时,rule必填
- mode -
当mode为select时,可以通过这条API选择某个翻译服务
- PUT:
/translate/select
- Content-Type:
application/x-www-form-urlencoded
- Authorization:
Bareer app_key
- Params
- index - 服务列表中的index
-
POST:
/translate/{engine}
-
Content-Type:
application/json
-
Authorization:
Bareer app_key
-
params:
- engine - config文件配置的任意一个翻译引擎类型,比如: googlex、deeplx、caiyun等
-
body:
{ "text": "hello world", "source_lang": "source language", "target_lang": "target language" }
-
response
{ "code": 200, "data": "你好 世界", "engine": }
获取当前服务器的状态,包括translator、usage、mode等信息
- GET:
/server/status
- Authorization:
Bareer app_key
Web-UI