REST API をプログラムで使用する
ドキュメント翻訳は、Azure AI 翻訳サービスのクラウドベースの機能です。 ドキュメント翻訳 API を使用すると、ソース ドキュメントの構造とテキストの書式設定を維持しながら、サポートされている言語とさまざまなファイル形式でドキュメント全体を非同期的に翻訳できます。 この攻略ガイドでは、任意のプログラミング言語と HTTP REST API でドキュメント翻訳 API を使用する方法について説明します。
前提条件
Note
ドキュメント翻訳は、S1 Standard サービス プラン (従量課金制) および C2、C3、C4、D3 ボリューム割引プランでサポートされています。 「Azure AI 翻訳の価格」を "参照してください"。
開始するには、以下が必要です。
アクティブな Azure アカウント。 アカウントがない場合は、無料アカウントを作成できます
Azure Blob Storage アカウント。 Azure Blob Storage アカウント内に、ソースとターゲットの各ファイル用のコンテナーを作成する必要があります。
- ソースのコンテナー。 このコンテナーは、翻訳対象のファイルをアップロードする場所です (必須)。
- ターゲットのコンテナー。 このコンテナーは、翻訳されたファイルを格納する場所です (必須)。
-
次のように、Translator プロジェクトとインスタンスの詳細フィールドを入力します。
[サブスクリプション]。 使用できる Azure サブスクリプションのいずれかを選択します。
[リソース グループ]。 新しいリソース グループを作成するか、同じライフサイクル、アクセス許可、ポリシーを共有する既存のリソース グループにリソースを追加することができます。
[リソース リージョン] . ご自身のビジネスまたはアプリケーションが特定のリージョンを必要としない限り、 [グローバル] を選択します。 認証にシステム割り当てマネージド ID を使用する場合は、米国西部などの地理的リージョンを選択します。
名前。 リソースに選んだ名前を入力します。 選択した名前は Azure 内で一意である必要があります。
Note
ドキュメント翻訳には、カスタム ドメイン エンドポイントが必要です。 名前フィールドに入力する値は、エンドポイントのカスタム ドメイン名となります。
価格レベル。 ドキュメント翻訳は、Free レベルではサポートされません。 このサービスを試すには、Standard S1 を選択してください。
[確認および作成] を選択します。
サービス条件を確認し、 [作成] を選択してリソースをデプロイします。
リソースが正常にデプロイされたら、[リソースに移動] を選択してキーとエンドポイントを取得します。
キーとカスタム ドメイン エンドポイントを取得する
- Translator サービスへの要求では、アクセスを認証するために読み取り専用キーとカスタム エンドポイントが必要です。 カスタム ドメイン エンドポイントは、リソース名、ホスト名、Translator サブディレクトリを指定した形式の URL であり、Azure portal で使用できます。
新しいリソースを作成した場合は、そのデプロイ後に [リソースに移動] を選びます。 既存のドキュメント翻訳リソースがある場合は、リソース ページに直接移動します。
左側のレールの [リソース管理] で、 [キーとエンドポイント] を選択します。
自分の
key
とdocument translation endpoint
をコピーして、使いやすい場所 ("Microsoft メモ帳" など) に貼り付けます。 API 呼び出しを行うために必要なキーは 1 つだけです。key
とdocument translation endpoint
を、ドキュメント翻訳サービスへの要求の認証のためのコード サンプルに貼り付けます。
キーを取得する
Translator サービスへの要求には、アクセス認証を受けるための読み取り専用キーが必要です。
- 新しいリソースを作成した場合は、そのデプロイ後に [リソースに移動] を選びます。 既存のドキュメント翻訳リソースがある場合は、リソース ページに直接移動します。
- 左側のレールの [リソース管理] で、 [キーとエンドポイント] を選択します。
- 自分のキーをコピーして、使いやすい場所 ("Microsoft メモ帳" など) に貼り付けます。
- それを、ドキュメント翻訳サービスへの要求の認証のための次のコード サンプルに貼り付けます。
Azure Blob Storage コンテナーを作成する
Azure Blob Storage アカウント内に、ソースおよびターゲットの各ファイル用のコンテナーを作成する必要があります。
- ソースのコンテナー。 このコンテナーは、翻訳対象のファイルをアップロードする場所です (必須)。
- ターゲットのコンテナー。 このコンテナーは、翻訳されたファイルを格納する場所です (必須)。
Note
ドキュメント翻訳では、用語集は、個別の用語集コンテナーではなく、ターゲット コンテナー内の BLOB としてサポートされます。 カスタム用語集を含める場合は、それをターゲット コンテナーに追加し、要求に glossaryUrl
を含める必要があります。 翻訳言語のペアが用語集に存在しない場合、それは適用されません。 「カスタム用語集を使用してドキュメントを翻訳する」を "参照してください"
ドキュメント翻訳用の SAS アクセス トークンを作成する
sourceUrl
、targetUrl
、省略可能な glossaryUrl
には Shared Access Signature (SAS) トークンを含める必要があり、クエリ文字列として追加します。 トークンは、コンテナーまたは特定の BLOB に割り当てることができます。 「ドキュメント翻訳プロセスの SAS トークンを作成する」を "参照してください"。
- ソースのコンテナーまたは BLOB には、読み取りと一覧表示のアクセス権が指定されている必要があります。
- ターゲットのコンテナーまたは BLOB には、書き込みと一覧表示のアクセス権が指定されている必要があります。
- 用語集の BLOB には、読み取りと一覧表示のアクセス権が指定されている必要があります。
ヒント
- 操作で複数のファイル (BLOB) を翻訳する場合は、コンテナー レベルで SAS アクセス権を委任します。
- 操作で 1 つ のファイル (BLOB) を翻訳する場合は、BLOB レベルで SAS アクセス権を委任します。
- SAS トークンの代わりに、システム割り当てマネージド ID を認証に使用することができます。
HTTP 要求
非同期バッチ翻訳要求は、POST 要求を通じて Translator サービス エンドポイントに送信されます。 成功した場合、POST メソッドから 202 Accepted
応答コードが返され、サービスによってバッチ要求が作成されます。 翻訳されたドキュメントがターゲット コンテナーに一覧表示されます。
Azure AI 翻訳サービスの要求の制限について詳しくは、ドキュメント翻訳要求の制限に関する記事を参照してください。
HTTP ヘッダー
各 Document Translation API 要求には、次のヘッダーが含まれています。
HTTP ヘッダー | 説明 |
---|---|
Ocp-Apim-Subscription-Key | 必須: 値は、Translator または Azure AI サービス リソースの Azure キーです。 |
Content-Type | 必須: ペイロードのコンテンツ タイプを指定します。 許容される値は、application/json または charset=UTF-8 です。 |
POST 要求本文のプロパティ
- Post 要求の URL は POST
https://<NAME-OF-YOUR-RESOURCE>.cognitiveservices.azure.com/translator/text/batch/v1.1/batches
です。 - POST 要求本文は、
inputs
という名前の JSON オブジェクトです。 inputs
オブジェクトには、ソースとターゲットの言語ペア用のsourceURL
とtargetURL
のコンテナー アドレスが両方とも含まれています。prefix
とsuffix
は、翻訳対象のソース パス内のドキュメントをフィルター処理するための、大文字と小文字を区別する文字列です。prefix
フィールドは、翻訳用のサブフォルダーを表現するためによく使われます。suffix
フィールドは、ファイルの拡張子に最もよく使われます。glossaries
フィールド (省略可能) の値は、ドキュメントが翻訳されるときに適用されます。- 各ターゲット言語の
targetUrl
は一意でなければなりません。
Note
同じ名前のファイルが宛先に既に存在する場合、ジョブは失敗します。
コンテナー内のすべてのドキュメントを翻訳する
{
"inputs": [
{
"source": {
"sourceUrl": "{sourceSASUrl}"
},
"targets": [
{
"targetUrl": "{targetSASUrl}",
"language": "fr"
}
]
}
]
}
コンテナー内の特定のドキュメントを翻訳する
"storageType": "File"
を指定します。- システム割り当てマネージド ID を認証に使っていない場合は、(コンテナーではなく) 特定の BLOB またはドキュメントに対して、ソース URL と SAS トークンが作成されていることを確認してください。
- ターゲット URL の一部としてターゲット ファイル名が指定されていることを確認してください (ただし、SAS トークンはコンテナー用のままです)。
- サンプル要求では、1 つのドキュメントが 2 つのターゲット言語に翻訳されたものが返されます。
{
"inputs": [
{
"storageType": "File",
"source": {
"sourceUrl": "{sourceSASUrl}"
},
"targets": [
{
"targetUrl": "{targetSASUrl}",
"language": "es"
},
{
"targetUrl": "{targetSASUrl}",
"language": "de"
}
]
}
]
}
カスタム用語集を使用してドキュメントを翻訳する
{
"inputs": [
{
"source": {
"sourceUrl": "{sourceSASUrl}"
},
"targets": [
{
"targetUrl": "{targetSASUrl}",
"language": "es",
"glossaries": [
{
"glossaryUrl": "{glossaryUrl/en-es.xlf}",
"format": "xliff"
}
]
}
]
}
]
}
🆕 ドキュメント内の画像に埋め込まれたテキストを翻訳する
Note
- この機能は省略可能で、翻訳要求ごとに有効にする必要があります。
- この機能を有効にすると、使用量に基づいて追加コストが発生する場合があります。 詳細については、「Azure AI Vision の価格」を参照してください。
- この機能は現在、Batch Document Translation API を通じてのみ利用可能です。
- サポートされているファイル形式は
.docx
のみです。 - この機能を使用するには、Azure AI Services リソース (スタンドアロンの Translator リソースではない) が必要です。
要求の構成
options
フィールドで省略可能なtranslateTextWithinImage
パラメーターを使用する- データ型: ブール値 (
true
またはfalse
) - 既定のブール値設定は
false
です。 このオプションをtrue
に設定して、画像テキストの翻訳を有効にします。
- データ型: ブール値 (
応答の詳細。 この機能を有効にすると、追加された画像処理情報が応答に含まれます。
totalImageScansSucceeded
正常に翻訳された画像スキャンの数。totalImageScansFailed
処理に失敗した画像スキャンの数。
コードを使用してドキュメント翻訳要求を送信する
コーディング プラットフォームを設定する
- 新しいプロジェクトを作成します。
- Program.cs を C# コード サンプルで置き換えます。
- エンドポイント、キー、コンテナー URL の値を Program.cs に設定します。
- JSON データを処理するために、.NET CLI を使用して Newtonsoft.Json パッケージを追加します。
- プロジェクト ディレクトリからプログラムを実行します。
重要
コード サンプルでは、示されている場所に Shared Access Signature (SAS) URL をハードコーディングします。 終了したら、コードから SAS の URL を削除し、決して公開しないようにしてください。 本番環境では、Azure マネージド ID のような、資格情報を安全に保存してアクセスできる方法を使用してください。 詳細については、「Azure Storage のセキュリティ」を参照してください。
操作によっては、次のフィールドの更新が必要になる場合があります。
endpoint
basePath
key
sourceURL
targetURL
glossaryURL
id
(ジョブ ID)
id
値の検索
- ジョブ
id
は、POSTstart-batch-translation
メソッドの応答ヘッダーOperation-Location
の URL 値で確認します。/document/
パラメーターの後に続く英数字の文字列は、操作のジョブid
です。
応答ヘッダー | 応答 URL |
---|---|
Operation-Location | {document-translation-endpoint}/translator/document/9dce0aa9-78dc-41ba-8cae-2e2f3c2ff8ec ?api-version={date} |
- また、get-translations-status 要求を使用して、翻訳 "ジョブ" とその
id
の一覧を取得することもできます。
非同期バッチ翻訳を開始する
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text;
class Program
{
static readonly string route = "?api-version={date}";
private static readonly string basePath = "{your-document-translation-endpoint}/translator/document/batches";
private static readonly string key = "{your-api-key}";
static readonly string json = ("{\"inputs\": [{\"source\": {\"sourceUrl\": \"https://YOUR-SOURCE-URL-WITH-READ-LIST-ACCESS-SAS\",\"storageSource\": \"AzureBlob\",\"language\": \"en\"}, \"targets\": [{\"targetUrl\": \"https://YOUR-TARGET-URL-WITH-WRITE-LIST-ACCESS-SAS\",\"storageSource\": \"AzureBlob\",\"category\": \"general\",\"language\": \"es\"}]}]}");
static async Task Main(string[] args)
{
using HttpClient client = new HttpClient();
using HttpRequestMessage request = new HttpRequestMessage();
{
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(basePath + route);
request.Headers.Add("Ocp-Apim-Subscription-Key", key);
request.Content = content;
HttpResponseMessage response = await client.SendAsync(request);
string result = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
Console.WriteLine($"Status code: {response.StatusCode}");
Console.WriteLine();
Console.WriteLine($"Response Headers:");
Console.WriteLine(response.Headers);
}
else
Console.Write("Error");
}
}
}
サポートされるドキュメントの形式の取得
サポートされているファイル形式の一覧を取得します。 成功した場合、このメソッドから 200 OK
応答コードが返されます。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
private static readonly string basePath = "{your-document-translation-endpoint}/translator/document/formats";
static readonly string route = "?api-version={date}&type=document";
private static readonly string key = "{your-api-key}";
static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
using HttpRequestMessage request = new HttpRequestMessage();
{
request.Method = HttpMethod.Get;
request.RequestUri = new Uri(basePath + route);
request.Headers.Add("Ocp-Apim-Subscription-Key", key);
HttpResponseMessage response = await client.SendAsync(request);
string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"Status code: {response.StatusCode}");
Console.WriteLine($"Response Headers: {response.Headers}");
Console.WriteLine();
Console.WriteLine(result);
}
}
翻訳ジョブの状態を取得する
1 つのジョブの現在の状態と、ドキュメント翻訳要求に含まれるすべてのジョブの概要を取得します。 成功した場合、このメソッドから 200 OK
応答コードが返されます。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
private static readonly string basePath = "{your-document-translation-endpoint}/translator/document/batches/{id}";
static readonly string route = "?api-version={date}";
private static readonly string key = "{your-api-key}";
static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
using HttpRequestMessage request = new HttpRequestMessage();
{
request.Method = HttpMethod.Get;
request.RequestUri = new Uri(basePath + route);
request.Headers.Add("Ocp-Apim-Subscription-Key", key);
HttpResponseMessage response = await client.SendAsync(request);
string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"Status code: {response.StatusCode}");
Console.WriteLine($"Response Headers: {response.Headers}");
Console.WriteLine();
Console.WriteLine(result);
}
}
}
特定のドキュメントの状態を取得する
概要
ドキュメント翻訳要求内の特定のドキュメントの状態を取得します。 成功した場合、このメソッドから 200 OK
応答コードが返されます。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
private static readonly string basePath = "{document-translation-endpoint}/translator/document/batches/{id}/documents/{documentId}";
static readonly string route = "?api-version={date}";
private static readonly string key = "{your-api-key}";
static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
using HttpRequestMessage request = new HttpRequestMessage();
{
request.Method = HttpMethod.Get;
request.RequestUri = new Uri(basePath + route);
request.Headers.Add("Ocp-Apim-Subscription-Key", key);
HttpResponseMessage response = await client.SendAsync(request);
string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"Status code: {response.StatusCode}");
Console.WriteLine($"Response Headers: {response.Headers}");
Console.WriteLine();
Console.WriteLine(result);
}
}
ジョブを削除する
概要
現在処理中またはキューに入っているジョブをキャンセルします。 翻訳が開始されていないドキュメントだけがキャンセルされます。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
private static readonly string basePath = "{your-document-translation-endpoint}/translator/document/batches/{id}";
static readonly string route = "?api-version={date}";
private static readonly string key = "{your-api-key}";
static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
using HttpRequestMessage request = new HttpRequestMessage();
{
request.Method = HttpMethod.Delete;
request.RequestUri = new Uri(basePath + route);
request.Headers.Add("Ocp-Apim-Subscription-Key", key);
HttpResponseMessage response = await client.SendAsync(request);
string result = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"Status code: {response.StatusCode}");
Console.WriteLine($"Response Headers: {response.Headers}");
Console.WriteLine();
Console.WriteLine(result);
}
}
一般的な HTTP 状態コード
HTTP 状態コード | 説明 | 考えられる理由 |
---|---|---|
200 | OK | 要求は成功しました。 |
400 | 正しくない要求 | 必須パラメーターが指定されていない、空、または null です。 または、必須またはオプションのパラメーターに渡された値が無効です。 よくある問題はヘッダーが長すぎることです。 |
401 | 権限がありません | 要求は承認されません。 キーまたはトークンが有効であり、正しいリージョンにあることを確認してください。 |
429 | 要求が多すぎます | 使用中のサブスクリプションで許可されている要求のクォータまたは速度を超えています。 |
502 | 無効なゲートウェイ | ネットワークまたはサーバー側の問題です。 無効なヘッダーを示す場合もあります。 |