
引言Suno 一句提示词生成带人声的完整歌曲让AI 写歌第一次真正出圈。但 AI 作曲并不是从 Suno 才开始的——从 1957 年用计算机生成的弦乐四重奏《Illiac Suite》到 MIDI 时代的规则系统再到今天的端到端音频大模型这条路走了快七十年。本文梳理两条主要技术路线符号音乐生成和端到端音频生成聊聊它们各自的原理、代表工作和工程落地的现实问题。符号音乐生成MIDI 时代的方法符号路线把音乐表示为离散事件序列音符、音高、时值、力度、和弦就像音乐界的文本。既然像文本NLP 的武器自然都能搬过来。早期方法是马尔可夫链和规则系统按统计概率接龙下一个音符生成的旋律听着像那么回事但缺乏长程结构——开头和结尾毫无呼应。深度学习阶段RNN/LSTM 一度是主力Google 的 Magenta 项目里的 Melody RNN 是经典教学案例。真正的跃升来自 TransformerMusic Transformer 用相对位置注意力捕捉乐句间的重复结构终于能生成有起承转合感的钢琴曲。后来的 MuseNet、PopMAG 等把多轨配器也纳入建模。符号生成的工程门槛不高用 pretty_midi 处理数据、拿 GPT 架构训练一个音符序列模型几百行代码就能跑import pretty_midi def midi_to_tokens(midi_path: str) - list[str]: 把 MIDI 文件转成 token 序列简化版音高时值 pm pretty_midi.PrettyMIDI(midi_path) tokens [] for note in pm.instruments[0].notes: # 取第一轨 duration round(note.end - note.start, 2) tokens.append(fNOTE_{note.pitch}_DUR_{duration}) return tokens def tokens_to_midi(tokens: list[str], out_path: str): pm pretty_midi.PrettyMIDI() inst pretty_midi.Instrument(program0) # 钢琴 t 0.0 for tok in tokens: _, pitch, _, dur tok.split(_) pitch, dur int(pitch), float(dur) inst.notes.append(pretty_midi.Note(80, pitch, t, t dur)) t dur pm.instruments.append(inst) pm.write(out_path)实际项目里 token 设计要细得多通常引入量化时间步如每拍 4/8 格、速度变化事件、和弦标记BPE 之类的方法也有人在用。端到端音频生成符号路线有个绕不过的天花板MIDI 里没有音色、没有呼吸、没有人声生成结果要过得去还得靠编曲和音源。端到端路线直接生成波形或频谱一步到位。技术演进大致是WaveNet2016用空洞卷积自回归生成波形音质惊艳但生成速度慢得离谱随后 GAN 方案MelGAN、HiFi-GAN把速度问题解决但可控性有限再往后是两条主线——音频编解码 语言模型Encodec、SoundStream 把音频压缩成离散 token然后像 GPT 一样自回归生成。MusicGen 就是这个思路结构清晰、训练稳定开源社区最爱。扩散模型Stable Audio、Udio 用扩散模型在潜空间生成音频从噪声逐步去噪出完整音轨音质和丰富度目前是天花板。Suno 的细节未公开业界普遍认为也是编解码器 生成模型的混合架构并且单独建模了人声。人声歌声是单独的一道难关。歌声合成比普通语音合成多了音高和节奏的强约束——必须卡着旋律唱VITS 系方案VITS、so-vits-svc 用于音色转换DiffSinger 用于从头合成是开源社区的主力。Suno 类产品的体验优势很大程度就来自把人声建模和伴奏生成联合训练而不是先作曲再配音。| 路线 | 代表工作 | 输出 | 优势 | 短板 | | --- | --- | --- | --- | --- | | 符号生成 | Music Transformer、PopMAG | MIDI/乐谱 | 结构可控、可编辑 | 无音色人声依赖音源 | | 自回归音频 | MusicGen、AudioLM | 波形 | 架构成熟、可流式 | 长曲目结构弱 | | 扩散音频 | Stable Audio、Udio | 波形 | 音质最高 | 推理慢、可控性仍在完善 | | 混合方案 | Suno推测 | 带人声歌曲 | 成品度最高 | 闭源、不可复现 |控制与编辑让生成听话生成一段音乐不难难的是生成我想要的那段。可控生成有几个常用抓手文本条件T5/CLAP 编码文本描述交叉注意力注入生成过程。忧郁的小调钢琴曲90 BPM这类提示词已经是标配。旋律/和弦条件哼一段旋律或者给和弦进行让模型照着展开MusicGen 的 melody conditioning。结构控制前奏-主歌-副歌的分段标记作为特殊 token或者用 Suno 式的歌词元标签[Verse][Chorus]。编辑能力inp