【個人開発】今のあなたの感情に合った音楽を提案、私はこんな感情の状況のときに、こんな曲を聴くよ！を共有できるアプリを作りました！

![ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1457972/600c041f-17cf-466f-7421-45bed4284ecb.png)


▼サービスURL
https://www.your-song.site

▼github
https://github.com/Hiro929/your_song

## はじめに

早速ですが、みなさん、音楽を聴こうとしたとき、何の曲聴こうかなと悩んだことありませんか？
私の場合、ハマっている曲があれば、それを聴くことが多いですが、そうでない場合は「どうしようかな〜」となることが多いです。
また、悲しい時(落ち込んだ時)など、何聴こうかな〜となることが多いです。
そういった時に、おすすめの曲を提案してくれるものがあればいいなと思いました。また、自分はこの曲に助けられているから聴いてみて！とオススメできて、ユーザーの方で落ち込んでいる方などの助けを少しでもできるようにしたいと思い、本サービスを作りました。

## サービス概要

主な機能は、2つです。

### **1. 診断機能**

表情を感情分析し、あなたの感情に応じて、おすすめの楽曲を提案します。
※こちらの機能は、SUPER BEAVERの楽曲のみの提案になります。

**なぜSUPER BEAVERなのか？**

僕が知っている中で、一番心を動かす楽曲を作るのがこのバンドだと思ったからです。
あと、単純に好きでよく聴いているからです。

### **2. 投稿機能**

楽曲を1つ選び、自分がどういうときにその曲を聴くのかユーザー同士で共有できます。

ぜひ、みなさんのお世話になっている曲を教えてください！

## 使い方

### **1. 診断機能**

撮影するだけです！
撮影すると、感情分析を行い、その結果に応じておすすめの楽曲を提案します。
感情分析には、Amazon Rekognitionを使用しています。

### **2. 投稿機能**

投稿したい楽曲を検索してください。
アーティスト名でも曲名でも検索できますが、曲名の方が狙った曲を検索できると思います。
spotify API を使用して、検索できるようにしています。

![https://i.gyazo.com/cfeb54e6719ef44107113742a983b2b3.gif](https://i.gyazo.com/cfeb54e6719ef44107113742a983b2b3.gif)

楽曲を選んでいただくと、入力フォームに遷移するので、どういうときのその曲を聴くのか、なぜその楽曲を聴くのかを入力して、投稿してください。
どういうときに関して、選択肢を設けていて、今のところ落ち込んんだとき、テンション上げたいとき、リラックスしたいときの3つを用意しています。

![https://i.gyazo.com/c1b8b35b507027059f86b40905fbce60.jpg](https://i.gyazo.com/c1b8b35b507027059f86b40905fbce60.jpg)

詳細画面でコメントできたり、twitterのアイコンをクリックすればシェアすることができます。

![https://i.gyazo.com/ffc10a85354bf83e89db5af36ef336be.png](https://i.gyazo.com/ffc10a85354bf83e89db5af36ef336be.png)

非ログインユーザーの方でも、ユーザーの投稿一覧と詳細を閲覧することができます。

## 苦労したところ

- **感情に応じた楽曲の選曲ロジック**

どの感情のときに、どの楽曲を提案するかについては、独自に考えたものです。
この曲は、悲しいときに提案してほしいのように、ある程度、自分の中で各感情別に振り分けをして、spotify APIで取得した情報で、共通する値を探して決めました。

spotify APIで、楽曲の情報を色々と取得できるのですが、今回のロジックに使用したのは以下の情報です。
- acousticness(アコースティック感)
- danceability(踊りやすい曲かどうか)
- energy(激しさ)
- tempo（テンポ）
- valence(ポジティブさ)

これを組み合わせたり、めちゃくちゃ悩んで決めました笑

```
if response.face_details == []
  @songs = Song.all
  @song = @songs.sample
  render json: {
    body: "分析失敗(>_<)(顔が写っていない等)",
    emotion: "UNKNOWN",
    song_id: @song.id
  }
else
  response.face_details.each do |face_detail|
    @emotion = if face_detail.emotions[0].type == 'HAPPY'
                 @songs = Song.where(
                   'acousticness <= ? and danceability >= ? or valence >= ?',
                   0.0038, 0.4, 0.7
                 )
                 @song = @songs.sample
                 { 
                   body: "あなたはとてもハッピーです(^o^)" ,
                   emotion: "HAPPY",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'SAD'
                 @songs = Song.where(
                   'valence > ? or acousticness >= ? or danceability <= ?',
                   0.5, 0.0039, 0.39
                 )
                 @song = @songs.sample
                 {
                   body: "あなたは悲しんでいます(>_<)",
                   emotion: "SAD",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'ANGRY'
                 @songs = Song.where(
                   'tempo >= ? and tempo <= ? or acousticness >= ?', 
                   90, 150, 0.0039
                 )
                 @song = @songs.sample
                 {
                   body: "あなたは怒っています(`A´)",
                   emotion: "ANGRY",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'CONFUSED'
                 @songs = Song.where('acousticness >= ?', 0.0039)
                 @song = @songs.sample
                 {
                   body: "あなたは困惑しています(´･ω･`)?",
                   emotion: "CONFUSED",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'DISGUSTED'
                 @songs = Song.where('acousticness <= ? or valence >= ?', 0.0038, 0.6)
                 @song = @songs.sample
                 {
                   body: "あなたはうんざりしています( ≖_≖​)ﾊｧ･･･",
                   emotion: "DISGUSTED",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'SURPRISED'
                 @songs = Song.where('tempo >= ? and tempo <= ? or acousticness >= ?', 90, 150, 0.0039)
                 @song = @songs.sample
                 {
                   body: "あなたは驚いています（ﾟﾛﾟ）",
                   emotion: "SURPRISED",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'CALM'
                 @songs = Song.where('acousticness <= ? or energy >= ?', 0.0039, 0.85)
                 @song = @songs.sample
                 {
                   body: "あなたは穏やかです(*´∀`*)",
                   emotion: "CALM",
                   song_id: @song.id
                 }
               elsif face_detail.emotions[0].type == 'FEAR'
                 @songs = Song.where('acousticness <= ? or valence >= ?', 0.0038, 0.6)
                 @song = @songs.sample
                 {
                   body: "あなたは恐れています（；ﾟДﾟ）",
                   emotion: "FEAR",
                   song_id: @song.id
                 }
               else
                 @songs = Song.where(
                   'valence > ? or acousticness >= ? or danceability <= ?',
                   0.5, 0.0039,0.39
                 )
                 @song = @songs.sample
                 {
                   body: "あなたの感情は無です( ˙-˙ )",
                   emotion: "UNKNOWN",
                   song_id: @song.id
                 }
               end                  
        render json: @emotion
      end
    end
```


- **Amazon Rekognitionでの感情分析の結果を受け取ってから、選曲を行い、その結果を渡す**

Amazon Rekognitionからの感情分析の結果の受け取りが、うまくできなかったり、選曲結果の渡しがうまくいかなかったりしました。また、APIの利用が初めてで、設定部分で手こずったりしたので、結構苦労しました。

## 使用技術

### バックエンド

Ruby 3.0.3
Ruby on Rails 6.1.4

### フロントエンド

Javascript 

### 外部API

Amazon Rekognition
Spotify API

### インフラ

Heroku
postgreSQL

## 終わりに

最後まで、読んで頂きありがとうございました。
初めてAPI利用したりしたので、個人的には難しかったのですが、リリースできてよかったです。

今日何聴こうかな〜と悩んでいる方など、ご興味のある方は、ぜひ、本サービス利用して頂き、診断や投稿して頂けるとめちゃくちゃ嬉しいです！

ありがとうございました！