
✏️ 做者介绍:
git
丸音 APP 是一款基于 AI 音乐创做的音乐分享社区。咱们但愿经过丸音,让更多喜欢音乐的人能轻松地进行音乐创做,在丸音拥有属于你本身的音乐!
丸音的库中有用户上传的海量音乐。咱们的首要任务是如何基于用户的历史行为,从海量音乐中筛选出用户感兴趣的音乐。关于推荐系统模型,咱们考虑了最经典的基于用户的协同过滤(User-based CF)和基于项目的协同过滤(Item-based CF):
基于用户的协同过滤在用户总数较多的状况下会致使漫长的计算时间,同时考虑到产品特性,咱们打算使用 I2I 实现音乐推荐。但因为目前并无太多的歌曲信息,想作 I2I 只能从歌曲自己下手,因此须要经过必定手段提取歌曲特征
向量。咱们的作法是将歌曲转成梅尔频谱图;而后设计 CNN 网络来提取特征向量,做为歌曲的表征;最后经过查找类似向量来实现音乐推荐。
有了特征向量,剩下的问题就是如何在海量特征向量中找到指定向量的类似结果。关于特征向量检索工具,咱们想到了 Faiss 和 Milvus。Milvus 是 2019 年 11 月份在 GitHub 榜单刷到的,了解了一下项目,感受像一个高阶 API(当时仍是 0.5.x 版本,如今已发布了 0.10.2 版本)。
两款工具中其实咱们更倾向于使用 Milvus。一方面由于以前用过 Faiss,此次想尝试点新东西。另外一方面,Faiss 更 “底层” 一些,用起来相对麻烦。在进一步了解后,咱们决定使用 Milvus,主要缘由有两点:
总的来讲,Milvus 对用户十分友好,官网的文档也至关详细。遇到问题先查文档基本都能解决,解决不了的能够在社区交流群请教。
在决定使用 Milvus 特征向量检索引擎后,咱们配置了单机服务在 DEV 环境运行。几天下来发现效果不错,打算提到 FAT 环境测试。又考虑到在生产环境中若单节点宕机了,那么服务也就不可用了,应该配置高可用的特征向量检索服务。
Milvus 提供了 Mishards 集群分片中间件,并且在配置方面,官方提供了 Milvus-Helm。咱们只须要根据需求修改参数,而后打包部署到 Kubernetes 便可,因此部署 Milvus 集群的过程十分方便。关于 Mishards 的工做原理,可参考官方文档里的示意图:
Mishards 将上游过来的请求拆分,而后路由到子服务。子服务完成后,将各子服务查询结果汇总,返回给上游。其集群方案架构以下图:
关于 Mishards 的官方介绍很清晰,感兴趣的小伙伴能够查阅
Milvus 文档
。
https://milvus.io/cn/docs/v0.10.2/mishards.md
在目前的音乐推荐服务中,咱们基于 Milvus-Helm 部署了一个写节点、两个读节点和一个 Mishards 中间件实例到 Kubernetes,而且在 FAT 环境里运行了一段时间。服务稳定运行后已经在生产环境使用了,目前服务仍在正常运行。固然,美中不足的是目前只支持单写节点,相信后续官方会有更好的方案。
前面已经介绍了丸音的 I2I 音乐推荐系统从歌曲自己下手,首先会将用户上传的新歌作音轨分离,也就是把人声(Vocal)和伴奏(BGM)分开,提取伴奏中的特征向量做为该歌曲的表征(音轨分离也基本解决了翻唱过滤需求),而后将这些特征向量存入 Milvus,而后基于用户听过的歌在 Milvus 中召回类似歌曲,再通过排序和重排实现音乐推荐,具体实现流程以下图:
咱们应用 Milvus 的另外一个场景是重复歌曲筛选。有的用户会把同一首歌或者其片断上传屡次,这些重复的歌可能会出如今某一用户的推荐列表里。若不去重就展示给用户,极可能会下降用户的听歌体验。所以咱们须要找出哪些歌是同一首歌,而后对其作一些处理,以避免同时出如今同一列表里。
咱们的思路一样是经过筛选类似的歌曲特征向量来实现,首先对音乐作音轨分离,而后基于 Milvus 召回必定量级的类似歌曲。为了实现重复歌曲的精准筛选,咱们会提取音乐的音频指纹(好比
Echoprint、Chromaprint 等技术)
,再对 Milvus 召回的歌曲进行音频指纹的一对一匹配,取一个阈值,类似度高于该阈值的则判为重复歌曲。音频指纹匹配这一过程可让重复歌曲筛选更加准确,但也十分耗时,因此针对海量的音乐库筛选,咱们选择先利用 Milvus 筛选出候选的重复歌曲。
为了实现丸音对海量歌曲作 I2I 推荐,咱们经过提取歌曲特征向量来表征歌曲。而后对类似向量进行召回,通过排序、重排后展示给用户。为实现实时召回推荐,咱们使用了相较于 Faiss 更易用且更成熟的 Milvus 向量类似度检索引擎。并基于此思路实现了实时重复歌曲筛选,提高了业务效率。
架构
🎵 你能够下载丸音,体验好“丸”的音乐:https://enjoymusic.ai/wanyin。app
参考资料:
https://milvus.io/cn/docs/v0.10.2/mishards.md
https://github.com/milvus-io/milvus/tree/master/shards
https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
github.com/milvus-io/milvus
| 源码
milvusio.slack.com
| Slack 社区
zhihu.com/org/zilliz-11/columns |
知乎
zilliz.blog.csdn.net
|
CSDN 博客
space.bilibili.com/478166626 |
Bilibili