Bark是一种基于transformer的文本到语音模型,由Suno AI在suno-ai/bark 中提出。
Bark由4个主要模型组成:
- [
BarkSemanticModel
](也称为“文本”模型):一种因果自回归transformer模型,它以分词的文本作为输入,预测捕捉文本意义的语义文本标记。 - [
BarkCoarseModel
](也称为“粗粒度声学”模型):一种因果自回归transformer,它以[BarkSemanticModel
]模型的结果作为输入。旨在预测EnCodec所需要的前两个音频码簿。 - [
BarkFineModel
](“精细声学”模型):这次是非因果自编码器transformer,它根据先前码簿嵌入的总和迭代地预测最后的码簿。 - 在预测了来自[
EncodecModel
]的所有码簿通道之后,Bark使用它来解码输出音频数组。
应该注意的是,前三个模块中的每一个都可以支持有条件的说话者嵌入,以便根据特定的预定义语音来对输出音频进行条件处理。
可以通过几行额外的代码对Bark进行优化,从而显著减少其内存占用并加速推理。
只需将模型加载为半精度,即可将推理加速并减少内存占用约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)
Better Transformer是🤗Optimum的一种优化功能,可以在底层进行内核融合。你可以获得20%至30%的速度提升,而性能不会下降。将模型导出到🤗Better Transformer只需一行代码:
model = model.to_bettertransformer()
请注意,在使用此功能之前,必须安装🤗Optimum。点击这里了解如何安装。
如上所述,Bark由4个子模型组成,在生成音频时按顺序调用这些子模型。换句话说,当一个子模型正在使用时,其他子模型处于空闲状态。
如果你使用的是CUDA设备,可以通过将空闲子模型卸载到CPU来实现内存占用减少80%的简单解决方案。这个操作称为CPU卸载,你只需使用一行代码即可使用它。
model.enable_cpu_offload()
请注意,在使用此功能之前,必须安装🤗Accelerate。点击这里了解如何安装。
你可以结合使用优化技术,同时使用CPU卸载、半精度和🤗Better Transformer。
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)
# 转换为bettertransformer
model = BetterTransformer.transform(model, keep_original_model=False)
# 启用CPU卸载
model.enable_cpu_offload()
在此处了解更多推理优化技术here。
Suno提供了一系列多种语言的预设语音库here。 这些预设语音库也上传到了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可以生成高度逼真的、多语言的语音以及其他音频 - 包括音乐、背景噪音和简单的音效。
>>> # 多语言语音 - 简体中文
>>> 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)
此模型由Yoach Lacombe (ylacombe) 和 Sanchit Gandhi (sanchit-gandhi) 贡献。 原始代码可以在这里找到。
[[autodoc]] BarkConfig
- all
[[autodoc]] BarkProcessor
- all
- call
[[autodoc]] BarkModel
- generate
- enable_cpu_offload
[[autodoc]] BarkSemanticModel
- forward
[[autodoc]] BarkCoarseModel
- forward
[[autodoc]] BarkFineModel
- forward
[[autodoc]] BarkCausalModel
- forward
[[autodoc]] BarkCoarseConfig
- all
[[autodoc]] BarkFineConfig
- all
[[autodoc]] BarkSemanticConfig
- all