Wav2Small: Distilling Wav2Vec2 to 72K parameters for low-resource
speech emotion recognition.
D. Kounadis-Bastian, O. Schrüfer, A. Derington, H. Wierstorf,
F. Eyben, F. Burkhardt, B.W. Schuller. 2024, arXiV Preprint
CCC MSP Podcast v1.7
Test 1
Test 2
Val
Dom
Aro
Val
Dom
Aro
0.6760566
0.6840044
0.7620181
0.4229267
0.4684658
0.4857733
HowTo
python
1import librosa
2import torch
3import types
4import torch.nn as nn
5from transformers import AutoModelForAudioClassification
6from transformers.models.wav2vec2.modeling_wav2vec2 import(Wav2Vec2Model,7 Wav2Vec2PreTrainedModel)8910signal = torch.from_numpy(11 librosa.load('test.wav', sr=16000)[0])[None,:]12device ='cpu'1314classADV(nn.Module):1516def__init__(self, config):1718super().__init__()1920 self.dense = nn.Linear(config.hidden_size, config.hidden_size)21 self.out_proj = nn.Linear(config.hidden_size, config.num_labels)2223defforward(self, x):2425 x = self.dense(x)26 x = torch.tanh(x)2728return self.out_proj(x)293031classDawn(Wav2Vec2PreTrainedModel):32r"""https://arxiv.org/abs/2203.07378"""3334def__init__(self, config):3536super().__init__(config)3738 self.wav2vec2 = Wav2Vec2Model(config)39 self.classifier = ADV(config)4041defforward(self, x):42 x -= x.mean(1, keepdim=True)43 variance =(x * x).mean(1, keepdim=True)+1e-744 x = self.wav2vec2(x / variance.sqrt())45return self.classifier(x.last_hidden_state.mean(1))464748def_forward(self, x):49'''x: (batch, audio-samples-16KHz)'''50 x =(x + self.config.mean)/ self.config.std # sgn51 x = self.ssl_model(x, attention_mask=None).last_hidden_state
52# pool53 h = self.pool_model.sap_linear(x).tanh()54 w = torch.matmul(h, self.pool_model.attention).softmax(1)55 mu =(x * w).sum(1)56 x = torch.cat(57[58 mu,59((x * x * w).sum(1)- mu * mu).clamp(min=1e-7).sqrt()60],1)61return self.ser_model(x)626364# WavLM6566base = AutoModelForAudioClassification.from_pretrained(67'3loi/SER-Odyssey-Baseline-WavLM-Multi-Attributes',68 trust_remote_code=True).to(device).eval()69base.forward = types.MethodType(_forward, base)7071# Wav2Vec27273dawn = Dawn.from_pretrained(74'audeering/wav2vec2-large-robust-12-ft-emotion-msp-dim'75).to(device).eval()767778defwav2small(x):79return.5* dawn(x)+.5* base(x)8081pred = wav2small(signal.to(device))82print(f'Arousal={pred[0,0]} '83f'Dominance={pred[0,1]} ',84f'Valence={pred[0,2]}')