こちらの記事の続きになります。
この記事では、Ruby on Railsを使って、Amazon TranslateのAPIを使用するサンプルと、そのアーキテクチャを記載します。
なお、Ruby on RailsはAPI機能のみを実装しており、Rails上で実装した翻訳APIのエンドポイントが叩かれると、Amazon Translateを実行するか否かを判断し、必要に応じて処理する、という実装にしています。
全体的なアーキテクチャの紹介
処理の流れは大きく以下のように実装しています。
- モバイル側から「翻訳」ボタンがタップされると、Railsにtranslatesのエンドポイントを叩きます。(この時、テーブル名、id、翻訳言語を最低限のparameterとして飛ばします。)
- Rails側にて、翻訳対象がtranslatesテーブルに格納されているなら、そのデータをそのままレスポンス。なければAmazon Translateを使用して、翻訳処理を実行後、そのデータをtranslatesテーブルに格納し、モバイルにレスポンスする。
翻訳済みのデータをrailsを用いてDBに格納しておくことで、無駄にAmazon Translateを叩かないようにします。(Amazon Translateは従量課金なので、できるだけコストを抑えます)
AWSでAmazon Translateを設定する
EC2やRDSのように、特に設定する必要はありません。
SDKを用いて実装するのみです。
AWS上でカスタム辞書の設定
カスタム辞書のみ、AWS上で設定が必要ですが、csvをアップロードするだけです。(csvの他にもTMXファイル、実質的にはXML、で設定することも可能なようです。)
注意点としては、ファイルの1行目に言語コードを、後は各行に対応する単語を入力すること、また大文字・小文字も区別されることぐらいでしょう。
詳細は公式サイトを確認してください。(英語のみ)
Creating a Custom Terminology
Ruby on Railsの実装
次にRails側にてAmazon TranslateのAPIを実装してきます。
AWS SDKの導入
Gemfileを使っている前提で進めます。
Gemfileに”aws-sdk”を記載し、bundle installでsdkを組み込みます。
gem 'aws-sdk'
bundle install
Amazon Translate APIの実行
def create
...
translate_client = Aws::Translate::Client.new(
region: "REGION",
access_key_id: "ACCESS_KEY_ID",
secret_access_key: "SECRET_ACCESS_KEY"
)
...
target_text = ""
timeline = Timeline.find(params[:id])
target_text = timeline.content
response = translate_client.translate_text({
text: target_text,
source_language_code: "auto",
target_language_code: params[:language_code],
})
...
render json: { text: response.translated_text }
end
至ってシンプルです。諸々省いていますが、この前後に、翻訳済みデータが存在していればそのままレスポンス、存在していなかったときに翻訳後にDBに格納という処理も実装しています。
SDKがあるので、実装自体はかなり簡潔に書くことが出来ました。
運用状況の確認
従量課金制なので、現在どれぐらい使われているのかもAWS上でサクッと確認することが出来ます。
Amazon Translateのダッシュボードで、翻訳された言語のペア、リクエストの数、文字数カウント、平均応答時間など、が確認することが出来ます。
最初の12ヶ月は無料なので、是非試してみてください。
AWSのUI改善されて、全体的にかなり見やすくなった!