プログラミング

Amazon TranslateをRuby on Railsで実装する

eyecatch-aws

こちらの記事の続きになります。

この記事では、Ruby on Railsを使って、Amazon TranslateのAPIを使用するサンプルと、そのアーキテクチャを記載します。

なお、Ruby on RailsはAPI機能のみを実装しており、Rails上で実装した翻訳APIのエンドポイントが叩かれると、Amazon Translateを実行するか否かを判断し、必要に応じて処理する、という実装にしています。

全体的なアーキテクチャの紹介

処理の流れは大きく以下のように実装しています。

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、で設定することも可能なようです。)

amazon-translate

注意点としては、ファイルの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

Amazon Translateのダッシュボードで、翻訳された言語のペア、リクエストの数、文字数カウント、平均応答時間など、が確認することが出来ます。

最初の12ヶ月は無料なので、是非試してみてください。

AWSのUI改善されて、全体的にかなり見やすくなった!