はじめに
AWSのAIサービスをつかったハンズオンです。
AWSのAIサービスといってもどんなサービスがあるのかイメージがしにくいかと思います。
実際、生成AIのサービスや音声作成、学習モデルの作成プラットフォームなど様々なサービスがあります。
今回はAIサービスでも身近な翻訳サービス「Amazon Translate」を使って英語のテキストを日本語に翻訳してみます。
このハンズオンでは、Amazon Translateを使って、S3にアップロードした英語テキストファイルを日本語に翻訳し、S3に格納するサービスを作成していきます。
前提条件
- Amazon Translateはサービスを有効化しておいてください。
- ハンズオンのためLambdaはVPCなしの設定で作成しています。内部的な通信を利用する場合はS3とTranslateのエンドポイントをVPCに作成してください。
環境構成
本ハンズオンの環境構成は以下の通りです。
料金目安
本ハンズオンはAmazon Translateの無料枠期間内であればほぼ無料、無料期間外でも1000文字で2円程度です。
- S3: 入力用のテキストファイルと結果のjsonファイルのみなので、ほぼ無料
- Lambda: 処理回数や利用リソース/利用時間はわずかなのため、ほぼ無料(無料枠範囲)
- Amazon Translate: 1000文字あたり$0.015(約2円)。リクエストから最初の12か月は無料枠範囲
1. S3バケットの作成
AWS管理コンソールから「S3」の画面を開き、「バケットの作成」を選択します。
翻訳元の英語テキストを格納するバケットと翻訳後の日本語ファイルを格納するS3バケットを作成します
※Lambdaと同じリージョンで作成してください。
3. Lambda関数の作成
AWS管理コンソールから「Lambda」の画面を開き、「関数の作成」を選択します。
任意の関数名、ランタイム:Node.js 22.x、アーキテクチャ:x86_64として、関数を作成します。
関数が作成できたら、設定タブを選択してください。一般設定から「編集」を選択します。
基本設定の画面が表示されます。タイムアウト値はデフォルトの3秒のままでもいいですが、翻訳する文章量によって数値を調整してください。
実行ロールにS3バケットとTranslateの実行権限を付与します。「IAMコンソールで****ロールの表示」を選択してください。
ロールの設定画面が表示されます。許可を追加から「インラインポリシーを作成」を選択してください。
ポリシーエディタが表示されます。JSONを選択して以下のポリシーを入力してください。入力後「次へ」を選択します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::【翻訳元の英語テキストを格納するバケット名】/*"
},
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::【翻訳結果の日本語テキストを格納するバケット名】/*"
},
{
"Effect": "Allow",
"Action": "translate:TranslateText",
"Resource": "*"
}
]
}
確認して作成の画面で「ポリシーを作成」を選択します。
Lambdaの画面に戻って環境変数の追加をします。設定タブ>左メニューの「環境変数」を選択し「編集」を選択します。
環境変数を設定します。
キー | 値 |
---|---|
REGION | リージョン名(ap-northeast-1など) |
TARGETBUCKET | 【翻訳結果の日本語テキストを格納するバケット名】 |
以下のソースを反映し、「index.mjs」を「index.js」に名前を変えてください。
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.handler = void 0;
const client_s3_1 = require("@aws-sdk/client-s3");
const client_translate_1 = require("@aws-sdk/client-translate");
const s3Client = new client_s3_1.S3Client({ region: process.env.REGION });
const translateClient = new client_translate_1.TranslateClient({ region: process.env.REGION });
// S3の読み取り用ヘルパー関数
const streamToString = async (stream) => {
const chunks = [];
for await (const chunk of stream) {
chunks.push(chunk);
}
return Buffer.concat(chunks).toString('utf-8');
};
// Lambdaハンドラー
const handler = async (event) => {
try {
// イベントからバケット名とオブジェクトキーを取得
const sourceBucket = event.Records[0].s3.bucket.name;
const sourceKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
// S3からテキストファイルを取得
const getObjectParams = { Bucket: sourceBucket, Key: sourceKey };
const getObjectCommand = new client_s3_1.GetObjectCommand(getObjectParams);
const s3Response = await s3Client.send(getObjectCommand);
const fileContent = await streamToString(s3Response.Body);
console.log('Original Content:', fileContent);
// Amazon Translateで翻訳
const translateParams = {
Text: fileContent,
SourceLanguageCode: 'en', // 元の言語 (英語)
TargetLanguageCode: 'ja', // 翻訳先言語 (日本語)
};
const translateCommand = new client_translate_1.TranslateTextCommand(translateParams);
const translation = await translateClient.send(translateCommand);
console.log('Translated Content:', translation.TranslatedText);
// 新しいS3バケットにアップロード
const targetBucket = process.env.TARGETBUCKET; // 変換後のファイルを保存するバケット名
const targetKey = `translated/${sourceKey.split('/').pop()?.replace('.txt', '-translated.txt')}`;
const putObjectParams = {
Bucket: targetBucket,
Key: targetKey,
Body: translation.TranslatedText,
ContentType: 'text/plain',
};
const putObjectCommand = new client_s3_1.PutObjectCommand(putObjectParams);
await s3Client.send(putObjectCommand);
console.log(`Translated file uploaded to ${targetBucket}/${targetKey}`);
}
catch (error) {
投稿 console.error('Error processing S3 event:', error);
throw error;
}
};
exports.handler = handler;
反映と名前の変更が完了したら、「Deploy」を選択します。
S3のアップロードをトリガーとする設定を追加します。「トリガーを追加」を選択します。
トリガーの設定でS3を選択し、バケットは【翻訳元の英語テキストを格納するバケット名】を入力してください。イベントタイプは「PUT」、サフィックスは「.txt」を入力して「追加」を選択します。
3. 動作確認
今回はアメリカの独立宣言を翻訳してみます。こちらから参照
In Congress, July 4, 1776
The unanimous Declaration of the thirteen united States of America, When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature’s God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.
・
・
・
【翻訳元の英語テキストを格納するバケット名】のバケットにこちらのテキストファイルをアップロードします。
しばらくすると、【翻訳結果の日本語テキストを格納するバケット名】のバケットのtranslated配下にファイルが生成されます。
内容を確認します。
1776年7月4日、議会で
全会一致のアメリカ十三州宣言。人災の過程で、ある民族が他の民族と結びついてきた政治的集団を解散させ、自然の法則と自然の神の法則によって与えられる分離された平等な地位を地球の権力の間で引き継ぐことが必要になった場合、人類の意見をきちんと尊重するには、人類の意見をきちんと尊重する必要があります。分離。
Google翻訳では以下になります。
1776 年 7 月 4 日、議会にて
アメリカ合衆国 13 か国の全会一致の宣言。人類の出来事の過程において、ある国民が他の国民と結びついていた政治的集団を解体し、地球上の権力の中に分離した、そして独立した政治的集団を引き受けることが必要になる。自然の法則と自然の神が彼らに与えた同等の地位を保障するために、人類の意見をまともに尊重するには、人類を分離に駆り立てた原因を宣言する必要がある。
結果が多少異なりますが、大意は一致しています。
まとめ
このハンズオンではAWSのAIサービスの中でも比較的イメージしやすそうな翻訳サービスに触れてみました。
このハンズオンを応用することで、ドキュメントの一括翻訳や翻訳APIを使った翻訳サービスを提供することも可能です。
翻訳サービスを深めていくのもいいですし、慣れてきたら他のAIサービスも使ってみてください。
以下AWSのAIサービス関連のおすすめ書籍です。
|
|