资讯动态

Transformers 中的 UnivNet 声码器:基于多分辨率频谱鉴别器的全带宽语音波形生成

发布时间:2026/9/9 12:32:59 来源:尧图企业网站定制
Transformers 中的 UnivNet 声码器基于多分辨率频谱鉴别器的全带宽语音波形生成【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers导读本文面向语音合成TTS与语音转换研究者、音频工程师和依赖 Transformers 生态的推理开发者系统讲解仓库中 UnivNet 的完整实现它如何以 log-mel 频谱为条件、借助随机噪声输入将声学特征实时还原为高保真语音波形即声码器角色。读完本文你将掌握UnivNet 生成器在 Transformers 中的前向流程与噪声语义、UnivNetConfig/UnivNetFeatureExtractor全部关键配置项、从原始波形到最终.wav的标准推理管线以及该实现底层的位置变量卷积LVC等源码级结构。模型概述为什么关注全带宽 mel 频谱UnivNet 由 Won Jang、Dan Lim 等人提出论文题为UnivNet: A Neural Vocoder with Multi-Resolution Spectrogram Discriminators for High-Fidelity Waveform Generation于 2021 年发表。它本质上是一个对抗生成网络GAN声码器大多数神经声码器只能使用带限band-limited的 mel 频谱而 UnivNet 采用全带宽full-bandlog-mel 频谱作为输入条件从而保留尽可能多的声学信息同时为了缓解全带宽输入下常见的频谱过平滑over-smoothing问题训练时引入了借鉴语音活动检测思想的多分辨率频谱鉴别器multi-resolution spectrogram discriminatorMRD——它使用不同参数组计算出的多组线性频谱幅度作为输入。需要特别强调的是本仓库Transformers只实现了 UnivNet 的生成器generator。该生成器把条件 log-mel 频谱与可选的噪声序列映射为语音波形推理时只需要生成器论文中用于对抗训练的鉴别器含 MRD并未在此实现。源码层面这一点体现在 modeling_univnet.py 中全部模块均为前向生成结构仅提供权重归一化相关的apply_weight_norm/remove_weight_norm辅助方法不存在任何判别网络。从模型族归属看UnivNetModel的model_type为univnet配置定义见 configuration_univnet.py 中的UnivNetConfig其类声明标注的默认参考检查点为dg845/univnet-dev。该模型于 2023-11-22 由社区贡献者 dg845 合入本仓库。一次完整的推理从原始语音到 .wav原文档给出的标准用法是先用一段真实语音做频谱重合成式演示验证声码器能把 mel 频谱还原成接近原声的波形import torch from datasets import Audio, load_dataset from scipy.io.wavfile import write from transformers import UnivNetFeatureExtractor, UnivNetModel model_id_or_path dg845/univnet-dev model UnivNetModel.from_pretrained(model_id_or_path, device_mapauto) feature_extractor UnivNetFeatureExtractor.from_pretrained(model_id_or_path) ds load_dataset(hf-internal-testing/librispeech_asr_dummy, clean, splitvalidation) # Resample the audio to the model and feature extractors sampling rate. ds ds.cast_column(audio, Audio(sampling_ratefeature_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_rateds[0][audio][sampling_rate], pad_endTrue, return_tensorspt ) 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)这段代码完整覆盖了特征提取 → 模型推理 → 后处理解码三阶段其中包含几个必须理解的关键约定重采样对齐使用dataset.cast_column将音频列按feature_extractor.sampling_rate默认 24000 Hz重采样。特征提取器会在sampling_rate与自身配置不一致时直接抛出ValueError见 feature_extraction_univnet.py 中__call__的实现。末端补静音pad_endTrue在每条波形末尾追加静音默认pad_end_length10个频谱帧即10 × hop_length个采样点。文档引用了一个 MelGAN 时代的经典 issue 来说明在波形末尾补零静音能有效降低生成音频末端的伪影artifact这也是众多 GAN 声码器推理时的通用工程技巧。batch_decode 去除补零模型输出waveforms里包含补出的静音batch_decode依据waveform_lengths原始未填充波形长度将其裁剪掉返回的是去填充后的长度不齐的 1D numpy 波形列表。输出形状推导源码验证值得展开说明的一点是输出长度为什么是输入的某个倍数。在UnivNetModel.forward中见 modeling_univnet.pyinput_features需被转置为(batch, channels, time)噪声经conv_pre后逐层通过多个UnivNetLvcBlock每个 LVC Block 内部先用ConvTranspose1d以resblock_stride_sizes[layer_id]为上采样倍数放大时间轴。默认配置resblock_stride_sizes(8, 8, 4)因此总时间放大为8 × 8 × 4 256——这正对应测试 test_modeling_univnet.py 中result.shape (batch_size, seq_length * 256)的断言也是1 秒 24000 Hz 音频 ≈ 约 94 个 mel 帧这种换算关系的来源。输入输出约定与复现性UnivNetModel.forward的完整签名来自源码 docstringinput_featuresFloatTensor条件 log-mel 频谱即特征提取器的input_features输出。noise_sequenceFloatTensor可选标准高斯噪声形状(batch_size, sequence_length, config.model_in_channels)batch 维也可省略输入会被自动unsqueeze(0)。其长度维必须与input_features一致若同时提供二者且 batch 数不匹配其中一个为 1forward 内部会自动把 batch1 的输入repeat到对方大小两者都 1 且不一致才会报错。若未提供noise_sequence模型会按(batch, seq_len, model_in_channels)形状自动torch.randn生成此时可传入generatortorch.Generator使前向过程可复现。由于torch.randn(..., generator...)是逐元素采样同一 Generator 必须新建后立即使用一次避免复用导致的不可复现。padding_mask指示填充位置的 0/1 掩码用于在输出时计算每条波形真实长度waveform_lengths padding_mask.sum(dim1)。前向返回UnivNetModelOutputdataclass包含字段waveforms(batch_size, sequence_length)的单声道波形与waveforms_lengths每条去填充后的采样点数。batch_decode(**audio)正是解包这两个字段完成裁剪。噪声到底起什么作用源码中input_features在进入残差网络前并没有与噪声直接 concat——实际的融合路径是噪声经conv_pre7×1 卷积、reflect padding映射为初始隐状态而条件频谱进入每个UnivNetLvcBlock的UnivNetKernelPredictor由频谱预测出逐位置的卷积核与偏置再施加到上采样后的噪声特征上。也就是说噪声承担波形骨架信号源频谱则通过下述位置变量卷积精细调制出语音细节。位置变量卷积LVCUnivNet 生成器的核心本实现高度复用了 LVCNet 提出的位置变量卷积思想论文LVCNet: Efficient Condition-Dependent Modeling Network for Waveform Generation这一点在源码注释中有明确引用。生成器主要由三部分堆叠构成UnivNetKernelPredictor核预测器以num_mel_bins为输入通道的 mel 频谱为输入经 5×1 输入卷积、若干UnivNetKernelPredictorResidualBlock每个为双 1D 卷积 LeakyReLU 的残差块并带 Dropout最后分裂出kernel_conv与bias_conv两条支路输出高维的局部卷积核张量与偏置张量。其张量维度设计为卷积核形状(batch, conv_layers, in, out, kernel_size, seq_len)偏置形状(batch, conv_layers, out, seq_len)——每个时间位置都拥有独立卷积核这正是位置变量的含义。UnivNetLvcBlockLVC 块先做转置卷积上采样stride 取自resblock_stride_sizes再由 KernelPredictor 生成各层卷积核/偏置依次喂给num_blocks个UnivNetLvcResidualBlock。UnivNetLvcResidualBlockLVC 残差块对输入做conv空洞卷积dilation 逐块取自resblock_dilation_sizes如[1,3,9,27]后调用location_variable_convolution。其实现用unfoldeinsum(bildsk,biokl-bolsd, hidden_states, kernel)完成局部卷积随后对输出按通道一分为二做门控激活sigmoid(前一半) × tanh(后一半)再加回残差。注意hidden_states长度必须满足in_length kernel_length * hop_size否则直接ValueError。源码中这些类的 docstring 均注明以 maum-ai/univnet 的model/lvcnet.py为蓝本移植这也解释了该实现与社区非官方 PyTorch 版权重可以直接对齐的原因论文本身没有官方代码发布。整体数据流forward为noise_sequence ──transpose── conv_pre(1D, 7) ── 逐层 UnivNetLvcBlock(隐状态频谱) ── LeakyReLU ── conv_post(1D, 7) ── tanh ──squeeze(1)── waveforms(batch, seq_len)输出前施加tanh把波形幅度约束到 (-1, 1)符合 PCM/16-bit WAV 的常规表示区间。UnivNetConfig网络架构的全部旋钮UnivNetConfig定义于 configuration_univnet.py默认值与含义对照如下参数默认值说明model_in_channels64残差网络输入通道数必须等于噪声序列最后维与特征提取器同名配置model_hidden_channels32每个残差块的隐藏通道数num_mel_bins100条件 log-mel 频谱的频带数必须与UnivNetFeatureExtractor保持一致resblock_kernel_sizes(3, 3, 3)每个残差块的卷积核尺寸元组长度即残差块个数resblock_stride_sizes(8, 8, 4)上采样转置卷积的 stride 元组各 stride 连乘给出总上采样倍数 256resblock_dilation_sizes((1,3,9,27), ×3)嵌套元组每个 LVC 残差块内的空洞卷积膨胀率序列kernel_predictor_num_blocks3核预测网络中的残差块数量kernel_predictor_hidden_channels64核预测网络各残差块的隐藏通道数kernel_predictor_conv_size3核预测网络每个 1D 卷积的核尺寸kernel_predictor_dropout0.0核预测网络残差块的 dropout 概率leaky_relu_slope0.2LeakyReLU 负半轴斜率initializer_range0.01参数初始化范围三个resblock_*元组的长度必须相等等于 LVC 块个数这一约束由配置类的validate_architecture方法在运行时校验不一致时抛出ValueError。单元测试 test_modeling_univnet.py 用model_in_channels8, num_mel_bins20等小规模配置快速构建模型做前向冒烟说明这些结构参数是完全可调的只要保证频谱维数、噪声维数与配置一致即可用自定义尺寸初始化UnivNetModel(configuration)甚至自训练。UnivNetFeatureExtractor把波形变成模型要的输入UnivNetFeatureExtractor继承自SequenceFeatureExtractor通过 STFT 从原始单声道波形中提取log-mel 滤波器组特征STFT 实现遵循 Tacotron 2 / HiFi-GAN 约定。其model_input_names [input_features, noise_sequence, padding_mask]即一次__call__默认就返回模型所需的全部三个输入。核心处理管线对应 feature_extraction_univnet.py 的实现顺序采样率校验若传入sampling_rate与self.sampling_rate不一致则抛错不传则给出警告建议始终显式传入。统一批量化并转 float32仅支持单声道高于 2 维的数组直接报错。可选末端补静音pad_endTrue时按pad_length默认 pad_end_length10× hop_length追加padding_value的静音采样。此步骤发生在通用 padding 策略之前。序列 padding/截断默认paddingTrue补到 batch 内最长、truncationTrue最大长度以max_length_s × sampling_rate默认 10 秒 × 24000 240000 采样点为上限。mel_spectrogram变换先按 MelGAN/HiFi-GAN 官方实现做reflect反射填充(n_fft - hop_length)/2再做无窗移位的 FFTpowerNone取复频谱手动拼接幅度与mel_floor注意 UnivNet 把mel_floor加在幅度平方项内与通用spectrogram的用法不同随后乘 Slaney 尺度 mel 滤波器组最后做动态范围压缩log(clip(mel, mincompression_clip_val) × compression_factor)得到 log-mel 频谱。归一化可选默认关闭按normalize_min-11.5129…与normalize_max2.3143…取自 Tacotron 2 的统计值做线性映射到 [-1, 1]。噪声生成默认开启generate_noise用标准正态采样出(spectrogram_length, model_in_channels)的噪声支持传入numpy.random.Generator复现。返回BatchFeatureattention_mask会作为padding_mask返回供模型计算waveform_lengths。__call__还提供了max_length、truncation、pad_to_multiple_of便于对齐 Tensor Cores / TPU 友好长度、do_normalize覆盖等通用控制项。已派生对象如window、mel_filters、n_fft在to_dict中不会被序列化避免冗余。小参数表默认前端配置速览参数默认值说明sampling_rate24000期望输入音频采样率Hznum_mel_bins100mel 频带数需匹配config.num_mel_binshop_length256滑窗帧移采样点数非毫秒win_length/filter_length1024窗长与 FFT 点数win_functionhann_window窗函数名torch.hann_windowfmin/fmax0.0/ 自动为sampling_rate/2mel 频率下限 / 上限centerFalse是否居中各帧max_length_s10最长输入秒数决定 padding 上限model_in_channels64生成噪声的特征通道数需匹配config.model_in_channelspad_end_length10末端补静音的频谱帧数工程细节权重归一化、检查点转换与测试验证权重归一化由于原始非官方实现训练时对全网络施加了权重归一化weight norm本仓库的所有模块类都实现了apply_weight_norm()/remove_weight_norm()。转换脚本在加载权重前调用前者以匹配原始状态字典随后调用后者移除、恢复为常规推理形态。一般而言直接从 Hub 加载的权重已处于移除 weight norm 的推理状态普通用户无需手动调用。检查点转换若希望把 maum-ai 的非官方预训练权重移植为 Transformers 格式可使用 convert_univnet.pypython src/transformers/models/univnet/convert_univnet.py \ --checkpoint_path 原始权重目录 \ --pytorch_dump_folder_path 输出目录 \ [--config_path hf config.json] \ [--push_to_hub 目标 repo id]脚本完成键名重映射kernel predictor 相关参数逐项对齐、load_state_dict、weight norm 的加入与移除以及save_pretrained可选推送到 Hub。注意该脚本仅作为离线转换工具存在使用时需先有原始检查点。测试佐证模型侧测试位于 tests/models/univnet/test_modeling_univnet.py包含标准ModelTesterMixin冒烟测试验证输出形状(batch, seq × 256)、噪声/频谱 batch 广播等由于 UnivNet 不是 Transformer、不含注意力机制测试显式跳过了 resize embeddings、attention 相关用例。特征提取侧测试位于 tests/models/univnet/test_feature_extraction_univnet.py。常见坑位与使用建议小结输入频谱的num_mel_bins、噪声通道的model_in_channels必须与模型config一致否则 kernel predictor / 首层卷积维度对不上。若不显式传noise_sequence特征提取器默认已生成好只有需要精细复现或批量复用噪声时才手动构造并注意把noise_length对齐到频谱帧数。pad_endTrue主要用来压制波形尾端的伪影输出记得用batch_decode把补的静音裁掉。采样率务必先cast_column到 24000 Hz否则特征提取器直接报错而不是静默重采样。推理放在torch.no_grad()下并切换到eval()模式即可模型属于生成器前向无需也无法在库内做判别器训练。参考实现与证据集中在 src/transformers/models/univnet/、tests/models/univnet/ 与本文档 model_doc/univnet.md需要深入调试或二次开发时可沿这些路径继续阅读。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价