[JAVA] Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~

Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~

Ich habe eine Android-App erstellt, die mit der MicrosoftTranslatorText-API übersetzt Ich werde ein Memorandum über die Einführungsmethode aufbewahren. In diesem Artikel Übersetzen mit der Microsoft Translator Text API unter Android-Preparation- Mit dem in erhaltenen Schlüssel implementieren wir die Übersetzungsfunktion in der Android-Anwendung mit der MicrosofTranslatorText-API.

Offizielle Dokumentation

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

1. Holen Sie sich das API-Token

Um mit der MicrosoftTranslatorTextAPI zu übersetzen, müssen Sie zuerst ein API-Token erhalten. Erstellen Sie eine Klasse, die AsyncTask erbt, weil sie kommuniziert.

TranslateAPIGetTokenRequest.java



package <Paketnamen>;

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 = "<API-Schlüssel bei der Vorbereitung erhalten>"; //API-Schlüssel
    private static final String LOG_TAG = "GetTokenRequest"; //Protokoll-Tag
    private static final String HTTP_OK = "HTTP_OK"; //HttpUrlConnection-Status
    private String mTranslateWord = ""; //Übersetzter Text
    private String mApiToken = ""; //API-Token
    private MainActivity mActivity; //Für Rückruf

    //Konstrukteur
    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"; //Ziel-URL für API-Token-Erfassungsanforderung
        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);
        //Der Status ist HTTP_Wenn OK, starten Sie eine Übersetzungsanforderung
        if(result.equals(HTTP_OK)) {
            TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mApiToken);
            trans.execute();
        }else{
            Log.d("GetTokenRequest", "onPostExecute:Error");
        }
    }
}

Codekommentar

1. Halten Sie den API-Schlüssel als Klassenkonstante

private static final String KEY = "<API-Schlüssel in Vorbereitung erhalten>"; // API-Schlüssel `

2. Halten Sie die Callback-Zielaktivität und den übersetzten Text im Konstruktor

Dies liegt daran, dass ich den zu übersetzenden Text angeben möchte, wenn ich von Activity aus anrufe.

    //Konstrukteur
    public TranslateAPIGetTokenRequest(MainActivity activity,String word){
        mActivity = activity;
        mTranslateWord = word;
    }
3. Geben Sie den Endpunkt an

Die Endpunkte für den Erwerb von API-Token sind wie folgt. https://api.cognitive.microsoft.com/sts/v1.0/issueToken

String urlStr = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; //Ziel-URL für API-Token-Erfassungsanforderung
4. Stellen Sie die Anforderungsparameter ein

Sie müssen den API-Schlüssel im Parameter Ocp-Apim-Subscription-Key festlegen.

Anforderungsmethode: POST Content-Type:application/json ** Ocp-Apim-Abonnement-Schlüssel: API-Schlüssel ** (Schlüssel in Vorbereitung erhalten)

con.setRequestMethod("POST");
con.addRequestProperty("Content-Type","application/json");
con.addRequestProperty("Ocp-Apim-Subscription-Key", KEY);
5. Halten Sie das in der Antwort empfangene API-Token als Mitgliedsvariable

Wenn die Anforderung erfolgreich ist, wird eine Zeichenfolge mit ca. 700 Zeichen zurückgegeben. Das ist das API-Token.

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. Wenn die Kommunikation abgeschlossen ist (wenn onPostExecute aufgerufen wird), führen Sie die Übersetzungsanforderungsklasse aus.

Geben Sie zu diesem Zeitpunkt das API-Token, die Rückrufzielaktivität und den übersetzten Text an, die in 5 im Argument des Konstruktors erhalten wurden.

    @Override
    protected void onPostExecute(String result) {
        Log.d(LOG_TAG, "onPostExecute, result: " + result);
        //Der Status ist HTTP_Wenn OK, starten Sie eine Übersetzungsanforderung
        if(result.equals(HTTP_OK)) {
            TranslateAPITranslateRequest trans = new TranslateAPITranslateRequest(mActivity, mTranslateWord, mTranslateToken);
            trans.execute();
        }else{
            Log.d("GetTokenRequest", "onPostExecute:Error");
        }
    }

Es scheint Unsinn, die AsyncTask-Klasse nacheinander so aufzurufen ...

2. Übersetzungsanfrage

Stellen Sie eine Übersetzungsanforderung mit dem in 1 erhaltenen API-Token. Verwenden Sie eine Klasse, die AsyncTask wie in der API-Token-Erfassungsanforderung erbt.

TranslateAPITranslateRequest.java


package <Paketnamen>;

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"; //Protokoll-Tag
    private static final String HTTP_OK = "HTTP_OK";
    private String mTranslateWord = "";//Nicht übersetzter Text
    private String mTranslatedWord = ""; //Text nach der Übersetzung
    private String mApiToken = ""; //API-Token
    private MainActivity mActivity; //Rückrufzielaktivität

    //Konstrukteur
    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) {
                //Verarbeitung zum Empfang von Antworten usw.
                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");
        }
    }
}

Codekommentar

1. Halten Sie die Callback-Zielaktivität, den nicht übersetzten Text und das API-Token im Konstruktor.
    //Konstrukteur
    public TranslateAPITranslateRequest(MainActivity activity,String word,String token){
        Log.d(LOG_TAG,"word:" + word);
        mActivity = activity;
        mTranslateWord = word;
        mApiToken = token;
    }
2. Geben Sie die Endpunkt- und URL-Parameter an

Der Endpunkt der Übersetzungsanforderung lautet wie folgt. http://api.microsofttranslator.com/v2/Http.svc/Translate Die URL-Parameter lauten wie folgt. Text: Der Text, den Sie übersetzen möchten. ** Erforderlich ** zu: Sprachcode nach der Übersetzung. ** Erforderlich ** von: Sprachcode vor der Übersetzung. Irgendein appid: API-Token. ** Erforderlich, aber nicht erforderlich, wenn Header-Parameter: Authorization gibt ein API-Token an. ** ** **

    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();
        }

Dieses Mal werden wir vom Japanischen ins Englische übersetzen, also haben wir von = ja und bis = en angegeben. Das API-Token wird dann im Header-Parameter angegeben.

3. Geben Sie die Anforderungsparameter an

Anforderungsmethode: GET (Es gibt eine Theorie, dass es kein Problem mit POST gibt) Autorisierung: API-Token (*)

Das folgende ist das Format des API-Tokens. ** "Inhaber \ <API-Token >" ** Sie müssen einen Träger auf den Kopf setzen. ** Bitte beachten Sie, dass zwischen dem Träger und dem API-Token ein Abstand von halber Breite besteht. ** ** ** Dieses Format wird auch verwendet, wenn die AppID im URL-Parameter angegeben ist.

    con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");
    con.addRequestProperty("Authorization","Bearer " + mApiToken);
4. Ersetzen Sie das in der Antwort erhaltene Übersetzungsergebnis durch unnötige Teile und behalten Sie es in der Elementvariablen bei.

Wenn die Anforderung erfolgreich ist, wird das Übersetzungsergebnis im folgenden Format zurückgegeben.

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[Übersetzungsergebnis]</string>

Ich möchte nur das Übersetzungsergebnis zurückgeben, also löschen Sie den unnötigen Teil.


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

Ganz gewaltsam?

5. Rufen Sie die Aktivität zurück, wenn die Kommunikation abgeschlossen ist (wenn onPostExecute aufgerufen wird).

Wenn die Kommunikation erfolgreich ist, wird das empfangene Übersetzungsergebnis zur Aktivität zurückgerufen. Ich verwende die in MainActivity implementierte Rückruffunktion.


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

Danach ist es in Ordnung, wenn Sie das Übersetzungsergebnis in TextView usw. auf der Aktivitätsseite anzeigen.

MainActivity.java


 /**
   *Rückrufmethode.
   *Wird aufgerufen, nachdem die Hintergrundverarbeitung abgeschlossen ist.
   */
    public void callback(final int responseCode, String word) {
        if (CALLBACK_FINISH_TRANSLATE_CODE == responseCode) {
            translateResultText.setText(word);
        }
    }

Wenn Sie mit der Übersetzung beginnen, beschreiben Sie Folgendes in Aktivität und beginnen Sie mit dem Erwerb des API-Tokens.

    TranslateAPIGetTokenRequest trans = new TranslateAPIGetTokenRequest(MainActivity.this, [Der Text, den Sie übersetzen möchten]);
    trans.execute();

3. Ich habe versucht zu übersetzen

Ich habe versucht, die in EditText eingegebene Zeichenfolge zu übersetzen, um festzustellen, wie genau sie tatsächlich war. Der Text stammt aus der offiziellen Dokumentation der Microsoft Translator-API.

1. Japanisch ⇒ Englisch

Screenshot_20171129-140425.png

Google Übersetzung

msae2.PNG

Auf diese Weise ist der englische Text des übersetzten Wortes völlig anders.

2. Englisch ⇒ Japanisch

Screenshot_20171129-093344.png

Google Übersetzung

msae.PNG

** Fazit **

Wie erwartet scheint Google eine höhere Übersetzungsgenauigkeit zu haben. Aber ich wünschte, ich könnte das kostenlos machen!

Das ist es.

Recommended Posts

Übersetzen Sie mit der Microsoft Translator Text API unter Android ~ Implementierung ~
Übersetzen mit der Microsoft Translator-Text-API in Java (Japanisch → Englisch)
Speichern Sie ArrayList mit GSON unter Android
[Android] Implementierung von SideVolling ListView mit RecyclerView
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
Sobel-Filter mit OpenCV unter Android (Java)
Versuchen Sie es mit der Emotion API von Android
Versuchen Sie, Firebase Cloud-Funktionen unter Android (Java) zu verwenden.
Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
Verwenden der PAY.JP-API mit Rails ~ Implementierungsvorbereitung ~ (payjp.js v2)
Versuchen Sie die Bildklassifizierung mit TensorFlow Lite unter Android (JAVA).