基本原理:

个性化音乐生成算法基于MindNLP和MusicGen模型,由MetaAl的JadeCopet等人提出。该模型能够根据文本描述或音频提示生成高质量的音乐样本。算法的核心原理分为三个阶段:

  1. 文本编码:用户输入的文本描述通过一个预训练的文本编码器模型转换成一系列隐状态表示。
  2. 音乐解码:MusicGen解码器基于这些隐状态预测离散的音频token。
  3. 音频恢复:使用音频压缩模型(如EnCodec)对音频token进行解码,恢复成音频波形。

MusicGen模型采用Transformer结构,创新之处在于使用单个stage的Transformer LM结合高效的token交织模式,避免了传统分层或上采样方法,能够生成单声道和立体声的高质量音乐。

数据集选用:

文档中提到使用了sanchit-gandhi/gtzan数据集进行音频提示生成的示例。这个数据集通常用于音乐情绪识别任务,包含了不同情绪的音乐样本。

代码实现过程:
  1. 环境配置:首先配置了MindSpore和MindNLP的版本,确保算法能够在正确的环境中运行。
  2. 模型加载:使用MusicgenForConditionalGeneration.from_pretrained方法加载预训练的MusicGen模型。
  3. 音乐生成
    • 无提示生成:通过get_unconditional_inputs获取随机输入,然后调用generate方法进行自回归生成。
    • 文本提示生成:使用AutoProcessor对文本进行预处理,然后结合文本描述生成音乐。
    • 音频提示生成:加载音频文件,使用AutoProcessor预处理,然后输入模型生成音乐。
  4. 音频处理:生成的音频样本通过scipy.io.wavfile.write保存为.wav文件,以便后续播放和分析。
  5. 批量生成:展示了如何使用不同的音频样本片段进行批量生成,并使用batch_decode去除填充的部分。
  6. 生成配置:介绍了如何检查和更新模型的生成配置,如采样模式、指导比例、生成的token数量等。
遇到的问题:

在代码实现过程中,遇到了KeyboardInterrupt错误,这通常是由于程序运行时间过长或资源不足导致的中断。此外,还有ReadTimeoutError,表明在请求数据集时超时。


 

%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14

%%capture captured_output
# 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行`!pip install mindnlp==0.3.1 jieba soundfile librosa`
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindnlp jieba soundfile librosa
# 查看当前 mindspore 版本
!pip show mindspore
from mindnlp.transformers import MusicgenForConditionalGeneration

model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
%%time
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)

audio_values = model.generate(
    **unconditional_inputs, do_sample=True, max_new_tokens=256
)
import scipy

sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write(
    "musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy()
)
from IPython.display import Audio

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
audio_length_in_s = 256 / model.config.audio_encoder.frame_rate

audio_length_in_s
%%time
from mindnlp.transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("facebook/musicgen-small")

inputs = processor(
    text=[
        "80s pop track with bassy drums and synth",
        "90s rock song with loud guitars and heavy drums",
    ],
    padding=True,
    return_tensors="ms",
)

audio_values = model.generate(
    **inputs, do_sample=True, guidance_scale=3, max_new_tokens=256
)
scipy.io.wavfile.write(
    "musicgen_out_text.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy()
)
from IPython.display import Audio

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
%%time
from datasets import load_dataset

processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]

# take the first half of the audio sample
sample["array"] = sample["array"][: len(sample["array"]) // 2]

inputs = processor(
    audio=sample["array"],
    sampling_rate=sample["sampling_rate"],
    text=["80s blues track with groovy saxophone"],
    padding=True,
    return_tensors="ms",
)

audio_values = model.generate(
    **inputs, do_sample=True, guidance_scale=3, max_new_tokens=256
)
scipy.io.wavfile.write(
    "musicgen_out_audio.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy()
)
from IPython.display import Audio

# 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
Audio(audio_values[0].asnumpy(), rate=sampling_rate)
sample = next(iter(dataset))["audio"]

# take the first quater of the audio sample
sample_1 = sample["array"][: len(sample["array"]) // 4]

# take the first half of the audio sample
sample_2 = sample["array"][: len(sample["array"]) // 2]

inputs = processor(
    audio=[sample_1, sample_2],
    sampling_rate=sample["sampling_rate"],
    text=[
        "80s blues track with groovy saxophone",
        "90s rock song with loud guitars and heavy drums",
    ],
    padding=True,
    return_tensors="ms",
)

audio_values = model.generate(
    **inputs, do_sample=True, guidance_scale=3, max_new_tokens=256
)

# post-process to remove padding from the batched audio
audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)
Audio(audio_values[0], rate=sampling_rate)
model.generation_config
# increase the guidance scale to 4.0
model.generation_config.guidance_scale = 4.0

# set the max new tokens to 256
model.generation_config.max_new_tokens = 256

# set the softmax sampling temperature to 1.5
model.generation_config.temperature = 1.5
audio_values = model.generate(**inputs)






















Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐