赞
踩
简介:最近一个月,轮番上线的音乐大模型,一举将素人生产音乐的门槛降到了最低,并掀起了音乐圈会不会被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不仅能够生成符合文本描述的音乐,还能够通过旋律条件控制生成的音调结构。
具体的,导入依赖模块
- %%capture captured_output
- !pip uninstall mindspore -y
- !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
- !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindnlp==0.3.1 jieba soundfile librosa
下载模型
- from mindnlp.transformers import MusicgenForConditionalGeneration
-
- model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
生成音乐(无提示)
- 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", force_download=True, cache_dir="./")
-
- 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", force_download=True, cache_dir="./")
- 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)

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