本項目多源翻譯( 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 );
}
}
} 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)