Amazon Translate を使った翻訳 LINE Bot を作ってみた

2018.07.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、中村です。

こちらの記事(【速報】AWSの翻訳サービス Amazon Translateが日本語に対応して全12言語に!)でも紹介してるように、 Amazon Translate で日本語対応がなされました! 今回は、Amazon Translate を使って、翻訳 LINE Bot を作成します。

はじめに

機能

ユーザーが入力した日本語を英語に翻訳し返信してくれる機能になります。

構成

構成はおなじみの API Gateway・Lambda を使います。もちろん翻訳は、 Amazon Translate です。

作ってみよう

LINE チャネル作成

まずLINE 開発者コンソールにてチャネルを作成したいプロバイダーをクリック。

チャネルの一覧が表示される。新規チャネル作成をクリック。

Messaging API でチャネルを作成するを選択する。

アプリ名・アプリ説明・プラン・業種・メールアドレスを入力し入力内容を確認するをクリック。

情報利用に関する同意についてが表示されるので、同意するをクリック。

入力内容が表示されるので、内容を確認する。LINE@利用規約Messaging API(Developer Trial プラン)利用規約にチェックし作成をクリック。

チャネルの一覧に作成したチャネルがされるのでクリック。

チャネルが表示されるので、チャネル基本設定メッセージ送受信設定にあるアクセストークンの再発行をクリック。

再発行に関するメッセージが表示されるので、再発行をクリック。

アクセストークン(ロングターム)が発行されるので、内容をメモする。

webhook は、Lambda・API Gateway を設定後追加します。

Lambda

IAMロール

まず Lambda に使用する IAM ロールを作成します。今回は Translate が使用できればOKなので、TranslateReadOnly を追加する必要があります。 AWS コンソールで IAM を開き、ロールの作成をクリックします。 このロールを使うサービスを選択画面が表示されます。Lambda を選択しましょう。そして、次のステップ: アクセス権限をクリックします。 次にロールに与えるアクセス権限を選択します。検索窓で Translate と検索してください。すると、TranslateReadOnlyというポリシーが表示されると思います。チェックボックスにチェックし、次のステップ: 確認をクリックします。 最後にロール名・ロールの説明を入力します。また信頼されたエンティティ(どのサービスでロールを使うか)・アクセス権限が表示されているので問題ないか確認しロールの作成をクリックします。

これでロールが作成されているはずです。関数を作成するときに作成したロールを指定してください。

関数作成

AWS コンソールで Lambda を開き、関数の作成をクリックします。 ロールは、先ほど作成した物を選択してください。

実装

モジュールインストール

外部モジュールを使用しますので、npm や yarn を使用してモジュールをインストールします。 aws-sdk については、 Lambda に標準で入っているのでインストールしなくてもOKです。

$ yarn add @line/bot-sdk
サンプルコード

実際の利用では、署名の検証(リクエストが正しいものかどうか)等が必要になりますが、今回は割愛しています。

const Line = require('@line/bot-sdk');
const Aws = require('aws-sdk');
const ChannelAccessToken = 'xxxxxxxxxxx'; //メモしておいたアクセストークン(ロングターム)を入れる
const Client = new Line.Client({channelAccessToken: ChannelAccessToken});
const Translate = new Aws.Translate({region: 'us-east-1'});

exports.handler = async (event) => {
    console.log('event >>>' + JSON.stringify(event));
    let body = JSON.parse(event.body);
    let org_text = body.events[0].message.text;
    let result = await getTranslate(org_text);
    let message = [{
        type: 'text',
        text: result.TranslatedText
    }];
    let response = await Client.replyMessage(body.events[0].replyToken, message);
    console.log(response);
    return {statusCode: 200};
};

function getTranslate(org_text) {
    return new Promise(((resolve, reject) => {
        let params = {
            Text: org_text,
            SourceLanguageCode: 'ja',
            TargetLanguageCode: 'en',
        }
        Translate.translateText(params, function(err,data){
            if (err) {
                console.log(err);
                reject();
            } else {
                console.log(JSON.stringify(data));
                resolve(data);
            }
        });
    }));
};

API Gateway

AWS コンソールで API Gateway を開き、APIの作成をクリック。

API 名・説明・エンドポイントタイプを決定し、APIの作成をクリック。

作成ができたのでメソッドの作成をクリックし、メソッドを追加していきます。

メソッドの一覧が表示されるので、POSTを選択します。

次にメソッドのエンドポイントを指定します。

  • 統合タイプ:Lambda関数
  • Lambda プロキシ統合の使用: チェックを入れる
  • Lambda リージョン: 作成したLambdaのリージョン
  • Lambda 関数: 作成したLambda関数名
  • デフォルトタイムアウトの使用: チェックを入れる

を設定し、保存をクリック。

Lambda へのアクセス権限を追加のメッセージが表示されるので、OKをクリック。

成功するとこのように表示されます。

作成できたAPIをデプロイします。APIのデプロイをクリック。

APIのデプロイメッセージが表示されます、デプロイステージを新しいステージにし、ステージ名を入力し、デプロイをクリック。

成功すると作成したステージエディターが表示されます。またURLも表示されるので、LINEの開発者コンソールに登録します。

登録が完了すると完成になります。 実際に使ってみましょう!

デモ動画

なんとなく良さそうです。

まとめ

いかがでしたでしょうか。 今回は日本語英訳のみですが、Amazon Translate を使い複数言語を翻訳するボットができると旅行中に現地の方との会話に有用かなと思います。