[JAVA] Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~

Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~

J'ai créé une application Android qui se traduit à l'aide de l'API MicrosoftTranslatorText, donc Je garderai un mémorandum de la méthode d'introduction. Dans cet article Traduction à l'aide de l'API Microsoft Translator Text sur Android-Preparation- En utilisant la clé obtenue dans, nous implémenterons la fonction de traduction dans l'application Android avec l'API MicrosofTranslatorText.

Documentation officielle

http://docs.microsofttranslator.com/text-translate.html#!/default/get_Translate

1. Obtenez un jeton API

Pour traduire à l'aide de MicrosoftTranslatorTextAPI, vous devez d'abord obtenir un jeton API. Créez une classe qui hérite d'AsyncTask car elle communique.

TranslateAPIGetTokenRequest.java



package <nom du paquet>;

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class TranslateAPIGetTokenRequest extends AsyncTask<String, Void, String>{
    private static final String KEY = "<Clé API obtenue lors de la préparation>"; //Clé API
    private static final String LOG_TAG = "GetTokenRequest"; //Balise de journal
    private static final String HTTP_OK = "HTTP_OK"; //État de HttpUrlConnection
    private String mTranslateWord = ""; //Texte traduit
    private String mApiToken = ""; //Jeton API
    private MainActivity mActivity; //Pour rappel

    //constructeur
    public TranslateAPIGetTokenRequest(MainActivity activity,String word){
        mActivity = activity;
        mTranslateWord = word;
    }

    @Override
    protected String doInBackground(String... params) {
        String urlStr = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; //URL de destination de la demande d'acquisition de jeton API
        String result = null;
        HttpURLConnection con;
        URL url = null;
        BufferedReader reader = null;
        try{
            url = new URL(urlStr);
        }catch(Exception e){
            e.printStackTrace();
        }

        try {
            con = (HttpsURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.addRequestProperty("Content-Type","application/json");
            con.addRequestProperty("Ocp-Apim-Subscription-Key", KEY);

            final int status = con.getResponseCode();
            Log.d(LOG_TAG, "result:" + status);
            if (status == HttpURLConnection.HTTP_OK) {
                result= HTTP_OK;
                StringBuilder stringBuilder = new StringBuilder();
                reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                while ((inputLine = reader.readLine()) != null) {
                    stringBuilder.append(inputLine);
                }
                String recvData = stringBuilder.toString();
                mApiToken = recvData;
                Log.d(LOG_TAG, "http post success  recvData: " + recvData);
            } else{
                result = String.valueOf(status);
            }

        }catch(Exception e){
            Log.e(LOG_TAG,e.toString());
        }

        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d(LOG_TAG, "onPostExecute, result: " + result);
        //Le statut est HTTP_Si OK, lancez une demande de traduction
        if(result.equals(HTTP_OK)) {
            TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mApiToken);
            trans.execute();
        }else{
            Log.d("GetTokenRequest", "onPostExecute:Error");
        }
    }
}

Commentaire de code

1.Faites de la clé API une constante de classe

private static final String KEY = "<clé API obtenue en préparation>"; // clé API `

2. Maintenez l'activité de destination de rappel et le texte traduit dans le constructeur

C'est parce que je souhaite spécifier le texte à traduire lors de l'appel depuis Activity.

    //constructeur
    public TranslateAPIGetTokenRequest(MainActivity activity,String word){
        mActivity = activity;
        mTranslateWord = word;
    }
3. Spécifiez le point de terminaison

Les points de terminaison pour l'acquisition de jetons API sont les suivants. https://api.cognitive.microsoft.com/sts/v1.0/issueToken

String urlStr = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; //URL de destination de la demande d'acquisition de jeton API
4. Définir les paramètres de demande

Vous devez définir la clé API dans le paramètre Ocp-Apim-Subscription-Key.

Méthode de demande: POST Content-Type:application/json ** Ocp-Apim-Subscription-Key: clé API ** (clé obtenue en préparation)

con.setRequestMethod("POST");
con.addRequestProperty("Content-Type","application/json");
con.addRequestProperty("Ocp-Apim-Subscription-Key", KEY);
5. Conservez le jeton API reçu dans la réponse en tant que variable membre

Si la demande aboutit, une chaîne d'environ 700 caractères sera renvoyée. C'est le jeton API.

if (status == HttpURLConnection.HTTP_OK) {
                result= HTTP_OK;
                StringBuilder stringBuilder = new StringBuilder();
                reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                while ((inputLine = reader.readLine()) != null) {
                    stringBuilder.append(inputLine);
                }
                String recvData = stringBuilder.toString();
                mTranslateToken = recvData;
                Log.d(LOG_TAG, "http post success  recvData: " + recvData);
} else {
               result = String.valueOf(status);
       }
6. Lorsque la communication est terminée (lorsque onPostExecute est appelé), exécutez la classe de demande de traduction.

À ce stade, spécifiez le jeton d'API, l'activité de destination de rappel et le texte traduit obtenu en 5 dans l'argument du constructeur.

    @Override
    protected void onPostExecute(String result) {
        Log.d(LOG_TAG, "onPostExecute, result: " + result);
        //Le statut est HTTP_Si OK, lancez une demande de traduction
        if(result.equals(HTTP_OK)) {
            TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mTranslateToken);
            trans.execute();
        }else{
            Log.d("GetTokenRequest", "onPostExecute:Error");
        }
    }

Il semble absurde d'appeler la classe AsyncTask successivement comme ceci ...

2. Demande de traduction

Faites une demande de traduction à l'aide du jeton API obtenu en 1. Utilisez une classe qui hérite d'AsyncTask comme dans la demande d'acquisition de jeton API.

TranslateAPITranslateRequest.java


package <nom du paquet>;

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class TranslateAPITranslateRequest extends AsyncTask<String, Void, String> {
    private static final String LOG_TAG = "TranslateRequest"; //Balise de journal
    private static final String HTTP_OK = "HTTP_OK";
    private String mTranslateWord = "";//Texte non traduit
    private String mTranslatedWord = ""; //Texte post-traduction
    private String mApiToken = ""; //Jeton API
    private MainActivity mActivity; //Activité de destination de rappel

    //constructeur
    public TranslateAPITranslateRequest(MainActivity activity,String word,String token){
        Log.d(LOG_TAG,"word:" + word);
        mActivity = activity;
        mTranslateWord = word;
        mApiToken = token;
    }

    @Override
    protected String doInBackground(String... params) {
        Log.d(LOG_TAG,"doInBackground,translateWord:" + mTranslateWord);

        String urlStr = null;
        try {
            urlStr = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=ja&to=en&text=" + URLEncoder.encode(mTranslateWord, "UTF-8") ;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String result = null;
        HttpURLConnection con;
        URL url = null;
        BufferedReader reader = null;
        try{
            url = new URL(urlStr);
        }catch(Exception e){
            e.printStackTrace();
        }

        try {
            con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.addRequestProperty("Authorization","Bearer " + mApiToken);

            final int status = con.getResponseCode();
            Log.d(LOG_TAG, "result:" + status);
            if (status == HttpURLConnection.HTTP_OK) {
                //Traitement pour recevoir une réponse, etc.
                result=HTTP_OK;
                StringBuilder stringBuilder = new StringBuilder();
                reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String inputLine;
                while ((inputLine = reader.readLine()) != null) {
                    stringBuilder.append(inputLine);
                }
                mTranslatedWord = stringBuilder.toString();
                mTranslatedWord = mTranslatedWord.replace("<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">", "");
                mTranslatedWord = mTranslatedWord.replace("</string>", "");
                Log.d(LOG_TAG, "http post success recvData: " + mTranslatedWord);
            } else{
                result=String.valueOf(status);
            }

        }catch(Exception e){
            Log.e(LOG_TAG, e.toString());
        }

        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d(LOG_TAG, "onPostExecute, result:" + result);
        if(result.equals(HTTP_OK)) {
            mActivity.callback(MainActivity.CALLBACK_FINISH_TRANSLATE_CODE, mTranslatedWord);
        }else{
            Log.d(LOG_TAG, "onPostExecute:Error");
        }
    }
}

Commentaire de code

1. Conservez l'activité de destination de rappel, le texte non traduit et le jeton API dans le constructeur.
    //constructeur
    public TranslateAPITranslateRequest(MainActivity activity,String word,String token){
        Log.d(LOG_TAG,"word:" + word);
        mActivity = activity;
        mTranslateWord = word;
        mApiToken = token;
    }
2. Spécifiez le point de terminaison et les paramètres d'URL

Le point final de la demande de traduction est le suivant. http://api.microsofttranslator.com/v2/Http.svc/Translate Les paramètres d'URL sont les suivants. text: le texte que vous souhaitez traduire. ** Obligatoire ** à: code de langue après traduction. ** Obligatoire ** from: Code de langue avant traduction. Tout appid: jeton API. ** Obligatoire, mais non obligatoire si paramètre d'en-tête: l'autorisation spécifie un jeton API. ** **

    try {
           urlStr = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=ja&to=en&text=" + URLEncoder.encode(mTranslateWord, "UTF-8") ;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

Cette fois, nous traduirons du japonais vers l'anglais, nous avons donc spécifié from = ja et to = en. Le jeton API est ensuite spécifié dans le paramètre d'en-tête.

3. Spécifiez les paramètres de la demande

Méthode de requête: GET (Il existe une théorie selon laquelle il n'y a pas de problème avec POST) Autorisation: jeton API (*)

Voici le format du jeton API. ** "Porteur \ <jeton API >" ** Vous devez mettre un porteur sur la tête. ** Veuillez noter qu'il y a un espace demi-largeur entre le porteur et le jeton API. ** ** Ce format est également utilisé lorsque l'appid est spécifié dans le paramètre URL.

    con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.addRequestProperty("Authorization","Bearer " + mApiToken);
4. Remplacez le résultat de traduction reçu dans la réponse par des parties inutiles et conservez-le dans la variable membre.

Si la demande aboutit, le résultat de la traduction sera renvoyé dans le format suivant.

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[Résultat de la traduction]</string>

Je souhaite renvoyer uniquement le résultat de la traduction, supprimez donc la partie inutile.


    mTranslatedWord = stringBuilder.toString();
    mTranslatedWord = mTranslatedWord.replace("<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">", "");
    mTranslatedWord = mTranslatedWord.replace("</string>", "");

Assez forcé?

5. Rappelez l'activité lorsque la communication est terminée (lorsque onPostExecute est appelé).

Si la communication réussit, le résultat de la traduction reçu sera rappelé à l'activité. J'utilise la fonction de rappel implémentée dans MainActivity.


    @Override
    protected void onPostExecute(String result) {
        Log.d(LOG_TAG, "onPostExecute, result:" + result);
        if(result.equals(HTTP_OK)) {
            mActivity.callback(MainActivity.CALLBACK_FINISH_TRANSLATE_CODE, mTranslatedWord);
        }else{
            Log.d(LOG_TAG, "onPostExecute:Error");
        }
    }

Après cela, c'est OK si vous affichez le résultat de la traduction sur TextView etc. du côté Activité.

MainActivity.java


 /**
   *Méthode de rappel.
   *Appelé une fois le traitement en arrière-plan terminé.
   */
    public void callback(final int responseCode, String word) {
        if (CALLBACK_FINISH_TRANSLATE_CODE == responseCode) {
            translateResultText.setText(word);
        }
    }

Lors du démarrage de la traduction, décrivez comme suit dans Activité et commencez par l'acquisition du jeton API.

    TranslateAPIGetTokenRequest trans = new TranslateAPIGetTokenRequest(MainActivity.this, [Le texte que vous souhaitez traduire]);
    trans.execute();

3. J'ai essayé de traduire

J'ai essayé de traduire la chaîne de caractères entrée dans EditText pour voir à quel point elle était précise. Le texte est extrait de la documentation officielle de l'API Microsoft Translator.

1. japonais ⇒ anglais

Screenshot_20171129-140425.png

Google Traduction

msae2.PNG

De cette façon, le texte anglais du mot traduit est complètement différent.

2. Anglais ⇒ japonais

Screenshot_20171129-093344.png

Google Traduction

msae.PNG

** Conclusion **

Comme prévu, Google semble avoir une meilleure précision de traduction. Mais j'aimerais pouvoir le faire gratuitement!

C'est tout.

Recommended Posts

Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~
Traduire à l'aide de l'API de texte Microsoft Translator en Java (japonais → anglais)
Enregistrer ArrayList à l'aide de GSON sur Android
[Android] Implémentation de ListView à défilement latéral à l'aide de RecyclerView
Essayez d'utiliser le service sur Android Oreo
Filtre Sobel utilisant OpenCV sur Android (Java)
Essayez d'utiliser l'API Emotion d'Android
Essayez d'utiliser Firebase Cloud Functions sur Android (Java)
Essayez la communication en utilisant gRPC sur un serveur Android + Java
Utilisation de l'API PAY.JP avec Rails ~ Préparation de l'implémentation ~ (payjp.js v2)
Essayez la classification d'image à l'aide de TensorFlow Lite sur Android (JAVA)