导语:哈喽,大家好。我是翊博,你在AI和数据科学领域的好朋友~~~想让 AI 学会作曲?首先需要让 AI"听懂"音乐!本文将带你全面了解音乐在 AI 世界中的 7 种表示方法,从波形到 MIDI,从频谱到 MFCC,手把手教你用 Python 实现。

为什么需要学习音乐表示?

在 AI 音乐生成领域(如 MusicGen、Suno、Udio 等),音乐表示是第一步,也是最关键的一步

想象一下:人类通过乐谱、听觉来理解音乐,但 AI 只能理解数字。如何把美妙的音乐转换成 AI 能理解的数字形式?这就是"音乐表示"要解决的问题。

本文将带你掌握 7 种核心音乐表示方法,并附上完整的 Python 代码,让你从零开始构建 AI 音乐生成的知识体系!

环境准备

首先安装必要的库:

!pip install -q librosa soundfile matplotlib numpy scipy torch torchaudio pretty_midi

核心库说明

  • librosa:音频处理的神器
  • matplotlib:可视化频谱图
  • pretty_midi:处理 MIDI 文件
  • torchaudio:PyTorch 音频处理

1. 音频波形(Waveform)—— 音乐的最原始形态

什么是波形?

波形是声音在时域上的表示,展示了振幅随时间的变化。就像你看到的声波图一样。

可视化波形

plt.figure(figsize=(12, 4))
plt.plot(y)
plt.title("时域波形 (Time Domain Waveform)")
plt.xlabel("采样点")
plt.ylabel("振幅")
plt.show()

知识点:波形是最直观的音乐表示,但对 AI 来说信息密度太低,需要进一步转换。


2. 频域分析(FFT)—— 拆解音乐的"基因"

什么是频域?

如果说时域看的是"声音随时间怎么变化",那么频域看的就是"声音由哪些频率组成"。

核心概念:FFT(快速傅里叶变换)

  • 任何复杂信号 = 多个不同频率的正弦波叠加
  • FFT 把时域信号转换到频域

通俗理解

  • 时域 = 看一首歌的"剧情发展"(随时间变化)
  • 频域 = 看一首歌的"演员阵容"(有哪些频率在"参演")

3. 声谱图(Spectrogram)—— 音乐的"照片"

为什么需要声谱图?

普通 FFT 有个致命问题:只能看整体,看不到时间变化。但音乐的频率是随时间变化的!

解决方案:STFT(短时傅里叶变换)

  • 把音频切成小段
  • 每段分别做 FFT
  • 拼起来 = 声谱图

# 计算 STFT
D = librosa.stft(y)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

# 可视化声谱图
plt.figure(figsize=(12, 4))
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title("声谱图 (Spectrogram)")
plt.xlabel("时间")
plt.ylabel("频率 (Hz)")
plt.show()

图示解读

  • 横轴:时间
  • 纵轴:频率(对数刻度)
  • 颜色深浅:该时刻该频率的能量强度

 4. Mel 频谱图(Mel Spectrogram)—— AI 最爱的表示

什么是 Mel 刻度?

关键发现:人耳对低频敏感,对高频不敏感!

Mel 刻度就是模拟人耳听觉特性的频率刻度:

  • 低频区域:拉伸(分辨率高)
  • 高频区域:压缩(分辨率低)

# 计算 Mel 频谱图
mel = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
mel_db = librosa.power_to_db(mel, ref=np.max)

# 可视化
plt.figure(figsize=(12, 4))
librosa.display.specshow(mel_db, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title("Mel 频谱图")
plt.xlabel("时间")
plt.ylabel("Mel 频率")
plt.show()

重要应用

  •  语音识别(ASR)
  •  语音合成(TTS)
  •  音乐分类
  •  说话人识别
  •  所有语音/音乐大模型的标准输入!

为什么神经网络偏爱 Mel 频谱图?
因为它更符合人耳感知,网络更容易学到有意义的特征!


5. MFCC —— 语音识别的经典特征

什么是 MFCC?

MFCC(Mel Frequency Cepstral Coefficients,Mel 频率倒谱系数)是语音识别领域最经典的特征

名字拆解

  • Mel:用人耳听觉刻度
  • Frequency:来自频域分析
  • Cepstral:倒谱(对频谱再做一次变换)
  • Coefficients:最终输出一组数字

# 提取 13 维 MFCC
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)

# 可视化
plt.figure(figsize=(12, 4))
librosa.display.specshow(mfcc, x_axis='time')
plt.title("MFCC 特征")
plt.xlabel("时间")
plt.ylabel("MFCC 系数")
plt.show()

print("MFCC 形状:", mfcc.shape)

Output:

MFCC 形状: (13, 1001)  # 13个系数 × 1001个时间帧

MFCC vs Mel 频谱图

  • Mel 频谱图:保留完整的频谱形状
  • MFCC:提取频谱的整体形状特征,数据量更小

6. MIDI 符号表示 —— 音乐的"乐谱"

什么是 MIDI?

MIDI(Musical Instrument Digital Interface)不是音频,而是演奏指令

它记录的是:

  •  音高(Pitch):哪个音?(如 C4、A4)
  • ️ 起始时间(Onset):什么时候按下的?
  •  时值(Duration):按了多久?
  •  力度(Velocity):按得多重?

# 加载 MIDI 文件
midi = pretty_midi.PrettyMIDI("657944__lilmati__skeleton-playing-piano-02.mid")

# 查看前 10 个音符
for note in midi.instruments[0].notes[:10]:
    print(f"音高: {note.pitch}, 起始: {note.start:.3f}s, 结束: {note.end:.3f}s")

解读

  • 音高 60 = 中央 C(C4)
  • 第二行:在 0.384 秒按下 E4 音,持续 0.243 秒

 7. 钢琴卷轴(Piano Roll)—— 可视化 MIDI

什么是钢琴卷轴?

钢琴卷轴是 MIDI 的二维可视化表示

  • 横轴:时间
  • 纵轴:音高(钢琴键盘)
  • 颜色/亮度:音符是否激活

钢琴卷轴的应用

  • AI 作曲模型(如 MuseNet、Music Transformer)
  • 音乐生成(Symbolic Music Generation)
  • MIDI 编辑软件的标准视图

8. MIDI 回放 —— 从符号到声音

# 将 MIDI 转换为音频
audio = midi.synthesize()

# 播放
ipd.display(ipd.Audio(audio, rate=44100))

神奇之处:虽然原始音频和 MIDI 音频的音色不同,但旋律完全一致!这就是符号表示的魅力——分离了"演奏内容"和"演奏音色"

七种音乐表示方法对比

表示方法 数据类型 信息内容 典型应用
波形 连续信号 振幅随时间变化 音频播放、基础处理
FFT 频域谱 整体频率分布 音频分析
声谱图 2D 图像 频率随时间变化 音乐可视化
Mel 频谱图 2D 图像 人耳感知频率 语音/音乐 AI 标准输入
MFCC 特征向量 频谱形状特征 语音识别
MIDI 符号序列 音符事件 AI 作曲、符号音乐生成
钢琴卷轴 2D 矩阵 音符时空分布 Music Transformer 等模型

下一步:Encodec Tokens

本文介绍的 7 种表示方法是音乐 AI 的基础。在下一章,我们将学习:

Encodec Tokens —— Meta 提出的神经音频编解码器,它能把音频压缩成离散的 token 序列,让音乐生成模型(如 MusicGen)能像处理文本一样处理音频!

敬请期待下一期:《Audio Tokenizer:让 AI 用"单词"理解音乐》

互动话题

  1. 你正在学习 AI 音乐生成的哪个方向?
  2. 对哪种音乐表示方法最感兴趣?
  3. 你用过哪些 AI 音乐生成工具(Suno、Udio、MusicGen)?

欢迎在评论区留言讨论! 👇


参考资料

  1. Librosa 官方文档:https://librosa.org/
  2. MusicLM 论文:https://google-research.github.io/seanet/musiclm/examples/
  3. MusicGen 论文:https://arxiv.org/abs/2306.05284
  4. Encodec 论文:https://arxiv.org/abs/2210.13438

最后要感谢Datawhale提供这样一次机会,还有田佳铭、王泊轩、林睿哲、刘秋杰几位老师对创作的努力和贡献,让我们继续为开源做出我们自己的贡献~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐