Amazon Web Services ブログ

Amazon Translate、AWS Lambda、および、新しいバッチ翻訳 API を使ってのドキュメント翻訳

ビジネスや個人向けに、世界中で共有されるデジタルのテキストドキュメントの数が増加し続けている中、翻訳機能への要求はさらに強まってきています。オンライン上には、ユーザーがテキストをコピー&ペーストすればその内容を希望の言語に翻訳できるツールが複数存在します。(分量に限度があり) その場しのぎで テキストを翻訳するのであれば、これも非常に有用だと言えますが、頻繁にこれを行うとなれば、退屈で時間だけがかかる仕事になります。

各組織では、製品やサービスを説明するためのコンテンツを大いに活用することで、問い合わせの方法を顧客に知らせたり、事業上の訴求ポイントなどを広告しています。こういったコンテンツでは、しばしばテキスト量が増えがちで、また、ほとんどは母国語で記述されているでしょう。その言語についての十分な知識のないユーザーが内容を理解しようとすることはやっかいなことです。そして、企業と顧客との関係においても、直接的な影響を与える可能性があります。ドキュメント一式をある言語から別な言語に素早くコスト効率良く翻訳できる、自動化されたソリューションが求められています。

このブログ記事では、ドキュメント翻訳に関する 2 つのソリューションについて解説していきます。その 1 つは、収集したドキュメントに非同期のバッチ翻訳を行うシンプルな翻訳手法のアプローチで、もう一方は、AWS Lambda と Amazon のリアルタイム翻訳を使い、ドキュメントを入手する度に同期的に翻訳を行う、より進んだアプローチです。お客様は、必要に応じ最適な方を選び、ご使用いただけます

同期バッチ翻訳を使うシンプルなアプローチ

Amazon Translate は、現実的な価格で迅速かつ高品質な翻訳を実現するニューラル機械翻訳サービスです。ニューラル機械翻訳は、深層学習モデルを応用した自動翻訳の一形態です。これによれば、従来の統計学や規則をベースにした翻訳アルゴリズムと比べて、正確かつ自然な響きのある翻訳を提供できますこの翻訳サービスは、多様なコンテンツにも適格に対応するため、異なるユースケースやドメイン間での多様な文章を使ってトレーニングされています。この詳細については、Amazon Translate の製品ページをご参照ください。

近頃、Amazon Translate では、大量に集積したテキストや HTML ドキュメントの翻訳に使える、非同期のバッチ翻訳機能を公開しました。これにより、1 回の API 呼び出しのみで、ドキュメント一式をある言語から別な言語に翻訳できます。非同期バッチ翻訳を使うことで、ドキュメントやチュートリアル素材、あるいはブログなどを、日ごとに希望の言語に翻訳しローカライズすることが可能です。さらに、バッチ翻訳ジョブの進行状況をモニタリングしたり、指定した出力フォルダーから翻訳結果を取得することもできます。それでは、非同期バッチ翻訳の使用方法を確認していきましょう。

Amazon Translate のバッチ翻訳を試すために、ここでは、次に示すような 3 つのテキストファイルを使用します。 これらのテキストファイルは、こちらからダウンロードできます。

テキストファイル 1:

Amazon Translate is a neural machine translation service that delivers fast, high-quality, and affordable language translation. 

テキストファイル 2:

Neural machine translation is a form of language translation automation that uses deep learning models to deliver more accurate and more natural sounding translation than traditional statistical and rule-based translation algorithms.

テキストファイル 3:

Amazon Translate allows you to localize content - such as websites and applications - for international users, and to easily translate large volumes of text efficiently.

これらのサンプルテキストを使用したバッチ翻訳ジョブを作成するには、次の手順を実行します。

  1. us-east-1 に S3 バケットを作成し、translate-job-batch-input のような一意の名前を付けます。
  2. このバケット内に、rawという名前のフォルダーを作成します。
  3. フォルダー s3://translate-job-batch-input/raw/ に、翻訳対象のテキストファイルをアップロードします。このバケットが、バッチ翻訳の入力を保持することになります。
  4. translate-job-batch-output/ のような一意の名前で、もう 1 つの S3 バケットを us-east-1 に作成します。
  5. このバケット内に、outputという名前のフォルダーを作成します。
  6. バッチ翻訳からの出力は、s3://translate-job-batch-output/output/ の中に保存されます。
  7. Amazon Translate コンソールで、[Batch Translation] をクリックします。
  8. [Create job] をクリックします。
  9. [Name] に、 MyTranslationJob と入力します。
  10. [Source language] で、[English] を選択します。
  11. [Target language] では、[German] を選択します
  12. [Input S3 location] に、s3://translate-job-batch-input/raw/ と入力します。
  13. [File Format] で、[txt] を選択します。
  14. [Output S3 location] に、s3://translate-job-batch-output/output/ と入力します。
  15. [Access permissions] では、[Create an IAM role] を選択します。
  16. [IAM role] では、[Input and output S3 buckets] を選択します。
  17. [Role name] に、translate-batch-role と入力します。
  18. [Create job] をクリックします。

ジョブの作成が完了すると、 Amazon Translate コンソール上で、その進行状況が確認できるようになります。そのスクリーンショットを次に示します。

ジョブが完了すると、上記の status が Completed に変わり、翻訳済みのドキュメントが出力用の S3 バケットに保存されます。完了した翻訳ジョブの詳細を表示しているスクリーンショットを、次に示します。

翻訳済みファイルは、次に示すような出力用 S3 ロケーションに保存されます。

AWS Lambda と リアルタイム翻訳を使用する進んだアプローチ

コンテンツのローカライズに関する問題は、バッチ翻訳ジョブを実行することで、容易かつコスト効率よく解決することができます。しかし、一連のドキュメントを集めたり、そのドキュメントに対して定期的に非同期のバッチ API を呼び出したりする時間的余裕がないという場合もあり得ます。こういった場合には、ドキュメントが用意された時点で、すぐに翻訳処理を開始していく必要が生じます。

この目標は、イベント駆動型アーキテクチャを利用することで達成できます。特定の S3 バケットにドキュメントがアップロードされたときに、そのバケットから AWS Lambda に通知が送信されるように設定を構成します。この通知により、AWS Lambda では、次のようなイベントのシーケンスのためのコードが実行されます。まず、ドキュメントを読み出し S3 バケットにアップロードします。次に、リアルタイム翻訳 API に渡せるように短いセグメントをドキュメントから抽出します。次に、リアルタイム翻訳 API にこのセグメントを渡します。さらに、リアルタイム翻訳 API からの出力を使って翻訳済みドキュメントを再構成します。最後に、指定した出力ロケーションに出力を保存します。

次の図に、このアーキテクチャを示します。

AWS CloudFormation を使ってのアプリケーションの起動

このソリューションは、AWS CloudFormation コンソールを使い、次のような AWS CloudFormation スタックを起動することで、お使いの AWS アカウント内に容易かつコスト効率よく実装することが可能です。

アプリケーションのデプロイ

このアプリケーションをデプロイするには、次の手順を実行します。

  1. AWS CloudFormation コンソールで、新しくリソース (標準) を設定し、[Create stackをクリックします。
  2. [Amazon S3 URL] を選択し、Amazon S3 URL フィールドに https://s3.amazonaws.com/aws-ml-blog/artifacts/serverless-document-translation/translate-lambda-cfn-stack.yml をコピーします。次に [Next] をクリックします。
  3. [Stack name] には、automated-document-translation のように、アカウント内で一意のスタック名を入力します。
  4. [IAMRoleName] には、TranslationLambdaExecRole のように、アカウント内で一意の IAM ロール名を入力します。Lambda 関数では、このロールが必要な Amazon S3 と Amazon Translate API にアクセスできることを想定しています。この IAM ロールには、次のような 2 つのポリシーがアタッチされています。その 1 つめは、入力および出力の S3 バケットに対する読み出し/書き込みのアクセス権限 (GetObjectPutObject) を与えるカスタムポリシーです。2 つめは、AWS が管理しているポリシー TranslateReadOnly で、これは、Amazon Translate への API を呼び出すためのものです。
  5. [LambdaFunctionName] には、trigger-translation のように、一意の AWS Lambda 関数名を入力します。
  6. InputBucketName には、スタックが作成した Amazon S3 バケットのための、一意の名前を入力します。たとえば、raw-input-bucket のようにします。入力のドキュメントは、翻訳処理前に、このバケットにアップロードされます。入力バケットの名前は小文字だけで構成し、スペースは含めないようにしてください。また、このオペレーションでは新規の S3 バケットが作成されるため、既存バケットの名前は使わないようにします。詳細については「バケット命名規則」をご参照ください。
  7. [OutputBucketName] には、出力バケットのための一意の名前を入力します。たとえば、translated-output-bucket のようにします。翻訳済みの出力ドキュメントが、このバケットに保存されます。入力バケットの場合と同様の命名規則を使用してください。
  8. [SourceLanguageCode] では、翻訳前のドキュメントの言語を、コードで入力します。たとえば、英語を指定する場合は en とし、主として使われている言語を検出させる場合は auto とします。
  9. [TargetLanguageCode] には、翻訳後のドキュメントで使う言語を、コードで入力します。たとえば、ドイツ語を指定する場合には de とします。使用可能な言語コードの詳細については「Amazon Translate とは」をご参照ください。
  10. [Next] を選択します。
  11. [Configure Stack Options] ページで、スタック用のタグなど、追加のオプションパラメータを選択します。
  12. [Next] を選択します。
  13. [I acknowledge that AWS CloudFormation might create IAM resources with custom names.] のチェックボックスをオンにします。
  14. [Create Stack] をクリックします。

スタックの作成が完了するまで、最大 1 分間ほどかかります。

アプリケーションの実行

AWS CloudFormation スタックの作成が終わると、このソリューションを利用開始できます。

入力 S3 バケットに、翻訳対象のテキストファイルをアップロードします。これによりワークフローが起動され、処理が完了すると、翻訳済みドキュメントが出力 S3 バケットに自動的に保存されます。

翻訳済みドキュメントは、出力 S3 バケット内の次のようなパスに保存されます。

<TargetLanguageCode>/<original path of the source file>.たとえば、入力ドキュメントのタイトルが FinalProposal.txt となっていて、入力 S3 バケット内の Marketing という名前の S3 フォルダーに保存されているとすると、ドイツ語に翻訳されたドキュメントの保存先は、出力バケット内の de/Marketing/FinalProposal.txt となります。

出力 S3 バケットでドキュメントが見つからない場合は、Amazon CloudWatch Logs で対応する Lambda 関数をチェックし、失敗の原因となっている可能性のあるエラーを探します。

ここでのソリューションでは、UTF-8 形式のテキストドキュメントのみを処理しています。この記事内の Python を修正することで、異なるファイル形式を処理することも可能です。このソリューションには、Lambda 関数での最大実行時間 (timeout) に関する制限があります。

まとめ

今回の記事では、Amazon Translate を使いドキュメントを翻訳するための、2 つのソリューションの実装法をご紹介しました。1 つは、非同期のバッチ翻訳を使うシンプルなアプローチ、そしてもう 1 つは、AWS Lambda と Amazon の リアルタイム翻訳 を使う、より進んだアプローチでした。Amazon Translate を使って、翻訳ジョブの構築にトライしてみてください。


著者について

Jay Rao は AWS のソリューションアーキテクトです。Jay は、技術的なガイダンスをお客様に提供し、AWS ソリューションの設計や実装を支援することに、熱心に取り組んでいます。

 

 

 

Nikiforos Botis は AWS のソリューションアーキテクトです。Nikiforos は、特に Machine Learning を利用するお客様におけるクラウドジャーニーを成功に導くため、積極的に働いています。仕事以外では、旅行やバスケットボールをプレイすることを楽しんでいます。

 

 

 

Watson G. Srivathsan はAWS のニューラル言語処理サービスである Amazon Translate のために、シニアプロダクトマネージャーとして働いています。週末の彼は、太平洋岸北西部でのアウトドア活動を楽しんでいます。