Skip to content

bigvgan

Reusable native BigVGAN-v2 vocoder.

Adapted from NVIDIA BigVGAN-v2 and its alias-free activation implementation. The CUDA activation kernel is intentionally excluded; FastVideo uses the portable PyTorch path for deterministic loading and parity.

Classes

fastvideo.models.audio.bigvgan.BigVGANV2

BigVGANV2(config: dict[str, Any])

Bases: Module

BigVGAN-v2 generator compatible with NVIDIA checkpoint keys.

Source code in fastvideo/models/audio/bigvgan.py
def __init__(self, config: dict[str, Any]) -> None:
    super().__init__()
    config = dict(config)
    config.pop("_class_name", None)
    config.pop("architectures", None)
    weight_norm_removed = bool(config.pop("weight_norm_removed", False))
    self.config = AttrDict(config)
    if self.config.get("use_cuda_kernel", False):
        raise ValueError("FastVideo BigVGANV2 supports only the portable PyTorch path")
    self.config["use_cuda_kernel"] = False
    self.num_kernels = len(self.config.resblock_kernel_sizes)
    self.num_upsamples = len(self.config.upsample_rates)
    self.conv_pre = weight_norm(Conv1d(self.config.num_mels, self.config.upsample_initial_channel, 7, 1, padding=3))
    if self.config.resblock == "1":
        block_class = AMPBlock1
    elif self.config.resblock == "2":
        block_class = AMPBlock2
    else:
        raise ValueError(f"Unsupported BigVGAN resblock: {self.config.resblock}")

    self.ups = nn.ModuleList()
    for index, (rate, kernel) in enumerate(
        zip(self.config.upsample_rates, self.config.upsample_kernel_sizes, strict=True)
    ):
        self.ups.append(
            nn.ModuleList(
                [
                    weight_norm(
                        ConvTranspose1d(
                            self.config.upsample_initial_channel // (2**index),
                            self.config.upsample_initial_channel // (2 ** (index + 1)),
                            kernel,
                            rate,
                            padding=(kernel - rate) // 2,
                        )
                    )
                ]
            )
        )

    self.resblocks = nn.ModuleList()
    for index in range(len(self.ups)):
        channels = self.config.upsample_initial_channel // (2 ** (index + 1))
        for kernel, dilation in zip(
            self.config.resblock_kernel_sizes, self.config.resblock_dilation_sizes, strict=True
        ):
            self.resblocks.append(
                block_class(self.config, channels, kernel, tuple(dilation), activation=self.config.activation)
            )

    channels = self.config.upsample_initial_channel // (2 ** len(self.ups))
    self.activation_post = _activation(self.config.activation, channels, self.config.snake_logscale)
    self.use_bias_at_final = self.config.get("use_bias_at_final", True)
    self.conv_post = weight_norm(Conv1d(channels, 1, 7, 1, padding=3, bias=self.use_bias_at_final))
    for upsampler in self.ups:
        upsampler.apply(init_weights)
    self.conv_post.apply(init_weights)
    self.use_tanh_at_final = self.config.get("use_tanh_at_final", True)
    if weight_norm_removed:
        self.remove_weight_norm()