Azure AI 翻訳サービスの使い方
システムに翻訳機能を入れたくて、当初はGPT-4oに生成してもらおうかと思ってたのですが、Azureに翻訳サービスがあったので使ってみました。
リソース作成
「Azure AI Translator Service」のリソースを作成するのもいいですが、「AI Services」リソースを作るのがおすすめです。
Translator
以外にもDocument Intelligence
やComputer Vision
を同じエンドポイントから呼び出すことができるようになるからです。
使い方
エンドポイントとキーはAI Servicesリソースの以下をコピーして設定してください。
import os
import requests
from dotenv import load_dotenv
load_dotenv()
ai_translator_endpoint = os.environ["AZURE_AI_TRANSLATOR_ENDPOINT"]
ai_translator_endpoint += "translator/text/v3.0/translate"
api_key = os.environ["AZURE_INFERENCE_CREDENTIAL"]
request_json = []
input = input("英訳したい文章を入力してください: ")
request_json.append({"Text": input})
headers = {
'Ocp-Apim-Subscription-Key': api_key,
'Ocp-Apim-Subscription-Region': "<your resource region>",
'Content-type': 'application/json',
}
params = {
"to": "en"
}
request = requests.post(ai_translator_endpoint, params=params, headers=headers, json=request_json)
response = request.json()
print(response)
print(response[0]["translations"][0]["text"])
こんな感じで出てきました。
英訳したい文章を入力してください: 2025年3月27日、東京ビッグサイトでMicrosoft AI Tour Tokyoが開催されます!!
[{'detectedLanguage': {'language': 'ja', 'score': 1.0}, 'translations': [{'text': 'On March 27, 2025, Microsoft AI Tour Tokyo will be held at Tokyo Big Sight!', 'to': 'en'}]}]
On March 27, 2025, Microsoft AI Tour Tokyo will be held at Tokyo Big Sight!
色々調査
1. リクエスト形式
複数送ることも可能ですが、それぞれTextキーのオブジェクト内に入れる必要があります。
[
{"Text":"I would really like to drive your car around the block a few times."},
{"Text":"xxx."}
]
2. レスポンス形式
以下のように返ってくる。
[
{
"detectedLanguage": {
"language": "ja",
"score": 1.0
},
"translations": [
{
"text": "On March 27, 2025, Microsoft AI Tour Tokyo will be held at Tokyo Big Sight!",
"to": "en"
}
]
},
....
]
てことはテキストだけ取り出したい時は↓のような感じで。
for i in response:
print(i["translations"][0]["text"])
3. 文が直訳の意味じゃない場合は
ことわざみたいに、単純に英語に変えるだけじゃダメなやつはどうなるのか。
「犬も歩けば棒に当たる」で検証してみます。
英訳したい文章を入力してください: 犬も歩けば棒に当たる
[{'detectedLanguage': {'language': 'ja', 'score': 1.0}, 'translations': [{'text': 'If the dog walks, it will hit the stick', 'to': 'en'}]}]
If the dog walks, it will hit the stick
生成AIモデルと比べてみました。
英訳という意味ではちゃんとしてくれているものの、ことわざの意味まで踏まえた英訳にはなってないです。
日本語は難しい表現が多いので、AI Translatorで英訳した文を全て鵜呑みにして使うのは良くなさそうです。
AI Translator | GPT-4o | |
---|---|---|
犬も歩けば棒に当たる | If the dog walks, it will hit the stick | Every dog has its day |
豚も煽てりゃ木に登る | Pigs also climb trees | Even pigs can climb trees if flattered |
4. JSON構造丸ごと翻訳したい場合は
そもそもAI Translatorを使おうと思った背景としては、生成AI(GPT-4o)が出力した構造化データのvalueを全て英語にしたバージョンが欲しかったからです。
当初は生成AIに作ってもらおうと思ったのですが、トークン数も単純に倍になるし、生成の時間も長くなってしまいます。
↓イメージ
class ResponseDetail(BaseModel):
title: str
topic: list[str]
content: str
class Response(BaseModel)
ja: ResponseDetail
en: ResponseDetail
json_schema = {
"ja": {"title": "xxx", ...},
"en": {"title": "xxx", ...},
}
そこで、生成AIにはja(日本語)側だけを生成してもらって、en(英語)側はAI Translatorを使いたいです。
理想としてはJSON形式そのまま送ったら、valueのところだけ英語に変えてくれると助かるのですが「1. リクエスト形式」にある通りTextキーに値を入れていかないといけません。
ですのでPythonでデータ構造を組み変える必要があります。
- まずはJSON形式からvalueのみを取り出して文字列配列を生成
def collect_strings(data):
result = []
paths = []
def _collect(value, path):
if isinstance(value, dict):
for k, v in value.items():
_collect(v, path + [k])
elif isinstance(value, list):
for idx, v in enumerate(value):
_collect(v, path + [idx])
elif isinstance(value, str):
result.append(value)
paths.append(path)
_collect(data, [])
return result, paths
- 文字列配列をまとめてAI Translatorに送る
def batch_translate(contents):
request_json = []
for i in contents:
request_json.append({"Text": i})
headers = {
'Ocp-Apim-Subscription-Key': api_key,
'Ocp-Apim-Subscription-Region': <your resource regision>,
'Content-type': 'application/json',
}
params = {
"to": "en"
}
request = requests.post(ai_translator_endpoint, parames=params, headers=headers, json=request_json)
response = request.json()
results = []
for res in response:
results.append(res["translations"][0]["text"])
return results
- 翻訳された文字列配列を再度JSON形式に戻す
def back_to_structure(data, translations, paths):
def _set_value(d, p, val):
if len(p) == 1:
d[p[0]] = val
else:
_set_value(d[p[0]], p[1:], val)
for t, p in zip(translations, paths):
_set_value(data, p, t)
return data
- 最後に一連の処理を実行
def translate_to_en_json(data):
# 1. 文字列配列を抽出
ja_string_list, paths = collect_strings(data)
if not ja_string_list:
return data
# 2. 全部英訳
en_string_list = batch_translate(ja_string_list)
# 3. 元の構造に埋め戻す
en_json = back_to_structure(data, en_string_list, paths)
return en_json
- 試してみる
request = {"title": "Azure AI 翻訳サービスの使い方", "topic": ["azure", "microsoft", "翻訳", "生成AI", "python"], "content": "システムに翻訳機能を入れたくて、当初はGPT-4oに生成してもらおうかと思ってたのですが、Azureに翻訳サービスがあったので使ってみました。"}
response = translate_to_en_json(request)
print(response)
{'title': 'How to use the Azure AI Translation Service', 'topic': ['azure', 'microsoft', 'Translation', 'Generate AI', 'python'], 'content': 'I wanted to put a translation function in the system, and at first I was thinking of having GPT-4o generate it, but there was a translation service in Azure, so I tried using it.'}
5. 金額
100万文字あたり、1550円
感想
体感ではありますが、翻訳精度はGoogle翻訳と同じくらいだと思われるので、文面の意味までしっかり考慮した英訳をしたい場合は生成AIに出力してもらうのが無難だと思いました。
あとはリクエスト先のエンドポイントを以下にしたら何故かエラーが発生します。
Microsoft Learnにはこちらが記載されているのですが。
https://api.cognitive.microsofttranslator.com/translate?api-version=3.0
この記事でも紹介している通り、v3の方式だと上手くいきますのでこちらを利用ください。
Discussion