Skip to content

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]
  1. 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)

支持两种输入:

  1. 文本风格:直接编码文本
  2. 参考音频:读取音频 → 重采样 → 提取风格嵌入
# 文本 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,
)
输出为 mp3 格式,保存在 output_dir 中。