#author("2025-07-22T06:14:00+02:00","","")
#author("2025-07-22T06:18:20+02:00","","")
[[技術資料]]

[[石井]]


#attach(nolist)

----
目次
#contents()
----

**[[取得したデータの分析]] [#xa4954b3]
**[[myBeatの動作方法]] [#w9f7f9b3]
*はじめに [#z00fd092]
本研究では大まかに2つのことをやる&br;
1.webから楽曲特徴量を取得し、特徴量に応じたHTMLの作成(下準備)&br;
2.顔から感情値を取得し、感情値に応じてHTMLへ移動&br;
実行したいだけの人は下の「楽曲推薦の実行方法」まで飛ばしてください&br;


*使うプログラム全て [#h82a02b0]
使うプログラムはこちら ※最終的に1.8GBの容量になるのでPCに1.8GB分の容量をあけておいてください&br;
あと、htmlの作成に合計3~4時間かかります&br;
#ref(感情分析プログラム.zip)
中身はこんな感じ&br;
#ref(使うプログラム1.png,,800x120)
「1.プレイリスト作成用プログラム」は、HTML作成するプログラムで「2.顔から感情推定用プログラム」は顔から感情を取得するプログラムである。&br;
「data」は「1.プレイリスト作成用プログラム」のプログラムの実行結果のcsvを格納するためのフォルダである&br;


*手順 [#z00fd092]
下準備1.GeniusAPIからアクセストークを取得&br;
下準備2.SpotifyからClientid、Clientsecretを取得&br;
1.「1.プレイリスト作成用プログラム」の「2.Geniusから歌詞の取得.ipynb」を実行&br;
2.「1.プレイリスト作成用プログラム」の「3.BERTのモデルの構築&歌詞の感情推定」のなかにある「3.BERTモデル構築&感情推定.ipynb」を実行&br;
3.「1.プレイリスト作成用プログラム」の「4.LDAによるトピック分類.ipynb」を実行&br;
4.「1.プレイリスト作成用プログラム」の「5.トピックと楽曲特徴量によるHTMLの作成.ipynb」を実行&br;
ここで、HTML作成は終わり&br;
5.「2.顔から感情推定用プログラム」のapp.py実行用のモジュールをインストール(インストールするモジュールは後述)&br;
6.「2.顔から感情推定用プログラム」のapp.pyをコマンドプロンプトから起動&br;

以下にそれぞれの解説を行う

*下準備 [#gb4f7d1e]
**下準備1(Geniusのアクセストークンを取得) [#j1699223]
GeniusAPIから歌詞を取得するには、以下のサイトの、「Geniusのアカウント登録」、「Genius APIにおけるトークンの取得」を行う&br;


https://self-development.info/%E3%80%90%E6%AD%8C%E8%A9%9E%E5%8F%96%E5%BE%97%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%91genius-api%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%96%B9%E6%B3%95/

登録したら、アクセストークンを控えておく。これは2.Geniusから歌詞の取得.ipynbで使用する。以下は例↓
#ref(アクセストークン.jpg,,320x300)


**下準備2(SpotifyからclientID、clientsecretを取得) [#v2f2044e]
spotifyから楽曲の特徴量を取得するには、spotifyに会員登録をし、clientid,crientsecretを取得する必要がある。&br;
以下のサイトの、「ここまででCLIENT ID と CLIENT SECRET ID を取得する流れは完了です」までを実行する&br;
https://zenn.dev/tteaoocl/articles/6cce2e7615c11c &br;
アプリを作成の部分で、アプリ名とアプリの説明は何でもよいが、リダイレクトURLは「https://example.com/callback/」を入力する&br;

#ref(アクセストークン22.png,,620x500)
登録が完了したら、ClientIDとClientsecretを控えておく。これは5.トピックと楽曲特徴量によるHTML作成で使用する&br;
以下は例↓
#ref(アクセストークン333.png,,820x400)

*「1.プレイリスト作成用プログラム」の解説 [#h82a02b0]
「1.プレイリスト作成用プログラム」の中身はこのようになっている
#ref(使うプログラム2.1.1.png,,800x200)
2から順番に使っていきます&br;


基本的にコードを実行していくだけでできます。&br;
**「2.Geniusからの歌詞の取得ipynb」の解説 [#h82a02b0]
このプログラムでできること&br;
・アーティスト名と楽曲名から歌詞を取得する&br;
・スクレイピングで取得した歌詞の不要な部分の除去&br;
ipynbはそれぞれのブロックに分かれているので、それぞれの重要な部分の解説を行う&br;

***モジュールのインストールの部分 [#i6b7472e]
コードを実行するとこのプログラムの実行に必要なモジュールがダウンロードされる


***Geniusから歌詞の取得の部分 [#i6b7472e]

tokenに「下準備1」で取得した自分のアクセストークンを入れる&br;
#ref(アクセストークン2.png,,800x100)


「clean_lyrics」は歌詞から不要な文字列を削除する関数。
#ref(2関数1.png,,500x450)
「get_lyrics」はアーティスト名と曲名を使って Genius から歌詞を取得する関数。
#ref(2関数2.png,,600x800)
これは削除したい不要な文字列を削除する部分。削除したい文字列を追加したい場合配列に追加する
#ref(2関数3.png,,400x200)

最後に、歌詞の列を追加したcsvが「data」の「2.ごみとり前歌詞付き楽曲特徴量1.csv」に保存される。&br;


***取得した歌詞のごみとり1の部分 [#i6b7472e]
これは取得した歌詞から分析に関係ないごみを取るコード。&br;
実行に200分くらいかかるので、実行したら放置。&br;
最後に、歌詞のゴミとり処理を行った結果のcsvファイルが「data」の「3.ごみとり前歌詞付き楽曲特徴量2.csv」に保存される。&br;


***取得した歌詞のごみとり2の部分 [#i6b7472e]
これは上と同じようにごみを取るコード&br;
これはすぐ終わります&br;
最後に、歌詞のごみとり処理を行った結果結果が「data」の「4.歌詞付き楽曲特徴量.csv」に保存される。&br;





**「3.BERTのモデル構築&歌詞の感情推定」の解説 [#h82a02b0]
このプログラムでできること&br;
・BERTのモデルを構築する&br;
・構築したBERTモデルを用いて歌詞の感情値(0~1の連続値、1に行けば行くほどポジティブを表す)を推定する&br;
BERTについて知りたい人はこちらを参考に↓&br;
https://aisuite.jp/column/bert/ &br;
「3.BERTのモデル構築&歌詞の感情推定」の中身はこのようになっている。この中の「3.BERTのモデル構築&歌詞の感情推定.ipynb」を実行する
#ref(3の中身.png,,800x150)
***モジュールインストールの部分 [#i6b7472e]
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる


***同じディレクトリにある「chABSA-dataset.zip」を解凍するコードの部分 [#i6b7472e]
「chABSA-dataset」は、TISが公開している感情分析を行うためのデータセット&br;
詳しくはこちら↓&br;
https://www.tis.co.jp/news/2018/tis_news/20180410_1.html&br;
#ref(3.1.png,,800x70)
このコードは以下のサイトから「chABSA-dataset.zip」をダウンロードしている↓&br;
https://github.com/chakki-works/chABSA-dataset?tab=readme-ov-file&br;
コードを実行すると「chABSA-dataset.zip」が解凍される&br;

#ref(3.2.0.png,,800x200)
***「chABSA-dataset」のデータの形を整え感情分析用のデータセットのcsvを作成の部分 [#i6b7472e]
このコードは「chABSA-dataset」を扱いやすいようにcsvファイルに変換している&br;
ほぼこのページを参考にしました↓&br;
https://zenn.dev/robes/articles/a7ba6e172f3a14

コードを実行すると「dataset.csv」が保存される
#ref(3.2.1.png,,800x200)
中身はこんな感じ。「label」は、「text」の文章がポジティブかネガティブかを表している(0ならネガティブ、1ならポジティブ)&br;
#ref(3.3.png,,600x400)


***「bert-base-japanese-v2」の事前学習モデルを使って「chABSA-dataset」のデータセットでファインチューニングを行ってBERTの感情分析モデルを完成させるの部分 [#i6b7472e]
このコードはさっき作った「dataset.csv」を使ってBERTを感情分析用に適用させる。&br;
BERTは事前学習は東北大学が公開している「bert-base-japanese-v2」を使用している&br;
「bert-base-japanese-v2」についてはこちら↓&br;
https://www.math-joy-life.com/bert-base-japanese-v2&br;

BERTのモデルのトレーニングに使用するトレーニング引数である
#ref(トレーニング引数.png,,600x300)

num_train_epochsはエポック数であり学習データを全て 1 回モデルに入力するプロセスの回数である&br;
per_device_train_batch_size、per_device_eval_batch_sizeトレーニングと評価の際のバッチサイズであり、一度にモデルへ入力されるデータサンプルの数のことである&br;
warmup_steps学習率が最大値に到達するまでのステップ数である&br;
weight_decayは重み減衰率であり,モデルの過学習を防ぐためのパラメータである&br;
logging_stepsはlogに記録を書き込む回数のことである&br;

BERTの用語について詳しくはこちら↓&br;
https://deepsquare.jp/2020/07/transformer/&br;
このコードを実行するとBERTのモデルが作成される&br;
#ref(完成したモデル.png,,600x200)
また、最後にモデルの評価結果が出力される。
#ref(モデルの評価.png,,800x30)

***作成したモデルを用いて歌詞の感情分析の部分 [#i6b7472e]
このコードは、作成したBERTの感情分析モデルで、歌詞の感情値を分析している&br;
BERTで歌詞のポジティブ、ネガティブの割合を分析し、ポジティブの割合を感情値としている。&br;
このコードを実行すると歌詞の感情分析結果を追加したcsvファイルが「data」の「5.歌詞感情値付き楽曲特徴量_列名修正前.csv」に保存される&br;

***列名を整えるの部分 [#i6b7472e]
csvファイルの列名を整えている&br;
コードを実行すると列名を変更したcsvファイルが「data」の「6.歌詞感情値付き楽曲特徴量2.csv」に保存される


**「4.LDAによるトピック分析.ipynb」の解説 [#h82a02b0]
このプログラムでできること&br;
・LDAを拡張したガイド付きLDAを用いて、歌詞から任意のトピックを抽出する。&br;
LDAとは、それぞれのテキストを単語に分割して情報化して、各テキストについてのトピックを推定するもの&br;
ガイド付きLDAとは、それぞれのトピックに「予約語」を設定することで、テキストを任意のトピックへクラスタリングするもの&br;

LDAについて知りたい人はこちら↓&br;
https://recruit.gmo.jp/engineer/jisedai/blog/topic-model/&br;
ガイド付きLDAについて知りたい人はこちら↓&br;
https://qiita.com/pocket_kyoto/items/23ebe43c7f647f2c6b6f&br;


***モジュールのインストールの部分 [#i6b7472e]
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる


***ガイド付きLDAを用いて歌詞からトピックを抽出するの部分 [#i6b7472e]
ここでは、ガイド付きLDAを用いて、歌詞を「恋愛」「青春」「応援」「友情」「絶望、孤独」「夢、目標」「人生」「ストーリー」「季節、風景描写」「地名場所」に分類している。&br;
ここはストップワードを設定する部分。ストップワードとは、分析に必要のない単語のことであり、ストップワードを設定して分析に関係ない単語を除去している&br;
#ref(4.1.png,,600x130)
ここは予約語の定義の部分。予約語として各トピックに関連するワードを設定することにより歌詞を任意のトピックに分類することができる。&br;
それぞれのトピックの予約語は、トピックに関連するであろうワードを自分で設定しました。ここを変えればクラスタ結果が変わります。&br;
#ref(4.2.png,,600x230)
ここは歌詞からストップワード、と英語を除去し、単語ごとに分割している
#ref(4.31.png,,600x300)
ここは予約語をもとに初期トピックの単語分布を設定している。
#ref(4.4.png,,600x260)
ここはLDAモデルのパラメータ設定部分。etaはトピックの単語分布を表し、さっき作成した単語分布を使用している
#ref(4.5.png,,600x250)

最後に、トピックのクラスタ結果を追加したcsvファイルが「data」の「7.歌詞感情値楽曲特徴量_with_cluster.csv」に保存される&br;
また、クラスタとトピック対応表のcsvファイルが「data」に保存される&br;
**「5.トピックと楽曲特徴量によるHTML.ipynb」の解説 [#h82a02b0]
このプログラムでできること&br;
・トピックと特徴量ごとにプレイリストを作成&br;
・プレイリストを埋め込んだHTMLの作成&br;

***モジュールのインストールの部分 [#n17ef1e8]
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる


***特徴量によるクラスタ分けの部分 [#vbd487ee]
これは楽曲を、「高ネガティブ強度向け」「中ネガティブ強度向け」「低ネガティブ強度向け」にクラスタリングしている。&br;
最後に、特徴量のクラスタ結果を追加したcsvファイルが「data」の「8.歌詞感情値付き楽曲特徴量_with_cluster_更新.csv」に保存される&br;

***初回認証の部分 [#pec9d3ba]
これは、次の「プレイリストの作成とhtmlの作成」を実行するために必要なコードである。
まず、「CLIENT_ID」と「CLIENT_SECRET」は「下準備2」で取得したものを入れる
#ref(クライアント登録.png,,600x200)
実行すると、以下のurlが出てくるので、クリックする
#ref(実行1.png,,800x100)
そうすると以下の画面が出るので、このページのurlをコピーする
#ref(実行2.png,,800x400)
また、画面上部にurlを張り付ける部分が出てくるので、先ほどコピーしたurlを張り付ける
#ref(認証1.png,,800x400)
成功すると「認証成功!アカウント名:(ユーザの名前)」が表示される。もし認証に失敗したらもう一度urlを張りなおすか、client,clientsecretが間違っていないか確認する
#ref(認証結果.png,,800x150)
***プレイリストの作成の部分 [#he8bdeb3]
ここは、上の初回認証を終わった後に行う。
まず、「CLIENT_ID」と「CLIENT_SECRET」は「下準備2」で取得したものを入れる
#ref(クライアント登録2.png,,600x200)
実行するとurlの入力が要求されるので、「初回認証」で取得したurlを張り付ける
#ref(認証2.png,,800x260)

入力が成功すると、まず、自分のSpotifyアカウントにプレイリストが作成される
#ref(プレイリスト.png,,600x400)
また、プレイリストのurlを格納したcsvファイルが「data」の「created_playlists.csv」に保存される
#ref(プレイリスト2.png,,600x250)
***プレイリストからHTMLの作成の部分 [#he8bdeb3]
これは、先ほど作成したcsvのurlをもとに、プレイリストが埋め込まれたhtmlを作成するコード&br;
実行すると、作成されたプレイリストが埋め込まれたhtmlが「2.顔から感情推定用プログラム」の「static」の中の「楽曲」というフォルダにそれぞれの強度ごとのhtmlが保存される
#ref(作成されたhtml.png,,900x520)


*「2.顔から感情推定用プログラム」の解説 [#h82a02b0]
表情から感情値を取得し、「1.プレイリスト作成プログラム」で作成されたプレイリストへ移動するコード
「2.顔から感情推定用プログラム」の中身は以下の通り
#ref(2の中身.png,,800x150)
「static」には「1.プレイリスト作成用プログラム」で作成されたプログラムが入っている。&br;
「templates」にはhtmlの表示部分の「index.html」が入っている&br;
「測定結果」には、表情から測定した各感情の確率が格納されているcsvファイルが保存される&br;
「app.py」は実行プログラム&br;

*楽曲推薦の実行方法[#h82a02b0]
環境はPython 3.10.1で実行できました。ほかのバージョンでもできると思いますが、実行できなかったらpython 3.10.1でやってみてください&br;&br;

以下のモジュールをインストール。多分これでいけます。モジュールのインストールエラーが出たら適宜インストールする。

 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」を実行&br;
学籍番号と名前を入力(測定結果のcsvファイルの名前を区別するためなので、何でもよい)
#ref(動作1.png,,800x150)
以下の画面になったら、ctrlボタンを押しながら「https:://127.0.0.1:5000」のところを押す
#ref(動作2.png,,800x230)
実行できたら以下のフロント画面が表示される。&br;
この画面はカメラから移される画面と、画面の中の表情から推定したネガティブ強度が表示されている。また、その下には起動してからのネガティブ強度の平均値が表示されている。
#ref(動作3.png,,500x500)
「楽曲を表示」ボタンを押すと、ネガティブ強度の平均値に応じたサイトに別タブで移動する&br;
左のランプは現在の人のストレス強度の段階(青なら低ネガティブ強度、黄色なら中ネガティブ強度、赤なら高ネガティブ強度)を表し、右のランプは音楽の持つ楽曲の特徴量の度合いを表す。&br;
#ref(動作4.1.png,,500x300)
フロント画面の「終了する」ボタンを押すか、フロント画面のタブを閉じると測定終了。「測定結果」のファイルにcsvファイルが保存される。&br;
「感情値(前)」の方は、フロント画面を起動してから「楽曲を表示する」ボタンを押す前(音楽を聴く前)までの各感情のスコアが保存されている。&br;
「感情値(後)」の方は「楽曲を表示する」ボタンを押してからフロント画面を閉じる(音楽を聴いた後)の各感情スコアが保存されている&br;
#ref(動作5.png,,800x180)

中身は以下のとおりである。1秒ごとの各感情の確率とネガティブスコアが格納されている
#ref(動作6.png,,800x400)

**1分間のグラフを作成する方法 [#rafbda8e]
1分間のグラフの推移を作成するには、以下のプログラムを使う。このプログラムは、指定した分または秒ごとのネガティブスコアの平均値を計算するプログラムである
#ref(分析用プログラム.py)

***使う流れ [#jbc2fd43]
まず、pythonプログラムを起動すると分析するcsvを選択するダイアログが表示されるので、分析したいcsvファイルを選択する
#ref(分析プログラム1.1.png,,600x400)
次に、秒ごとの平均をとるか、分ごとの平均をとるかを選択する。秒ごとの平均の場合は0、分ごとの平均をとる場合は1を押す
#ref(分析プログラム2.png,,800x50)
選択したら、何秒ごとまたは何分ごとの平均をとるかを選択する。1分ごとの平均をとる場合は以下の通り
#ref(分析プログラム3.png,,600x200)
そうすると、選択したcsvファイルに選択した分ごとのネガティブ強度の平均値が表示される。以下は1分ごとの平均値をとった時の出力結果
#ref(分析プログラム4.1.png,,600x500)
ここからグラフの作成方法を説明する(excelの場合)。まず、計算したネガティブ強度をドラッグする。
#ref(分析プログラム5.1.png,,500x600)
ドラッグした状態で「挿入」→「散布図(直線とマーカー)」を押す。
#ref(分析プログラム6.3.png,,600x400)
出来上がり。グラフの色や書式は自分で選択したください
#ref(分析プログラム8.png,,600x400)

おわり

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS