JavaでMicrosoft Translator テキスト APIを使って翻訳(日本語→英語)
Microsoft Translator テキスト APIをJavaで試してみました。
意外とJavaのサンプルソースが見つからなかったので参考になればと思い公開します。
key,tokenUrl,transUrlを環境に合わせて変更してもらえればすぐに利用利用可能です。
ちなみに、keyは発行したご自身のものを利用してする必要がありますが、2017/11/05時点では
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