| 62 | |
| 63 | |
| 64 | class SpeakerEncoder(torch.nn.Module): |
| 65 | def __init__( |
| 66 | self, |
| 67 | mel_n_channels=80, |
| 68 | model_num_layers=2, |
| 69 | model_hidden_size=256, |
| 70 | model_embedding_size=256, |
| 71 | ): |
| 72 | super(SpeakerEncoder, self).__init__() |
| 73 | self.lstm = nn.LSTM( |
| 74 | mel_n_channels, model_hidden_size, model_num_layers, batch_first=True |
| 75 | ) |
| 76 | self.linear = nn.Linear(model_hidden_size, model_embedding_size) |
| 77 | self.relu = nn.ReLU() |
| 78 | |
| 79 | def forward(self, mels): |
| 80 | self.lstm.flatten_parameters() |
| 81 | _, (hidden, _) = self.lstm(mels.transpose(-1, -2)) |
| 82 | embeds_raw = self.relu(self.linear(hidden[-1])) |
| 83 | return embeds_raw / torch.norm(embeds_raw, dim=1, keepdim=True) |
| 84 | |
| 85 | |
| 86 | class MELEncoder(nn.Module): |
nothing calls this directly
no outgoing calls
no test coverage detected