iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 27
1
AI & Machine Learning

以100張圖理解 Neural Network -- 觀念與實踐系列 第 27

Day 27:音樂資訊檢索(Music Information Retrieval,MIR)

前言

K過『自動語音識別』(Automatic Speech Recognition)後,原想對聲音的研讀要告一段落,沒想到柳暗花明又一村,又看到 Machine Learning 應用到音樂領域也是非常熱門,所以,我們這一篇就來討論『音樂資訊檢索』(Music Information Retrieval,MIR),說明在先,我對音樂一竅不通,如有謬誤,還請海涵。

相關應用

『音樂資訊檢索』(Music Information Retrieval,MIR)應用相當廣,而且都很實際,『What is Music Information Retrieval?』列舉下列應用:

fingerprinting(音訊指紋)
cover song detection(口水歌偵測)
genre recognition(曲風辨識)
transcription(轉錄)
recommendation(推薦)
symbolic melodic similarity(相似性比對)
mood(音樂情緒)
source separation(音源分離)
instrument recognition(樂器辨識)
pitch tracking(音高追蹤),可參閱[Audio Signal Processing and Recognition (音訊處理與辨識)](http://mirlab.org/jang/books/audioSignalProcessing/ptIntro.asp?title=7-1%20Introduction%20to%20Pitch%20Tracking%20(%AD%B5%B0%AA%B0l%C2%DC%C2%B2%A4%B6)&language=chinese)
tempo estimation(節奏)
score alignment(給分)
song structure/form(歌曲結構)
beat tracking(音樂節拍辨識)
key detection(音階偵測)
query by humming(哼唱選歌)

本來完全看不懂,剛好搜尋到台大MIR實驗室的招生簡章,一比對,大部分都懂了:/images/emoticon/emoticon24.gif

  • 哼唱選歌(query by singing/humming, QBSH):由哼唱來辨識所唱的歌。
  • 口水歌偵測(cover song identification):抽取主旋律來進行辨識,達成口水歌偵測的任務。(口水歌的範例:傳統的「望春風」以及陶吉吉搖滾版的「望春風」,或是張惠妹和孫燕姿的「原來你什麼都不要」。)
  • 音訊指紋比對(audio fingerprinting):又稱為原曲選歌,亦即如何以被雜訊污染後的原曲音樂聲來辨識此首歌曲。
  • 歌聲評分:如何讓電腦根據節拍、音調、咬字、音色、抖音等,來對你的歌聲進行評分,如同日本的「關八比賽」一般。
  • 歌詞與音樂同步化:自動由audio music產生同步變色的歌詞。
  • 音樂節拍辨識(beat tracking):由一段音樂來自動抓到此音樂的拍點。
  • 音樂曲風分類(music genre classification):如何辨識一段音訊音樂(audio music)的曲風(例如交響樂、鄉村樂、重金屬、饒舌、搖滾、迪斯可等)。
  • 音樂情緒辨識(music mood classification):如何辨識一段音訊音樂所要表達的情緒,例如快樂、憂愁、亢奮、勵志等不同情緒類別。
  • 音訊音樂的主旋律抽取(audio melody extraction):如何自動從複音音訊音樂(polyphonic audio music)中,自動抓出人聲的主旋律。
  • 敲擊選歌:如何由一個人敲擊節拍(或拍手)的方式來辨識所敲擊的歌。
  • 遊戲應用:音樂敲擊遊戲、打鼓練習遊戲。

以 Neural Network 可著力的地方還真不少,以上列舉的幾乎都是分類(Classification)與辨識(Prediction),正是 Neural Network 的長處,而且在世界流傳的音樂數量又多不可數,訓練資料也容易取得。

音訊介紹

之前我們介紹過語音如何轉化為MFCC特徵向量,再由程式來處理。基本上,音樂也是一種語音,也是可以相同的方式處理,但是,音樂還有三個特徵要考慮:

  1. 音量(Volume):代表語音訊號的強度,也就是聲波的振幅(Amplitude)。
  2. 音高(俗稱音調,Pitch):代表聲音的高低,頻率越高,代表音高越高。
  3. 音色(Timbre):是一個較抽象的東西,根據Wiki說明,他決定於多種表現方式,例如,起音、尾音、抖音(震動)、....;而據[音訊處理與辨識](http://mirlab.org/jang/books/audioSignalProcessing/audioBasicFeature.asp?title=3-2%20Basic%20Acoustic%20Features%20(%B0%F2%A5%BB%C1n%BE%C7%AFS%BCx)&language=chinese)一書描述,音色是指一個聲波基本週期的內容。

透過上面三個特徵組合,我們就可以進一步辨識節拍、曲風(genre,搖滾、爵士、古典...)、情緒(mood,快歌、慢歌、抒情...)等等。

Neural Network 作法

Neural Network 最簡單的作法,其實與『自動語音識別』(Automatic Speech Recognition)大同小異,只要將辨識對象由單字類別改為曲風或情緒類別,每個歌曲取一小段轉成MFCC特徵向量,以CNN或RNN進行訓練,就完成了。但是,為了針對音樂的特徵作更細緻的辨識,就有各種變形的CNN/RNN演算法出現,例如 CRNN(convolutional recurrent neural network),它是作曲風的辨識,請看下圖,與不同的CNN模型作比較。
https://ithelp.ithome.com.tw/upload/images/20180106/20001976EPzhR0tADV.png
圖. CRNN 與不同的 CNN 模型作比較,圖片來源:Convolutional Recurrent Neural Networks for Music Classification

程式

照例我們舉一範例說明,上述的CRNN係以TensorFlow撰寫,較不易講解,所以,我找了一個比較簡單的範例來說明,程式來源為 https://github.com/Hguimaraes/gtzan.keras ,它主要是使用CNN模型辨識曲風,模型如下,是標準的多層式模型:

  def cnn_melspect_1D(input_shape):
    kernel_size = 3
    #activation_func = LeakyReLU()
    activation_func = Activation('relu')
    inputs = Input(input_shape)

    # Convolutional block_1
    conv1 = Conv1D(32, kernel_size)(inputs)
    act1 = activation_func(conv1)
    bn1 = BatchNormalization()(act1)
    pool1 = MaxPooling1D(pool_size=2, strides=2)(bn1)

    # Convolutional block_2
    conv2 = Conv1D(64, kernel_size)(pool1)
    act2 = activation_func(conv2)
    bn2 = BatchNormalization()(act2)
    pool2 = MaxPooling1D(pool_size=2, strides=2)(bn2)

    # Convolutional block_3
    conv3 = Conv1D(128, kernel_size)(pool2)
    act3 = activation_func(conv3)
    bn3 = BatchNormalization()(act3)
    
    # Global Layers
    gmaxpl = GlobalMaxPooling1D()(bn3)
    gmeanpl = GlobalAveragePooling1D()(bn3)
    mergedlayer = concatenate([gmaxpl, gmeanpl], axis=1)

    # Regular MLP
    dense1 = Dense(512,
        kernel_initializer='glorot_normal',
        bias_initializer='glorot_normal')(mergedlayer)
    actmlp = activation_func(dense1)
    reg = Dropout(0.5)(actmlp)

    dense2 = Dense(512,
        kernel_initializer='glorot_normal',
        bias_initializer='glorot_normal')(reg)
    actmlp = activation_func(dense2)
    reg = Dropout(0.5)(actmlp)
    
    dense2 = Dense(10, activation='softmax')(reg)

    model = Model(inputs=[inputs], outputs=[dense2])
    return model

其他部分與『自動語音識別』(Automatic Speech Recognition)的範例均相同,只是撰寫語法不同而已,就不再介紹。

執行

必須下載GTZAN資料集,範例提供較小的資料集,你也可以下載完整的GTZAN資料集,下載的檔案解壓縮後放在一目錄下,修改 params.ini 的內容,例如下面的內容:

[FILE_READ]
TYPE = AUDIO_FILES
GTZAN_FOLDER = D:/0_DataMining/Audio/MIR/Samples/0_Music Genre classification on GTZAN dataset using CNN/gtzan.keras-master/dataset/genres/
#../dataset/GTZAN/
SAVE_MODEL = ../models/gtzan_hguimaraes.h5
SAVE_NPY = False
...

執行下列指令即可:
python train.py

執行結果

  1. 準確度:約80%,但有點過度擬合,應加 DropOut 層
    https://ithelp.ithome.com.tw/upload/images/20180106/2000197670g6Ps1DRV.png
  2. 優化過程中的損失函數變化
    https://ithelp.ithome.com.tw/upload/images/20180106/20001976CR6acXpeRl.png
  3. 其他結果如下:
    https://ithelp.ithome.com.tw/upload/images/20180106/20001976YHmQsvlUn5.png

結論

以上的範例可以延伸到MIR的其他應用,可以花點時間想想,另外,筆者看電視常看到『A藝人模仿B藝人的音色唱歌』,很有娛樂效果,突發奇想,如果能比照之前討論的『畫風轉換』,將『A藝人的音色套到B藝人的歌曲』,是不是可行呢?沒想到老外也已有類似的作法,請參閱這一篇『Timbre modification using deep learning』,65頁,/images/emoticon/emoticon06.gif


上一篇
Day 26:自動語音識別(Automatic Speech Recognition) -- 觀念與實踐(續)
下一篇
Day 28:小學生談『生成對抗網路』(Generative Adversarial Network,GAN)
系列文
以100張圖理解 Neural Network -- 觀念與實踐31

尚未有邦友留言

立即登入留言