- 建议修改Lang.java改名为 LANG.java
- 执行BaiduTranslator.token()函数的时候读取js文件可以使用 FileReader reader = new FileReader(ResourceUtils.getFile("classpath:Baidu.js"));
本项目 多源翻译 (Multi-source Translation, MTrans),提供了集多种主流的 在线翻译 及 TTS 功能于一身的轻量级服务。通过程序向所支持的在线目标服务器发送 HTTP 请求,获取并解析返回的结果,为使用者提供便利。目前,本项目免费开源,开发者可基于此进行二次开发。
目前支持 源 及 语种 如下:
翻译源 | 服务器地址 | 支持语种 | 方式 |
---|---|---|---|
百度翻译 | http://fanyi.baidu.com/v2transapi | 中文、英语、日语、韩语、法语、俄语、德语 | 互译 |
有道翻译 | http://fanyi.youdao.com/translate_o | 中文、英语、日语、韩语、法语、俄语 | 互译 |
谷歌翻译 | https://translate.google.cn/translate_a/single | 中文、英语、日语、韩语、法语、俄语、德语 | 互译 |
腾讯翻译君 | http://fanyi.qq.com/api/translate | 中文、英语、日语、韩语、法语、俄语、德语 | 互译 |
欧米翻译 | http://www.omifanyi.com/transSents.do | 中文、英语 | 互译 |
TryCan | http://fanyi.trycan.com/Transfer.do | 中文、英语 | 互译 |
金山爱词霸 | http://fy.iciba.com/ajax.php?a=fy | 中文、英语、日语、韩语、法语、德语 | 互译 |
搜狗翻译 | http://fanyi.sogou.com/reventondc/translate | 中文、英语、日语、韩语、法语、俄语、德语 | 互译 |
TTS 源 | 服务器地址 | 支持语种 |
---|---|---|
百度 TTS | http://fanyi.baidu.com/gettts | 中文、英语、日语、韩语、法语、俄语、德语、泰语 |
有道 TTS | http://tts.youdao.com/fanyivoice | 英语、日语、韩语、法语 |
谷歌 TTS | https://translate.google.cn/translate_tts | 中文、英语、日语、韩语、法语、俄语、德语 |
腾讯 TTS | http://audiodetect.browser.qq.com:8080/tts | 中文、英语、日语、韩语 |
搜狗 TTS | http://fanyi.sogou.com/reventondc/synthesis | 中文、英语 |
本项目使用 IDEA + Maven 进行开发,请在 pom.xml 中添加如下依赖。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
- 最小翻译实例
import com.swjtu.lang.LANG; import com.swjtu.querier.Querier; import com.swjtu.trans.AbstractTranslator; import com.swjtu.trans.impl.GoogleTranslator; import java.util.List; public class Test { public static void main(String[] args) { Querier<AbstractTranslator> querierTrans = new Querier<>(); // 获取查询器 querierTrans.setParams(LANG.ZH, LANG.EN, "如果这都不算爱,我有什么好悲哀!"); // 设置参数 querierTrans.attach(new GoogleTranslator()); // 向查询器中添加 Google 翻译器 List<String> result = querierTrans.execute(); // 执行查询并接收查询结果 for (String str : result) { System.out.println(str); } } }
- 最小 TTS 实例
import com.swjtu.lang.LANG; import com.swjtu.querier.Querier; import com.swjtu.tts.AbstractTTS; import com.swjtu.tts.impl.BaiduTTS; import java.util.List; public class Test { public static void main(String[] args) { Querier<AbstractTTS> querierTTS = new Querier<>(); // 获取查询器 querierTTS.setParams(LANG.EN, "To be or not to be, that is a question."); // 设置参数 querierTTS.attach(new BaiduTTS()); // 向查询器中添加 Google 翻译器 List<String> result = querierTTS.execute(); // 执行查询并接收查询结果 for (String str : result) { System.out.println(str); } } }
本项目中主要定义了如下几个包,其命名及作用如下表:
包名 | 包含类 | 说明 |
---|---|---|
com.swjtu.lang | LANG | 枚举类型,支持的语种列表 |
com.swjtu.util | Util | 工具包 |
com.swjtu.http | HttpParams、AbstractHttpAttribute | HTTP 方法接口及抽象类 |
com.swjtu.querier | Querier | 泛型,查询器 |
com.swjtu.trans | AbstractTranslator | 翻译器(抽象)类 |
com.swjtu.trans.impl | BaiduTranslator、GoogleTranslator、YoudaoTranslator、IcibaTranslator、 OmiTranslator、SogouTranslator、TencentTranslator、TrycanTranslator |
翻译器实体类 |
com.swjtu.tts | AbstractTTS | TTS 抽象类 |
com.swjtu.tts.impl | BaiduTTS、YoudaoTTS、GoogleTTS、TencentTTS、SogouTTS | TTS 实体类 |
-
com.swjtu.http 包 / 类图
-
com.swjtu.querier 包 / 类图
-
com.swjtu.trans 包 / 类图
-
com.swjtu.trans.impl 包 / 类图
-
com.swjtu.tts 包 / 类图
-
com.swjtu.tts.impl 包 / 类图
-
com.swjtu.util 包 / 类图
-
LANG
枚举:定义所支持或将支持的语种,统一并规范了语种列表。public enum LANG { ZH, // 中文 EN, // 英语 JP, // 日语 JPKA, // 日语假名 TH, // 泰语 ... }
-
Util
类:包含并实现了一些实用方法。public static List<NameValuePair> map2list(Map<String, String> mapParams); // 将 Map 转换成 List public static String getUrlWithQueryString(String url, Map<String, String> params); // 生成 URL // 各种格式的 MD5 public static String md5(String input); public static String md5(File file); public static String md5(InputStream in);
-
Querier
类:定义了Querier
类,使用了观察者模式。该类包含了一个集合,集合中的元素为翻译器类 或 TTS 类,通过setParams()
设定好参数后,执行execute()
方法发送请求,同时返回结果。可以通过attach()
和detach()
方法向集合中添加或移除元素。public final class Querier<T extends AbstractHttpAttribute> { private List<T> collection; // 集合 ... public void setParams(LANG source, String text); // TTS 参数设置, source 源语种,text 待转换为语音的内容 public void setParams(LANG from, LANG to, String text); // 翻译器参数设置,from 源语种,to 目标语种,text 待翻译内容 public List<String> execute() { List<String> result = new ArrayList<String>(); for (T element : collection) { if (element.getClass().getName().contains("Translator")) { result.add(element.run(from, to, text)); } else if (element.getClass().getName().contains("TTS")) { result.add(element.run(from, text)); } } return result; } public void attach(T element); public void detach(T element); ... }
-
HttpParams
接口:定义了设置 HTTP 数据格式的接口方法public interface HttpParams { public void setFormData(LANG source, String text); // 设置 TTS 参数的接口方法 public void setFormData(LANG from, LANG to, String text); // 设置翻译器参数的接口方法 }
-
AbstractHttpAttribute
类:与 HTTP 请求相关的请求及控制流程public abstract String query() throws Exception; public abstract String run(LANG source, String text); public abstract String run(LANG from, LANG to, String text); // 资源释放 public void close(HttpEntity httpEntity, CloseableHttpResponse httpResponse); public void close();
-
AbstractTranslator
类:继承自AbstractHttpAttribute
类,并实现了HttpParams
接口,定义了抽象的翻译器类。@Override public String run(LANG from, LANG to, String text) { String result = ""; setFormData(from, to, text); try { result = parses(query()); } catch (Exception e) { e.printStackTrace(); } close(); return result; } public abstract void setLangSupport(); // 设置支持的语种 public abstract String parses(String text) throws IOException; // 解析返回结果
-
AbstractTTS
类:继承自AbstractHttpAttribute
类,并实现了HttpParams
接口,定义了抽象的 TTS 类。@Override public String run(LANG source, String text) { String saveFile = null; setFormData(source, text); try { saveFile = query(); System.out.println(saveFile); } catch (IOException e) { e.printStackTrace(); } close(); return saveFile; } public String query() throws IOException { ... // 将 TTS 结果保存为 mp3 音频文件,以待转换文本的 md5 码作为部分文件名 StringBuilder saveFile = new StringBuilder(); saveFile.append("./tts/") .append(this.getClass().getName()) .append("-") .append(Util.md5(uri)) .append(".mp3"); ... }
本项目封装了若干方法,并通过 Querier
泛型类暴露出来的 5个 API 方法,非常简单易于使用,详见实例:
// 设置查询器参数
public void setParams(LANG source, String text);
public void setParams(LANG from, LANG to, String text);
public List<String> execute(); // 执行查询并返回结果
public void attach(T element); // 向查询器中添加元素
public void detach(T element); // 移除查询器中的元素
本项目支持并提供了主流的 在线翻译 及 TTS 服务,通过提供的 API 接口可方便的进行相关任务。同时,考虑到用户潜在的需求,现介绍如何基于本项目进行扩展,达到二次开发的目的。在扩展本项目之前,用户需对项目源码及 HTTP 知识有一定的了解。
项目代码中枚举 LANG
定义了大部分常用的语种,若所支持的语种不能满足用户的需求时,用户可自行扩展。
- 确定目标服务器支持的语种及该语种代号;
- 将所需语种自定义代号添加到枚举中;
- 在实体类
setLangSupport()
方法中,将代号映射添加到langMap
变量中;
举例:如对 Youdao 翻译器添加 西班牙语 的支持:
-
步骤一:通过查询有道翻译服务器所支持的语种列表可知,支持西班牙语种且其代号为:
es
-
步骤二:在
LANG
中,添加语种自定义代号:public enum LANG { ZH, // 中文 EN, // 英语 JP, // 日语 JPKA, // 日语假名 TH, // 泰语 FRA, // 法语 SPA, // 西班牙语 <--- 添加语种(自定义语种代号) KOR, // 韩语 .... }
-
步骤三:在
YoudaoTranslator
类中,添加代号映射:@Override public void setLangSupport() { langMap.put(LANG.ZH, "zh-CHS"); langMap.put(LANG.EN, "en"); langMap.put(LANG.JP, "ja"); langMap.put(LANG.KOR, "ko"); langMap.put(LANG.FRA, "fr"); langMap.put(LANG.RU, "ru"); langMap.put(LANG.SPA, "es"); // 添加代号映射 }
开发者通过继承 AbstractTranslator
类来定义自己的翻译器类,并实现该类中的如下抽象方法:
// 添加语种支持
public abstract void setLangSupport();
// 用于设置请求参数
public abstract void setFormData(LANG from, LANG to, String text);
// 发送 HTTP 请求并接收返回结果(通常为 JSON 或 XML 字符串,根据用户请求结果而定)
public abstract String query() throws Exception;
// 解析字符串,提取翻译结果
public abstract String parses(String text) throws IOException;
注意:对于某些需要设置 Cookie 的 HTTP 请求,请先获取并设置好 Cookie 再进行请求。通常,在 Chrome 浏览器中按下 F12 键,并在 Console 控制台中输入:
document.cookie
即可查看。
开发者通过继承 AbstractTTS
类来定义自己的 TTS 类,并实现该类中的如下抽象方法:
// 添加语种支持
public abstract void setLangSupport();
// 用于设置请求参数
public abstract void setFormData(LANG source, String text);
// 发送 HTTP 请求并接收返回结果(通常为 JSON 或 XML 字符串,根据用户请求结果而定)
public abstract String query() throws Exception;
注意:TTS 保存路径默认为:./tts/类名-md5(待转换内容).mp3
(如:com.swjtu.tts.impl.GoogleTTS-5757a2c16ce52b5427eb12f961d6362e.mp3)