オリジナルのPDFのフォーマットを保持し、Amazon Textract、Amazon Translate、およびPDFBoxで翻訳されたドキュメントを表示します

Display documents translated using Amazon Textract, Amazon Translate, and PDFBox while preserving the original PDF format.

様々な業界の企業は、大量のPDF文書を作成し、スキャンし、保存しています。多くの場合、コンテンツはテキストが多く、異なる言語で書かれており、翻訳が必要です。これに対応するためには、これらのPDF内のコンテンツを自動的に抽出し、迅速かつ効率的に翻訳する自動化されたソリューションが必要です。

多くのビジネスは、多様なグローバルユーザーを持ち、それらの間でクロス言語コミュニケーションを可能にするためにテキストを翻訳する必要があります。これは手作業であり、遅く、高価な人間の努力です。オリジナルの文書のフォーマットを保持しながら文書を翻訳するためのスケーラブルで信頼性のある、費用対効果の高いソリューションを見つける必要があります。

医療などの業界では、規制要件により、翻訳された文書には追加の人間が必要で、機械翻訳された文書の妥当性を検証する必要があります。

翻訳された文書が元のフォーマットと構造を保持していない場合、文脈が失われます。これにより、人間のレビュアーが検証し修正することが困難になる可能性があります。

この投稿では、Amazon Textract、Amazon Translate、およびApache PDFBoxを使用したジオメトリベースのアプローチを使用して、スキャンされたPDFから新しい翻訳されたPDFを作成する方法を示します。

ソリューションの概要

この投稿で紹介するソリューションでは、次のコンポーネントを使用します:

  • Amazon Textract – スキャンされた文書から印刷されたテキスト、手書き、およびその他のデータを自動的に抽出する、完全に管理された機械学習(ML)サービスです。Amazon Textractは、単純な光学文字認識(OCR)を超えて、フォームやテーブルからデータを識別、理解、抽出するためのものです。 Amazon Textractは、財務報告書、医療記録、税務フォームなど、さまざまなドキュメントでテキストを検出できます。
  • Amazon Translate – 高速で品質の高い、手頃な価格の言語翻訳を提供するニューラル機械翻訳サービスです。 Amazon Translateは、2,970以上の言語ペアを対象にオンデマンドおよびバッチ翻訳機能を提供し、翻訳コストを削減します。
  • PDF Translate – Javaで書かれたオープンソースのライブラリで、AWS SamplesのGitHubに公開されています。このライブラリには、Amazon TextractとAmazon Translateを使用して、希望の言語で翻訳されたPDF文書を生成するためのロジックが含まれています。また、PDFドキュメントを作成するためにオープンソースのJavaライブラリであるApache PDFBoxも使用しています。他のプログラミング言語でも同様のPDF処理ライブラリが利用可能です。たとえば、Node PDFBoxなどがあります。

機械翻訳を行う際には、名前や固有の識別子など、特定のテキストのセクションを翻訳しないように保持したい場合があります。 Amazon Translateでは、タグの修正を許可するため、翻訳されないテキストを指定することができます。 Amazon Translateはまた、翻訳出力のフォーマリティのカスタマイズもサポートしており、翻訳の形式レベルをカスタマイズすることができます。

Amazon Textractの制限の詳細については、Amazon Textractのクォータを参照してください。

このソリューションは、現在English、Spanish、Italian、Portuguese、French、GermanをサポートしているAmazon Textractで抽出できる言語に制限されています。これらの言語はAmazon Translateでもサポートされています。Amazon Translateでサポートされている言語の完全なリストについては、サポートされている言語と言語コードを参照してください。

このPDFでは、英語からスペイン語へのテキストの翻訳をデモンストレーションするために使用されます。このソリューションは、フォーマットなしで翻訳されたドキュメントを生成することもサポートします。翻訳されたテキストの位置は保持されます。ソースと翻訳されたPDFドキュメントは、AWS SamplesのGitHubリポジトリでも見つけることができます。

次のセクションでは、ローカルマシン上で翻訳コードを実行する方法と、翻訳コードの詳細について見ていきます。

前提条件

開始する前に、AWSアカウントとAWSコマンドラインインターフェース(AWS CLI)をセットアップしてください。 Amazon TextractやTranslateなどのAWSサービスへのアクセスには、適切なIAM権限が必要です。最小特権のアクセス許可を利用することをお勧めします。 IAMの権限については、IAMのポリシーと権限およびAmazon TextractとIAMの連携、Amazon TranslateとIAMの連携を参照してください。

ローカルマシンで翻訳コードを実行する

このソリューションでは、PDFドキュメントを抽出して翻訳するためのスタンドアロンのJavaコードに焦点を当てています。これは、最適なレンダリングされた翻訳済みPDFドキュメントをテストおよびカスタマイズするためのものです。その後、コードをAWSでデプロイして実行する自動化されたソリューションに統合することができます。コードの実行には、Amazon Simple Storage Service(Amazon S3)を使用してドキュメントを保存し、AWS Lambdaを使用してコードを実行するサンプルアーキテクチャを参照してください。

ローカルマシンでコードを実行するには、以下の手順を完了してください。コードの例はGitHubリポジトリで利用可能です。

  1. GitHubリポジトリをクローンします:

    git clone https://github.com/aws-samples/amazon-translate-pdf
  2. 次のコマンドを実行します:

    cd amazon-translate-pdf
  3. 次のコマンドを実行して、英語からスペイン語に翻訳します:

    java -jar target/translate-pdf-1.0.jar --source en --translated es

2つの翻訳されたPDFドキュメントがdocumentsフォルダに作成されます。元の書式と共に(SampleOutput-es.pdfSampleOutput-min-es.pdf)。

翻訳されたPDFを生成するためのコード

次のコードスニペットは、PDFドキュメントを取得し、対応する翻訳されたPDFドキュメントを生成する方法を示しています。Amazon Textractを使用してテキストを抽出し、翻訳されたテキストを画像のレイヤーとして追加して翻訳されたPDFを作成します。これは、Amazon Textractを使用してスキャンされたドキュメントから自動的に検索可能なPDFを生成する解決策に基づいています。

コードはまず、Amazon Textractで各行のテキストを取得します。 Amazon Translateを使用して翻訳されたテキストを取得し、翻訳されたテキストのジオメトリを保存します。

Region region = Region.US_EAST_1;
TextractClient textractClient = TextractClient.builder()
        .region(region)
        .build();

// 入力のDocumentオブジェクトをバイトとして取得
Document pdfDoc = Document.builder()
        .bytes(SdkBytes.fromByteBuffer(imageBytes))
        .build();

TranslateClient translateClient = TranslateClient.builder()
        .region(region)
        .build();

DetectDocumentTextRequest detectDocumentTextRequest = DetectDocumentTextRequest.builder()
        .document(pdfDoc)
        .build();

// Detect操作を呼び出す
DetectDocumentTextResponse textResponse = textractClient.detectDocumentText(detectDocumentTextRequest);

List<Block> blocks = textResponse.blocks();
List<TextLine> lines = new ArrayList<>();
BoundingBox boundingBox;

for (Block block : blocks) {
    if ((block.blockType()).equals(BlockType.LINE)) {
        String source = block.text();

        TranslateTextRequest requestTranslate = TranslateTextRequest.builder()
                .sourceLanguageCode(sourceLanguage)
                .targetLanguageCode(destinationLanguage)
                .text(source)
                .build();

        TranslateTextResponse resultTranslate = translateClient.translateText(requestTranslate);

        boundingBox = block.geometry().boundingBox();
        lines.add(new TextLine(boundingBox.left(),
                boundingBox.top(),
                boundingBox.width(),
                boundingBox.height(),
                resultTranslate.translatedText(),
                source));
    }
}
return lines;

フォントサイズは次のように計算され、簡単に設定できます:

int fontSize = 20;
float textWidth = font.getStringWidth(text) / 1000 * fontSize;
float textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
 
if (textWidth > bbWidth) {
    while (textWidth > bbWidth) {
        fontSize -= 1;
        textWidth = font.getStringWidth(text) / 1000 * fontSize;
        textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
     }
} else if (textWidth < bbWidth) {
     while (textWidth < bbWidth) {
         fontSize += 1;
         textWidth = font.getStringWidth(text) / 1000 * fontSize;
         textHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
      }
}

保存されたジオメトリと翻訳されたテキストから翻訳されたPDFが作成されます。翻訳されたテキストの色の変更は簡単に設定できます。

float width = image.getWidth();
float height = image.getHeight();
 
PDRectangle box = new PDRectangle(width, height);
PDPage page = new PDPage(box);
page.setMediaBox(box);
this.document.addPage(page); //org.apache.pdfbox.pdmodel.PDDocument
 
PDImageXObject pdImage;
 
if(imageType == ImageType.JPEG){
    pdImage = JPEGFactory.createFromImage(this.document, image);
} else {
    pdImage = LosslessFactory.createFromImage(this.document, image);
}
 
PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.OVERWRITE, false);
 
contentStream.drawImage(pdImage, 0, 0);
contentStream.setRenderingMode(RenderingMode.FILL);
 
for (TextLine cline : lines){
    String clinetext = cline.text;
    String clinetextOriginal = cline.originalText;
                       
    FontInfo fontInfo = calculateFontSize(clinetextOriginal, (float) cline.width * width, (float) cline.height * height, font);
    //元のドキュメント構造を含めるように構成する - 元のドキュメントとオーバーレイ
    contentStream.setNonStrokingColor(Color.WHITE);
    contentStream.addRect((float) cline.left * width, (float) (height - height * cline.top - fontInfo.textHeight), (float) cline.width * width, (float) cline.height * height);
    contentStream.fill();
 
    fontInfo = calculateFontSize(clinetext, (float) cline.width * width, (float) cline.height * height, font);
    //元のドキュメント構造を含めるように構成する - 翻訳されたドキュメントとオーバーレイ
    contentStream.setNonStrokingColor(Color.WHITE);
    contentStream.addRect((float) cline.left * width, (float) (height - height * cline.top - fontInfo.textHeight), (float) cline.width * width, (float) cline.height * height);
    contentStream.fill();
    //ここで出力テキストの色を変更する
    fontInfo = calculateFontSize(clinetext.length() <= clinetextOriginal.length() ? clinetextOriginal : clinetext, (float) cline.width * width, (float) cline.height * height, font);
    contentStream.setNonStrokingColor(Color.BLACK);
    contentStream.beginText();
    contentStream.setFont(font, fontInfo.fontSize);
    contentStream.newLineAtOffset((float) cline.left * width, (float) (height - height * cline.top - fontInfo.textHeight));
    contentStream.showText(clinetext);
    contentStream.endText();
}
contentStream.close()

以下の画像は、元の書式を保持した状態でスペイン語に翻訳されたドキュメントを表示しています(SampleOutput-es.pdf)。

以下の画像は、書式のないスペイン語の翻訳PDFを表示しています(SampleOutput-min-es.pdf)。

処理時間

雇用申請PDFの抽出、処理、および翻訳PDFのレンダリングには約10秒かかりました。独立宣言PDFなどのテキストが多いドキュメントの処理時間は1分未満でした。

費用

Amazon Textractでは、処理されるページと画像の数に基づいて従量課金されます。Amazon Translateでは、処理されるテキスト文字の数に基づいて従量課金されます。実際の費用については、Amazon Textractの価格とAmazon Translateの価格を参照してください。

結論

この記事では、Amazon TextractおよびAmazon Translateを使用して、元のドキュメント構造を保持したまま翻訳されたPDFドキュメントを生成する方法を紹介しました。翻訳の品質を向上させるために、Amazon Textractの結果を事後処理することもできます。たとえば、抽出された単語をSymSpellなどのMLベースのスペルチェックに通すことでデータの検証ができます。また、クラスタリングアルゴリズムを使用して読み取り順序を保持することもできます。さらに、Amazon Augmented AI(Amazon A2I)を使用して、元のPDFドキュメントと翻訳されたPDFドキュメントを人間のレビューに提供し、より正確なコンテキストを提供するためのワークフローを構築することもできます。始めるには、「Amazon TranslateとAmazon Augmented AIを使用したヒューマンレビューワークフローの設計」と「ドメイン固有および言語固有のカスタマイズを使用した多言語ドキュメント翻訳ワークフローの構築」を参照してください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

PaLM-Eをご紹介します:新たな5620億パラメータの具現化された多モーダル言語モデルで、ロボットの操作計画やビジュアルQAなどのタスクを実行します

大容量の言語モデル(LLM)は、会話、ステップバイステップの推論、数学の問題解決、コードの作成など、さまざまな分野で強力...

機械学習

「品質と責任について大規模な言語モデルを評価する」

生成AIに関連するリスクは広く公表されています有毒性、偏見、逸出した個人情報、幻覚は組織の評判に悪影響を与え、顧客の信...

AI研究

このAI研究は、大規模言語モデルにおける不誠実さのメカニズムを明らかにする:プロンプトエンジニアリングとニューラルネットワーク分析に深く没入する

大規模な言語モデル(LLM)の理解とその正直な行動の促進は、これらのモデルが成長し、社会に広く受け入れられるようになった...

機械学習

「マイクロソフト、Azureカスタムチップを発表:クラウドコンピューティングとAI能力を革新する」

産業の持続的な噂の中で、Microsoftの長らく待ち望まれていた発表がイグナイトカンファレンスで明らかになり、テックランドス...

機械学習

「FC-CLIPによる全局セグメンテーションの革新:統一された単一段階人工知能AIフレームワーク」

イメージセグメンテーションは、画像を意味のある部分や領域に分割する基本的なコンピュータビジョンのタスクです。 それは、...