0

我正在使用 fairseq 库运行示例代码以使用 VQ-Wav2Vec 代码进行特征提取,如下所示:

In [6]: import torch
   ...: from fairseq.models.wav2vec import Wav2VecModel

In [7]: cp = torch.load('wav2vec_models/checkpoint_best.pt')
   ...: model = Wav2VecModel.build_model(cp['args'], task=None)
   ...: model.load_state_dict(cp['model'])
   ...: model.eval()

In [9]: wav_input_16khz = torch.randn(1,10000)
   ...: z = model.feature_extractor(wav_input_16khz)
   ...: f, idxs = model.vector_quantizer.forward_idx(z)
   ...: print(idxs.shape, f.shape)

>>>> torch.Size([1, 60, 4]) torch.Size([1, 512, 60])

我的理解是,vq-wav2vec 每 10ms 处理一次输入语音(假设以 16K 样本/秒采样)样本,并为这 10ms 的每一个语音输出一个大小为 [512] 个样本的特征向量。因此,假设输入语音是 10000 个样本,我们应该得到 62 帧(62 * 160 = 9920 个样本)。

为什么我只看到 60 帧?

4

1 回答 1

1

来自文章 (arxiv.org/pdf/1904.05862.pdf):“编码器的输出是低频特征表示 zi ∈Z,它对 16 kHz 的大约 30 毫秒的音频进行编码,并且每 10 毫秒跨步导致表示 zi。 " => 窗口是重叠的,这就解释了为什么你少了 2 帧。事实上,我们正在以 10 毫秒的步长移动一个 30 毫秒的窗口。在您的示例中,30 ms 窗口占据 60 个不同的位置。

于 2020-06-14T20:12:30.610 回答