当前位置:   article > 正文

昇思25天学习打卡营第11天|基于MindNLP+MusicGen生成自己的个性化音乐

昇思25天学习打卡营第11天|基于MindNLP+MusicGen生成自己的个性化音乐

MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:

1. 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示

2. 训练MusicGen解码器来预测离散的隐形状态音频token

3. 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形

MusicGen 模型的新颖之处在于音频代码的预测方式。传统上,每个码本都必须由一个单独的模型(即分层)或通过不断优化 Transformer 模型的输出(即上采样)进行预测。与传统方法不同,MusicGen采用单个stage的Transformer LM结合高效的token交织模式,取消了多层级的多个模型结构,例如分层或上采样,这使得MusicGen能够生成单声道和立体声的高质量音乐样本,同时提供更好的生成输出控制。MusicGen不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。

下载模型

MusicGen提供了small、medium和big三种规格的预训练文件,本文采用small规格的权重

  1. from mindnlp.transformers import MusicgenForConditionalGeneration
  2. model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

生成音乐

MusicGen支持两种生成模式:贪心(greedy)和采样(sampling)。在实际执行过程中,采样模式得到的结果要显著优于贪心模式。

无提示生成

  1. %%time
  2. unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
  3. audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)
  1. import scipy
  2. sampling_rate = model.config.audio_encoder.sampling_rate
  3. scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
  1. from IPython.display import Audio
  2. # 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
  3. Audio(audio_values[0].asnumpy(), rate=sampling_rate)
  1. audio_length_in_s = 256 / model.config.audio_encoder.frame_rate
  2. audio_length_in_s

文本提示生成

  1. %%time
  2. from mindnlp.transformers import AutoProcessor
  3. processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
  4. inputs = processor(
  5. text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
  6. padding=True,
  7. return_tensors="ms",
  8. )
  9. 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())
  1. from IPython.display import Audio
  2. # 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
  3. Audio(audio_values[0].asnumpy(), rate=sampling_rate)

音频提示生成

  1. %%time
  2. from datasets import load_dataset
  3. processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
  4. dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
  5. sample = next(iter(dataset))["audio"]
  6. # take the first half of the audio sample
  7. sample["array"] = sample["array"][: len(sample["array"]) // 2]
  8. inputs = processor(
  9. audio=sample["array"],
  10. sampling_rate=sample["sampling_rate"],
  11. text=["80s blues track with groovy saxophone"],
  12. padding=True,
  13. return_tensors="ms",
  14. )
  15. 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())
  1. from IPython.display import Audio
  2. # 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
  3. Audio(audio_values[0].asnumpy(), rate=sampling_rate)

要恢复最终音频样本,可以对生成的audio_values进行后处理,以再次使用处理器类删除填充:

  1. sample = next(iter(dataset))["audio"]
  2. # take the first quater of the audio sample
  3. sample_1 = sample["array"][: len(sample["array"]) // 4]
  4. # take the first half of the audio sample
  5. sample_2 = sample["array"][: len(sample["array"]) // 2]
  6. inputs = processor(
  7. audio=[sample_1, sample_2],
  8. sampling_rate=sample["sampling_rate"],
  9. text=["80s blues track with groovy saxophone", "90s rock song with loud guitars and heavy drums"],
  10. padding=True,
  11. return_tensors="ms",
  12. )
  13. audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
  14. # post-process to remove padding from the batched audio
  15. audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)
Audio(audio_values[0], rate=sampling_rate)

生成配置

控制生成过程的默认参数(例如采样、指导比例和生成的令牌数量)可以在模型的生成配置中找到,并根据需要进行更新。首先检查默认的生成配置:

  1. model.generation_config
  2. # increase the guidance scale to 4.0
  3. model.generation_config.guidance_scale = 4.0
  4. # set the max new tokens to 256
  5. model.generation_config.max_new_tokens = 256
  6. # set the softmax sampling temperature to 1.5
  7. model.generation_config.temperature = 1.5

重新运行生成将使用生成配置中新定义的值

audio_values = model.generate(**inputs)

总结

 本文将MindNLP和MusicGen模型结合,用于生成音乐

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/788203
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&