wav2vec 2.0 语音特征提取器的使用方法

1 wav2vec 2.0 可以用来做什么?

很多人看完了wav2vec 2.0 不知道该怎么用,也不知道有什么用。下面将介绍怎么使用它和它到底有什么用。
用处:我们知道声音其实是个序列,那么该如何提取声音的序列特征呢?简单来说wav2vec 2.0 就是个语音信号特征提取器,基本上任何语音任务都可以用它来提取声音特征。当然也可以自己构建一些模型结构来提取声音特征,但是这个模型提供了几百上千小时语音的预训练模型岂不是更有优势,因此很多语音任务都会在前面加一个wav2vec 2.0 用于提取语音特征。
使用:wav2vec 2.0 集成在transformers 库中,直接调用,你只需要记住,拿到一个语音信号出来的结果是(batch, seq_len, 768)这个维度即可,seq_len的长度不能自己定义,而是根据具体声音信号长度而来。需要注意的是:最大语音长度限制在10s以内,采样率固定为16k。

2 代码

2.1 模型代码结构

讲那么多,不如直接看代码
首次调用,会下载相关的模型文件。

from transformers import Wav2Vec2Model, Wav2Vec2Processor
import torch
from torch import nn


class MyWav2Vec(nn.Module):
    def __init__(self):
        super(MyWav2Vec, self).__init__()
        self.processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
        self.wav2Vec = Wav2Vec2Model.from_pretrained("facebook/wav2vec2-base-960h")

    def forward(self, x):
        return self.wav2Vec(x).last_hidden_state

    def process(self, x):
        return self.processor(x, sampling_rate=16000, return_tensors="pt").input_values


from torchinfo import summary
# 假设输入时长为5s,采样率16k的信号
# 这个维度必须是1维的
input_audio = torch.randn(16000 * 5)
model = MyWav2Vec()

# 预处理 维度变为(1, input_audio.shape[0]), 增加了一个维度,声音信号长度本身没有变
input_v = model.process(input_audio)

# 输出结果为
out = model(input_v)
print(f"输入shape: {input_v.shape}, 输出shape: {out.shape}")

# 打印模型结构
summary(model, input_size=(1,10000), depth=6)

结果: 输入shape: torch.Size([1, 80000]), 输出shape: torch.Size([1, 249, 768]), 输出的seq_len = 50 * 输入时长 - 1。从而可以用于后续序列任务。

模型结构:

MyWav2Vec [1, 31, 768] –
├─Wav2Vec2Model: 1-1 [1, 31, 512] 768
│ └─Wav2Vec2FeatureEncoder: 2-1 [1, 512, 31] –
│ │ └─ModuleList: 3-1 – –
│ │ │ └─Wav2Vec2GroupNormConvLayer: 4-1 [1, 512, 1999] –
│ │ │ │ └─Conv1d: 5-1 [1, 512, 1999] 5,120
│ │ │ │ └─GroupNorm: 5-2 [1, 512, 1999] 1,024
│ │ │ │ └─GELUActivation: 5-3 [1, 512, 1999] –
│ │ │ └─Wav2Vec2NoLayerNormConvLayer: 4-2 [1, 512, 999] –
│ │ │ │ └─Conv1d: 5-4 [1, 512, 999] 786,432
│ │ │ │ └─GELUActivation: 5-5 [1, 512, 999] –
│ │ │ └─Wav2Vec2NoLayerNormConvLayer: 4-3 [1, 512, 499] –
│ │ │ │ └─Conv1d: 5-6 [1, 512, 499] 786,432
│ │ │ │ └─GELUActivation: 5-7 [1, 512, 499] –
│ │ │ └─Wav2Vec2NoLayerNormConvLayer: 4-4 [1, 512, 249] –
│ │ │ │ └─Conv1d: 5-8 [1, 512, 249] 786,432
│ │ │ │ └─GELUActivation: 5-9 [1, 512, 249] –
│ │ │ └─Wav2Vec2NoLayerNormConvLayer: 4-5 [1, 512, 124] –
│ │ │ │ └─Conv1d: 5-10 [1, 512, 124] 786,432
│ │ │ │ └─GELUActivation: 5-11 [1, 512, 124] –
│ │ │ └─Wav2Vec2NoLayerNormConvLayer: 4-6 [1, 512, 62] –
│ │ │ │ └─Conv1d: 5-12 [1, 512, 62] 524,288
│ │ │ │ └─GELUActivation: 5-13 [1, 512, 62] –
│ │ │ └─Wav2Vec2NoLayerNormConvLayer: 4-7 [1, 512, 31] –
│ │ │ │ └─Conv1d: 5-14 [1, 512, 31] 524,288
│ │ │ │ └─GELUActivation: 5-15 [1, 512, 31] –
│ └─Wav2Vec2FeatureProjection: 2-2 [1, 31, 768] –
│ │ └─LayerNorm: 3-2 [1, 31, 512] 1,024
│ │ └─Linear: 3-3 [1, 31, 768] 393,984
│ │ └─Dropout: 3-4 [1, 31, 768] –
│ └─Wav2Vec2Encoder: 2-3 [1, 31, 768] –
│ │ └─Wav2Vec2PositionalConvEmbedding: 3-5 [1, 31, 768] –
│ │ │ └─ParametrizedConv1d: 4-8 [1, 768, 32] 768
│ │ │ │ └─ModuleDict: 5-16 – –
│ │ │ │ │ └─ParametrizationList: 6-1 [768, 48, 128] 4,718,720
│ │ │ └─Wav2Vec2SamePadLayer: 4-9 [1, 768, 31] –
│ │ │ └─GELUActivation: 4-10 [1, 768, 31] –
│ │ └─LayerNorm: 3-6 [1, 31, 768] 1,536
│ │ └─Dropout: 3-7 [1, 31, 768] –
│ │ └─ModuleList: 3-8 – –
│ │ │ └─Wav2Vec2EncoderLayer: 4-11 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-17 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-2 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-3 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-4 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-5 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-18 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-19 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-20 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-6 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-7 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-8 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-9 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-10 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-21 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-12 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-22 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-11 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-12 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-13 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-14 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-23 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-24 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-25 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-15 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-16 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-17 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-18 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-19 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-26 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-13 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-27 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-20 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-21 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-22 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-23 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-28 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-29 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-30 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-24 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-25 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-26 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-27 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-28 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-31 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-14 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-32 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-29 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-30 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-31 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-32 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-33 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-34 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-35 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-33 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-34 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-35 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-36 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-37 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-36 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-15 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-37 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-38 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-39 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-40 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-41 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-38 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-39 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-40 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-42 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-43 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-44 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-45 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-46 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-41 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-16 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-42 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-47 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-48 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-49 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-50 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-43 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-44 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-45 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-51 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-52 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-53 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-54 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-55 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-46 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-17 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-47 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-56 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-57 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-58 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-59 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-48 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-49 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-50 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-60 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-61 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-62 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-63 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-64 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-51 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-18 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-52 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-65 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-66 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-67 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-68 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-53 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-54 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-55 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-69 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-70 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-71 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-72 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-73 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-56 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-19 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-57 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-74 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-75 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-76 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-77 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-58 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-59 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-60 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-78 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-79 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-80 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-81 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-82 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-61 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-20 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-62 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-83 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-84 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-85 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-86 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-63 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-64 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-65 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-87 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-88 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-89 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-90 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-91 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-66 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-21 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-67 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-92 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-93 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-94 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-95 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-68 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-69 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-70 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-96 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-97 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-98 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-99 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-100 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-71 [1, 31, 768] 1,536
│ │ │ └─Wav2Vec2EncoderLayer: 4-22 [1, 31, 768] –
│ │ │ │ └─Wav2Vec2Attention: 5-72 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-101 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-102 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-103 [1, 31, 768] 590,592
│ │ │ │ │ └─Linear: 6-104 [1, 31, 768] 590,592
│ │ │ │ └─Dropout: 5-73 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-74 [1, 31, 768] 1,536
│ │ │ │ └─Wav2Vec2FeedForward: 5-75 [1, 31, 768] –
│ │ │ │ │ └─Linear: 6-105 [1, 31, 3072] 2,362,368
│ │ │ │ │ └─GELUActivation: 6-106 [1, 31, 3072] –
│ │ │ │ │ └─Dropout: 6-107 [1, 31, 3072] –
│ │ │ │ │ └─Linear: 6-108 [1, 31, 768] 2,360,064
│ │ │ │ │ └─Dropout: 6-109 [1, 31, 768] –
│ │ │ │ └─LayerNorm: 5-76 [1, 31, 768] 1,536

2.2 主要说明

(1)Wav2Vec2Processor: 此类中不包含模型的权重,只是利用加载的文件中对数据进行了一些预处理,并不会参与训练
(2)Wav2Vec2Model:此类加载模型的权重,模型结构都在其中定义,是模型训练的主题。
(3)模型构建完成后,其输出为last_hidden_state这一层的结果,shape为(b, seq_len, 768)。seq_len = 50 * audio_len / 16k - 1,简单来说,1s钟的声音信号对应50帧结果。
(4)训练:可以在预训练模型基础上训练,也可以不在训练预训练模型,主要看自己的任务数据,与其他训练一致,没有什么差别,强烈不建议使用transformers库中自带的训练结构
(5)模型保存:正常保存,没有差别
(6)推理:也是正常推理,没有什么差别

你可能感兴趣的:(wav2vec,2.0,语音识别)