
この手順はJAWS DAYS 2021のハンズオンセッションにて使うハンズオン手順です。この手順は公開しますので復習や社内展開して自由に使って頂いて構いません。
以下が実施できているかを確認しましょう
AWS LambdaのソースなどをPCにダウンロードします。
こちらのgithubにアクセスしZIPファイルをダウンロードしてください。

ZIPファイルを解凍します。以下の3つのzipファイルを本日のハンズオンで使いますので、3つのZIPファイルが存在することを確認してください。
aws-handson-nlp-linebot
| README.md
|
+---Lambda
| bot.zip
| push.zip
| startTranscribe.zip
|
\---linebot
jaws_beginner_icon.png
memo.txt
richmenu_jawsdays2021_hondson-line.png
memo.txtはパラメータなどをメモする際に任意で使用してください。
完成イメージです。LINEのMessaging APIを使い、英語のテキストメッセージを送信すると日本語訳してメッセージを返し、日本語の音声メッセージを送信すると文字起こしした日本語メッセージを返すLINEボットです。
LINEボットの設定を行います。構成図だとここです。

LINEボットを作成するためには、LINE Developersへの登録が必要となります。
LINE Developersコンソールで[コンソール]もしくは[ログイン]をクリックします。

認証画面で[LINEアカウントでログイン]をクリック

LINEアカウントのメールアドレスとパスワードを入力し、ログインしてください。

以下のような二要素認証のための4桁の数字が表示されるため

LINEアプリで4桁を入力してください。

ログイン後にアカウント情報の登録画面になりますので任意の開発者名とメールアドレスを入力し、[アカウントを作成]をクリック

登録できました。

LINEボットを開発するために開発者の所属となるプロバイダーを作成します。[新規プロバイダー]ボタンをクリック

個人開発者ですのでプロバイダー名は本名でもニックネームでも任意で設定してください。

作成できました。今日からあなたもLINE Developerの一員です!

LINEボットアカウントを作成します。以下の画面で[Messaging API]をクリックします。

チャネル作成画面で、必要項目を埋めて[作成]ボタンをクリックします。
チャネルの種類 | Messaging API | |
プロバイダー | (作成したプロバイダー) | |
チャネルアイコン | 任意 | *1度設定すると1時間変更不可 *素材フォルダにサンプルのJAWSアイコン素材あり |
チャネル名 | 任意 | *一度設定したら7日間変更不可 |
チャネル説明 | 任意 | *埋まっていればOK |
大業種 | 通信・情報・メディア | *ハンズオン用なので適当でOK |
小業種 | その他通信・情報・メディア | *ハンズオン用なので適当でOK |
メールアドレス | (LINEアカウントメールアドレス) | |
プライバシーポリシー | 空欄 | |
サービス利用規約 | 空欄 |


[作成]ボタンをクリックします。

[同意する]をクリック

チャネル作成できました。

LINEのリッチメニューを設定します。[LINE official Account manager]をクリックします。

LINE Official Account Manager(公式アカウントからの配信などを行うコンソール)に画面遷移しますので、ホームタブをクリックし

左ペインからトークルーム管理>リッチメニューをクリックします。

リッチメニュー設定画面で[作成]をクリックします。

以下のようにリッチメニューを設定し

コンテンツ設定項目で[テンプレートを選択]をクリック

小項目の以下を選択して[選択]

[テンプレートを選択]をクリックし

素材フォルダのrichmenu_jawsdays2021_hondson-line.pngをアップロードします。

アクション項目で以下を設定します。
タイプ | URL | アクションラベル | |
A | リンク | https://jawsug-bgnr.connpass.com/ | connpass |
B | リンク | https://forms.gle/BysejaSa3uv2Zzqm7 | アンケート |

リッチメニューが設定できました。

APIの設定を行うため、別タブで操作していたLINE Developer コンソールの画面に戻ります。チャネル基本設定タブのチャネルIDとチャネルシークレットをメモしておきます。
チャネルIDは以下。

チャネルシークレットは以下。

Messaging API設定タブをクリックし

チャネルアクセストークンの[発行]をクリックし、表示されるトークンをメモします。


ここまでメモできていれば完了です。

ここをつなげます。

LINEのQRコードでボットと友達になります。

リッチメニューが設置されていてウェルカムメッセージが来たら成功です。

この時点だと任意のメッセージを送ってもLINE側の応答機能でソーリー文が返されます。

次からはAWS側の構築を行います。
AWSマネジメントコンソールにログインし、東京リージョンに変更します。

Lambda用のロールを作成します。IAMサービス画面でロールメニューをクリックします。

AWS > Lambdaをクリックします。

LambdaからAmazon Translate, Amazon S3 , Amazon CloudWatch Logs, Amazon Transcribeにアクセスが必要です。以下のポリシーを選択し、[次のステップ:タグ]をクリックします。
TranslateFullAccess |
AmazonS3FullAccess |
CloudWatchLogsFullAccess |
AmazonTranscribeFullAcces |




タグの追加(オプション)画面は設定不要ですのでそのまま[次のステップ:確認]をクリックします。

ロールを作成します。ロール名にhandson-20210320-role-linebotのとおりで設定して[ロールの作成]をクリックしてください。

作成できました。

LINEボットから送信される音声を保存するS3バケットとAmazon Transcribeの結果を保存するS3バケットを作成します。

AWSマネジメントコンソールでAmazon S3にアクセスし、[バケットを作成する]をクリックしてください。

下記のバケット名を入力し作成をクリックしてください。バケット名は、全リージョンでユニークな名前である必要がありますので、利用しているAWSアカウントIDをバケット名に追加する形でご用意ください。利用しているAWSアカウントIDはマネジメントコンソール右上部のタブから確認ができます。
S3バケット名 | 用途 |
transcribe-input-${AWSAccountID} | 音声データを保存 |
transcribe-output-${AWSAccountID} | Amazon Transcribeの結果を保存 |
${AWSAccountID}はAWSマネジメントコンソール右上部のタブから確認できます。

バケット名を入力し以下以外の設定は変更せずに[バケットを作成]をクリックします。


再度[バケットを作成]をクリックしてバケット名transcribe-output-${AWSAccountID}を作成してください。

このバケット名をメモしておきます。

S3の完成です。

サービス名検索バーでlambdaを検索し、Lambdaサービス画面で[関数の作成]をクリックします。

以下の設定を行い[関数の作成]をクリックします。
関数名 | handson-20210320-linebot |
ランタイム | Node.js 12.x |
実行ロールの選択または作成 | 既存のロールを使用する |
既存のロール | handson-20210320-role-linebot |


作成できました。

コードタブのアップロード元として[.zipファイル]を選択し


資材のbot.zipをアップロードして[保存]をクリックします。

コードソースがアップロードできました。

設定タブ>一般設定>編集

外部APIコールによる音声データの取得、S3への保存処理があるため、タイムアウトを10秒に伸ばします。

環境変数メニューをクリックし

環境変数にメモしてあったチャネルシークレット、チャネルアクセストークン、音声ファイル保存先S3バケット名を以下のとおり追加します。
変数名 | 説明 |
CHANNEL_SECRET | チャネルシークレット |
CHANNEL_ACCESS_TOKEN | チャネルアクセストークン(ロングターム) |
TRANSCRIBE_BUCKET_NAME | 音声ファイル保存先S3バケット名、transcribe-input-${AWSAccountID} |

ここを作成します。

先ほどと同様でLambda関数を新規作成します。

基本設定は以下とし、[関数の作成]をクリック
関数名 | handson-20210320-startTranscribe |
ランタイム | Node.js 12.x |
実行ロールの選択または作成 | 既存のロールを使用する |
既存のロール | handson-20210320-role-linebot |

zipファイルとしてstartTranscribe.zipをアップロードします。


先ほどと同様にタイムアウトを10秒に伸ばして


Amazon Transcribeで文字起こしした結果を保存する先の環境変数として以下を追加します。
変数名 | 説明 |
OUTPUT_BUCKET | 文字起こしした結果保存先S3バケット名、transcribe-output-${AWSAccountID} |

今の状態だとLINEボットのLambda関数でS3バケットに保存された音声データが格納されますが、その後続のLambda関数が動がない状態になっていますので、トリガーを設定してつなげます。

handson-20210320-startTranscribe関数の[トリガーを追加]をクリックします。

プルダウンからS3を選択して

以下を設定します。
バケット | transcribe-input-${AWSAccountID} |
イベントタイプ | すべてのオブジェクト作成イベント |
プレフィックス - オプション | (空) |
サフィックス - オプション | .mp4 |

再帰呼び出しの✔を付けて[追加]をクリック

追加されました。これでS3に音声データが格納されたことをきっかけとして文字起こしのためのLambda関数が動くようになります。


先ほどと同じ流れでLambda関数を新規作成します。Lambda関数画面で[関数の作成]をクリック

関数名 | handson-20210320-push |
ランタイム | Node.js 12.x |
実行ロールの選択または作成 | 既存のロールを使用する |
既存のロール | handson-20210320-role-linebot |

zipファイルをアップロード

push.zipをアップロードして保存

一般設定でタイムアウトを10秒に伸ばして


Amazon Transcribeで文字起こしした結果をLINEに通知するために必要となる環境変数として以下を追加します。
変数名 | 説明 |
CHANNEL_ACCESS_TOKEN | チャネルアクセストークン |

関数が作成できました。

先ほどと同様で、トリガーを設定してつなげます。

handson-20210320-push関数の[トリガーを追加]をクリックします。

以下のトリガー追加設定を行い[追加]をクリックします。
バケット | transcribe-output-${AWSAccountID} |
イベントタイプ | すべてのオブジェクト作成イベント |
プレフィックス - オプション | (空) |
サフィックス - オプション | .json |

トリガーが追加できました。

APIを作ります。

マネジメントコンソールの検索バーでAPI Gatewayを検索しHTTP APIの[構築]ボタンをクリックします。


[統合を追加]をクリック

統合タイプはLambdaを選択します。

以下の設定を行い[次へ]をクリックします。

ルートを設定します。LINEのWebhookはHTTP POSTで受ける必要がありますのでメソッドをPOST、リソースパスは/webhookとしてください。統合ターゲットは自動で選択されているはずですのでそのまま次へをクリックしてください。

ステージ設定はデフォルトのままで[次へ]をクリック

設定を確認し[作成]をクリック

このAPIをLINEからPOSTすればLINEボットLambda関数が動くことになりますね。

Lambda関数との統合を行ったので、LINEボットのLambda関数のトリガーにも追加されてます。

LINEからメッセージ投稿されたらAPI Gatewayで作ったURIがPOSTされるようにLINE DeveloperのWebhookの設定を行います。

LINE DevelopersコンソールのボットチャンネルMessagins API設定タブの中にある

Webhook URLの[編集]ボタンをクリックし

先ほどメモしたAPI GatewayのURL+/webhookをWebhook URLとして入力し[更新]します。

[検証]ボタンをクリックし

成功と表示されることを確認します。

Webhookの利用をONにします。

これでAWSとつながった状態になりました。今の状態ではLINE公式アカウントが自動応答する状態になっているため無効化する設定を行います。LINE DeveloperコンソールのMessaging APIタブ内にある応答メッセージ項目の[編集]をクリックすると

LINE 公式アカウントマネージャーコンソール画面が別タブで開きます。応答設定の応答メッセージをオフに変更しましょう。

ボットの動作確認をしましょう。
まず、英語のメッセージを送ってみます。AWSエバンジェリストJeff Barrのブログなどからコピーペーストして英語の文章を送信して日本語訳のメッセージが返ってくるかを試してください。

次に、LINEの音声入力ボタンから音声メッセージを送ると文字起こしされてテキストメッセージが返ってくるかの確認を行います。

「JAWS DAYS 2021」など固有名詞だとうまく文字起こしできない場合があるのは仕方ないですが、色々入力してAWSのAI精度を試してみてください。

動作確認でうまくいかない場合、以下の内容を確認してみてください。
うまく動作しない場合やハンズオンの時間があまったらCloudWatchでどういうログがどこに出力されるのかを確認しましょう。

AWSマネジメントコンソールの検索バーでCloudWatchを入力して検索し、ログをクリックします。

[View log groups]をクリックします。

3つのLambda関数が表示されるので知りたいログのLambda関数をクリックし

任意のログストリームのリンクをクリックするとログイベント画面でログを確認することができます。


Lambdaサービス画面からでも同じ情報に辿りつくこともできますので目的や観点によって使い分けて調べることができます。

使われ続けないかぎりは課金が発生するものではないですが、課金が発生しないようリソースの削除を行いましょう。今日は残しておき、復習してからでも構いません。
1つずつLambda関数を選択して削除します。


今回作成したLambda関数3つともなくなればOKです。

S3は、バケット内が空の状態でないと削除できませんのでバケットを選択し[空にする]をクリックしてデータ削除します。

[完全に削除する]と入力して[空にする]をクリックすることでデータが削除できます。

バケットが空になりました。

次に、バケットを削除します。


これを繰り返して2つのバケットを削除することができます。

API Gatewayを選択して[Delete]をクリックします。


IAMロールを削除します。


削除されたら完了です。

LINE 公式アカウントは課金されることはありませんが、後始末として削除しておきましょう。LINE Developersコンソールのプロバイダー画面で[チャネルの削除]ボタンをクリックします。

ポップアップを確認し、[LINE Official Account Managerを表示]をクリックします。

LINE Official Account Managerコンソールのアカウント削除画面が別タブで開きますので内容の同意の上で[アカウントを削除]をクリックします。


もし、LINEプロバイダーまで削除したい場合にはDevelopersコンソールのプロバイダー設定から[削除]を行うことができます。

まとめ
手を動かしながら学ぶことを楽しんでもらえたら幸いです。