4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaでMicrosoft Translator テキスト APIを使って翻訳(日本語→英語)

Last updated at Posted at 2018-06-08

Microsoft Translator テキスト APIをJavaで試してみました。

意外とJavaのサンプルソースが見つからなかったので参考になればと思い公開します。 key,tokenUrl,transUrlを環境に合わせて変更してもらえればすぐに利用可能です。 ちなみに、keyは発行したご自身のものを利用してする必要があり下記となります。 tokenUrl(認証用トークンAPI-URL) https://api.cognitive.microsoft.com/sts/v1.0/issueToken
transUrl(翻訳用API-URL) https://api.microsofttranslator.com/V2/http.svc/TranslateArray

ソース


@Component
public class TranslatorAPI {

    @Value("${translation.subscriptionKey}")
    private String key;

    @Value("${translation.tokenApi.url}")
    private String tokenUrl;

    @Value("${translation.transApi.url}")
    private String transUrl;

    /**
     * 対象文字列を英語に翻訳します。
     * @param words 対象文字
     * @return 翻訳結果
     */
    public String[] translator(String... words) {
        return translatorPOSTToEN(words);
    }

    /**
     * トークンを取得します。
     */
    private String tokenPOST() {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost postMethod = new HttpPost(tokenUrl);

            // Header
            postMethod.setHeader("Content-Type", "application/json");
            postMethod.setHeader("Accept", "application/jwt");
            postMethod.setHeader("Ocp-Apim-Subscription-Key", key);

            try (CloseableHttpResponse response = httpClient.execute(postMethod)) {
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    return EntityUtils.toString(entity, StandardCharsets.UTF_8);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 翻訳APIにポストします。
     */
    private String[] translatorPOSTToEN(String... words) {
        List<String> rtnWords = new ArrayList<String>();

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {

            HttpPost postMethod = new HttpPost(transUrl);

            // header
            // 認証トークンを取得
            String token = tokenPOST();
            String authKey = "Bearer " + token;
            postMethod.setHeader("Content-Type", "application/xml");
            postMethod.setHeader("Authorization", authKey);

            // 翻訳ワード
            StringBuilder transWords = new StringBuilder();
            for (String word : words) {
                transWords.append("<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>");
                transWords.append(word);
                transWords.append("</string>");
            }
            StringBuilder requestSB = new StringBuilder();
            requestSB.append("<TranslateArrayRequest>");
            requestSB.append("<AppId />");
            requestSB.append("<Texts>");
            requestSB.append(transWords.toString());
            requestSB.append("</Texts>");
            // 翻訳対象言語を指定
            requestSB.append("<To>en</To>");
            requestSB.append("</TranslateArrayRequest>");

            postMethod.setEntity(new StringEntity(requestSB.toString(),
                    StandardCharsets.UTF_8));

            try (CloseableHttpResponse response = httpClient.execute(postMethod)) {
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    String res = EntityUtils.toString(entity, StandardCharsets.UTF_8);
                    InputSource inputSource = new InputSource(new StringReader(res));
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder documentBuilder = factory.newDocumentBuilder();
                    Document document = documentBuilder.parse(inputSource);

                    // 翻訳対象文字列文のソートを実行
                    Element root = document.getDocumentElement();
                    NodeList rootChildren = root.getChildNodes();
                    for (int i = 0; i < rootChildren.getLength(); i++) {
                        Node node = rootChildren.item(i);
                        if (node.getNodeType() == Node.ELEMENT_NODE) {
                            Element element = (Element) node;
                            String val = element.getElementsByTagName("TranslatedText").item(0).getFirstChild().getNodeValue();
                            rtnWords.add(val);
                        }
                    }
                }
            }
        } catch (ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rtnWords.toArray(new String[rtnWords.size()]);
    }

}

確認

呼び出し

        // サンプル
        String[] words = tranApi.translator("これはペンです", "りんごはおいしい");
        for (String word : words) {
            System.out.println(word);
        }

出力結果

This is a pen.
Apple delicious
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?