经常在评论区看到这样的问题:“《海阔天空》和《光辉岁月》一起听,总觉得主歌的味道很像,是不是我耳朵有问题?”在乐迷圈里,这差不多是常年争论:有人说是致敬,有人说是灵感重复,有人说是巧合。如果只靠听感,这类讨论很难有结果,因为人对“像”的判定受情绪、记忆和播放顺序的影响非常大。
但技术人有技术人的回答方式:把音频变成数字特征,用动态时间规整(DTW)做时间轴对齐,最后输出一个可以复现的相似度分数。这才是本文真正想展示的内容。
说明一下,这篇是《BEYOND那些旋律相似的歌词》系列的第二篇。上一篇如果说的是“听感”,这篇就把脑回路切成工程师模式。你不一定能从这篇文章里得出“某首歌到底重复了多少”的裁判结论,但一定能掌握一套“把旋律相似变成可计算指标”的分析方法。做翻唱识别、曲库去重、音乐推荐甚至版权比对时,这套方法都通用。
1. 这篇文章真正要解决的问题
先给本文划清边界。我要解决的问题不是我能不能判断某首歌是否抄袭,而是三个更落地的工程问题:
- 在没有人工标注的情况下,如何把“两首歌听起来像”转化为“两个特征序列距离近”?
- 在不做人工扒谱的前提下,哪些声学特征最能代表旋律走向,哪些只是音色和编曲带来的干扰?
- 如何避免算法把“同一类和弦进行”误报成“旋律抄袭”?
如果你正在做音乐推荐系统、翻唱识别、音频指纹、K歌评分、曲库去重,或者你只是好奇音乐数据挖掘怎么做,这篇文章的思路可以直接迁移到你的业务里。
从技术角度看,真正有价值的结论是:让人感到“像”的音乐,往往不是完全重复的音符,而是“时间结构一致 + 音高走向接近 + 节奏骨架重合”。所以核心不是去找一个现成的相似度 API,而是自己完成一次特征工程。很多初学者一开始就想着端到端训练一个大模型,但在音乐领域,先理解特征、先把传统方法跑通,后面接入模型时反而会更有判断力。
2. 旋律相似到底由什么决定
要量化旋律相似,至少要把“旋律”这个概念拆开,因为它在我们日常说话时经常被混着用。人耳感知到的“像”通常是多个维度的叠加:
| 维度 | 典型听感 | 技术表示 | 常用算法特征 |
|---|---|---|---|
| 旋律轮廓 | 一句歌词的音高起伏很像 | 主音高序列(F0) | pyin / CREPE / MIDI 转写 |
| 和声走向 | 后半句的底色和弦很像 | 和弦进行 | chroma / chord label |
| 节奏骨架 | 字位置、切分方式很像 | 拍点与音符时值 | onset / beat / duration |
| 音色质感 | 乐器和人声的音色相近 | 频谱包络 | MFCC / CQT / 音色嵌入 |
这四层中,前三层才是“旋律相似”的主要来源,音