登陸研究的領域 – iNDIEVOX 智慧電台參上!

iNDIEVOX Radio
西元2012年4月,iNDIEVOX 上線了開站以來最令人興奮的產品 — iNDIEVOX 智慧電台引用創辦人吳柏蒼所言:
「這個電台中的音樂演算分析,代表 iNDIEVOX 開始踏入了一個新的領域。從踏出這一步開始,iNDIEVOX 將陸續推出更多音樂的智慧型服務,一如我們的初衷:我們愛音樂,希望更多好音樂被聽見。」
iNDIEVOX 智慧電台是台灣獨立音樂服務的一小步,卻對許多台灣獨立藝人及樂迷來說意義重大
好音樂如何被聽見?
一直以來台灣的獨立音樂都在面對這個問題:好音樂如何被聽見?不像流行音樂,獨立音樂一直沒有便利的銷售通路及宣傳管道,也因此獨立藝人在創作音樂之外,常常得分心處理銷售及宣傳的問題iNDIEVOX 可以說是在這樣的需求之下誕生的,獨立藝人可以在這邊很簡易地整合官方網站、銷售通路以及宣傳管道,喜歡獨立音樂的樂迷也可以透過 iNDIEVOX 提供的各種網路服務直接或間接地推廣獨立音樂。
若先撇開藝人及樂迷使用 iNDIEVOX 服務所形成的宣傳效果,iNDIEVOX 本身究竟做了什麼來讓好音樂被聽見?跟傳統的音樂網站服務一樣,我們撰寫新聞稿,播報獨立音樂界重大的新聞,以及相關獨立藝人事跡;我們邀請專業音樂評論家,為難得一見的好音樂書寫樂評;我們也派了音樂記者前往採訪獨立藝人或演唱活動,深刻地描繪出獨立音樂的生命力;新鮮貨列表即時地將最新發表的音樂推播給樂迷們,不可能買榜的熱門唱片排行更展現出了近期銷售最好的獨立音樂來供樂迷做為選購的參考。雖然這些服務著實費了我們不少工夫,但這些服務卻仍然解決不了「好音樂如何被聽見?」這個問題。新音樂不斷發表,好音樂稍縱即逝,埋沒在音樂海裡面的好音樂,如果不被聽見,就永遠上不了熱門排行,即使站方也很難挖掘出來這樣被埋藏住的好音樂,自然不可能為其寫樂評做宣傳。
其實這樣的問題並不是一個新的問題,外國的音樂網站已經有許多方法來解決「好音樂如何被聽見?」這個問題。若將這個問題總結成一個解法,這個解法就是所謂的「音樂推薦」。我們可以看到 Amazon 的 Frequently Bought Together 列表及 Customers Who Bought This Item Also Bought 列表,這便是利用分析購買紀錄來推薦並幫助樂迷選購以前不曾聽過的音樂;我們也看到了 Last.fm 的相似音樂及相似藝人,這便是利用分析 Social tags 來推薦相似藝人以幫助樂迷可以觸類旁通;另一種更直覺的方法便是利用人們的情緒心理,分析音樂情緒推薦符合人們心情的音樂,如此當符合聽者情緒的音樂播出,這首音樂便會是所謂的好音樂,這樣的音樂推薦服務,我們可以在 Musicovery 看到,其背後的技術據說是請音樂專家標示音樂的情緒值,因此能推薦出符合情緒的音樂。
就在解決「好音樂如何被聽見?」這個問題的過程中,iNDIEVOX 開始嘗試研究這些音樂推薦技術,登陸了研究的領域。這些取經自外國音樂網站的音樂推薦方法,都有它的道理,但直接套用在 iNDIEVOX 所面臨的情況卻不一定可行。例如 Amazon 所使用的關聯法則演算法,在 iNDIEVOX 音樂銷售量不足的情況下,並不能真正推薦出可信的音樂。 Last.fm 的 Social tags 深受 cold start problem 影響,許多好音樂還是會被埋在音樂海裡,原本就較為冷門的獨立音樂 cold start problem 會更為嚴重。Musicovery 人工標是情緒值的方法雖然簡易,但對於 iNDIEVOX 來說現階段無法投入這樣人力成本的,且情緒值如果用人工來表示也頗為主觀,成效不一定好。
iNDIEVOX 智慧電台成型及背後運作原理
在觀察過多種音樂推薦的服務之後,我們開始想像 iNDIEVOX 的音樂推薦服務應該要長成什麼樣子。我們希望能夠讓好音樂被聽見,我們希望這個方法夠簡易直覺,最好也能吸引以前不曾聽過獨立音樂的樂迷,就在這樣的想像之下,一個能夠自動播放「好音樂」的音樂電台便開始成型。而「好音樂」的衡量標準也並非用銷售量為基準,而是回歸到聽者的心理,當聽到符合情緒的音樂,這些音樂在聽者心中就是好音樂,能夠「點播心情音樂的電台」- iNDIEVOX 智慧電台便這樣誕生了。
前述網站的音樂推薦方法,基本上都是使用 metadata(包含銷售紀錄、標籤、情緒值等等) 來做到音樂推薦的功能,若轉個方向,我們其實可以利用音樂「本身的資料」來做到音樂推薦,也就是分析音樂本身的訊號,來萃取出有用的資訊以做到音樂推薦的功能。以 iNDIEVOX 智慧電台為例,我們是利用音訊分析的方法來將抽象的音樂訊號歸納出訊號帶給聽者的情緒反應,這些反應可以利用 Data Mining 的方法計算並建立出一個決策樹,這個決策樹便可以決定音樂訊號帶給聽者的音樂情緒。例如若音樂訊號呈現是小調、歌曲速度慢,那麼這首音樂很可能就是一首悲傷的歌曲;若音樂訊號呈現是大調、歌曲速度快,那麼這首音樂很可能就是一首較為興奮的歌曲;當然在 Music Information Retrieval 的研究領域中仍有其他效果更好的方法可以做到類似 iNDIEVOX 智慧電台的功能(若讀者有興趣深入討論想關研究,可以與我討論@fukuball),但採用決策樹方法可說是在種種成本效益考量下的最佳解法!
效果
那麼 iNDIEVOX 智慧電台的心情點播效果究竟如何呢?最直接的回饋當然就是聽聽樂迷的說法:
從樂迷的反映看來,iNDIEVOX 智慧電台的心情點播效果應該還不錯!
使用說明
在此讓我來稍微介紹一下 iNDIEVOX 智慧電台的使用方式,首先我們先前往 iNDIEVOX 智慧電台 ,一打開電台,音樂便開始自動播放,預設是播放輕鬆電台,如下圖所示:
若此時心情不好想聽悲傷的歌曲,可將滑鼠游標移動到上方,此時便會出現電台選單,目前 iNDIEVOX 智慧電台總共支援輕鬆、快樂、興奮、悲傷、憤怒、開趴、充滿能量七種心情電台。
iNDIEVOX 智慧電台還有幾項實用又簡易的操作功能,現正播放的音樂專輯封面左上方會有 facebook like button,讓樂迷可以快速地將正在聽的歌曲發佈到 facebook,未來我們會視使用情況考慮將聽過的歌曲整合到 facebook timeline。專輯封面的右下方由左至右分別是 iv like button、iv dislike button 以及 buy button,iv like button 可將歌曲加入最愛, dislike button 則可將現正播放的歌曲紀錄為不喜歡,之後 iNDIEVOX 智慧電台便不會再播放這首歌曲,buy button 則是可以讓樂迷聽到喜歡歌曲後也可以方便的進行購買。
由於 iNDIEVOX 智慧電台終究還是個電台,使用上可能會發現與一般的播放器有些許不同。和一般播放器的相同點在於可以讓音樂播放或暫停,若現正播放的音樂播不好聽,還可以直接跳播下一首,但卻不能播放上一首,音樂播放進度條也不能自由拖拉,算是一種仿電台式的單向播放,卻又不像電台那樣完全的限制,這樣的設計考量有一點是為了保護獨立藝人的音樂作品,畢竟這個電台為的是幫助宣傳音樂,而不是要讓使用者聽免費、聽免驚的。
結論
關於音樂分析等相關研究領域所研發出的產品,誠如大家所見,在國外的大型音樂網站並非不常見,但國內音樂網站同業,因研發風險及成本代價過於高昂,投入在這方面的資源可說是相當少,自然難有成果。在行政院新聞局的補助下,iNDIEVOX 智慧電台登陸音樂研究的領域,是台灣音樂網站的第一步,我們也期望此舉能在未來台灣數位音樂產業發展的歷史上留下一頁。

Classical 曲風

古典音樂是一個含義廣泛的術語,廣義的西洋古典音樂是指那些從西方中世紀開始至今的、在歐洲主流文化背景下創作的音樂,或者指植根於西方傳統禮拜式音樂和世俗音樂,其範圍涵蓋了約公元9世紀至今的全部時期。主要因其複雜多樣的創作技術和所能承載的厚重內涵而有別於通俗音樂民間音樂。在地理上,這些音樂主要創作於歐洲美洲,這是相對於非西方音樂而言的。另外,西洋古典音樂主要以樂譜記錄和傳播,和大多數民間音樂口傳心授的模式不同。

亦有人認為[誰?]「古典」是對應於「流行」而言的,因為這些音樂經得起時間的考驗,能夠引起不同時代聽眾的共鳴,故認為應當稱之為「經典」(classic)的音樂。

但如果細究古典一詞,本意可以理解為古代留傳下來堪稱經典的音樂作品(古代+經典),但是一般來說,古典音樂是具有規則性本質的音樂,具有平衡、明 晰的特點,注重形式的美感,被認為具有持久的價值,而不僅僅是在一個特定的時代流行。這也體現於「古典」(classical)與「經 典」(classic)的不同。

古典音樂(classical music)本來是專指17501830年間以海頓莫扎特貝多芬為代表的音樂,即所謂「維也納古典樂派」的音樂(或翻譯為「維也納古典主義音樂」)。這就是狹義的古典音樂。

從這個狹義的古典音樂概念出發,我們可以向前追溯到巴赫韓德爾,乃至更早的天主教基督教宗教音樂,向後延伸到浪漫主義民族樂派,以及20世紀西方的現代音樂。這些都是廣義的古典音樂,也就是基於這個傳統的,無論是繼承和發揚這個傳統,還是試圖以創新來突破這個傳統的音樂創作嘗試,都可以歸入古典音樂之內。而在這個傳統外獨立發展的音樂,雖然有借鑒和影響古典音樂創作的,但是一般也不歸入古典音樂之內,比如爵士樂搖滾樂,以及東方一些民族的音樂。

因此對於廣義的「古典音樂」這個詞來說,歐洲藝術音樂的定義更加準確。

歐洲藝術音樂與其他的非歐洲音樂和流行音樂體系的主要區別是記譜法有所不同,其規則大約源自於16世紀便開始使用的記譜法。在西方記譜法中,作曲者 給演奏者規定了音調、格律、速度,獨特的節奏和對於一同段音樂準確的演奏方式。這種即興演奏發揮空間很小的記譜法模式,極大的不同於非歐洲藝術音樂(相對 於傳統的日本音樂和印度音樂)和流行音樂。

古典音樂作為音樂中類別的稱呼,是相對於輕音樂通俗音樂等類別而存在,它本身並沒有嚴格明確的解釋或者定義。在輕音樂範圍裏,有時也採用「古典」的概念來指某些經過時間檢驗,被人們奉為楷模的輕音樂作品,如古典輕歌劇、古典爵士樂等,這裡的 classical 理解為「古代+經典」,似乎更為合適一些。

Blues 曲風

藍調英文Blues,解作「藍色」,又音譯為布魯斯)是一種基於五聲音階聲樂和樂器音樂,它的另一個特點是其特殊的和聲。藍調起源於過去美國黑人奴隸的讚美歌、勞動歌曲、叫喊和聖歌。藍調中使用的「藍調之音」和啟應的演唱方式都顯示了它的西非來源。藍調對後來美國和西方流行音樂有非常大的影響,拉格泰姆爵士樂藍草節奏藍調搖滾樂鄉村音樂和普通的流行歌曲,甚至現代的古典音樂中都含有藍調的因素或者是從藍調發展出來的。[1]在詩歌裡這個詞常被用來描寫憂鬱情緒。

藍調一詞是與「藍色魔鬼」(Blue devils)一致的意思,意思是情緒低調、憂傷、憂鬱。早在1798年喬治·科曼就寫過一部名為《藍色魔鬼,一幕滑稽戲》的滑稽戲19世紀這個詞被用來表示震顫譫妄和警察。在美國黑人音樂中這個詞的應用可能更老。1912年孟菲斯威廉·克里斯多福·漢迪的《孟菲斯藍調》是這個詞在音樂中最早的書面紀錄。[2]

Alternative 曲風

另類搖滾alternative rock,也稱為 alternative music[1],或是簡稱 alternative)是搖滾樂中的一種類型,最早在1980年內出現,在1990年代開始廣泛流行。「alternative」這個單字的本意「可選擇的」,在1980年代也被用來指在獨立唱片廠牌旗下的龐克搖滾風格樂團,他們和當時的主流音樂類型並不相同。[2]作為一種特定的音樂類型,另類搖滾自1980年代以來集合了許多獨立音樂(indie music)的子類型,例如油漬搖滾獨立搖滾英式搖滾哥德搖滾等。

Facebook 的確是好物!

Everybody knows it!

Algorithm Gossip: 基數排序法

說明

在之前所介紹過的排序方法,都是屬於「比較性」的排序法,也就是每次排序時 ,都是比較整個鍵值的大小以進行排序。

這邊所要介紹的「基數排序法」(radix sort)則是屬於「分配式排序」(distribution sort),基數排序法又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為O (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。

解法

基數排序的方式可以採用LSD(Least sgnificant digital)或MSD(Most sgnificant digital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始。

以LSD為例,假設原來有一串數值如下所示:

73, 22, 93, 43, 55, 14, 28, 65, 39, 81

首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:

0 1 2 3 4 5 6 7 8 9

81


65


39



43 14 55

28



93







22 73





接下來將這些桶子中的數值重新串接起來,成為以下的數列:

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接著再進行一次分配,這次是根據十位數來分配:

0 1 2 3 4 5 6 7 8 9

28 39







14 22
43 55 65 73 81 93

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

14, 22, 28, 39, 43, 55, 65, 73, 81, 93

這時候整個數列已經排序完畢;如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止。

LSD的基數排序適用於位數小的數列,如果位數多的話,使用MSD的效率會比較好,MSD的方式恰與LSD相反,是由高位數為基底開始進行分配,其他的演 算方式則都相同。

實作

  • C
#include <stdio.h>
#include <stdlib.h> 

int main(void) {
    int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
    int temp[10][10] = {0};
    int order[10] = {0};
    int i, j, k, n, lsd; 

    k = 0;
    n = 1; 

    printf("\n排序前: ");
    for(i = 0; i < 10; i++)
        printf("%d ", data[i]); 

    putchar('\n'); 

    while(n <= 10) {
        for(i = 0; i < 10; i++) {
            lsd = ((data[i] / n) % 10);
            temp[lsd][order[lsd]] = data[i];
            order[lsd]++;
        } 

        printf("\n重新排列: ");
        for(i = 0; i < 10; i++) {
            if(order[i] != 0)
                for(j = 0; j < order[i]; j++) {
                    data[k] = temp[i][j];
                    printf("%d ", data[k]);
                    k++;
                }
            order[i] = 0;
        } 

        n *= 10;
        k = 0;
    } 

    putchar('\n');
    printf("\n排序後: ");
    for(i = 0; i < 10; i++)
        printf("%d ", data[i]); 

    return 0;
}
  • Java
public class RadixSort {
    public static void sort(int[] number, int d) {
        int k = 0;
        int n = 1;

        int[][] temp = new int[number.length][number.length];
        int[] order = new int[number.length];

        while(n <= d) {
            for(int i = 0; i < number.length; i++) {
                int lsd = ((number[i] / n) % 10);
                temp[lsd][order[lsd]] = number[i];
                order[lsd]++;
            } 

            for(int i = 0; i < number.length; i++) {
                if(order[i] != 0)
                    for(int j = 0; j < order[i]; j++) {
                        number[k] = temp[i][j];
                        k++;
                    }
                order[i] = 0;
            } 

            n *= 10;
            k = 0;
        }
    }

    public static void main(String[] args) {
        int[] data =
           {73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100}; 

        RadixSort.sort(data, 100);

        for(int i = 0; i < data.length; i++) {
            System.out.print(data[i] + " ");
        }
    }
}
Original URL: http://fukuball.twbbs.org/?p=137