huggingface实现Bark模型

目录

引言

使用半精度

使用CPU卸载

使用Better Transformer

使用Flash Attention 2

安装

使用

组合优化技术

使用技巧

BarkConfig

实例化 BarkConfig

参数说明

BarkProcessor

参数

__call__ 方法

from_pretrained 方法

save_pretrained 方法

BarkModel

生成语音

示例

启用 CPU 卸载

参数

BarkSemanticModel

forward 方法

参数

BarkCoarseModel

forward 方法

参数

BarkFineModel

forward 方法

参数

BarkCausalModel

forward 方法的参数

BarkCoarseConfig

参数

示例:

BarkFineConfig

参数

示例:

BarkSemanticConfig

参数

示例:


引言

Bark是由Suno AI提出的基于变换器的文本到语音模型,它包括四个主要模型:

  1. BarkSemanticModel(文本模型):一个因果自回归变换器模型,它接收被标记化的文本作为输入,并预测捕捉文本含义的语义文本标记。
  2. BarkCoarseModel(粗糙声学模型):一个因果自回归变换器,接收BarkSemanticModel模型的结果作为输入。它旨在预测EnCodec所需的前两个音频码本。
  3. BarkFineModel(细致声学模型):这次是一个非因果自编码变换器,它基于之前码本嵌入的总和迭代地预测最后的码本。
  4. 预测了所有码本通道后,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 =
  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
雷达中的bark相位编码模型是一种用于模拟雷达信号处理中的编码方式。Bark相位编码模型是基于霍夫曼编码原理设计的,主要用于对宽带信号进行相位编码,以提高信号处理的效率和减少信息传输的带宽需求。 Bark相位编码模型的仿真主要包括以下几个步骤: 1. 信号预处理:将输入的宽带信号进行预处理,包括滤波、降噪等操作,以提高编码过程的准确性。 2. 频谱分析:对预处理后的信号进行频谱分析,得到信号的频谱特征,为后续编码过程提供依据。 3. 相位计算:根据频谱特征,计算每个频率点的相位信息,用于后续的编码操作。 4. 相位编码:根据相位信息,采用Bark编码的方法对信号进行编码,将其转化为二进制序列。 5. 信号恢复:将编码后的信号进行解码,根据Bark编码的规则,恢复为原始的相位信息。 仿真过程中需要注意的是,要选择合适的信号预处理方法和编码算法,并进行合理的参数设置,以获得准确且高效的编码结果。此外,在仿真过程中还需要进行信号质量评估,比如误码率分析等,以评价编码方案的性能。 总之,雷达中的Bark相位编码模型是一种能够提高信号处理效率和减少信息传输带宽需求的编码方式。通过仿真模拟,可以对该编码模型的性能进行评估和优化,为实际雷达信号处理系统的设计和应用提供参考依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

E寻数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值