見出し画像

Djangoで機械学習の翻訳を行う(Amazon Translate)

無料で使える翻訳サイトがたくさんあるのに、なんでAmazonの翻訳を使う必要があるの?と思われるかもしれません。

翻訳サイトは汎用性をもたせるために、一般的な翻訳をすることが多いです。でも、Amazon Translateを使うことで、特定の用語を特定の言葉に翻訳するカスタマイズ設定を行うこともできます。

Amazonの機械学習の翻訳サービスを使うことで、より適切な翻訳内容を手に入れることができるようになるというわけですね。

Webアプリケーションで利用すれば、ユーザーが作成したコンテンツを、その場で翻訳して表示することだってできる可能性があります。

それでは、さっそくAmazon Translateを使っていきましょう!

必要なパッケージのインストール

DjangoからAmazon Translateを使うには、3つのパッケージが必要になります。django、boto3、そしてawscliです。

boto3は、AWS SDK for Pythonと呼ばれるもので、要するにAWSにアクセスしたい時に使う、Python用のSDKですね(SDK:Software Development Kit)。名前の由来がよくわからないので、とても覚えにくいです(´;ω;`)

そして、awscliはAWS Command Line Interfaceの略で、AWSにコマンドラインからアクセスできるようにするツールです。

この2つを連携させることで、Amazon Translateを使うことができるようになります。

…というわけで、さっそくPythonの仮想環境に入って、これらのパッケージをインストールしていきます。

pip install django
pip install boto3
pip install awscli

インストールはこれだけで完了です!

AWSでIAMユーザーの作成

続いて、Amazon Translateで利用するIAMユーザーを作成します。

IAM(Identity and Access Management)は、AWSでユーザー作成やその権限などを設定できるサービスです。AWSアカウントを作成すると、ルートユーザーと呼ばれる、全ての権限をもったユーザーが作成されます。ただ、そのルートユーザーでなんでもできてしまう、というのが問題になることがあります。

ルートユーザーが乗っ取られた場合、悪意を持った人がなんでもできてしまうかもしれません。アカウントを共有していたら、誰が何を変更したのかわからない状態になります。

このような状態を避けるために、それぞれの用途に合わせてIAMユーザーを作成し、各ユーザーにそれぞれ必要な必要最低限の権限を与えることで、もしもの場合に備えておくことができます。

今回はAmazon Translateだけを使うので、Amazon Translateしか利用できないユーザーを作成するというわけですね!

まずは、AWSマネジメントコンソールでIAMサービスを選択し、左側のメニューから[ユーザー]を選択します。

スクリーンショット 2021-04-15 22.25.45

それから画面上部にある[ユーザーを追加]ボタンを押して、ユーザーの作成を始めていきます。

スクリーンショット 2021-04-15 22.26.20

作成画面に入ったら、適当に名前をつけてユーザーを作成します。名前はなんでもいいですが、あとでどんなユーザーかわかりやすいようにしておく方が良いでしょう。

下の、[AWSアクセスの種類を選択]に関しては、今回は[AWSマネジメントコンソールへのアクセス]は必要ないので、[プログラムによるアクセス]にだけチェックを入れます。

スクリーンショット 2021-04-15 22.27.34

次に進むと、アクセス許可を設定する画面になります。

[ユーザーをグループに追加]は、同じような権限を持ったユーザーを複数作成するのであれば、グループを作成しておくと便利です。そのグループにユーザーを追加/削除するだけで、そのグループに設定した権限を与えたりなくしたりすることができます。

[アクセス権限を既存のユーザーからコピー]はそのままですね。

今回は新しく作るので、[既存のポリシーを直接アタッチ]を選択します。ポリシーはAWSのサービスの利用権限を細かくわけています。このポリシーの一覧の中から必要な権限を選んで、ユーザーに付与することができます。

Amazon Translateを使う場合は、検索バーに"translate"と入力して、Amazon Translate関連のポリシーをフィルターしましょう。

スクリーンショット 2021-04-15 22.26.59

[TranslateFullAccess]にチェックを入れて、次のステップに進みます。

スクリーンショット 2021-04-15 22.29.33

タグの追加は任意です。作成しているサービスごとにタグを作っておくと、一覧にしたい時に便利です。

スクリーンショット 2021-04-15 22.29.49

最後に確認画面があります。

確認して問題なければ、下の方にある「ユーザーの作成」ボタンを押してユーザーの作成ができます。

スクリーンショット 2021-04-15 22.30.21

成功すると、サインイン用のアドレスや、アクセスキーID、シークレットアクセスキーをダウンロードできる画面になります。(画像ではセキュリティのため表示しません)

これらのキーを記憶するのは困難なので、忘れずに.csvファイルをダウンロードしておきましょう。このファイルは厳重管理しておきます。

AWS CLIのインストール

boto3からAWSサービスにアクセスするためには、利用するIAMユーザーを設定しなければなりません。そのための事前設定として、awscliに先ほど作成したキーを登録する必要があります。

awscliインストール後に、以下のコマンドを入力するとセットアップが開始されます。

aws configure

すると、先ほどIAMユーザーで作成したアクセスキーIDなどを求められますので、それぞれ入力していきます。

近いリージョンのほうがレスポンスが早いので、できるだけ近いリージョンに設定しておきましょう。僕の場合は、東京リージョンなので"ap-northeast-1"に設定しました。

出力フォーマットはjsonにします。

Default region name [us-west-2]:ap-northeast-1
Default output format [None]:json

利用できるリージョン一覧は下を参考にしてください。

これでAWS側の準備は完了です。

あとは、DjangoでAmazon Translateを使ったモデルを作っていきましょう。

DjangoのTranslateアプリケーションの作成

これからtranslateというアプリケーションを作成していきますが、大部分は以前に書いたこちらの記事と一緒なので、違うところだけ紹介していきます。

今回は、以下コマンドでtranslateアプリケーションを作成し、このアプリケーションにCRUDのCreateとRead部分を実装していきます。

python manage.py startapp translate

translateアプリケーションのモデル

今回はシンプルに作りたいので、モデルにも最低限の情報だけつけていきます。(本当はモデルも作る必要はありませんが、このほうがわかりやすいと思うので…)

# translate/models.py
from django.db import models
import uuid
import os

class Translate(models.Model):
  text = models.TextField(max_length=1000)
  translated_text = models.TextField(max_length=1000)

単純な日本語のテキスト(text)とそれを翻訳したテキスト(translated_text)だけを保存するシンプルなモデルです。

translateアプリケーションのCreateView

最初に処理の流れを説明します。

フォームにテキストを入力してもらって、そのテキストをAmazon Translateに渡して翻訳してもらいます。シンプルですね。

モデルデータを作成するためにフォームに入力をしていきます。

[form_valid]はフォームに入力された内容に問題がなかった場合に、呼ばれる関数です。ここでtextに登録されたデータをAmazon Translateに渡して、違う言語に変換してもらうことにします。

まずはTranslateCreateViewがどうなっているかみてみましょう。

# translate/views.py

from django.views import generic 
from django.urls import reverse_lazy
from .models import Translate

class TranslateCreateView(generic.CreateView):
  model = Translate
  template_name = 'translate/create.html'
  success_url = reverse_lazy('translate:list')
  fields = ['text']
 
  def form_valid(self, form):
    translate = form.save(commit=False)
    response = use_translate(translate.text)
    if "TranslatedText" in response:
      translate.translated_text = response["TranslatedText"]
  translate.save()
  return super().form_valid(form)

フォームで入力するフィールドは、textだけなので、fieldsには'text'だけ書きます。translated_textはtextから作成するフィールドなので、入力する必要はありません。

[form_valid]関数では、form.save(commit=False)と呼ぶことによって、フォームで入力した内容から作成されるモデル(translate)を取得できます。commit=Falseとしているのは、翻訳したテキストを入手してからデータベースに保存を行いたいからです。

use_translate関数で、Amazon Translateにアクセスしてレスポンスを返してもらっています。このレスポンスの中に"TranslatedText"という要素があれば、それをtranslated_textフィールドに保存しています。この関数については、後述します。

これでモデルのデータが完成しましたので、最後にtranslate.save()でデータベースに保存して完了です。

Amazon Translateへのアクセス方法

最後にuse_translate関数の中身を紹介しておきます。最低限の実装として以下のようにしました。

# translate/views.py 

from boto3 import Session

...省略...

def use_translate(text):

   # create session
   session = Session(profile_name="default")
   translate = session.client("translate")

   # create translation data
   response = translate.translate_text(
               Text = text,                
               SourceLanguageCode='ja',
               TargetLanguageCode='en'
               )

   return response

最初にboto3を利用してAWSと接続するセッションを作成します。

profile_name="default"と指定すると、aws configureで設定したアクセスキーIDなどでAWSに接続することができます。

そして、次の行で"translate"への接続に使うクライアントを作成します。

これで事前準備が完了しました。

次のtranslate.translate_textで、実際にAmazon Translateに接続しに行っています。最低限必要な情報として以下を設定する必要があります。

Text:翻訳したいテキスト
SourceLanguageCode:翻訳元の言語
TargetLanguageCode:翻訳先の言語

ちなみに、SourceLanguageCodeに"auto"と設定すると言語を自動検知してくれます。(裏でAmazon Comprehendを呼んでくれているらしいです)

今回は日本語から英語にしていますが、選択式にしてもいいかもしれませんね!

選択できる言語コードの一覧は以下を参照してください。

これでAmazon Translateを利用して、音声ファイルをテキスト情報に変換して、データベースに保存することができるようになりました。

実際に翻訳してみる

では、早速翻訳できるか試してみましょう。
まずは、開発用サーバーを起動します。

python manage.py runserver

http://localhost:8000/にアクセスします。まだ何も作成していないので、このような状態になっています。それでは、テキストを作成しましょう。

スクリーンショット 2021-04-15 23.15.12

スクリーンショット 2021-04-15 23.16.27

適当に翻訳したいテキストを入力します。

スクリーンショット 2021-04-15 23.18.27

データが作成されたので詳細を表示してみます。

スクリーンショット 2021-04-15 23.18.52

あってる!!

スクリーンショット 2021-04-15 23.21.12

これはちょっと怪しいかな(笑)。でもまぁ伝わらなくもない…かな。

あとは、いろいろ遊んでみてください!(*´꒳`*)

サンプルサイト

GitHubにここまでに作成した内容を残しておきます。

最後に

Amazon Translate最初の12ヶ月は毎月200万文字まで無料で使えるのがいいですよね。こうやってWebアプリケーションを作らなくても、マネジメントコンソールから簡単に試せるのも優秀です。


ここまで読んでいただけたなら、”スキ”ボタンを押していただけると励みになります!(*´ー`*)ワクワク



この記事が気に入ったらサポートをしてみませんか?