5.1 DiffRhythm2 歌词生成歌曲 - Colab
Introduction:
DiffRhythm2 是由 ASLP-lab 开源的歌词到歌曲(Lyrics-to-Audio)生成模型,支持输入中文/英文歌词 + 风格提示(文本或参考音频),直接生成带人声、有旋律的完整歌曲。
本教程基于 Google Colab 环境,演示如何使用 DiffRhythm2 完成:
- 仓库克隆与环境配置
- 歌词与风格输入准备
- 批量推理生成歌曲
- 音频播放与结果查看
点击直接运行 Colab:DiffRhythm2 生成音乐-Colab.ipynb
如果你没有 Colab 环境,可以阅读下文详细单元格及讲解。
📦 克隆仓库 & 安装依赖
DiffRhythm2 需要安装 Python 依赖以及语音合成工具 espeak-ng,安装过程大约需要 8 分钟。
# 克隆仓库
!git clone https://github.com/ASLP-lab/DiffRhythm2.git
%cd DiffRhythm2
# 安装系统依赖(语音工具)
!apt-get update
!apt-get install -y espeak-ng
# 安装Python依赖
!pip install -q -r requirements.txt
⚠️ 常见报错处理 如果出现以下提示:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed.
The following packages were previously imported in this runtime: [numpy,pyparsing]
You must restart the runtime in order to use newly installed versions.
📝 这里我们看一下官方仓库 example 歌词与输入配置
DiffRhythm2 通过 jsonl 文件指定歌曲信息,包括:
song_name:歌曲名lyrics:歌词文件路径-
style_prompt:风格描述(文本 或 参考音频路径) -
中文歌词文件 lyrics.txt:
[start]
[intro]
[verse]
西山
脚下的落日刺痛了我的童年
现在
回想起来却是那么美
时光在游走
我的野蛮离我越来越远
黯淡了眼神
谁来把它重新点燃
...
回想起来却是那么美
[end]
- test.jsonl 配置
{"song_name":"song1","style_prompt": "Pop, Piano, Bass, Drums, Happy", "lyrics":"example/lrc/1.lrc"}
{"style_prompt": "example/prompt/2.wav", "lyrics":"example/lrc/1.lrc"}
🤖 运行推理生成歌曲
使用官方 inference.py 脚本,通过命令行参数指定模型、输出、配置等。
# 运行推理脚本
!bash inference.sh
inference.sh 内容解析:
export PYTHONPATH=$PYTHONPATH:$PWD
espeak-ng --version
python inference.py \
--repo-id ASLP-lab/DiffRhythm2 \ # 模型 HuggingFace ID
--output-dir ./results/test \ # 输出目录
--input-jsonl ./test.jsonl \ # 输入配置文件
--cfg-strength 2.0 \ # 引导强度(越大越遵循提示)
--max-secs 210.0 \ # 最大时长(秒)
--steps 16 \ # 采样步数
--fake-stereo True # 是否生成伪立体声
运行日志会显示:
- 分词器、模型加载
- 歌词处理
- 扩散采样进度(105 step)
🔊 播放生成的歌曲
使用 IPython.display.Audio 直接在 Notebook 内播放音频。
from IPython.display import Audio
Audio("/content/DiffRhythm2/results/test/song1.mp3")
运行后即可在页面中点击播放 🎧
🧾 inference.py 核心代码分段讲解
1. 参数解析
parser = argparse.ArgumentParser()
parser.add_argument('--repo-id', type=str, default=None) # 模型ID
parser.add_argument('--output-dir', type=str, default=None) # 输出文件夹
parser.add_argument('--input-jsonl', type=str, default=None) # 输入配置
parser.add_argument('--cfg-strength', type=float, default=2.0) # 引导强度
parser.add_argument('--max-secs', type=float, default=210.0) # 最大时长
parser.add_argument('--steps', type=int, default=16) # 采样步数
parser.add_argument('--fake-stereo', type=bool, default=True) # 伪立体声
args = parser.parse_args()
2. 模型加载
# 加载 DiffRhythm2 + Mulan 风格编码器 + 歌词分词器 + 解码器
diffrhythm2, mulan, lrc_tokenizer, decoder = prepare_model(args.repo_id, device)
3. 读取 jsonl 配置
with open(input_jsonl, 'r') as f:
input_info = [json.loads(i.strip()) for i in f.readlines()]
4. 歌词预处理
# 读取歌词 → 分词 → 转为张量
with open(lyrics, 'r') as f:
lyrics = f.read()
lyrics_token = parse_lyrics(lyrics)
lyrics_token = torch.tensor(sum(lyrics_token, []), dtype=torch.long, device=device)
5. 风格提示编码(Mulan)
支持两种输入:
- 文本风格:直接编码文本
- 参考音频:读取音频 → 重采样 → 提取风格嵌入
# 文本 prompt
style_prompt_embed = mulan(texts=[style_prompt])
# 或 音频 prompt
prompt_wav, sr = torchaudio.load(style_prompt)
prompt_wav = torchaudio.functional.resample(prompt_wav, sr, 24000)
style_prompt_embed = mulan(wavs=prompt_wav)
6. 推理生成
inference(
model=diffrhythm2,
decoder=decoder,
text=lyrics_token,
style_prompt=style_prompt_embed,
duration=max_secs,
output_dir=output_dir,
song_name=song_name,
sample_steps=args.steps,
cfg_strength=cfg_strength,
fake_stereo=args.fake_stereo,
)
output_dir 中。