为什么 FairSeq 的 VQ-Wav2Vec 输出会丢失帧?
Why does the output from VQ-Wav2Vec from FairSeq missing frames?
我正在使用 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 每 10 毫秒处理一次输入语音(假设以 16K 样本/秒采样)样本,并为这 10 毫秒语音中的每一个输出一个大小为 [512] 个样本的特征向量。因此假设输入语音是 10000 个样本,我们应该得到 62 帧(62 * 160 = 9920 个样本)。
为什么我只看到 60 帧?
来自文章 (arxiv.org/pdf/1904.05862.pdf):"The output of the encoder is a low frequency feature representation zi ∈Z which encodes about 30 ms of 16 kHz of audio and the striding results in representations zi every 10ms." => windows 是重叠的,这解释了为什么你得到的帧少了 2 帧。
事实上,我们正在以 10 毫秒为步长移动 30 毫秒 window。在您的示例中,30 毫秒 window 占据 60 个不同的位置。
我正在使用 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 每 10 毫秒处理一次输入语音(假设以 16K 样本/秒采样)样本,并为这 10 毫秒语音中的每一个输出一个大小为 [512] 个样本的特征向量。因此假设输入语音是 10000 个样本,我们应该得到 62 帧(62 * 160 = 9920 个样本)。
为什么我只看到 60 帧?
来自文章 (arxiv.org/pdf/1904.05862.pdf):"The output of the encoder is a low frequency feature representation zi ∈Z which encodes about 30 ms of 16 kHz of audio and the striding results in representations zi every 10ms." => windows 是重叠的,这解释了为什么你得到的帧少了 2 帧。 事实上,我们正在以 10 毫秒为步长移动 30 毫秒 window。在您的示例中,30 毫秒 window 占据 60 个不同的位置。