Azure AI TranslatorのDocument Translation機能で構造を保ったままドキュメントを翻訳する

業務でAzure AI Translatorを利用する機会があり、Document Translationの機能を試したので内容を記載します。

Document Translationを活用することで、元のドキュメント構造とデータ形式を維持しながら、サポートされている言語でドキュメントを翻訳することができます。

Document Translationの概要

Document Translationは、Azure AI Translatorのクラウドベースの機械翻訳機能の1つです。

詳しい内容は以下のリンクを参照してください。

learn.microsoft.com

サポートされている翻訳プロセス

Document Translation API では2 つの翻訳プロセスがサポートされており、プロセスによってサポートされているドキュメントや実装方法が異なります。

Asynchronous batch translation(非同期バッチ翻訳)

複数のドキュメントと大きなファイルの処理がサポートされます。 バッチ翻訳プロセスでは、ソースと翻訳後のドキュメント用のストレージ コンテナーを含む Azure Blob Storage アカウントが必要です。

非同期バッチ翻訳では実行後、Azure Blob storageのコンテナに翻訳後のドキュメントが保存されます。

バッチでサポートされるドキュメント形式は以下の通りです。

ファイルの種類 [ファイル拡張子]
Adobe PDF pdf
コンマ区切りの値 csv
HTML html、htm
Localization Interchange File Format xlf
Markdown markdown, mdown, mkdn, md, mkd, mdwn, mdtxt, mdtext, rmd
MHTML mthml、mht
Microsoft Excel xls、xlsx
Microsoft Outlook msg
Microsoft PowerPoint ppt、pptx
Microsoft Word doc、docx
OpenDocument テキスト odt
OpenDocument プレゼンテーション odp
OpenDocument スプレッドシート ods
リッチ テキスト形式 rtf
Tab Separated Values/TAB tsv/tab
テキスト txt

Synchronous single file (同期単一ファイル)

HTTP 要求本文の一部として単一のドキュメントを送信し、翻訳されたドキュメントを HTTP 応答で受け取ることができます。 このファイル翻訳プロセスでは、Azure Blob Storage アカウントは必要ありません。

同期でサポートされるドキュメント形式は以下の通りです。

ファイルの種類 [ファイル拡張子] コンテンツ タイプ
テキスト形式 .txt text/plain
タブ区切りの値 .txv, .tab text/tab-separated-values
コンマ区切りの値 .csv text/csv
ハイパーテキスト マークアップ言語 .html、.htm text/html
M​HTML .mthml、.mht message/rfc822、application/x-mimearchive、multipart/related
Microsoft PowerPoint .pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
Microsoft Excel .xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Microsoft Word .docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
Microsoft Outlook .msg application/vnd.ms-outlook
XML Localization Interchange .xlf、.xliff application/xliff+xml

制限

Azure AI Translatorのすべての制限は次のリンクで確認できます。

learn.microsoft.com

同期・非同期(バッチ)翻訳共通の制限は以下のものがあります。

  • セキュリティで保護されたドキュメント (パスワードが暗号化されているもの、内容をコピーするアクセスが制限されているものなど) の翻訳をサポートしていません
  • 複数の言語で文が構成されている場合、コンテンツの文章全体が 1 つの言語で書かれているものとして動作、または対象言語に翻訳されないことがあります

非同期 (バッチ) 操作の制限

属性 制限
ドキュメント サイズ ≤ 40 MB
ファイルの総数 ≤ 1000
バッチ内のコンテンツ サイズの合計 ≤ 250 MB
バッチ内のターゲット言語の数 ≤ 10
用語集ファイルのサイズ ≤ 10 MB

同期操作の制限

属性 制限
ドキュメント サイズ ≤ 10 MB
ファイルの総数 1
ターゲット言語の合計数 1
用語集ファイルのサイズ ≤ 1 MB
翻訳文字数の制限 1 分あたり 600 万文字 (cpm)

実装方法

具体的な実装は以下のリンクを参考にしてください。

learn.microsoft.com

前提条件

  • アクティブな Azure アカウント
  • Azure AI Translator リソース (マルチサービス Azure AI サービス リソースとは異なる)
    • Standard S1 Standard サービス プラン (従量課金制)
    • または C2、C3、C4、または D3 ボリューム割引プラン(Freeのプランではエラーが発生)
  • (Asynchronous batch translationの場合)Azure Blob Storage アカウント
    • ソースのコンテナー:翻訳対象のファイルをアップロードする場所 (必須)
    • ターゲットのコンテナー:翻訳されたファイルを格納する場所 (必須)

※ サポートされている言語はドキュメント翻訳 SDK - Azure AI services | Microsoft Learnでご確認ください。

翻訳結果

まず、PowerPointで作成した資料の翻訳を実行しました。レイアウトを保ったまま翻訳することができています。記載していたリンクも文字だけが翻訳され、urlはそのまま機能しました。

※ 表示しているものは同期処理で翻訳したものですが、同期・非同期ともに処理の結果は同じでした。

翻訳前
翻訳後

続いて、同期単一ファイルの処理ではサポートされていないPDFを、非同期バッチ翻訳で処理を行いました。こちらも、構成が保たれたまま翻訳できました。文章だけではなく、表の文字も翻訳されていました。

pdf翻訳前
pdf翻訳後

実装例(Synchronous single file)

次のリンク先を参考に同期単一ファイルの実装を行います。
learn.microsoft.com

コンソールアプリでは以下のようなコードでDocument Translationの機能を試すことができます。

※<>の値は書き換えて下さい。

using Azure;
using Azure.AI.Translation.Document;
using System;
using System.Threading;
using System.Text;

class Program
{
    static async Task Main(string[] args)
    {
        string endpoint = "<your-custom-endpoint>";
        string apiKey = "<your-key>";
        SingleDocumentTranslationClient client = new SingleDocumentTranslationClient(new Uri(endpoint), new AzureKeyCredential(apiKey));

        string targetLanguage = "en";
        string fileName = "<source_file_name>";
        string outuptFileName = "<output_file_name>";

        try
        {
            string filePath = Path.Combine("<source_file_path>", fileName);
            string mimeType = GetMimeType(filePath); // MIMEタイプを取得

            using Stream fileStream = File.OpenRead(filePath);
            var sourceDocument = new MultipartFormFileData(Path.GetFileName(filePath), fileStream, mimeType);
            DocumentTranslateContent content = new DocumentTranslateContent(sourceDocument);

            var response = await client.DocumentTranslateAsync(targetLanguage, content).ConfigureAwait(false);

            var translationResult = response.Value; // response.ValueはBinaryData型
            if (translationResult != null)
            {
                // BinaryDataからストリームを取得
                using var translatedStream = translationResult.ToStream();

                // 必要に応じてストリームをファイルに保存 
                var translatedFilePath = Path.Combine("<output_file_path>", outuptFileName); // 適切なパスを指定
                using (var file = File.Create(translatedFilePath))
                {
                    await translatedStream.CopyToAsync(file); // 翻訳されたファイルを保存
                }

                Console.WriteLine($"Translation document saved: {translatedFilePath}");
            }
            else
            {
                Console.WriteLine("No translation result returned.");
            }
        }
        catch (RequestFailedException exception)
        {
            Console.WriteLine($"Error Code: {exception.ErrorCode}");
            Console.WriteLine($"Message: {exception.Message}");
        }
        catch (Exception ex)
        {
            // その他の例外をキャッチする場合
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }

    // 拡張子からMIMEタイプを取得するメソッド
    static string GetMimeType(string filePath)
    {
        string extension = Path.GetExtension(filePath).ToLowerInvariant();
        return extension switch
        {
            ".txt" => "text/plain", // テキスト形式
            ".txv" => "text/tab-separated-values", // タブ区切り値
            ".tab" => "text/tab-separated-values", // タブ区切り値
            ".csv" => "text/csv", // コンマ区切り値
            ".html" => "text/html", // HTML
            ".htm" => "text/html", // HTML
            ".mthml" => "application/x-mimearchive", // MHTML
            ".mht" => "message/rfc822", // MHTML
            ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", // PowerPoint
            ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // Excel
            ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // Word
            ".msg" => "application/vnd.ms-outlook", // Outlook
            ".xlf" => "application/xliff+xml", // XML Localization Interchange
            ".xliff" => "application/xliff+xml", // XML Localization Interchange
            _ => "application/octet-stream" // デフォルトのMIMEタイプ
        };
    }
}

最後に

今回はAzure AI TranslatorのDocument Translationの実装方法をまとめました。

非同期バッチ翻訳ではPDFファイルなどを、光学式文字認識 (OCR)を使いドキュメント内のテキストを抽出し翻訳してくれました。

このように、Azure AI TranslatorのDocument Translationを活用することで、複雑なフォーマットに含まれるテキストを効率的に翻訳することが可能となります。

執筆担当者プロフィール
寺澤 駿

寺澤 駿(日本ビジネスシステムズ株式会社)

IoTやAzure Cognitive ServicesのAIを活用したデモ環境・ソリューション作成を担当。

担当記事一覧