当前位置:   article > 正文

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

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

AI在创造还是毁掉音乐?

简介:最近一个月,轮番上线的音乐大模型,一举将素人生产音乐的门槛降到了最低,并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后,AI产品的版权归属于谁,创意产业要如何在AI的阴影下生长,都在被更多理性的目光审视。

本文将探讨人工智能和音乐人的合作模式,讨论AI在音乐创作中的辅助作用,以及如何实现人机共同创作,包括文本提示生成和音频提示生成。

MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型(LM)的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本,相关研究成果参考论文《[Simple and Controllable Music Generation](https://arxiv.org/abs/2306.05284)》。

MusicGen模型基于Transformer结构,可以分解为三个不同的阶段:
1. 用户输入的文本描述作为输入传递给一个固定的文本编码器模型,以获得一系列隐形状态表示。
2. 训练MusicGen解码器来预测离散的隐形状态音频token。
3. 对这些音频token使用音频压缩模型(如EnCodec)进行解码,以恢复音频波形。

MusicGen直接使用谷歌的[t5-base](https://huggingface.co/t5-base)及其权重作为文本编码器模型,并使用[EnCodec 32kHz](https://huggingface.co/facebook/encodec_32khz)及其权重作为音频压缩模型。MusicGen解码器是一个语言模型架构,针对音乐生成任务从零开始进行训练。


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

具体的,导入依赖模块

  1. %%capture captured_output
  2. !pip uninstall mindspore -y
  3. !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
  4. !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindnlp==0.3.1 jieba soundfile librosa

下载模型

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

生成音乐(无提示)

  1. unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
  2. 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
  3. %%time
  4. from mindnlp.transformers import AutoProcessor
  5. processor = AutoProcessor.from_pretrained("facebook/musicgen-small", force_download=True, cache_dir="./")
  6. inputs = processor(
  7. text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
  8. padding=True,
  9. return_tensors="ms",
  10. )
  11. audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
  12. scipy.io.wavfile.write("musicgen_out_text.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
  13. from IPython.display import Audio
  14. # 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
  15. Audio(audio_values[0].asnumpy(), rate=sampling_rate)

音频提示生成

  1. %%time
  2. from datasets import load_dataset
  3. processor = AutoProcessor.from_pretrained("facebook/musicgen-small", force_download=True, cache_dir="./")
  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)
  16. scipy.io.wavfile.write("musicgen_out_audio.wav", rate=sampling_rate, data=audio_values[0, 0].asnumpy())
  17. from IPython.display import Audio
  18. # 要收听生成的音频样本,可以使用 Audio 在 notebook 进行播放
  19. Audio(audio_values[0].asnumpy(), rate=sampling_rate)
  20. sample = next(iter(dataset))["audio"]
  21. # take the first quater of the audio sample
  22. sample_1 = sample["array"][: len(sample["array"]) // 4]
  23. # take the first half of the audio sample
  24. sample_2 = sample["array"][: len(sample["array"]) // 2]
  25. inputs = processor(
  26. audio=[sample_1, sample_2],
  27. sampling_rate=sample["sampling_rate"],
  28. text=["80s blues track with groovy saxophone", "90s rock song with loud guitars and heavy drums"],
  29. padding=True,
  30. return_tensors="ms",
  31. )
  32. audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)
  33. # post-process to remove padding from the batched audio
  34. audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)
  35. Audio(audio_values[0], rate=sampling_rate)

结果

学习心得:因为有三个训练方式,无提示、文本提示和音频提示,在文本提示和音频提示时会报错Exception: expected value at line 1 column 1,研究后发现需要使用processor = AutoProcessor.from_pretrained("facebook/musicgen-small", force_download=True, cache_dir="./"),将之前的缓存替换掉,然后 cache_dir 制定了另一个缓存地址,避免和前边的加载内容有冲突。

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

闽ICP备14008679号