speechbrain.lobes.models.discrete.dac 模块
此 lobe 支持集成预训练的离散 DAC 模型。参考: http://arxiv.org/abs/2306.06546 参考: https://descript.notion.site/Descript-Audio-Codec-11389fce0ce2419891d6591a68f814d5 参考: https://github.com/descriptinc/descript-audio-codec
- 作者
Shubham Gupta 2023
摘要
类
用于音频数据编码和解码的离散自编码器编解码器 (DAC)。 |
|
用于 DAC 解码器部分的 PyTorch 模块。 |
|
表示解码器架构中一个块的 PyTorch 模块。 |
|
用于 DAC 编码器部分的 PyTorch 模块。 |
|
用于卷积神经网络的编码器块模块。 |
|
用于卷积神经网络的残差单元模块。 |
|
在 SoundStream 中引入:一个端到端神经音频编解码器 https://arxiv.org/abs/2107.03312 |
|
实现在 1D 中 Snake 激活函数的 PyTorch 模块。 |
|
向量量化实现 |
函数
对 1D 卷积层应用权重归一化。 |
|
对 1D 转置卷积层应用权重归一化。 |
|
根据模型类型、比特率和标签下载指定的模型文件,并将其保存到本地路径。 |
|
初始化 1D 卷积层的权重。 |
参考
- speechbrain.lobes.models.discrete.dac.WNConvTranspose1d(*args, **kwargs)[source]
对 1D 转置卷积层应用权重归一化。
- speechbrain.lobes.models.discrete.dac.download(model_type: str = '44khz', model_bitrate: str = '8kbps', tag: str = 'latest', local_path: Path | None = None)[source]
根据模型类型、比特率和标签下载指定的模型文件,并将其保存到本地路径。
- 参数:
- 返回:
模型保存到的本地路径。
- 返回类型:
Path
- 引发:
ValueError – 如果模型类型或比特率不受支持,或者模型无法找到或下载。
- class speechbrain.lobes.models.discrete.dac.VectorQuantize(input_dim: int, codebook_size: int, codebook_dim: int)[source]
基类:
Module
向量量化实现
VQ 的实现,类似于 Karpathy 的 repo: https://github.com/karpathy/deep-vector-quantization 此外,还使用了 Improved VQGAN (https://arxiv.org/pdf/2110.04627.pdf) 中的以下技巧:
- 分解码:在低维空间中执行最近邻查找
以改善码本使用率
- l2 归一化码:将欧几里得距离转换为余弦相似度,这
提高了训练稳定性
- forward(z: Tensor)[source]
使用固定码本对输入张量进行量化,并返回相应的码本向量
- 参数:
z (torch.Tensor[B x D x T])
- 返回:
torch.Tensor[B x D x T] – 输入的量化连续表示
torch.Tensor[1] – 用于训练编码器以预测更接近码本条目的承诺损失(Commitment loss)
torch.Tensor[1] – 用于更新码本的码本损失(Codebook loss)
torch.Tensor[B x T] – 码本索引(输入的量化离散表示)
torch.Tensor[B x D x T] – 投影隐向量(量化前的输入连续表示)
- embed_code(embed_id: Tensor)[source]
使用码本权重嵌入 ID。
此方法利用码本权重嵌入给定的 ID。
- 参数:
embed_id (torch.Tensor) – 需要嵌入的包含 ID 的张量。
- 返回:
应用码本权重后嵌入的输出张量。
- 返回类型:
torch.Tensor
- class speechbrain.lobes.models.discrete.dac.ResidualVectorQuantize(input_dim: int = 512, n_codebooks: int = 9, codebook_size: int = 1024, codebook_dim: int | list = 8, quantizer_dropout: float = 0.0)[source]
基类:
Module
在 SoundStream 中引入:一个端到端神经音频编解码器 https://arxiv.org/abs/2107.03312
- 参数:
示例
使用预训练的 RVQ 单元。
>>> dac = DAC(load_pretrained=True, model_type="16KHz", model_bitrate="8kbps", tag="latest") >>> quantizer = dac.quantizer >>> continuous_embeddings = torch.randn(1, 1024, 20) # Example shape: [Batch, Channels, Time] >>> discrete_embeddings, codes, _, _, _ = quantizer(continuous_embeddings)
- forward(z, n_quantizers: int | None = None)[source]
使用一组固定的
n
个码本对输入张量进行量化,并返回相应的码本向量- 参数:
z (torch.Tensor) – 形状 [B x D x T]
n_quantizers (int, 可选) –
要使用的量化器数量 (n_quantizers < self.n_codebooks 例如:用于量化器 dropout)。注意:如果
self.quantizer_dropout
为 True,则忽略此参数在训练模式下,并使用随机数量的量化器。
- 返回:
z (torch.Tensor[B x D x T]) – 输入的量化连续表示
codes (torch.Tensor[B x N x T]) – 每个码本的码本索引(输入的量化离散表示)
latents (torch.Tensor[B x N*D x T]) – 投影隐向量(量化前的输入连续表示)
vq/commitment_loss (torch.Tensor[1]) – 用于训练编码器以预测更接近码本条目的承诺损失
vq/codebook_loss (torch.Tensor[1]) – 用于更新码本的码本损失
- class speechbrain.lobes.models.discrete.dac.Snake1d(channels)[source]
基类:
Module
实现在 1D 中 Snake 激活函数的 PyTorch 模块。
- 参数:
channels (int) – 输入张量中的通道数量。
- class speechbrain.lobes.models.discrete.dac.ResidualUnit(dim: int = 16, dilation: int = 1)[source]
基类:
Module
用于卷积神经网络的残差单元模块。
- class speechbrain.lobes.models.discrete.dac.EncoderBlock(dim: int = 16, stride: int = 1)[source]
基类:
Module
用于卷积神经网络的编码器块模块。
此模块构建一个编码器块,由一系列 ResidualUnits 和最终的 Snake1d 激活函数组成,后跟加权归一化 1D 卷积。此块可用作自编码器等架构中的编码器的一部分。
- class speechbrain.lobes.models.discrete.dac.Encoder(d_model: int = 64, strides: list = [2, 4, 8, 8], d_latent: int = 64)[source]
基类:
Module
用于 DAC 编码器部分的 PyTorch 模块。
- 参数:
示例
创建 Encoder 实例 >>> encoder = Encoder() >>> audio_input = torch.randn(1, 1, 16000) # 示例形状:[批量, 通道, 时间] >>> continuous_embedding = encoder(audio_input)
使用预训练的编码器。
>>> dac = DAC(load_pretrained=True, model_type="16KHz", model_bitrate="8kbps", tag="latest") >>> encoder = dac.encoder >>> audio_input = torch.randn(1, 1, 16000) # Example shape: [Batch, Channels, Time] >>> continuous_embeddings = encoder(audio_input)
- class speechbrain.lobes.models.discrete.dac.DecoderBlock(input_dim: int = 16, output_dim: int = 8, stride: int = 1)[source]
基类:
Module
表示解码器架构中一个块的 PyTorch 模块。
- 参数:
- class speechbrain.lobes.models.discrete.dac.Decoder(input_channel: int, channels: int, rates: List[int], d_out: int = 1)[source]
基类:
Module
用于 DAC 解码器部分的 PyTorch 模块。
- 参数:
示例
创建 Decoder 实例
>>> decoder = Decoder(128, 256, [8, 8, 4, 2]) >>> discrete_embeddings = torch.randn(1, 128, 20) # Example shape: [Batch, Channels, Time] >>> recovered_audio = decoder(discrete_embeddings)
使用预训练的解码器。请注意,实际输入应该是适当的离散表示。这里使用随机生成的输入是为了说明用法。
>>> dac = DAC(load_pretrained=True, model_type="16KHz", model_bitrate="8kbps", tag="latest") >>> decoder = dac.decoder >>> discrete_embeddings = torch.randn(1, 1024, 20) # Example shape: [Batch, Channels, Time] >>> recovered_audio = decoder(discrete_embeddings)
- class speechbrain.lobes.models.discrete.dac.DAC(encoder_dim: int = 64, encoder_rates: List[int] = [2, 4, 8, 8], latent_dim: int | None = None, decoder_dim: int = 1536, decoder_rates: List[int] = [8, 8, 4, 2], n_codebooks: int = 9, codebook_size: int = 1024, codebook_dim: int | list = 8, quantizer_dropout: bool = False, sample_rate: int = 44100, model_type: str = '44khz', model_bitrate: str = '8kbps', tag: str = 'latest', load_path: str | Path | None = None, strict: bool = False, load_pretrained: bool = False)[source]
基类:
Module
用于音频数据编码和解码的离散自编码器编解码器 (DAC)。
此类实现了带有量化功能的自编码器架构,用于高效处理音频。它包括编码器、量化器和解码器,用于将音频数据转换为压缩的隐向量表示并重构回音频。此实现支持初始化新模型和加载预训练模型。
- 参数:
encoder_dim (int) – 编码器的维度。
encoder_rates (List[int]) – 每个编码器层的下采样率。
latent_dim (int, 可选) – 隐向量空间的维度,如果为 None 则自动计算。
decoder_dim (int) – 解码器的维度。
decoder_rates (List[int]) – 每个解码器层的上采样率。
n_codebooks (int) – 向量量化的码本数量。
codebook_size (int) – 每个码本的大小。
quantizer_dropout (bool) – 是否在量化器中使用 dropout。
sample_rate (int) – 音频数据的采样率。
model_type (str) – 要加载的模型类型(如果已预训练)。
model_bitrate (str) – 要加载的模型的比特率(如果已预训练)。
tag (str) – 要加载的模型的特定标签(如果已预训练)。
load_path (str, 可选) – 加载预训练模型的路径,如果为 None 则自动下载。
strict (bool) – 是否严格执行状态字典匹配。
load_pretrained (bool) – 是否加载预训练模型。
示例
创建新的 DAC 实例
>>> dac = DAC() >>> audio_data = torch.randn(1, 1, 16000) # Example shape: [Batch, Channels, Time] >>> tokens, embeddings = dac(audio_data)
加载预训练的 DAC 实例
>>> dac = DAC(load_pretrained=True, model_type="16KHz", model_bitrate="8kbps", tag="latest") >>> audio_data = torch.randn(1, 1, 16000) # Example shape: [Batch, Channels, Time] >>> tokens, embeddings = dac(audio_data)
上面获得或从其他来源获得的 tokens 和离散 embeddings 可以被解码
>>> dac = DAC(load_pretrained=True, model_type="16KHz", model_bitrate="8kbps", tag="latest") >>> audio_data = torch.randn(1, 1, 16000) # Example shape: [Batch, Channels, Time] >>> tokens, embeddings = dac(audio_data) >>> decoded_audio = dac.decode(embeddings)
- encode(audio_data: Tensor, n_quantizers: int | None = None)[source]
编码给定的音频数据并返回量化隐向量码
- 参数:
audio_data (torch.Tensor[B x 1 x T]) – 要编码的音频数据
n_quantizers (int, 可选) – 要使用的量化器数量,默认为 None。如果为 None,则使用所有量化器。
- 返回:
“z” (torch.Tensor[B x D x T]) – 输入的量化连续表示
”codes” (torch.Tensor[B x N x T]) – 每个码本的码本索引(输入的量化离散表示)
”latents” (torch.Tensor[B x N*D x T]) – 投影隐向量(量化前的输入连续表示)
”vq/commitment_loss” (torch.Tensor[1]) – 用于训练编码器以预测更接近码本条目的承诺损失
”vq/codebook_loss” (torch.Tensor[1]) – 用于更新码本的码本损失
”length” (int) – 输入音频的采样数
- decode(z: Tensor)[source]
解码给定的隐向量码并返回音频数据
- 参数:
z (torch.Tensor) – 形状 [B x D x T] 输入的量化连续表示
- 返回:
torch.Tensor – 解码后的音频数据。
- 返回类型:
形状 B x 1 x length