You are on page 1of 65

機器學習與智慧⾳音樂應⽤用

Machine Learning
and the Intelligent Music Application

Fukuball Lin @ 資策會資訊處


簡介

關於我
Fukuball / 林林志傑

幕僚僚⼯工程師

Fukuball Lin @ 資策會資訊處


簡介

2006 年年的契機

Fukuball Lin @ 資策會資訊處


前⾔言
智慧 ⾳音樂

Fukuball Lin @ 資策會資訊處


Spotify 的智慧⾳音樂應⽤用 - 誠⼼心推薦
Fukuball Lin @ 資策會資訊處
KKBOX 的智慧⾳音樂應⽤用 - 你可能會喜歡
Fukuball Lin @ 資策會資訊處
前⾔言

為何要發展智慧系統?

如果不在 90 秒內抓
住使⽤用者的注意⼒力力,
可能就會失去這名
使⽤用者了了!

Fukuball Lin @ 資策會資訊處


前⾔言

我也想做智慧⾳音樂系統!

Fukuball Lin @ 資策會資訊處


前⾔言

2008 - 2016 我的⼩小⼩小成果


iNDIEVOX 智慧⾳音樂三寶

會員數從 2 萬增加⾄至 50 萬
Fukuball Lin @ 資策會資訊處
簡介

iNDIEVOX 是什什麼?

Fukuball Lin @ 資策會資訊處


簡介

iNDIEVOX 簡介

獨立⾳音樂⼈人 歌迷

50 餘萬會員
100 萬⽉月瀏覽次數
7000 餘組⾳音樂⼈人 平均停留留時間 17 分
12000 餘⾸首原創歌曲
20 餘家 Live House
⾼高⾳音質 DRM Free 線上⾳音樂商店
各⼤大⾳音樂祭
全台 Live House ⾨門票販售
⾳音樂社群平台

Fukuball Lin @ 資策會資訊處


Icons made by Simpleicon、Freepik from www.flaticon.com
要讓台灣的獨立⾳音樂跟歐美⽇日
⼀一樣蓬勃只做這些夠嗎?

Fukuball Lin @ 資策會資訊處


我們對獨立⾳音樂
StreetVoice Product Family
Talent Network > Distribution > Media, Digital Music Service Chain Online Retailers

⽣生態系統的完整藍藍圖

Pack

Talent Network

Promotion
Distribution
Song Placement

TV Shows / Live Events


Media

Media Partners

Fukuball Lin @ 資策會資訊處


簡介

iNDIEVOX 只是完整獨立⾳音樂
⽣生態系統中的⼀一⼩小塊

Fukuball Lin @ 資策會資訊處


簡介

進入正題,iNDIEVOX 智慧⾳音樂三寶
Fukuball Lin @ 資策會資訊處
火⼒力力展⽰示

購買關聯聯推薦
Fukuball Lin @ 資策會資訊處
火⼒力力展⽰示

⼼心情電台
Fukuball Lin @ 資策會資訊處
火⼒力力展⽰示

VA ⼼心情 DJ 電台
Fukuball Lin @ 資策會資訊處
I HAVE NO IDEA
那要怎麼做呢?

Fukuball Lin @ 資策會資訊處


Magic!

智慧

⾳音樂

Fukuball Lin @ 資策會資訊處


範例例程式碼
• https://bit.ly/iv-data-intro

Fukuball Lin @ 資策會資訊處


購買關聯聯推薦技術解析

Fukuball Lin @ 資策會資訊處


購買關聯聯

Apriori 演算法簡介(1)
• 快速計算關聯聯規則的著名演算法

• 關聯聯規則:符合「⽀支持度」、「信任度」的交
易易品項集合

• ⽀支持度:品項 A 與 品項 B 同時出現在交易易中
的機率

• 信任度:交易易中有品項 A 然後也會有品項 B 的
機率
Fukuball Lin @ 資策會資訊處
購買關聯聯

Apriori 演算法簡介(2)

Fukuball Lin @ 資策會資訊處


購買關聯聯

購買關聯聯簡易易範例例(1)
require_once('library/Apriori/lib/Apriori.class.php');

$minSupp = 5;
$minConf = 75;
$type = Apriori::SRC_PLAIN;
$recomFor = 'beer';
$data = 'lesson1_dataset.txt';

$apri = new Apriori($type, $data, $minSupp, $minConf);


$apri->displayTransactions()
->solve();
// 計算符合⽀支持度集合
$apri->generateRules()
->displayRules()
->displayRecommendations($recomFor);
// 計算符合信任度集合並推薦
unset($apri);
Fukuball Lin @ 資策會資訊處
購買關聯聯

購買關聯聯簡易易範例例(2)
執⾏行行
$ php lesson1_apriori.php
結果

Fukuball Lin @ 資策會資訊處


購買關聯聯

購買關聯聯實務上的問題
• 使⽤用 iNDIEVOX 開源的 Buy
Together Discs Dataset 或 Buy
Together Songs Dataset

• 實務上⽀支持度及信任度都要設很低
才跑得出結果(因為交易易品項多,
關聯聯規則較為稀疏)
Fukuball Lin @ 資策會資訊處
⼼心情電台技術解析

Fukuball Lin @ 資策會資訊處


⼼心情電台

分類問題
• 將⾳音樂分成輕鬆、快樂、
興奮、憂鬱、悲傷、憤怒,
其實就是⼀一種分類問題

• 分類在數學物理理意義上,
就是在空間中找到⼀一個可
以正確分開訓練資料的超
平⾯面
Fukuball Lin @ 資策會資訊處
⼼心情電台

SVM 分類模型簡介(1)
• 分類模型很多,我們這邊使⽤用的是
Soft Gaussian SVM

• SVM 具有不易易 overfitting、雜訊容


忍度較⾼高的特性

Fukuball Lin @ 資策會資訊處


⼼心情電台

SVM 分類模型簡介(2)

Fukuball Lin @ 資策會資訊處


⼼心情電台

SVM 分類模型簡介(3)

Fukuball Lin @ 資策會資訊處


⼼心情電台

Cross Validation 調整參參數

Fukuball Lin @ 資策會資訊處


⼼心情電台

機器學習過程
• 特徵萃取

• 產⽣生資料集

• 訓練

• Cross Validation

• 預測
Fukuball Lin @ 資策會資訊處
⼼心情電台

特徵萃取(1)
• ⾳音樂⾳音訊特徵萃取:使⽤用 PyAudio

• 使⽤用 iNDIEVOX 上傳⾳音樂萃取特


徵,透過 API 取得特徵值

Fukuball Lin @ 資策會資訊處


⼼心情電台

特徵萃取(2)
• 透過 iNDIEVOX Open API 取得特徵值

• API End Point:https://www.indievox.com/api/mir/song/


feature/{song_id}?
app_id=P300000045&app_secret=9bdecdb004682865260
c9d2a5cc71f0d

• Ex. https://www.indievox.com/api/mir/song/feature/1?
app_id=P300000045&app_secret=9bdecdb004682865260
c9d2a5cc71f0d

• 更更多 API ⽂文件請⾒見見:iNDIEVOX Datasets

Fukuball Lin @ 資策會資訊處


⼼心情電台

特徵萃取(3)

Fukuball Lin @ 資策會資訊處


⼼心情電台

產⽣生資料集
• 為資料上標籤,這邊就是為歌曲標上分類

• 1 代表輕鬆、2 代表快樂、3 代表興奮、4 代表憂鬱、5 代表


悲傷、6 代表憤怒

• Ex. .108498920134 0.076927526196 … …


0.00644760168266 2

• 將多筆資料組成資料集

• 使⽤用 iNDIEVOX 開源的 Emotion Combine Training Dataset

Fukuball Lin @ 資策會資訊處


⼼心情電台

訓練
• 使⽤用 fuku-ml 訓練⼼心情分類模型
import os
import FukuML.Utility as utility
import FukuML.SupportVectorMachine as svm

input_train_data_file = os.path.join(os.path.join(os.getcwd(),
os.path.dirname(__file__)), 'library/iNDIEVOX-Dataset/dataset/
emotion_combine_song_train.dataset')

svm_mc = svm.MultiClassifier()
svm_mc.load_train_data(input_train_data_file)
// 載入資料集
svm_mc.set_param(svm_kernel='soft_gaussian_kernel', C=1)
// 設定參參數
svm_mc.init_W()
svm_mc.train()
// 訓練
Fukuball Lin @ 資策會資訊處
⼼心情電台

Cross Validation
• 使⽤用 Cross Validation 挑選參參數
cross_validator = utility.CrossValidator()

svm_mc1 = svm.MultiClassifier()
svm_mc1.load_train_data(input_train_data_file)
svm_mc1.set_param(svm_kernel='soft_gaussian_kernel', C=1)
svm_mc2 = svm.MultiClassifier()
svm_mc2.load_train_data(input_train_data_file)
svm_mc2.set_param(svm_kernel='soft_gaussian_kernel', C=10)
svm_mc3 = svm.MultiClassifier()
svm_mc3.load_train_data(input_train_data_file)
svm_mc3.set_param(svm_kernel='soft_gaussian_kernel', C=100)

cross_validator.add_model(svm_mc1)
cross_validator.add_model(svm_mc2)
cross_validator.add_model(svm_mc3)
avg_errors = cross_validator.excute()
best_model = cross_validator.get_best_model()

Fukuball Lin @ 資策會資訊處


⼼心情電台

預測
• 模型訓練好之後,就可以拿來來做分類預測
best_model.init_W()
best_model.train()

future_data = '0.0333526059402 0.0191216300488 … …


0.0087182119318’

prediction = best_model.prediction(future_data,
mode='future_data')

Fukuball Lin @ 資策會資訊處


⼼心情電台

⼼心情電台範例例
執⾏行行
$ python lesson2_svm_classification.py
結果

Fukuball Lin @ 資策會資訊處


VA ⼼心情電台技術解析

Fukuball Lin @ 資策會資訊處


VA 電台

迴歸問題
• 將⾳音樂對應到 Valence
Arousal ⼆二維平⾯面,Valence
跟 Arousal 各⾃自是⼀一個實
數,其實就是迴歸問題
feature transform
• 迴歸在數學物理理意義上,就
是在空間中找到⼀一個與所有
資料點平⽅方距離最⼩小的超平
⾯面
Fukuball Lin @ 資策會資訊處
VA 電台

Ridge Regression 模型簡介

Fukuball Lin @ 資策會資訊處


VA 電台

機器學習過程
• 特徵萃取

• 產⽣生資料集

• 訓練

• Cross Validation

• 預測
Fukuball Lin @ 資策會資訊處
VA 電台

特徵萃取
• ⽅方法跟之前的⽅方法⼀一樣!

Fukuball Lin @ 資策會資訊處


VA 電台

產⽣生資料集
• 為資料上標籤,這邊就是為歌曲標上 Valence 值

• Valence 值域為 0 ~ 1 的浮點數,數值越靠近 0 就代表情緒


越負⾯面,越靠近 1 就代表越正⾯面

• Ex. .108498920134 0.076927526196 … …


0.00644760168266 0.4

• 將多筆資料組成資料集

• 使⽤用 iNDIEVOX 開源的 Valence Training Dataset

Fukuball Lin @ 資策會資訊處


VA 電台

訓練
• 使⽤用 fuku-ml 訓練 Valence 迴歸模型
import os
import FukuML.Utility as utility
import FukuML.RidgeRegression as ridge_regression

input_train_data_file = os.path.join(os.path.join(os.getcwd(),
os.path.dirname(__file__)), 'library/iNDIEVOX-Dataset/dataset/
valence_train.dataset')

ridge = ridge_regression.RidgeRegression()
ridge.load_train_data(input_train_data_file)
// 載入資料集
ridge.set_feature_transform('legendre', 2)
ridge.set_param(lambda_p=0.01)
// 設定參參數
ridge.init_W()
ridge.train()
// 訓練
Fukuball Lin @ 資策會資訊處
VA 電台

Cross Validation
• 使⽤用 Cross Validation 挑選參參數

cross_validator = utility.CrossValidator()

ridge_regression1 = ridge_regression.RidgeRegression()
ridge_regression1.load_train_data(input_train_data_file)
ridge_regression1.set_feature_transform('legendre', 2)
ridge_regression1.set_param(lambda_p=0)
ridge_regression2 = ridge_regression.RidgeRegression()
ridge_regression2.load_train_data(input_train_data_file)
ridge_regression2.set_feature_transform('legendre', 2)
ridge_regression2.set_param(lambda_p=0.01)

cross_validator.add_model(ridge_regression1)
cross_validator.add_model(ridge_regression2)
avg_errors = cross_validator.excute()
best_model = cross_validator.get_best_model()

Fukuball Lin @ 資策會資訊處


VA 電台

預測
• 模型訓練好之後,就可以拿來來做迴歸預測
best_model.init_W()
best_model.train()

future_data = '0.0611308372368 0.0993997525059 … …


0.00595031482948’

prediction = best_model.prediction(future_data,
mode='future_data')

Fukuball Lin @ 資策會資訊處


VA 電台

VA ⼼心情電台範例例
執⾏行行
$ python lesson3_ridge_regression.py
結果

Fukuball Lin @ 資策會資訊處


Magic!

啊~~~

智慧⾳音樂

Fukuball Lin @ 資策會資訊處


繼續研發

離開 iNDIEVOX 之後

Fukuball Lin @ 資策會資訊處


相似歌詞推薦

Fukuball Lin @ 資策會資訊處


實際應⽤用

中⽂文歌詞相似推薦系統 (1)
• Step 1:中⽂文斷詞,集合成資料集

• Step 2:去掉停⽤用字

• Step 3:將每⾸首歌詞轉成向量量表⽰示(doc2vec)

• Step 4:LSA 算法降維

• Step 5:使⽤用降維後的向量量計算 cosin similarity

• 這邊使⽤用了了 gensim 套件處理理步驟 2-5,但全部⾃自幹也


不算太難

Fukuball Lin @ 資策會資訊處 、


實際應⽤用

中⽂文歌詞相似推薦系統 (2)

Demo

Fukuball Lin @ 資策會資訊處 、


實際應⽤用

中⽂文歌詞相似推薦系統 (3)
• 輸入:楊培安 我的驕傲 歌詞

• 輸出:

• 楊培安 我的驕傲

• 五⽉月天 倔強

• 張雨⽣生 我的未來來不是夢

• 五⽉月天 憨⼈人

• 五⽉月天 ⼀一顆蘋果

Fukuball Lin @ 資策會資訊處 、


實際應⽤用

中⽂文歌詞相似推薦系統 (4)
《 我的驕傲》節錄 《 倔強》節錄

沒有⼭山不能跨越 沒有海海不能冒險 最美的願望 ⼀一定最瘋狂


讓歷史記得這⼀一天 當我⽤用⼼心立下諾⾔言 我就是我⾃自⼰己的神 在我活的地⽅方
沒有事不能改變 沒有夢不能實現 我和我最後的倔強 握緊雙⼿手絕對不放
我站在未來來最前線 抬頭迎接每個考驗 下⼀一站是不是天堂 就算失望不能絕望
我和我驕傲的倔強 我在風中⼤大聲的唱
海海闊天空是我的地圖 想寫下全新紀錄 這⼀一次為⾃自⼰己瘋狂 就這⼀一次 我和我的倔強
放眼天下在等我去征服 ⽤用熱⾎血燃燒⿊黑夜
等待最燦爛的⽇日出 逆風的⽅方向 更更適合⾶飛翔
我不怕千萬⼈人阻擋 只怕⾃自⼰己投降
看陽光與我賽跑 風雨和我狂飆 我的驕傲⾃自⼰己打造 我和我最後的倔強 握緊雙⼿手絕對不放
每個夢 永遠比天⾼高 ⼀一顆⼼心 為希望在跳躍 下⼀一站是不是天堂 就算失望不能絕望
讓世界為我歡呼 ⼤大地為我炫耀 我和我驕傲的倔強 我在風中⼤大聲的唱
我的驕傲你會看到 汗和淚淚痛苦的煎熬 這⼀一次為⾃自⼰己瘋狂 就這⼀一次 我和我的倔強
在這⼀一刻都是我光榮的記號

Fukuball Lin @ 資策會資訊處 、


補充說明

LSA 潛在語意分析(1)

Fukuball Lin @ iThome TechTalk 、


補充說明

LSA 潛在語意分析(2)

SVD 分解 LSA 降維 無法完整呈現歌詞情意

row 1 有關愛情的字詞值都較⾼高,所以Topic1應代表愛情
row 2 有關夢想的字詞值都較⾼高,所以Topic2應代表夢想

原本要⽤用12個詞來來描述歌詞,現在只要⽤用兩兩個Topic就可以描述

表⽰示歌詞如何⽤用兩兩種Topic來來呈現,可明顯看出有兩兩類歌詞
Fukuball Lin @ iThome TechTalk 、
補充說明

LSA 潛在語意分析(3)

風景 世界 巧克⼒力力 甜美 愛情 快樂 滋味 咖哩 理理想 夢想 陽光 ⾶飛翔


c1
c2
c3
c4
c5
m1
m2
m3
m4

能夠完整呈現歌詞情意

Fukuball Lin @ iThome TechTalk 、


實際應⽤用

中⽂文歌詞相似推薦系統 (5)
• 輸入:周杰倫倫 安靜 歌詞

• 輸出:

• 周杰倫倫 安靜

• 黃品源 那麼愛你為什什麼

• 孫燕姿 我不難過

• 陳奕迅 婚禮的祝福

• 周杰倫倫 斷了了的弦

Fukuball Lin @ 資策會資訊處 、


你也有什什麼 idea
以上智慧⾳音樂
應⽤用幾乎都是
想去實現嗎?

那就去做做看!

在我⼯工作之餘
完成的!

Fukuball Lin @ 資策會資訊處


Q&A
Find Me

Twitter @fukuball
Github @fukuball
Facebook @fukuball