Git Product home page Git Product logo

mtrans's Introduction

MTrans 项目介绍

本项目 多源翻译 (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 中文、英语

一、快速开始

1、环境配置

本项目使用 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>

2、最小实例

  • 最小翻译实例
    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);
            }
        }
    }

二、MTrans 使用说明

1、包/类 一览表

本项目中主要定义了如下几个包,其命名及作用如下表:

包名 包含类 说明
com.swjtu.lang LANG 枚举类型,支持的语种列表
com.swjtu.util Util 工具包
com.swjtu.http HttpParamsAbstractHttpAttribute HTTP 方法接口及抽象类
com.swjtu.querier Querier 泛型,查询器
com.swjtu.trans AbstractTranslator 翻译器(抽象)类
com.swjtu.trans.impl BaiduTranslatorGoogleTranslatorYoudaoTranslatorIcibaTranslator
OmiTranslatorSogouTranslatorTencentTranslatorTrycanTranslator
翻译器实体类
com.swjtu.tts AbstractTTS TTS 抽象类
com.swjtu.tts.impl BaiduTTSYoudaoTTSGoogleTTSTencentTTSSogouTTS TTS 实体类

2、类图

3、类说明

  • 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");
        
        ...
    }

三、提供的 API

本项目封装了若干方法,并通过 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 知识有一定的了解。

1、扩展语种

项目代码中枚举 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");                  // 添加代号映射
     }

2、扩展翻译器

开发者通过继承 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 即可查看。

3、扩展 TTS

开发者通过继承 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)

mtrans's People

Contributors

hamiguazzz avatar hujingshuang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mtrans's Issues

Result is null when using BaiduTranslator

The BaiduTranslator worked last month.However when I used it today,its post didn't word ,which caused NullPointerException,while other translators works well.
I had tried other cookie,sign and token,to my disappointed the exception happened again.
I wonder how I can make it work correctly.
Thank you!
java.lang.NullPointerException at com.swjtu.trans.impl.BaiduTranslator.parses(BaiduTranslator.java:73) at com.swjtu.trans.AbstractTranslator.run(AbstractTranslator.java:42) at com.swjtu.querier.Querier.execute(Querier.java:24)

Connection pool shut down

java.lang.IllegalStateException: Connection pool shut down
at org.apache.http.util.Asserts.check(Asserts.java:34)
at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:191)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:267)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:176)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at com.swjtu.trans.impl.GoogleTranslator.query(GoogleTranslator.java:73)
at com.swjtu.trans.AbstractTranslator.run(AbstractTranslator.java:42)
at com.swjtu.querier.Querier.execute(Querier.java:25)

关于sign和Cookie的计算

你好,我写了一个NodeJS版本的hexo标题自动翻译插件,里面也涉及了调用有关百度翻译,有道翻译,和Google翻译的接口,但是百度翻译接口自升级后,已经无法直接使用了,必须使用appid和appsecret的方式调用。

看到你的项目中对百度翻译接口中的sign和Cookie值是直接指定的,是什么原理呢?另外是否有动态设置的方式?谢谢

Map selection problem under the GoogleTranslator class setFormData() under jdk 1.8

#title for chinese: jdk 1.8 下 GoogleTranslator 类 setFormData() 的 Map 选择问题

The formData in the setFormData() method is a HashMap, the HashMap does not support key duplication, and the google translation form submission requires a dt field, which has multiple values.

Solution: You can change the HashMap to IdentityHashMap in the AbstractHttpAttribute parent class, and then have the same key, formData.put(new String("key"), "value");

ps:
In order to support internationalization, first use English to play it again. Recently, the google translation API is not used.

setFormData() 方法中 formData 是一个 HashMap, HashMap 不支持 key 重复, 而 google 翻译表单提交时 需要 dt 字段, 该字段有多个值。

解决方案: 可以在 AbstractHttpAttribute 父类中将 HashMap 改为 IdentityHashMap, 然后有相同 key 时, formData.put(new String("key"), "value");

ps:
为了支持国际化, 先用英文打一遍, 用这个频繁调用翻译接口还是会超时,腾讯、google 他们应该有反爬虫机制。

源代码内可能泄露个人信息

建议在源码内去除BDUSS
Cookie内有BDUSS 可用于非法登录百度帐号

BaiduTranslator.java, line 57
request.setHeader("Cookie", "BAIDUxxxx");

被请求的服务器限制怎么办

rg.apache.http.conn.HttpHostConnectException: Connect to www.google.com:443 [www.google.com/127.0.0.1, www.google.com/2404:6800:4012:0:0:0:0:2004] failed: Connection timed out: connect
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at com.swjtu.trans.impl.GoogleTranslator.query(GoogleTranslator.java:74)
at com.swjtu.trans.AbstractTranslator.run(AbstractTranslator.java:42)
at com.swjtu.querier.Querier.execute(Querier.java:25)

NoRouteToHostException: No route to host (Host unreachable)

作者您好:
在使用在项目中的 Google 翻译器时,在后续的翻译请求了出现了标题中所示的错误。猜测是因为太频繁导致被封禁了 IP?但是我用使用 Google 翻译是正常的。希望作者能改善或者指导我如何改善该问题。谢谢!

部分文本计算tk计算错误

我试了一下 类似于这种的文本不能翻译。 价格(%1$s) 谷歌抓包算出的tk为273850.173049 用js代码算出来的tk为54310.450642 楼主有没有什么解决办法

搜狗的Translator失效

搜狗的Translator失效,看目前的应该请求url变化了和增加一个叫s的参数,但是看他的js源码没有闹清楚这个s方法在哪里,在他的app.js里面

var F = s("" + L + O + B + "41ee21a5ab5a13f72687a270816d1bfd"), W = { "from": L, "to": O, "client": "pc", "fr": "browser_pc", "text": B, "pid": "sogou-dict-vr", "useDetect": "on", "useDetectResult": "auto" === L ? "on": "off", "needQc": _.need, "uuid": M, "oxford": "on", "isReturnSugg": "on", "s": F }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.