こんにちは、エンジニアの君島です。
コロナ禍にてリモートワーク、テレワークが一般化したことで、
オフィスに掛かってきた電話に応対できる人がいない。
そんな悩みの解決策として、ギークフィードでは留守番電話の音声を自社開発の音声認識エンジンでテキスト化し、
Slack通知を行うサービスを開発して、自社内でも運用しています。
テキストでも音声でも留守番電話の内容を確認できて便利です。
詳細はコチラ↓
今回は、そんな留守番電話通知サービスに感情解析機能を追加したら、
緊急度がわかったりして便利になるんじゃないかと思い、実装してみました。
目次
設計
構成の概要
追加した構成はシンプルかつサーバレスです。Amazon Comprehendを使用した感情解析を行う機能を、音声認識とSlack通知の間に入れました。
なお、設計上のポイントは以下の2点です。
Lambda function URLsの採用
少し前であればAWS Lambdaの前にAPI Gatewayを置くことになったのですが、今のAWS LambdaにはLambda function URLsがあります。
ちょうどLambda function URLsをまだ使用していなかったのと、
・APIコール数が多くない
・社内からの接続のみに限定される
・手っ取り早く始めてみよう
等の理由で、API Gatewayの高度な機能も必要ないので、Lambda function URLsを採用しました。
オンプレミスのサーバの変更を最小にする
なお、オンプレミスのサーバからAmazon ComprehendのAPIを叩くという方法もありましたが、
サーバにAWS SDKもCLIも入っていなかったのと、
別の用途でも使用していたため、できるだけミドルウェアの変更も入れたくありませんでした。
そのため、エンドポイントを叩く処理を追加するだけにしました。
実装
Amazon Comprehendの呼び出し
今回は、detectSentimentにて感情解析を行っています。呼び出し部分のソースコードはコチラになります。
後述ですが、この解析結果をあとで書き換えたいので、関数化しておきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
const AWS = require('aws-sdk') AWS.config.update({region: "ap-northeast-1"}) const comprehend = new AWS.Comprehend({apiVersion: '2017-11-27'}); const detectSentiment = async function (text) { return new Promise((resolve, reject) => { const params = { LanguageCode: "ja", Text: text }; comprehend.detectSentiment(params, function (err, data) { if (err) { console.log(err, err.stack); reject(err); } else { console.log(data); resolve(data); } }); }); }; |
Lambdaの呼び出し
オンプレミスサーバからLambda function URLsを呼び出しましょう。
curl 7.75.0からAWS SigV4のオプション指定が可能となりました。
しかしながら、オンプレミスサーバのcurlのバージョンは7.29.0でした。
ミドルウェアの変更をしたくなかったため、curlコマンドの配布元からサーバに適した最新版のバイナリをダウンロードして、オンプレミスサーバに配置して、以下のコマンドを実行することにしました。
1 2 3 4 5 |
./curl-amd64 -XPOST "https://XXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/" \ -H "Content-Type: application/json" \ -d "<解析対象のテキスト>" \ --aws-sigv4 "aws:amz:ap-northeast-1:lambda" \ --user "<アクセスキー>:<シークレット>" |
感情解析結果の上書き
Amazon ComprehendのAPIは、テキストからNeutral、Positive、Negative、Mixedのいずれかの感情と、そのスコア値を結果として返します。
実際にテキストを入れて検証しましたが、Neutralのスコア値が高い傾向にありました。
今回は、センシティブにNegativeやPositiveの感情の検出をしたかったので、Amazon Comprehendを呼び出すLambdaで感情の結果を切り替えることにしました。
結果の上書きロジックは単純です。最もスコアが高い感情を検出するのではなく、
Neutralが特定の閾値以下のスコアの場合、次いでスコアが高い感情を優先して検出するように結果を書き換えるようにしました。
効果的に通知する
感情に応じて通知に装飾を加えます。
Slackのアタッチメントは以下の画像のように装飾可能です。全てのパラメータはコチラから参照できます。
今回は、差異が大きく伝わるようなcolorとimage_urlを差し替えるようにしました。
例えば、Negativeな場合は以下のような通知を行います。
まとめ
留守番電話の音声を自社開発の音声認識エンジンでテキスト化してSlack通知する仕組みに、感情解析の機能を追加しました。
Amazon Comprehendの呼び出しや結果の上書きは非常に簡単に導入できますし、単体レベルのテストやデプロイは好きなタイミングで実施することができます。
AWS側はエンドポイントを用意すれば、他の追加機能を入れることも簡単にできそうです。
結果として、留守電のテキスト文面から感情解析の結果をUIに表現して通知すると、
安心してメッセージを確認できるようになりました。もちろん緊急時には、それとわかるようになりました。
今回はMixedの結果の時の通知はNeutral同様に変更しなかったのですが、Mixedの時も変えた方が良さそうです。
例えば、社員の欠席連絡のメッセージの場合にはMixedの結果でした。ちょうどいい表示を考えて追加しておこうと思います。
カジュアル面談も実施中!
ギークフィードではAWSエンジニアなどの職種で一緒に働く仲間を募集しています。
弊社に興味を持っていただいたり、会社のことをカジュアルに聞いてみたいという場合でも、ご気軽にフォームからお問い合わせください。その場合はコメント欄に、カジュアルにお話したいです、と記載ください!
- CLIでAmazon S3にあるファイル内の文字列検索をしてみる - 2024-02-01
- 不完全なマルチパートアップロードをCLIで確認してS3の無駄コストを無くそう - 2024-01-29
- AlmaLinux9.3にPHP8.3を入れてLaravel9から10にバージョンアップする - 2024-01-12
- AWS CloudShellの表現力を確認してみよう - 2024-01-01
- AWSのアーキテクチャーを学べるAWS Card Clash攻略Wiki - 2023-12-26