UnivNet
概述
UnivNet模型由Won Jang、Dan Lim、Jaesam Yoon、Bongwan Kin和Juntae Kim在UnivNet: A Neural Vocoder with Multi-Resolution Spectrogram Discriminators for High-Fidelity Waveform Generation中提出。
UnivNet模型是一种生成对抗网络(GAN),经过训练可以合成高保真语音波形。在transformers
中共享的UnivNet模型是生成器,它将条件对数梅尔频谱图和可选的噪声序列映射到语音波形(例如声码器)。推理时只需要生成器。用于训练generator
的判别器未实现。
论文的摘要如下:
大多数神经声码器使用带限的梅尔频谱图来生成波形。如果使用全频带频谱特征作为输入,声码器可以获得尽可能多的声学信息。然而,在一些使用全频带梅尔频谱图的模型中,会出现过度平滑的问题,导致生成的频谱图不够锐利。为了解决这个问题,我们提出了UnivNet,一种能够实时合成高保真波形的神经声码器。受语音活动检测领域工作的启发,我们添加了一个多分辨率频谱图判别器,该判别器使用多种参数集计算的多个线性频谱图幅度。通过使用全频带梅尔频谱图作为输入,我们期望通过添加一个使用多分辨率频谱图作为输入的判别器来生成高分辨率信号。在一个包含数百名说话者信息的数据集上的评估中,UnivNet在可见和未见说话者的竞争模型中获得了最佳的目标和主观结果。这些结果,包括文本到语音的最佳主观评分,展示了快速适应新说话者的潜力,而无需从头开始训练。
提示:
- UnivNetModel.forward() 的
noise_sequence
参数应为标准高斯噪声(例如来自torch.randn
),形状为([batch_size], noise_length, model.config.model_in_channels)
,其中noise_length
应与input_features
参数的长度维度(维度 1)匹配。如果未提供,它将随机生成;可以向generator
参数提供torch.Generator
,以便可以重现前向传递。(请注意,UnivNetFeatureExtractor 默认会返回生成的噪声,因此通常不需要手动生成noise_sequence
。) - 由UnivNetFeatureExtractor添加的填充可以通过
UnivNetFeatureExtractor.batch_decode()
方法从UnivNetModel输出中移除,如下面的使用示例所示。 - 在每个波形的末尾填充静音可以减少生成音频样本末尾的伪影。这可以通过向UnivNetFeatureExtractor.call()提供
pad_end = True
来实现。更多详情请参见此问题。
使用示例:
import torch
from scipy.io.wavfile import write
from datasets import Audio, load_dataset
from transformers import UnivNetFeatureExtractor, UnivNetModel
model_id_or_path = "dg845/univnet-dev"
model = UnivNetModel.from_pretrained(model_id_or_path)
feature_extractor = UnivNetFeatureExtractor.from_pretrained(model_id_or_path)
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
# Resample the audio to the model and feature extractor's sampling rate.
ds = ds.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
# Pad the end of the converted waveforms to reduce artifacts at the end of the output audio samples.
inputs = feature_extractor(
ds[0]["audio"]["array"], sampling_rate=ds[0]["audio"]["sampling_rate"], pad_end=True, return_tensors="pt"
)
with torch.no_grad():
audio = model(**inputs)
# Remove the extra padding at the end of the output.
audio = feature_extractor.batch_decode(**audio)[0]
# Convert to wav file
write("sample_audio.wav", feature_extractor.sampling_rate, audio)
该模型由dg845贡献。 据我所知,没有官方的代码发布,但可以在maum-ai/univnet找到一个非官方的实现,预训练的检查点可以在这里找到。
UnivNetConfig
类 transformers.UnivNetConfig
< source >( model_in_channels = 64 model_hidden_channels = 32 num_mel_bins = 100 resblock_kernel_sizes = [3, 3, 3] resblock_stride_sizes = [8, 8, 4] resblock_dilation_sizes = [[1, 3, 9, 27], [1, 3, 9, 27], [1, 3, 9, 27]] kernel_predictor_num_blocks = 3 kernel_predictor_hidden_channels = 64 kernel_predictor_conv_size = 3 kernel_predictor_dropout = 0.0 initializer_range = 0.01 leaky_relu_slope = 0.2 **kwargs )
参数
- model_in_channels (
int
, 可选, 默认为 64) — UnivNet 残差网络的输入通道数。这应该对应于noise_sequence.shape[1]
和在 UnivNetFeatureExtractor 类中使用的值。 - model_hidden_channels (
int
, optional, defaults to 32) — UnivNet残差网络中每个残差块的隐藏通道数。 - num_mel_bins (
int
, 可选, 默认为 100) — 条件对数梅尔频谱图中的频率分箱数量。这应该与UnivNetFeatureExtractor类中使用的值相对应。 - resblock_kernel_sizes (
Tuple[int]
或List[int]
, 可选, 默认为[3, 3, 3]
) — 一个整数元组,定义了UnivNet残差网络中1D卷积层的核大小。resblock_kernel_sizes
的长度定义了resnet块的数量,并且应该与resblock_stride_sizes
和resblock_dilation_sizes
的长度匹配。 - resblock_stride_sizes (
Tuple[int]
或List[int]
, 可选, 默认为[8, 8, 4]
) — 一个整数元组,定义了UnivNet残差网络中1D卷积层的步幅大小。resblock_stride_sizes
的长度应与resblock_kernel_sizes
和resblock_dilation_sizes
的长度相匹配。 - resblock_dilation_sizes (
Tuple[Tuple[int]]
或List[List[int]]
, 可选, 默认为[[1, 3, 9, 27], [1, 3, 9, 27], [1, 3, 9, 27]]
) — 一个嵌套的整数元组,定义了UnivNet残差网络中扩张1D卷积层的扩张率。resblock_dilation_sizes
的长度应与resblock_kernel_sizes
和resblock_stride_sizes
的长度相匹配。resblock_dilation_sizes
中每个嵌套列表的长度定义了每个resnet块中的卷积层数。 - kernel_predictor_num_blocks (
int
, 可选, 默认为 3) — 内核预测器网络中的残差块数量,该网络计算UnivNet残差网络中每个位置变量卷积层的内核和偏置。 - kernel_predictor_hidden_channels (
int
, optional, defaults to 64) — 内核预测器网络中每个残差块的隐藏通道数。 - kernel_predictor_conv_size (
int
, optional, 默认为 3) — 内核预测网络中每个1D卷积层的内核大小。 - kernel_predictor_dropout (
float
, optional, defaults to 0.0) — 内核预测器网络中每个残差块的丢弃概率。 - initializer_range (
float
, optional, 默认为 0.01) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - leaky_relu_slope (
float
, optional, defaults to 0.2) — 用于Leaky ReLU激活的负斜率角度。
这是用于存储UnivNetModel配置的配置类。它用于根据指定的参数实例化一个UnivNet声码器模型,定义模型架构。使用默认值实例化配置将产生与UnivNet dg845/univnet-dev架构相似的配置,该架构对应于maum-ai/univnet中的‘c32’架构。
配置对象继承自PretrainedConfig,可用于控制模型输出。阅读PretrainedConfig的文档以获取更多信息。
示例:
>>> from transformers import UnivNetModel, UnivNetConfig
>>> # Initializing a Tortoise TTS style configuration
>>> configuration = UnivNetConfig()
>>> # Initializing a model (with random weights) from the Tortoise TTS style configuration
>>> model = UnivNetModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
UnivNetFeatureExtractor
类 transformers.UnivNetFeatureExtractor
< source >( feature_size: int = 1 sampling_rate: int = 24000 padding_value: float = 0.0 do_normalize: bool = False num_mel_bins: int = 100 hop_length: int = 256 win_length: int = 1024 win_function: str = 'hann_window' filter_length: typing.Optional[int] = 1024 max_length_s: int = 10 fmin: float = 0.0 fmax: typing.Optional[float] = None mel_floor: float = 1e-09 center: bool = False compression_factor: float = 1.0 compression_clip_val: float = 1e-05 normalize_min: float = -11.512925148010254 normalize_max: float = 2.3143386840820312 model_in_channels: int = 64 pad_end_length: int = 10 return_attention_mask = True **kwargs )
参数
- feature_size (
int
, optional, defaults to 1) — 提取的特征的特征维度。 - sampling_rate (
int
, optional, defaults to 24000) — 音频文件应被数字化的采样率,以赫兹(Hz)表示。 - padding_value (
float
, 可选, 默认为 0.0) — 当应用由padding
参数定义的填充策略时,用于填充的值。应对应于音频静音。__call__
的pad_end
参数也将使用此填充值。 - do_normalize (
bool
, 可选, 默认为False
) — 是否对输入执行 Tacotron 2 标准化。标准化可以显著提高某些模型的性能。 - num_mel_bins (
int
, 可选, 默认为 100) — 提取的频谱图特征中的梅尔频率分箱数量。这应该与UnivNetModel.config.num_mel_bins
匹配。 - hop_length (
int
, 可选, 默认为 256) — 滑动窗口之间的直接样本数。在许多论文中也被称为“shift”。请注意,这与其他音频特征提取器(如 SpeechT5FeatureExtractor)不同,后者以毫秒为单位获取hop_length
。 - win_length (
int
, 可选, 默认为 1024) — 每个滑动窗口的直接样本数。请注意,这与其他音频特征提取器(如 SpeechT5FeatureExtractor)不同,后者以毫秒为单位获取win_length
。 - win_function (
str
, 可选, 默认为"hann_window"
) — 用于窗口化的窗口函数名称,必须可以通过torch.{win_function}
访问 - filter_length (
int
, 可选, 默认为 1024) — 使用的FFT组件数量。如果为None
,则使用transformers.audio_utils.optimal_fft_length
确定。 - max_length_s (
int
, optional, 默认为 10) — 模型的最大输入长度,以秒为单位。这用于填充音频。 - fmin (
float
, optional, defaults to 0.0) — 最小梅尔频率,单位为Hz. - fmax (
float
, 可选) — 最大梅尔频率,单位为Hz。如果未设置,默认值为sampling_rate / 2
. - mel_floor (
float
, 可选, 默认值为 1e-09) — 梅尔频率库的最小值。请注意,UnivNetFeatureExtractor 使用mel_floor
的方式与 transformers.audio_utils.spectrogram() 中的方式不同。 - center (
bool
, 可选, 默认为False
) — 是否对波形进行填充,使得帧t
在时间t * hop_length
周围居中。如果为False
,帧t
将在时间t * hop_length
开始。 - compression_factor (
float
, optional, 默认为 1.0) — 在频谱归一化过程中用于动态范围压缩的乘法压缩因子。 - compression_clip_val (
float
, optional, 默认为 1e-05) — 在频谱归一化期间应用动态范围压缩之前,应用于波形的裁剪值。 - normalize_min (
float
, 可选, 默认值为 -11.512925148010254) — 用于 Tacotron 2 风格线性归一化的最小值。默认值是 Tacotron 2 实现中的原始值。 - normalize_max (
float
, 可选, 默认为 2.3143386840820312) — 用于 Tacotron 2 风格线性归一化的最大值。默认值是 Tacotron 2 实现中的原始值。 - model_in_channels (
int
, 可选, 默认为 64) — UnivNetModel 模型的输入通道数。这应该与UnivNetModel.config.model_in_channels
匹配。 - pad_end_length (
int
, 可选, 默认为 10) — 如果对每个波形的末尾进行填充,则要附加的频谱图帧的样本数量。附加的样本数量将为pad_end_length * hop_length
. - return_attention_mask (
bool
, 可选, 默认为True
) — 是否 call() 应该返回attention_mask
.
构建一个UnivNet特征提取器。
该类使用短时傅里叶变换(STFT)从原始语音中提取对数梅尔滤波器组特征。STFT的实现遵循TacoTron 2和Hifi-GAN的实现。
此特征提取器继承自SequenceFeatureExtractor,其中包含 大部分主要方法。用户应参考此超类以获取有关这些方法的更多信息。
__call__
< source >( raw_speech: typing.Union[numpy.ndarray, typing.List[float], typing.List[numpy.ndarray], typing.List[typing.List[float]]] sampling_rate: typing.Optional[int] = None padding: typing.Union[bool, str, transformers.utils.generic.PaddingStrategy] = True max_length: typing.Optional[int] = None truncation: bool = True pad_to_multiple_of: typing.Optional[int] = None return_noise: bool = True generator: typing.Optional[numpy.random._generator.Generator] = None pad_end: bool = False pad_length: typing.Optional[int] = None do_normalize: typing.Optional[str] = None return_attention_mask: typing.Optional[bool] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None )
参数
- raw_speech (
np.ndarray
,List[float]
,List[np.ndarray]
,List[List[float]]
) — 要填充的序列或序列批次。每个序列可以是一个numpy数组、一个浮点值列表、一个numpy数组列表或一个浮点值列表的列表。必须是单声道音频,而不是立体声,即每个时间步长只有一个浮点数。 - sampling_rate (
int
, optional) —raw_speech
输入被采样的采样率。强烈建议在前向调用时传递sampling_rate
以防止静默错误并允许自动语音识别 管道。 - padding (
bool
,str
or PaddingStrategy, optional, defaults toTrue
) — Select a strategy to pad the inputraw_speech
waveforms (according to the model’s padding side and padding index) among:True
or'longest'
: Pad to the longest sequence in the batch (or no padding if only a single sequence if provided).'max_length'
: Pad to a maximum length specified with the argumentmax_length
or to the maximum acceptable input length for the model if that argument is not provided.False
or'do_not_pad'
(default): No padding (i.e., can output a batch with sequences of different lengths).
如果
pad_end = True
,填充将在应用padding
策略之前发生。 - max_length (
int
, optional) — 返回列表的最大长度以及可选的填充长度(见上文)。 - 截断 (
bool
, 可选, 默认为True
) — 激活截断功能,将超过max_length
的输入序列截断至max_length
. - pad_to_multiple_of (
int
, optional) — If set will pad the sequence to a multiple of the provided value.这对于在计算能力
>= 7.5
(Volta)的NVIDIA硬件上启用Tensor Cores特别有用,或者对于TPUs来说,序列长度为128的倍数是有益的。 - return_noise (
bool
, 可选, 默认为True
) — 是否生成并返回用于UnivNetModel.forward()的噪声波形。 - generator (
numpy.random.Generator
, optional, defaults toNone
) — 一个可选的numpy.random.Generator
随机数生成器,用于生成噪声时使用。 - pad_end (
bool
, 可选, 默认为False
) — 是否在每个波形的末尾填充静音。这有助于减少生成音频样本末尾的伪影;更多详情请参见 https://github.com/seungwonpark/melgan/issues/8。此填充将在执行padding
中指定的填充策略之前完成。 - pad_length (
int
, 可选, 默认为None
) — 如果对每个波形的末尾进行填充,填充的长度以频谱图帧为单位。如果未设置,将默认为self.config.pad_end_length
. - do_normalize (
bool
, optional) — 是否对输入执行 Tacotron 2 标准化。标准化可以显著提高某些模型的性能。如果未设置,将默认为self.config.do_normalize
. - return_attention_mask (
bool
, optional) — Whether to return the attention mask. If left to the default, will return the attention mask according to the specific feature_extractor’s default. - return_tensors (
str
或 TensorType, 可选) — 如果设置,将返回张量而不是Python整数列表。可接受的值有:'tf'
: 返回 TensorFlowtf.constant
对象。'pt'
: 返回 PyTorchtorch.np.array
对象。'np'
: 返回 Numpynp.ndarray
对象。
用于特征化并为一个或多个序列准备模型的主要方法。
UnivNetModel
类 transformers.UnivNetModel
< source >( config: UnivNetConfig )
参数
- config (UnivNetConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
UnivNet GAN 声码器。 该模型继承自 PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入的大小、修剪头部等)。
该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
前进
< source >( input_features: FloatTensor noise_sequence: typing.Optional[torch.FloatTensor] = None padding_mask: typing.Optional[torch.FloatTensor] = None generator: typing.Optional[torch._C.Generator] = None return_dict: typing.Optional[bool] = None ) → transformers.models.univnet.modeling_univnet.UnivNetModelOutput
或 tuple(torch.FloatTensor)
参数
- input_features (
torch.FloatTensor
) — 包含对数梅尔频谱图的张量。可以是批量的,形状为(batch_size, sequence_length, config.num_mel_channels)
,也可以是非批量的,形状为(sequence_length, config.num_mel_channels)
. - noise_sequence (
torch.FloatTensor
, 可选) — 包含标准高斯噪声序列的张量。可以是批量的,形状为(batch_size, sequence_length, config.model_in_channels)
,或者非批量的,形状为 (sequence_length, config.model_in_channels)`。如果未提供,将随机生成。 - padding_mask (
torch.BoolTensor
, optional) — Mask indicating which parts of each sequence are padded. Mask values are selected in[0, 1]
:- 1 for tokens that are not masked
- 0 for tokens that are masked
掩码可以是批量的,形状为
(batch_size, sequence_length)
,也可以是非批量的,形状为(sequence_length,)
。 - 生成器 (
torch.Generator
, 可选) — 一个 torch 生成器 用于使生成过程 具有确定性。 - return_dict — 是否返回一个ModelOutput子类而不是一个普通的元组。
返回
transformers.models.univnet.modeling_univnet.UnivNetModelOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.univnet.modeling_univnet.UnivNetModelOutput
或一个由
torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含各种
元素,具体取决于配置(UnivNetConfig)和输入。
- waveforms (
torch.FloatTensor
形状为(batch_size, sequence_length)
) — 批处理的1D(单声道)输出音频波形。 - waveform_lengths (
torch.FloatTensor
形状为(batch_size,)
) — 每个未填充波形在waveforms
中的样本长度。
UnivNetModel 的 forward 方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
将噪声波形和条件频谱图转换为语音波形。传递一批对数梅尔频谱图将返回一批语音波形。传递单个未批处理的对数梅尔频谱图将返回单个未批处理的语音波形。
示例:
>>> from transformers import UnivNetFeatureExtractor, UnivNetModel
>>> from datasets import load_dataset, Audio
>>> model = UnivNetModel.from_pretrained("dg845/univnet-dev")
>>> feature_extractor = UnivNetFeatureExtractor.from_pretrained("dg845/univnet-dev")
>>> ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> # Resample the audio to the feature extractor's sampling rate.
>>> ds = ds.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
>>> inputs = feature_extractor(
... ds[0]["audio"]["array"], sampling_rate=ds[0]["audio"]["sampling_rate"], return_tensors="pt"
... )
>>> audio = model(**inputs).waveforms
>>> list(audio.shape)
[1, 140288]