Slack の会話内容に合わせた AI 音楽レコメンドサービスをサーバーレスで実装してみた !

2023-11-01
日常で楽しむクラウドテクノロジー

Author : 守田 凜々佳  (監修 : 稲田 大陸)

こんにちは!ソリューションアーキテクトの守田です。
リモートワークをしている時、ふと音楽が聴きたくなることはありませんか ? しかし音楽を再生したとしても次の音楽に切り替える作業は仕事の邪魔になってしまいますし、プレイリストを作成して毎日同じ曲を聴いていても飽きてしまいます・・・。

そんな時、今流行りの AI が音楽をレコメンドしてくれるサービスがあったら嬉しいのではないでしょうか?そこで今回、Slack の会話内容に合わせて音楽をレコメンドするサービスを作成してみました !

例えば、業務用におすすめのイヤホンの会話をしている時には、曲名や歌詞に「イヤホン」が含まれた曲がレコメンドされます。業務時間中でも、Slack のチャンネルで行われる会話内容に合わせて音楽をレコメンドすることで状況や雰囲気に合った音楽を選ぶことができます。さらに、リモートワークで減少したチーム内のコミュニケーションの活性化も期待できます。

このサービスのポイントは以下の 2 点です。

  1. テキスト解析 AI サービス Amazon Comprehend を使っている
  2. サーバーレスなアーキテクチャで構成している


それぞれのポイントについて詳細に説明していきます。

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


Point 1. テキスト解析 AI サービス Amazon Comprehend を使っている

Amazon Comprehend を初めて知った方もいらっしゃるかと思いますので、まずはサービスについて紹介します。

Amazon Comprehend とは ?

Amazon Comprehend は、機械学習を使用してテキストからインサイトを検出する自然言語処理 (NLP) サービスです。主な機能は下記の 5 つです。

エンティティ認識

エンティティは固有表現とも呼ばれ、固有名詞や組織、日付などを指します。これらは、文章を理解する上で特徴的なキーワードとなることがあるため、エンティティを認識して文章の理解に役立てます。

キーフレーズ抽出

修飾語と名詞からなるフレーズのうち特徴的なものをキーフレーズとして抽出します。例えば、「風景」という名詞だけでなく「美しい風景」といった名詞句を抽出します。

感情分析

テキストの全体的な感情(混在・肯定的・否定的・中立的)の度合いを分析します。

構文解析

テキストに利用される各単語の品詞を特定します。

言語検出

使用している言語を検出します。

今回は Slack の会話内容からキーフレーズを抽出し、音楽をレコメンドしたいので、キーフレーズ抽出を使用しました。Amazon Comprehend のコンソール で機能を試すことができるので、具体的にどのように使用できるのかをご紹介します。

キーフレーズ抽出の例

左側のメニューの「Real-time analysis」を選択し、「Input data」中のテキストボックスに文章を入力します。

クリックすると拡大します

そして、出力された Insights から「Key phrases」を選択すると、こちらのように Key phrases と Confidence が表示されます。Confidence は、その単語がキーフレーズであることの信頼度を表しています。

こちらの例では、Amazon Comprehend についての説明文を入力してみました。入力した文章は Amazon Comprehend についての文章で、機械学習を使っている点が重要であるため、「Amazon Comprehend」や「機械学習」といったフレーズが抽出されており、人が判断するのと同じような結果が得られています。キーフレーズ抽出やエンティティ抽出を使った読書感想文執筆への挑戦もブログになっています。興味がある方は「テキスト解析 AI サービス Amazon Comprehend で本を読まずに読書感想文に挑戦してみる」を是非読んでみてください !

Amazon Comprehend を使うことで、機械学習モデルのトレーニングなどの機械学習に関する知識がなくても、テキスト解析を行うことが可能です。また、Amazon Comprehend の機能は簡易なコードで使用することができます。実装の説明の際に簡単なコード例をご紹介します。

クリックすると拡大します

Amazon Comprehend のアップデート

2 点目のポイントに入る前に、 Amazon Comprehend の 2022 年 12 月 ~ 2023 年 9 月のアップデートを 2 つ紹介させて頂きます。

1. Amazon Comprehend が半構造化ドキュメントの処理をサポート

今まではお客様が PDF ドキュメント、Microsoft Word ファイル、画像などの半構造化ドキュメントから関心のあるエンティティを分類して抽出するためには、お客様は前処理して機械が可読なテキストに変換する必要があり、文書コンテキストの品質が低下してしまう可能性がありました。

このアップデートによってお客様は 1 回の API 呼び出しで、スキャンされた文書や半構造化ドキュメントとプレーンテキスト文書の両方を処理できるようになり、前処理の手間を省くことができます。お客様はこの新機能を使用して、バッチ処理やリアルタイムでの文書処理を簡素化できます。詳細は こちら をご参照ください。

2. Amazon Comprehend を使用して画像と Textract JSON ファイルからカスタムエンティティを抽出

Amazon Comprehend は、テキスト、PDF ドキュメント、Microsoft Word ファイル に加えて画像形式のドキュメントもサポートするようになりました。

お客様は Amazon Comprehend カスタムエンティティ認識を使用して画像ファイル (JPG, PNG, TIFF) からエンティティを抽出できるようになりました。また、Amazon Comprehend を Amazon Textract JSON 出力で直接使用してドキュメントからカスタムエンティティを抽出することもできます。詳細は こちら をご参照ください。


Point 2. サーバーレスでアーキテクチャを構成している

ここからは冒頭で紹介したもう 1 つのポイントである、サーバーレスで構成した点についてお話しします。

今回のサービスのアーキテクチャは以下のように構成しました。サーバーレスな AWS サービスである AWS LambdaAmazon DynamoDB を使用しています。

サーバーレスサービスを用いることで、インフラを意識せずに開発や運用が可能です。Amazon EventBridge のルールで定期実行をスケジュールするだけで、指定の時間に Lambda 関数が実行されるため、コードがどのようなリソース上で動くかについて考える必要がありません。また、コンピューティング料金が実行された時間分で従量課金されるところも利点です。週末やチームの出社日、長時間のミーティングがある日など、こちらのサービスを使わない時間帯には料金が発生しないのは魅力的です。

上記のアーキテクチャの内容を以下の 3 つに分けてご説明します。

  1. プレイリスト登録
  2. 会話内容からキーフレーズを抽出
  3. キーフレーズから楽曲検索


前提として、今回のサービスでは外部の音楽ストリーミングサービスを使用しています。 Slack のチャンネルにて Slack コマンドを打つと、音楽のプレイリストが作成され、コマンドの実行されたチャンネルとプレイリストの ID を紐づけます。レコメンドされた曲が随時そのプレイリスト上に追加される形でプレイリストが更新され、ユーザーは追加の作業を行うことなくレコメンドされた音楽を再生し続けることができます。

1. プレイリスト登録

まずは、レコメンドされた曲が追加されるプレイリストを登録します。/register と Slack コマンドを打つと、コマンドを打った Slack チャンネル専用のプレイリストが作られるように実装していきます。

Slack の開発者用ツールでアプリを作成し、Slack上のイベントが発生した際に Amazon API Gateway のエンドポイント宛に HTTP POST リクエストが送られるように設定します。すると投稿のイベントが発生した際、API Gateway 経由で Lambda 関数 がトリガーされます。こちらの Lambda 関数では、Slack チャンネルで /register のコマンドが送信された際に、DynamoDB に Slack の Channel ID と プレイリスト ID を保存します。

クリックすると拡大します

2. 会話内容からキーフレーズを抽出

Slack に投稿されたメッセージを一定時間分取得し、メッセージから、 Amazon Comprehend でキーフレーズを 3 つ抽出します。

こちらの Lambda 関数は EventBridge のルールでスケジュールされ、定期的に実行されます。3. で紹介する楽曲検索の際に楽曲の再生時間の情報を取得し、それに合わせてルールを変更することで、必要なタイミングのみで曲を変更します。スケジュールに従って実行する EventBridge ルールについては こちら をご覧ください。

クリックすると拡大します

会話内容からのキーフレーズ抽出に関しては、前半でご紹介した Amazon Comprehend のキーフレーズ抽出の機能を用います。

以下に示すように、実装は非常に簡単に行えます。引数として text (今回は Slack の会話内容) と language_code ( 日本語の場合は ‘ja’ ) を与えると、キーフレーズのリストの含まれた JSON データを受け取ることができます。

def detect_key_phraes(text, language_code):
    comprehend = boto3.client('comprehend')
    response = comprehend.detect_key_phrases(Text = text, LanguageCode = language_code)
    return response

3. キーワードから楽曲検索

抽出した 3 つのキーフレーズを用いて、楽曲を検索し、プレイリストに追加します。

今回使用している音楽検索 API は、曲名以外のメタデータに対しても検索を行うことができるため、必ずしもキーフレーズが曲名に含まれている必要はありません。

クリックすると拡大します

アーキテクチャと実装についての解説は以上になります。


Slack の会話内容を表現するキーフレーズを抽出し、楽曲をレコメンドする

それではこれから使ってみましょう !

まず、「Sorry ページ用の猫の画像についての会話」を Slack 上で行い、曲の提案をしてもらいます。

クリックすると拡大します

上記の会話で抽出されたキーフレーズは「スコティッシュフォールドの画像」「ユーザーの不快感」「効果」でした。レコメンドされた音楽は、立ち耳スコティッシュフォールドというアーティストの、「昔の写真」という楽曲でした。

Slack チャンネル内の会話との関連が分かる音楽がレコメンドされていますし、もしこの音楽がレコメンドされれば、チーム内の話題にもなることが想像できます。

次に、英語でも試してみましょう。「夏フェスの音楽と会場レイアウトのミーティング準備についての会話」を行います。

クリックすると拡大します

上記の会話で抽出されたキーフレーズは “the festival” , “the way” , “the audio team” の 3 つになり、提案された曲は NONA REEVES というアーティストの “FESTIVAL“ という楽曲でした。

「夏フェスの音楽と会場レイアウトのミーティング準備についての会話」から、“FESTIVAL” を提案されたというのは、会話内容に合った音楽をレコメンドすることができたと言えるのではないでしょうか。


まとめ

Slack の会話内容から音楽をレコメンドするサービスを作成して、下記を達成することができました。

  • Amazon Comprehend で Slack の一定期間内の会話内容を表すキーフレーズを複数抽出する
  • サーバーレスな構成で Slack のメッセージ取得、キーフレーズ抽出、音楽検索等を行う

上記 2 点を実装することで、当初の目的である「リモートワーク中に雰囲気に合った音楽をレコメンドしてほしい !」という願いを実現できました。

発展的な内容としては、以下の機能の改善が可能と考えております。

  • キーフレーズ抽出の精度を上げる
    • マネジメントコンソールで Amazon Comprehend を使っていただくと分かりやすいかと思いますが、「私」のような一人称や、構文解析のできていない長い文章がキーフレーズとして抽出されてしまうことがあります。エンティティ抽出と組み合わせる、他のモデルを使用するなどの方法でキーフレーズ抽出の精度を上げたいと考えています。
  • 会話の雰囲気や曲の雰囲気から、より適切な楽曲を提案する
    • 現状、リモートワーク中に再生する音楽を想定しているにも関わらず、非常にアップビートな EDM が流れてしまう等の可能性があります。そのため、楽曲 API の仕様にもよりますが、BPM や 曲のジャンルなどを絞って楽曲の検索を行うことができればより良いユーザー体験に繋がります。また、Amazon Comprehend には感情抽出の機能があるため、Positive な会話の場合と Negative な会話の場合でレコメンドする楽曲の曲調を変えるという機能の追加も可能です。


また、今回使用した Amazon Comprehend 以外にも AWS は多くの言語系 AI/ML サービスを提供しています。これらのサービスを使った記事も builders.flash では紹介していますので、オススメの記事を以下に 3 つ記載します。

それでは、レコメンドされた音楽をお共に、良いリモートワーク生活をお送りください !


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

守田 凜々佳
アマゾン ウェブ サービス ジャパン合同会社
技術統括本部 ソリューションアーキテクト

ソリューションアーキテクトとして、AWS をご利用になるお客様を技術面でサポートしています。好きなサービスは Amazon QuickSight です。
週末はヴァイオリンの演奏を楽しんでいます。

監修者プロフィール

稲田 大陸 (Riku Inada)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

2021 年 4 月に AWS Japan に入社した、筋トレが趣味なソリューションアーキテクトです。現在は製造業のお客様を中心にクラウド活用の技術支援を担当しています。好きな AWS のサービスは AWS AmplifyAmazon Location Service です。週末には美味しいお酒を求めてフラフラしています。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する