Amazon Translate ~Slackを利用した異言語コミュニケーション~

こんにちは。katoです。

今回は日本語対応が発表されたAmazon Translateを試してみたいと思います。

 

概要

今回Amazon Translateを利用して行うのは、Amazon TranslateとSlackを連携した異言語コミュニケーションシステムの構築です。

構成としては下記の様になります。

Amazon Translate

 

SlackのSlash CommandsからAPI Gateway経由でLambdaを呼び出し、Amazon Translateでの翻訳結果をSlackに返すといった流れになります。

今回は、日本語→英語、英語→日本語の翻訳を行うようそれぞれ設定を行っていきます。

なお、バージニア北部にてAWSの構築は行っていきます。

 

手順

それでは実際に設定を行っていきましょう。

まずはじめに、Slackの設定を行っていきます。

Slackで必要となる設定は、Incoming WebHooksとSlash Commandsの設定となります。

 

Slackの「Add an app」からどちらも機能を追加することができます。

 

 

Incoming WebHooksの設定に関しましては、機能を追加し、出力を行うチャンネルを選択するのみとなります。

ここで選択したチャンネルが、翻訳結果の出力先となります。

入力はSlackのどこからでも実行できますが、出力先は固定となりますので注意して下さい。

 

Slash Commandsも同様に機能を追加し、日本語→英語、英語→日本語の翻訳をそれぞれ行うよう2種類のコマンドを設定していきます。

 

 

最初の段階では、コマンドを設定するのみとなります。API Gatewayの作成後にURLの設定を追加します。

今回はコマンドをそれぞれ、「/ja_to_en」、「/en_to_ja」として作成しております。

 

 

Slack設定が完了したら翻訳処理を行うLambda関数を作成していきます。

Amazon Translateへの権限を付与したロールを指定し、Python 3.6にて関数を作成します。
利用するロールは「TranslateReadOnly」というポリシーをアタッチしておけばOKです。

関数の作成が完了したら、下記コードをインラインにて入力します。

 

# coding: UTF-8
import boto3
import json
import logging
import os
import urllib

ENCRYPTED_EXPECTED_TOKEN = os.environ['kmsEncryptedToken']

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def respond(params, err, res=None):
    message = params['text'][0]
    user = params['user_name'][0]
    translate = boto3.client('translate')
    response = translate.translate_text(
        Text=message,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )
    url = os.environ['slackurl']
    data = { "username": user, "text": response['TranslatedText']}
    req = urllib.request.Request(url, json.dumps(data).encode())
    with urllib.request.urlopen(req) as res:
        body = res.read()
    return {
        'text': "Input: " + message
    }

def lambda_handler(event, context):
    params = urllib.parse.parse_qs(event['body'])
    token = params['token'][0]
    if token != ENCRYPTED_EXPECTED_TOKEN:
        logger.error("Request token (%s) does not match expected", token)
        return respond(Exception('Invalid request token'))
    return respond(params, None)

今回は2種類の翻訳で、利用するLambda関数を分けておりますが、コードの内容自体はほぼ同じものとなります。
Amazon Translateの「SourceLanguageCode」と「TargetLanguageCode」の部分のみ翻訳する内容に応じて切り替えて下さい。

上記のコードを入力したら、下記の2種類の環境変数をそれぞれ設定します。

キー:kmsEncryptedToken 値:Slash Commendsの設定時に表示されたToken
キー:slackurl 値:Incoming WebHooksの設定時に表示されたWebhook URL

Slash CommandsのTokenの値はSlash Commands毎に異なるので、値をそれぞれ設定してください。

環境変数の設定が完了したら、トリガーの設定を行います。

「トリガーの追加」からAPI Gatewayを選択し、下記内容にてトリガーの設定を行います。

API:新規APIの作成
セキュリティ:オープン
API名:任意の名前
デプロイされるステージ:任意の名前

Lambda毎にそれぞれAPIを作成するように設定します。

デプロイステージは共通で構いません。

上記設定にてトリガーの追加が完了したら、Lambdaの設定を保存します。

Lambdaの設定が完了すると、API GatewayのサービスページにAPIが追加されるので、設定・デプロイを行っていきます。

作成されたAPIリソースの統合リクエストを選択します。

「Lambdaプロキシ統合の使用」のチェックを外します。

 

下記内容のマッピングテンプレートを追加し、保存をします。

 

Content-Type:application/x-www-form-urlencoded
テンプレート:{ "body": $util.urlDecode($input.json("$")) }

 

 

上記の設定を2つのAPIリソースにてそれぞれ行い、APIをデプロイします。

デプロイが完了するとURLが発行されるので、このURLをSlash Commandの「URL」の箇所に入力して設定は完了となります。

なお、設定するURLは下記の様にAPI名まで含んだものを指定してください。

例)https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod/translate_jp_to_eng

 

動作確認

それでは実際に動作を見ていきましょう。

Slach Commandsの後にメッセージを入力することで、翻訳した結果がSlack上に表示されます。
なお、改行を含むメッセージの場合はエラーとなりますのでご注意ください。

今回の翻訳機能を利用して会話したやり取りが以下になります。

 

 

イコン画像を指定していないため、少し見づらいですが、ユーザAとユーザBのやり取りとなっております。
ユーザAは日本語→英語、ユーザBは英語→日本語の翻訳機能を使ってメッセージを送っております。

少しおかしな翻訳もありますが、異言語間でのコミュニケーションをスムーズに行うことができました。

第3者からみると日本語と英語が混在しているため、内容が掴みづらくなってしまう可能性があります。
利用シーンによっては、原文も載せた方が使いやすくなるかもしれません。

 

まとめ

今回は、Amazon Translateを利用した翻訳機能を試してみました。

Amazon Translateは、直訳ではなくて意訳してくれている部分もあるので、ネットに転がっている無料の翻訳ツールと比べるとかなり精度の高い翻訳となっているのではと感じました。

ただし、ことわざであったり、文学的な言い回しは翻訳しきれない箇所も見受けられました。

Amazon Translateは継続的な機械学習を行う翻訳サービスとなってるため、今後さらに翻訳の精度は上がっていくかと思われます。

他のAWSサービスと連携させることで、マルチ言語対応のシステムを今まで以上に簡単に構築できるようになりました。

便利なサービスとなっているので一度お試しになってみては如何でしょうか。