ortの灰ログ

人狼のことや技術のことや日々雑感

Microsoft Translator使ってみた備忘録

翻訳APIの無料枠あるし、応用すれば自動で人狼の再翻訳村とかできるんじゃね?という思いつきで使ってみた
2022/5現在、月200万文字まで無料っぽい。

https://azure.microsoft.com/ja-jp/free/

ここからアカウント作成
登録完了したらクイックスタートセンターを開く
上部検索でTranslatorで検索して「Cognitive Services | Translator」を開く
いい感じに登録してキーを確認

Microsoft Translator APIを使ってみた - Qiita
Microsoft Azure Cognitive Services テキスト翻訳とは - Azure Cognitive Services | Microsoft Docs

このあたりを参考に叩けばok
情報量なさすぎるけどそのくらい簡単にできたよ、ということで。

WOLF MANSIONで翻訳者の能力を受けると、
発言した内容をランダム言語に翻訳→再度日本語訳して発言されるようにできた。

全員デフォでこの状態になる「再翻訳村」もできるなぁと思ったのだけど、
月200万文字までだとワンチャン超えそうだなと思ったので一旦封印。

あと、翻訳精度が高すぎて、昔と比べてあまり面白い文章に変わらないという難点が。
(翻訳精度高いのはいいことなんだけども)

おまけのざっくりKotlinコード

private fun fromJa(str: String, language: String): String {
    val builder = UriComponentsBuilder.fromUriString(baseUrl)
    val uri = builder.queryParam("api-version", "3.0")
        .queryParam("from", "ja")
        .queryParam("to", language)
        .toUriString()
    return call(uri, str)
}

private fun toJa(str: String, language: String): String {
    val builder = UriComponentsBuilder.fromUriString(baseUrl)
    val uri = builder.queryParam("api-version", "3.0")
        .queryParam("from", language)
        .queryParam("to", "ja-Jpan")
        .toUriString()
    return call(uri, str)
}

private fun call(uri: String, str: String): String {
    val requestEntity = RequestEntity
        .post(URI(uri))
        .header("Ocp-Apim-Subscription-Key", key)
        .header("Ocp-Apim-Subscription-Region", "japaneast")
        .header("Content-Type", "application/json; charset=UTF-8")
        .body(listOf(TranslatorBody(str)))
    val restTemplate = RestTemplate()
    val response = restTemplate.exchange(requestEntity, Array<TranslatorResponse>::class.java)
    return response.body?.firstOrNull()?.translations?.firstOrNull()?.text ?: str
}

data class TranslatorBody(
    val Text: String
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class TranslatorResponse(
    val translations: List<TranslatorResponseContent>
) {
    @JsonIgnoreProperties(ignoreUnknown = true)
    data class TranslatorResponseContent(
        val text: String
    )
}