讓音樂伴隨你左右-Milvus 在丸音的應用




✏️  做者介紹:
git

Jason,不亦樂乎科技算法工程師
陳室餘,Zilliz 數據工程師


| 背景

丸音 APP 是一款基於 AI 音樂創做的音樂分享社區。咱們但願經過丸音,讓更多喜歡音樂的人能輕鬆地進行音樂創做,在丸音擁有屬於你本身的音樂!
丸音的庫中有用戶上傳的海量音樂。咱們的首要任務是如何基於用戶的歷史行爲,從海量音樂中篩選出用戶感興趣的音樂。關於推薦系統模型,咱們考慮了最經典的基於用戶的協同過濾(User-based CF)和基於項目的協同過濾(Item-based CF):
  • 基於用戶的協同過濾:用類似統計的方法獲得具備類似愛好或者興趣的相鄰用戶。有了最近鄰用戶集合,就能夠對目標用戶的興趣進行預測,產生推薦結果。github

  • 基於項目的協同過濾:由亞馬遜推出的 Item-to-Item (I2I) CF 推薦系統廣爲人知。該算法經過計算項目之間的類似性來代替計算用戶之間的類似性,所依據的基本假設是 「可以引發用戶興趣的項目,一定與其以前評分高的項目類似」。算法

基於用戶的協同過濾在用戶總數較多的狀況下會致使漫長的計算時間,同時考慮到產品特性,咱們打算使用 I2I 實現音樂推薦。但因爲目前並無太多的歌曲信息,想作 I2I 只能從歌曲自己下手,因此須要經過必定手段提取歌曲特徵 向量。咱們的作法是將歌曲轉成梅爾頻譜圖;而後設計 CNN 網絡來提取特徵向量,做爲歌曲的表徵;最後經過查找類似向量來實現音樂推薦。


| 選擇特徵向量檢索工具

有了特徵向量,剩下的問題就是如何在海量特徵向量中找到指定向量的類似結果。關於特徵向量檢索工具,咱們想到了 Faiss 和 Milvus。Milvus 是 2019 年 11 月份在 GitHub 榜單刷到的,瞭解了一下項目,感受像一個高階 API(當時仍是 0.5.x 版本,如今已發佈了 0.10.2 版本)。
兩款工具中其實咱們更傾向於使用 Milvus。一方面由於以前用過 Faiss,此次想嘗試點新東西。另外一方面,Faiss 更 「底層」 一些,用起來相對麻煩。在進一步瞭解後,咱們決定使用  Milvus,主要緣由有兩點:
  • 十分易用,只須要拉取 Docker 鏡像,而後根據自身狀況修改一些參數就能夠運行了。微信

  • 支持的索引更多,關於索引使用方法有詳細的文檔。網絡

總的來講,Milvus 對用戶十分友好,官網的文檔也至關詳細。遇到問題先查文檔基本都能解決,解決不了的能夠在社區交流羣請教。


| Milvus 集羣服務

在決定使用 Milvus 特徵向量檢索引擎後,咱們配置了單機服務在 DEV 環境運行。幾天下來發現效果不錯,打算提到 FAT 環境測試。又考慮到在生產環境中若單節點宕機了,那麼服務也就不可用了,應該配置高可用的特徵向量檢索服務。
Milvus 提供了 Mishards 集羣分片中間件,並且在配置方面,官方提供了 Milvus-Helm。咱們只須要根據需求修改參數,而後打包部署到 Kubernetes 便可,因此部署 Milvus 集羣的過程十分方便。關於 Mishards 的工做原理,可參考官方文檔裏的示意圖:       
   
Mishards 工做原理圖

Mishards 將上游過來的請求拆分,而後路由到子服務。子服務完成後,將各子服務查詢結果彙總,返回給上游。其集羣方案架構以下圖:


關於 Mishards 的官方介紹很清晰,感興趣的小夥伴能夠查閱 Milvus 文檔
https://milvus.io/cn/docs/v0.10.2/mishards.md

在目前的音樂推薦服務中,咱們基於 Milvus-Helm 部署了一個寫節點、兩個讀節點和一個 Mishards 中間件實例到 Kubernetes,而且在 FAT 環境裏運行了一段時間。服務穩定運行後已經在生產環境使用了,目前服務仍在正常運行。固然,美中不足的是目前只支持單寫節點,相信後續官方會有更好的方案



| I2I 音樂推薦

前面已經介紹了丸音的 I2I 音樂推薦系統從歌曲自己下手,首先會將用戶上傳的新歌作音軌分離,也就是把人聲(Vocal)和伴奏(BGM)分開,提取伴奏中的特徵向量做爲該歌曲的表徵(音軌分離也基本解決了翻唱過濾需求),而後將這些特徵向量存入 Milvus,而後基於用戶聽過的歌在 Milvus 中召回類似歌曲,再通過排序和重排實現音樂推薦,具體實現流程以下圖:



| 重複歌曲篩選

咱們應用 Milvus 的另外一個場景是重複歌曲篩選。有的用戶會把同一首歌或者其片斷上傳屢次,這些重複的歌可能會出如今某一用戶的推薦列表裏。若不去重就展示給用戶,極可能會下降用戶的聽歌體驗。所以咱們須要找出哪些歌是同一首歌,而後對其作一些處理,以避免同時出如今同一列表裏。
咱們的思路一樣是經過篩選類似的歌曲特徵向量來實現,首先對音樂作音軌分離,而後基於 Milvus 召回必定量級的類似歌曲。爲了實現重複歌曲的精準篩選,咱們會提取音樂的音頻指紋(好比  Echoprint、Chromaprint 等技術) ,再對 Milvus 召回的歌曲進行音頻指紋的一對一匹配,取一個閾值,類似度高於該閾值的則判爲重複歌曲。音頻指紋匹配這一過程可讓重複歌曲篩選更加準確,但也十分耗時,因此針對海量的音樂庫篩選,咱們選擇先利用 Milvus 篩選出候選的重複歌曲。


| 總結


爲了實現丸音對海量歌曲作 I2I 推薦,咱們經過提取歌曲特徵向量來表徵歌曲。而後對類似向量進行召回,通過排序、重排後展示給用戶。爲實現實時召回推薦,咱們使用了相較於 Faiss 更易用且更成熟的 Milvus 向量類似度檢索引擎。並基於此思路實現了實時重複歌曲篩選,提高了業務效率。
架構

🎵 你能夠下載丸音,體驗好「丸」的音樂:https://enjoymusic.ai/wanyinapp


參考資料:

1. Mishards 文檔:
https://milvus.io/cn/docs/v0.10.2/mishards.md
2. Mishards: 
https://github.com/milvus-io/milvus/tree/master/shards
3. Milvus-Helm: 
https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus


| 歡迎加入 Milvus 社區
github.com/milvus-io/milvus  | 源碼
milvus.io  | 官網
milvusio.slack.com  | Slack 社區
zhihu.com/org/zilliz-11/columns |  知乎
zilliz.blog.csdn.net   |   CSDN 博客
space.bilibili.com/478166626 |  Bilibili

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。工具

相關文章
相關標籤/搜索