目次
本研究では大まかに2つのことをやる
1.webから楽曲特徴量を取得し、特徴量に応じたHTMLの作成(下準備)
2.顔から感情値を取得し、感情値に応じてHTMLへ移動
実行したいだけの人は下の「楽曲推薦の実行方法」まで飛ばしてください
使うプログラムはこちら ※最終的に1.8GBの容量になるのでPCに1.8GB分の容量をあけておいてください
中身はこんな感じ
「1.プレイリスト作成用プログラム」は、HTML作成するプログラムで「2.顔から感情推定用プログラム」は顔から感情を取得するプログラムである。
「data」は「1.プレイリスト作成用プログラム」のプログラムの実行結果のcsvを格納するためのフォルダである
下準備1.GeniusAPIからアクセストークを取得
下準備2.SpotifyからClientid、Clientsecretを取得
1.「1.プレイリスト作成用プログラム」の「2.Geniusから歌詞の取得.ipynb」を実行
2.「1.プレイリスト作成用プログラム」の「3.BERTのモデルの構築&歌詞の感情推定」のなかにある「3.BERTモデル構築&感情推定.ipynb」を実行
3.「1.プレイリスト作成用プログラム」の「4.LDAによるトピック分類.ipynb」を実行
4.「1.プレイリスト作成用プログラム」の「5.トピックと楽曲特徴量によるHTMLの作成.ipynb」を実行
ここで、HTML作成は終わり
5.「2.顔から感情推定用プログラム」のapp.py実行用のモジュールをインストール(インストールするモジュールは後述)
6.「2.顔から感情推定用プログラム」のapp.pyをコマンドプロンプトから起動
以下にそれぞれの解説を行う
GeniusAPIから歌詞を取得するには、以下のサイトの、「Geniusのアカウント登録」、「Genius APIにおけるトークンの取得」を行う
登録したら、アクセストークンをコピーする。これは2.Geniusから歌詞の取得.ipynbで使用する
spotifyから楽曲の特徴量を取得するには、spotifyに会員登録をし、clientid,crientsecretを取得する必要がある。
以下のサイトの、「ここまででCLIENT ID と CLIENT SECRET ID を取得する流れは完了です」までを実行する
https://zenn.dev/tteaoocl/articles/6cce2e7615c11c
アプリを作成の部分で、アプリ名とアプリの説明は何でもよいが、リダイレクトURLは以下を入力する
「https://example.com/callback/」
「1.プレイリスト作成用プログラム」の中身はこのようになっている
2から順番に使っていきます
基本的にコードを実行していくだけでできます。
このプログラムでできること
・アーティスト名と楽曲名から歌詞を取得する
・スクレイピングで取得した歌詞の不要な部分の除去
ipynbはそれぞれのブロックに分かれているので、それぞれの重要な部分の解説を行う
コードを実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
tokenに「下準備1」で取得した自分のアクセストークンを入れる
「clean_lyrics」は歌詞から不要な文字列を削除する関数。
これはアーティスト名と曲名を使って Genius から歌詞を取得する関数。
これは削除したい不要な文字列を削除する部分。削除したい文字列を追加したい場合配列に追加する
最後に、結果が「data」の「2.ごみとり前歌詞付き楽曲特徴量1.csv」に保存される。
これは取得した歌詞から分析に関係ないごみを取るコード。
実行に200分くらいかかるので、実行したら放置。
最後に、結果が「data」の「3.ごみとり前歌詞付き楽曲特徴量2.csv」に保存される。
これは上と同じようにごみを取るコード
これはすぐ終わります
最後に、結果が「data」の「4.歌詞付き楽曲特徴量.csv」に保存される。
このプログラムでできること
・BERTのモデルを構築する
・構築したBERTモデルを用いて歌詞の感情値(0~1の連続値、1に行けば行くほどポジティブを表す)を推定する
BERTについて知りたい人はこちらを参考に↓
https://aisuite.jp/column/bert/
「3.BERTのモデル構築&歌詞の感情推定」の中身はこのようになっている。この中の「3.BERTのモデル構築&歌詞の感情推定.ipynb」を実行する
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
「chABSA-dataset」は、TISが公開している感情分析を行うためのデータセット
詳しくはこちら↓
https://www.tis.co.jp/news/2018/tis_news/20180410_1.html
このコードは以下のサイトから「chABSA-dataset.zip」をダウンロードしている↓
https://github.com/chakki-works/chABSA-dataset?tab=readme-ov-file
コードを実行すると「chABSA-dataset.zip」が解凍される
このコードは「chABSA-dataset」を扱いやすいようにcsvファイルに変換している
ほぼこのページを参考にしました↓
https://zenn.dev/robes/articles/a7ba6e172f3a14
コードを実行すると「dataset.csv」が保存される
中身はこんな感じ。「label」は、「text」の文章がポジティブかネガティブかを表している(0ならネガティブ、1ならポジティブ)
このコードはさっき作った「dataset.csv」を使ってBERTを感情分析用に適用させる。
BERTは事前学習は東北大学が公開している「bert-base-japanese-v2」を使用している
「bert-base-japanese-v2」についてはこちら↓
https://www.math-joy-life.com/bert-base-japanese-v2
各行の
このコードを実行するとBERTのモデルが作成される
csvファイルの列名を整えている コードを実行すると「data」に「6.歌詞感情値付き楽曲特徴量2.csv」が保存される
このプログラムでできること
・LDAを拡張したガイド付きLDAを用いて、歌詞から任意のトピックを抽出する。
LDAとは、それぞれのテキストを単語に分割して情報化して、各テキストについてのトピックを推定するもの
ガイド付きLDAとは、それぞれのトピックに「予約語」を設定することで、テキストを任意のトピックへクラスタリングするもの
LDAについて知りたい人はこちら↓
https://recruit.gmo.jp/engineer/jisedai/blog/topic-model/
ガイド付きLDAについて知りたい人はこちら↓
https://qiita.com/pocket_kyoto/items/23ebe43c7f647f2c6b6f
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
#ref(): File not found: "モジュールのインストール4.png" at page "水上さん修論_backup"
このプログラムでできること
・トピックと特徴量ごとにプレイリストを作成
・プレイリストを埋め込んだHTMLの作成
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
表情から感情値を取得し、「1.プレイリスト作成プログラム」で作成されたプレイリストへ移動するコード 「2.顔から感情推定用プログラム」の中身は以下の通り
「static」には「1.プレイリスト作成用プログラム」で作成されたプログラムが入っている。
「templates」にはhtmlの表示部分の「index.html」が入っている
「測定結果」には、表情から測定した各感情の確率が格納されているcsvファイルが保存される
「app.py」実行プログラム
環境はPython 3.10.1で実行できました。ほかのバージョンでもできると思いますが、実行できなかったらpython 3.10.1でやってみてください
以下のモジュールをインストール。多分これでいけます。モジュールのインストールエラーが出たら適宜インストールする。
pip install flask==3.1.0 pip install deepface==0.0.93 pip install tensorflow==2.18.0 pip install tf-keras==2.18.0
コマンドプロンプトから「2.顔から感情推定用プログラム」の中の「app.py」を実行
学籍番号と名前を入力(測定結果のcsvファイルの名前を区別するためなので、何でもよい)
以下の画面になったら、ctrlボタンを押しながら「https:://127.0.0.1:5000」のところを押す
実行できたら以下のフロント画面が表示される。
この画面はカメラから表情を認識し、
「楽曲を表示」ボタンを押すと、ネガティブ強度の平均値に応じたサイトに別タブで移動する
フロント画面の「終了する」ボタンを押すか、フロント画面のタブを閉じると測定終了。「測定結果」のファイルにcsvファイルが保存される。
「感情値(前)」の方は、フロント画面を起動してから「楽曲を表示する」ボタンを押す前(音楽を聴く前)までの各感情のスコアが保存されている。
「感情値(後)」の方は「楽曲を表示する」ボタンを押してからフロント画面を閉じる(音楽を聴いた後)の各感情スコアが保存されている
おわり