Ninjatabbycat commited on
Commit
32f2f63
·
verified ·
1 Parent(s): 9b01638

Upload PretrainedAudioMAEEncoder

Browse files
Files changed (4) hide show
  1. README.md +199 -0
  2. config.json +18 -0
  3. model.py +147 -0
  4. model.safetensors +3 -0
README.md ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: transformers
3
+ tags: []
4
+ ---
5
+
6
+ # Model Card for Model ID
7
+
8
+ <!-- Provide a quick summary of what the model is/does. -->
9
+
10
+
11
+
12
+ ## Model Details
13
+
14
+ ### Model Description
15
+
16
+ <!-- Provide a longer summary of what this model is. -->
17
+
18
+ This is the model card of a 🤗 transformers model that has been pushed on the Hub. This model card has been automatically generated.
19
+
20
+ - **Developed by:** [More Information Needed]
21
+ - **Funded by [optional]:** [More Information Needed]
22
+ - **Shared by [optional]:** [More Information Needed]
23
+ - **Model type:** [More Information Needed]
24
+ - **Language(s) (NLP):** [More Information Needed]
25
+ - **License:** [More Information Needed]
26
+ - **Finetuned from model [optional]:** [More Information Needed]
27
+
28
+ ### Model Sources [optional]
29
+
30
+ <!-- Provide the basic links for the model. -->
31
+
32
+ - **Repository:** [More Information Needed]
33
+ - **Paper [optional]:** [More Information Needed]
34
+ - **Demo [optional]:** [More Information Needed]
35
+
36
+ ## Uses
37
+
38
+ <!-- Address questions around how the model is intended to be used, including the foreseeable users of the model and those affected by the model. -->
39
+
40
+ ### Direct Use
41
+
42
+ <!-- This section is for the model use without fine-tuning or plugging into a larger ecosystem/app. -->
43
+
44
+ [More Information Needed]
45
+
46
+ ### Downstream Use [optional]
47
+
48
+ <!-- This section is for the model use when fine-tuned for a task, or when plugged into a larger ecosystem/app -->
49
+
50
+ [More Information Needed]
51
+
52
+ ### Out-of-Scope Use
53
+
54
+ <!-- This section addresses misuse, malicious use, and uses that the model will not work well for. -->
55
+
56
+ [More Information Needed]
57
+
58
+ ## Bias, Risks, and Limitations
59
+
60
+ <!-- This section is meant to convey both technical and sociotechnical limitations. -->
61
+
62
+ [More Information Needed]
63
+
64
+ ### Recommendations
65
+
66
+ <!-- This section is meant to convey recommendations with respect to the bias, risk, and technical limitations. -->
67
+
68
+ Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. More information needed for further recommendations.
69
+
70
+ ## How to Get Started with the Model
71
+
72
+ Use the code below to get started with the model.
73
+
74
+ [More Information Needed]
75
+
76
+ ## Training Details
77
+
78
+ ### Training Data
79
+
80
+ <!-- This should link to a Dataset Card, perhaps with a short stub of information on what the training data is all about as well as documentation related to data pre-processing or additional filtering. -->
81
+
82
+ [More Information Needed]
83
+
84
+ ### Training Procedure
85
+
86
+ <!-- This relates heavily to the Technical Specifications. Content here should link to that section when it is relevant to the training procedure. -->
87
+
88
+ #### Preprocessing [optional]
89
+
90
+ [More Information Needed]
91
+
92
+
93
+ #### Training Hyperparameters
94
+
95
+ - **Training regime:** [More Information Needed] <!--fp32, fp16 mixed precision, bf16 mixed precision, bf16 non-mixed precision, fp16 non-mixed precision, fp8 mixed precision -->
96
+
97
+ #### Speeds, Sizes, Times [optional]
98
+
99
+ <!-- This section provides information about throughput, start/end time, checkpoint size if relevant, etc. -->
100
+
101
+ [More Information Needed]
102
+
103
+ ## Evaluation
104
+
105
+ <!-- This section describes the evaluation protocols and provides the results. -->
106
+
107
+ ### Testing Data, Factors & Metrics
108
+
109
+ #### Testing Data
110
+
111
+ <!-- This should link to a Dataset Card if possible. -->
112
+
113
+ [More Information Needed]
114
+
115
+ #### Factors
116
+
117
+ <!-- These are the things the evaluation is disaggregating by, e.g., subpopulations or domains. -->
118
+
119
+ [More Information Needed]
120
+
121
+ #### Metrics
122
+
123
+ <!-- These are the evaluation metrics being used, ideally with a description of why. -->
124
+
125
+ [More Information Needed]
126
+
127
+ ### Results
128
+
129
+ [More Information Needed]
130
+
131
+ #### Summary
132
+
133
+
134
+
135
+ ## Model Examination [optional]
136
+
137
+ <!-- Relevant interpretability work for the model goes here -->
138
+
139
+ [More Information Needed]
140
+
141
+ ## Environmental Impact
142
+
143
+ <!-- Total emissions (in grams of CO2eq) and additional considerations, such as electricity usage, go here. Edit the suggested text below accordingly -->
144
+
145
+ Carbon emissions can be estimated using the [Machine Learning Impact calculator](https://mlco2.github.io/impact#compute) presented in [Lacoste et al. (2019)](https://arxiv.org/abs/1910.09700).
146
+
147
+ - **Hardware Type:** [More Information Needed]
148
+ - **Hours used:** [More Information Needed]
149
+ - **Cloud Provider:** [More Information Needed]
150
+ - **Compute Region:** [More Information Needed]
151
+ - **Carbon Emitted:** [More Information Needed]
152
+
153
+ ## Technical Specifications [optional]
154
+
155
+ ### Model Architecture and Objective
156
+
157
+ [More Information Needed]
158
+
159
+ ### Compute Infrastructure
160
+
161
+ [More Information Needed]
162
+
163
+ #### Hardware
164
+
165
+ [More Information Needed]
166
+
167
+ #### Software
168
+
169
+ [More Information Needed]
170
+
171
+ ## Citation [optional]
172
+
173
+ <!-- If there is a paper or blog post introducing the model, the APA and Bibtex information for that should go in this section. -->
174
+
175
+ **BibTeX:**
176
+
177
+ [More Information Needed]
178
+
179
+ **APA:**
180
+
181
+ [More Information Needed]
182
+
183
+ ## Glossary [optional]
184
+
185
+ <!-- If relevant, include terms and calculations in this section that can help readers understand the model or model card. -->
186
+
187
+ [More Information Needed]
188
+
189
+ ## More Information [optional]
190
+
191
+ [More Information Needed]
192
+
193
+ ## Model Card Authors [optional]
194
+
195
+ [More Information Needed]
196
+
197
+ ## Model Card Contact
198
+
199
+ [More Information Needed]
config.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "PretrainedAudioMAEEncoder"
4
+ ],
5
+ "auto_map": {
6
+ "AutoConfig": "model.AudioMAEConfig",
7
+ "AutoModel": "model.PretrainedAudioMAEEncoder"
8
+ },
9
+ "dtype": "float32",
10
+ "img_size": [
11
+ 1024,
12
+ 128
13
+ ],
14
+ "in_chans": 1,
15
+ "model_type": "audiomae",
16
+ "num_classes": 0,
17
+ "transformers_version": "4.57.3"
18
+ }
model.py ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Tuple
2
+
3
+ import torch
4
+ import torchaudio
5
+ import torchaudio.transforms as transforms
6
+ from torchaudio.compliance import kaldi
7
+ from transformers import PretrainedConfig
8
+
9
+ from einops import rearrange
10
+
11
+ from timm.models.vision_transformer import VisionTransformer
12
+ from transformers import PreTrainedModel
13
+
14
+
15
+ # it seems like Config class and Model class should be located in the same file; otherwise, seemingly casuing an issue in model loading after pushing to HF.
16
+ class AudioMAEConfig(PretrainedConfig):
17
+ model_type = "audiomae"
18
+
19
+ def __init__(self,
20
+ img_size:Tuple[int,int]=(1024,128),
21
+ in_chans:int=1,
22
+ num_classes:int=0,
23
+ **kwargs,):
24
+ super().__init__(**kwargs)
25
+ self.img_size = img_size
26
+ self.in_chans = in_chans
27
+ self.num_classes = num_classes
28
+
29
+
30
+ class AudioMAEEncoder(VisionTransformer):
31
+ def __init__(self, *args, **kwargs):
32
+ super().__init__(*args, **kwargs)
33
+ """
34
+ - img_size of (1024, 128) = (temporal_length, n_freq_bins) is fixed, as described in the paper
35
+ - AudoMAE accepts a mono-channel (i.e., in_chans=1)
36
+ """
37
+ self.MEAN = -4.2677393 # written on the paper
38
+ self.STD = 4.5689974 # written on the paper
39
+
40
+ def load_wav_file(self, file_path:str):
41
+ """
42
+ to use this, `torchaudio` and `ffmpeg` must be installed
43
+ - `ffmpeg` version must be >=4.4 and <7.
44
+ - `ffmpeg` installation by `conda install -c conda-forge ffmpeg==6.1.1`
45
+ """
46
+ audio, sample_rate = torchaudio.load(file_path) # audio: (n_channels, length);
47
+
48
+
49
+ # Check if the audio has multiple channels
50
+ if audio.shape[0] > 1:
51
+ # Convert stereo audio to mono by taking the mean across channels
52
+ # AudioMAE accepts a mono channel.
53
+ audio = torch.mean(audio, dim=0, keepdim=True)
54
+
55
+ # resample the audio into 16khz
56
+ # AudioMAE accepts 16khz
57
+ if sample_rate != 16000:
58
+ converter = transforms.Resample(orig_freq=sample_rate, new_freq=16000)
59
+ audio = converter(audio)
60
+
61
+ # length clip
62
+ audio_len = audio.shape[-1] / 16000
63
+ if audio_len > 10.0:
64
+ print(f'{file_path} has audio length {audio_len}s, which is longer than 10s. It will be segmented into 10-second windows with a 5-second stride (50% overlap)')
65
+ # current sampling rate is 16000, so 10 seconds is 160000 samples and 5 seconds is 80000 samples
66
+ window_size = 160000
67
+ stride = 80000
68
+ remainder = (audio.shape[-1] - window_size) % stride
69
+ if remainder != 0:
70
+ padding = (0, stride - remainder)
71
+ audio = torch.nn.functional.pad(audio, padding, "constant", 0)
72
+ audio = audio.squeeze(0).unfold(0, window_size, stride)
73
+ return audio
74
+ else:
75
+ return audio
76
+
77
+ def waveform_to_melspec(self, waveform:torch.FloatTensor):
78
+ # Compute the Mel spectrogram using Kaldi-compatible features
79
+ # the parameters are chosen as described in the audioMAE paper (4.2 implementation details)
80
+ mel_spectrogram = kaldi.fbank(
81
+ waveform,
82
+ num_mel_bins=128,
83
+ frame_length=25.0,
84
+ frame_shift=10.0,
85
+ htk_compat=True,
86
+ use_energy=False,
87
+ sample_frequency=16000,
88
+ window_type='hanning',
89
+ dither=0.0
90
+ )
91
+
92
+ # Ensure the output shape matches 1x1024x128 by padding or trimming the time dimension
93
+ expected_frames = 1024 # as described in the paper
94
+ current_frames = mel_spectrogram.shape[0]
95
+ if current_frames > expected_frames:
96
+ mel_spectrogram = mel_spectrogram[:expected_frames, :]
97
+ elif current_frames < expected_frames:
98
+ padding = expected_frames - current_frames
99
+ mel_spectrogram = torch.nn.functional.pad(mel_spectrogram, (0, 0, # (left, right) for the 1st dim
100
+ 0, padding), # (left, right) for the 2nd dim
101
+ )
102
+
103
+ # scale
104
+ # as in the AudioMAE implementation [REF: https://github.com/facebookresearch/AudioMAE/blob/bd60e29651285f80d32a6405082835ad26e6f19f/dataset.py#L300]
105
+ mel_spectrogram = (mel_spectrogram - self.MEAN) / (self.STD * 2) # (length, n_freq_bins) = (1024, 128)
106
+ return mel_spectrogram
107
+
108
+ @torch.no_grad()
109
+ def encode(self, file_path:str, device, reshape=True):
110
+ self.eval()
111
+
112
+ waveform = self.load_wav_file(file_path)
113
+
114
+ zs = []
115
+ for i in range(waveform.shape[0]):
116
+ melspec = self.waveform_to_melspec(waveform[i].unsqueeze(0)) # (length, n_freq_bins) = (1024, 128)
117
+ melspec = melspec[None,None,:,:] # (1, 1, length, n_freq_bins) = (1, 1, 1024, 128)
118
+ z = self.forward_features(melspec.to(device)).cpu() # (b, 1+n, d); d=768
119
+ z = z[:,1:,:] # (b n d); remove [CLS], the class token
120
+ b, c, w, h = melspec.shape # w: temporal dim; h:freq dim
121
+ if reshape:
122
+ wprime = round(w / self.patch_embed.patch_size[0]) # width in the latent space
123
+ hprime = round(h / self.patch_embed.patch_size[1]) # height in the latent space
124
+ # reconstruct the temporal and freq dims
125
+ z = rearrange(z, 'b (w h) d -> b d h w', h=hprime) # (b d h' w')
126
+ else:
127
+ # put the patch dim in the back, i.e., (b n d)-> (b d n)
128
+ z = z.transpose(1, 2)
129
+
130
+ # remove the batch dim
131
+ z = z[0] # (d h' w') if reshape else (d n)
132
+ zs.append(z)
133
+ z = torch.stack(zs, dim=0)
134
+ z = z.mean(dim=0).unsqueeze(0)
135
+ return z # (d h' w') if reshape
136
+
137
+
138
+ class PretrainedAudioMAEEncoder(PreTrainedModel):
139
+ config_class = AudioMAEConfig
140
+
141
+ def __init__(self, config):
142
+ super().__init__(config)
143
+ self.encoder = AudioMAEEncoder(img_size=config.img_size, in_chans=config.in_chans, num_classes=config.num_classes)
144
+
145
+ def forward(self, file_path:str, reshape=True):
146
+ device = self.device
147
+ return self.encoder.encode(file_path, device, reshape) # (d h' w')
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c868088d7f6f9ee8c29292bfa029a552bad781e1c59abb3692762330811bf535
3
+ size 342607672