能否訓練一個AI,能夠自動製作OSU!的鋪面?


p爺爺讓我來回答一下,可能是因為去年 dl 課的 final project 就是做的這個。

不過,我的 project 還不能算一個可以用的 generator,因為我的方法是有問題的, 以下我大體寫一下我的方法,以及遇到的坑,最後再說下我覺得應該怎麼做..

我一開始的想法非常 trivial:我們玩家判斷一個 map 做的好不好,是通過玩遊戲的方式,換句話說就是,在給了音樂的前提下,對當前時間段的點擊的位置,類型(滑條,點或者是圈)的評價,所以,直接優化我們的目標——讓玩家更爽,我們直接構建了一個 sequence model, 對 ranked map 中每一幀(osu中的把時間離散化的一種方式,跟bpm有關) 物件的類型,位置,打擊音效進行學習。

其實現在一看這個 model 問題非常大,一看就學不出來。首先,按照osu map中對時間的劃分,一張圖最少得幾百幾千幀,甚至有上萬幀的,無論是LSTM 還是 GRU 都不可能處理這麼長的sequence, 當然我們也進行了分割,不過效果還是不行;其次,在一個 model 中,同時學習多個目標不是一個好的選擇,要知道,在每一幀都要輸出物件的類型——無、點、滑條(這個滑條是個巨坑,之後再說)或者轉盤,物件的位置(x,y軸做標),點擊的音效(三種),這樣做loss變得非常複雜,產生了非常多的問題;最後,把一張map parse 成我們想要的格式,把我們輸出的格式 encode 回osu file這個過程也很痛苦。

最後這塊的麻煩程度我想用單獨描述一下:

首先,map是有多種格式的,去年的時候格式編號到v14,如果想利用起來所有的數據就得對不同的格式寫不同的 parser,這個過程又瑣碎又沒意義,所以如果其他人想做,我建議直接寫v14版本的 parser 就好,這樣一個 parser 改改直接可以兼容 v10-v14 的所有譜面。

其次,我認為處理起來最蛋疼的玩意——滑條,滑條別看滑起來爽,處理起來麻煩的要死。我們都知道,mapper 作圖的時候,點幾個點就能自動生成滑條,但這滑條是根據什麼函數生成的呢?好,我來告訴你,兩個點的時候它是一個直線,三個點的時候它是一個圓曲線,四個點以上就更有意思了,它是一個 Bézier curve.... 要知道在處理到這裡之前我只在高貴的數理方程課上見過這個函數,當時看到這玩意的時候我眼淚都下來了,早忘完了好嗎....不僅如此,還有雙擊fix一個點的位置,根據BPM(音樂的BPM是變化的,有的時候滑條滑到一半就會變)滑條速度不同等一系列問題....

最後還有個麻煩的地方是把生成的 sequence 再變回譜面的格式。這塊沒啥好說的,因為生成的 sequence 不可能嚴格符合譜面的標準,於是人工給定一些penalty,然後dp就行。主要是工作量比較大.

其實想想,這個parser里遇到的大部分問題其實都不算問題,還是因為我代碼能力太鶸,你們p爺爺 @pzhxbz 一天就能寫完...

最後再補一句,音樂提 feature 是用的 mfcc ,這個方法是做語音的那幫人用的,時域太小,也不是很好的選擇。

我們用這個失敗的方法是因為當時期末,時間緊張,天真得以為 end2end 的方法更簡單,可以省下寶貴的期末時間複習其他科目。

我們本來想用的方法是這個:

  1. Music Segmentation. 把音樂分成幾秒到幾十秒的小段。這個步驟可以 supervised 也可以 unsupervised,supervised 的話,golden split 可以用 mapper 標註的 break time,unsupervised 方法也有相關的 paper, 大體 survey 了一下, 相關方法都是2010年之前的了,近幾年研究 sequence data unsupervised segmentation 的沒怎麼看到...
  2. Tagging,針對每一幀做一個 tagging,這一步類似於ner,lstm+crf 說不定能達到期望的效果(猜測)
  3. Retrieval,根據音樂的 feature 和 第二步得到的 tagging,從 mapper 標註好的譜面里搜到最適合的物件,進行旋轉或者位移,作為 generator 的結果。想法類似於基於 retrieval 的 chatbot....

這個是之前我的理想方法,如果真要這麼做,這個 project 對我來說太大了,而且,第三步其實想法感覺不太可行,不過相對來說,比我一開始的胡逼 end2end 好多了....

如果題主想做的話,咱可以聊聊,雖然我鶸的不行,不過畢竟之前做過,說不定能給你們提一些不成熟的建議......

寫完了,請p爺爺審閱 @pzhxbz


高中寫了(假的)Cytus譜面自動生成,順便寫了對一個現成譜面自動劃分手指

自動生成大概就是wav文件取樣,特定節奏規則對應的情緒之類的,然後對一些已有的樣本劃分,重新組合

劃分手指基本上是難度係數=移動距離,交叉、長按、單手跨服、連續高難度之類的構成一個加成系統,選擇最低的劃分就行

順便有了難度自動確定

(原諒窩高中是pascal(偽)OIer


正好認識一個大佬之前寫過這個

@Ehaschia


現有的技術是很難,畢竟機器人連翻譯都不利落。未來我相信還是會出現


推薦閱讀:

機器學習初學者該如何選讀適合自己水平的論文?
用libsvm做時間序列預測,為什麼訓練數據越少越準確?
如何認識和看待人工智慧?人工智慧的巔峰是什麼?
人工智慧是什麼?
人工智慧的交易系統具體是什麼樣的理念,或者模式?

TAG:人工智慧 | 音樂遊戲MusicGame | 人工智慧演算法 | osu! | AI技術 |