目录
引言
Bark是由Suno AI提出的基于变换器的文本到语音模型,它包括四个主要模型:
- BarkSemanticModel(文本模型):一个因果自回归变换器模型,它接收被标记化的文本作为输入,并预测捕捉文本含义的语义文本标记。
- BarkCoarseModel(粗糙声学模型):一个因果自回归变换器,接收BarkSemanticModel模型的结果作为输入。它旨在预测EnCodec所需的前两个音频码本。
- BarkFineModel(细致声学模型):这次是一个非因果自编码变换器,它基于之前码本嵌入的总和迭代地预测最后的码本。
- 预测了所有码本通道后,Bark使用它来解码输出音频数组。
本文使用huggingface来实现他们。
使用半精度
通过以半精度加载模型,你可以简单地实现推理速度提升和50%的内存占用减少。
from transformers import BarkModel
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model = BarkModel.from_pretrained("suno/bark-small", torch_dtype=torch.float16).to(device)
使用CPU卸载
正如上文所述,Bark由4个子模型组成,这些子模型在音频生成过程中依次调用。换句话说,当一个子模型正在使用时,其他子模型处于空闲状态。
如果你使用的是CUDA设备,一个简单的方法是在子模型空闲时将其从GPU卸载到CPU,这称为CPU卸载。使用这个方法可以实现80%的内存占用减少,只需一行代码:
model.enable_cpu_offload()
注意,在使用此功能之前,需要安装Accelerate。以下是安装方法。
使用Better Transformer
Better Transformer是Optimum的一个特性,它在底层执行核融合。你可以通过导出模型到🤗 Better Transformer来获得20%到30%的速度提升,且不会降低性能。只需一行代码:
model = model.to_bettertransformer()
注意,在使用此功能之前,需要安装 Optimum。以下是安装方法。
使用Flash Attention 2
Flash Attention 2是一个更快、优化的版本,优化了之前的优化方法。
安装
首先,检查你的硬件是否与Flash Attention 2兼容。兼容硬件的最新列表可以在官方文档中找到。如果你的硬件不兼容Flash Attention 2,你仍然可以通过上述Better Transformer支持来受益于注意力核心的优化。
然后,安装最新版本的Flash Attention 2:
pip install -U flash-attn --no-build-isolation
使用
要使用Flash Attention 2加载模型,我们可以传递attn_implementation="flash_attention_2"
标志给.from_pretrained
。我们还会以半精度加载模型(例如,torch.float16),因为它几乎不会降低音频质量,但可以显著降低内存使用并加快推理速度:
model = BarkModel.from_pretrained("suno/bark-small", torch_dtype=torch.float16, attn_implementation="flash_attention_2").to(device)
组合优化技术
你可以组合优化技术,并同时使用CPU卸载、半精度和Flash Attention 2(或🤗 Better Transformer)。
from transformers import BarkModel
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载为fp16并使用Flash Attention 2
model = BarkModel.from_pretrained("suno/bark-small", torch_dtype=torch.float16, attn_implementation="flash_attention_2").to(device)
# 启用CPU卸载
model.enable_cpu_offload()
更多关于推理优化技术的信息,可以在相应的文档中找到。
使用技巧
Suno在这里提供了多种语言的声音预设库。这些预设也上传到了hub这里或那里。
from transformers import AutoProcessor, BarkModel
processor = AutoProcessor.from_pretrained("suno/bark")
model = BarkModel.from_pretrained("suno/bark")
voice_preset = "v2/en_speaker_6"
inputs = processor("Hello, my dog is cute", voice_preset=voice_preset)
audio_array = model.generate(**inputs)
audio_array = audio_array.cpu().numpy().squeeze()
Bark可以生成高度逼真的多语言语音,以及其他
from scipy.io.wavfile import write as write_wav
# 保存音频到磁盘,但首先需要从模型配置中获取采样率
sample_rate = model.generation_config.sample_rate
write_wav("bark_generation.wav", sample_rate, audio_array)
音频——包括音乐、背景噪音和简单的音效。
# 多语言语音 - 简体中文
inputs = processor("惊人的!我会说中文")
# 多语言语音 - 法语 - 我们也可以使用声音预设
inputs = processor("Incroyable! Je peux générer du son.", voice_preset="fr_speaker_5")
# Bark也可以生成音乐。你可以通过在你的歌词周围添加音乐符号来帮助它。
inputs = processor("♪ Hello, my dog is cute ♪")
audio_array = model.generate(**inputs)
audio_array = audio_array.cpu().numpy().squeeze()
模型还可以产生非言语交流,如笑声、叹息和哭声。
# 在输入文本中添加非语言提示
inputs = processor("Hello uh ... [clears throat], my dog is cute [laughter]")
audio_array = model.generate(**inputs)
audio_array = audio_array.cpu().numpy().squeeze()
要保存音频,只需从模型配置中取出采样率和一些scipy工具即可:
from scipy.io.wavfile import write as write_wav
# 保存音频到磁盘,但首先需要从模型配置中获取采样率
sample_rate = model.generation_config.sample_rate
write_wav("bark_generation.wav", sample_rate, audio_array)
BarkConfig
BarkConfig
是用于存储 BarkModel
配置的类,它定义了模型的架构,包括语义子模型、粗糙声学子模型、细致声学子模型和编解码子模型的配置。这个配置类允许你按照指定的子模型配置实例化一个 BarkModel
。通过使用默认配置实例化,将得到一个与 Suno AI 的 suno/bark
架构相似的配置。
BarkConfig
继承自 PretrainedConfig
,可以用来控制模型输出。更多信息请参阅 PretrainedConfig
的文档。
下面是如何使用这个配置类的示例:
实例化 BarkConfig
from transformers import BarkConfig, BarkSemanticConfig, BarkCoarseConfig, BarkFineConfig, AutoConfig
# 定义各子模型的配置(示例值,实际使用时应根据需要进行修改)
semantic_config =