說話人性別識別

讓人類來分辨說話人的性別是件十分簡單的事情,對於機器來說也不是什麼難事,下面介紹使用BiRNN進行說話人性別識別。

1. 性別判定特徵

說道男女聲音的差異很多人第一反應就是音高,這裏的音高指的是基音的頻率,我們採用基音週期作爲判決男聲女聲的特徵之一,如下圖所示。我們可以看到女性的基音週期和男性基音週期有一定的差別。

下一個特徵我們使用常用於語音信號處理的梅爾頻率倒譜系數,這裏我們使用13個梅爾濾波器然後將輸出結果進行一階差分得到12維動態的梅爾頻率倒譜系數,因此我們的MFCC特徵總共有13+12=25維,  如下圖所示。

 

我們再添加兩個特徵分別爲譜質心和譜對比度特徵。其中譜質心描述了聲音的明亮度,具有陰暗、低沉品質的聲音傾向有較多低頻內容,譜質心相對較低,具有明亮、歡快品質的多數集中在高頻,譜質心相對較高

 譜對比度將頻譜的每個幀都分爲子帶。對於每個子帶,通過將頂部分位數的平均能量(峯值能量)與底部分位數的平均能量(谷能量)進行比較來估計能量對比。高對比度值通常對應於清晰的窄帶信號,而低對比度值則對應於寬帶噪聲。

這樣我們就有了用於判定說話人性別的特徵集{基音週期, MFCC, 譜質心,譜對比度}一共32維。

2. 模型訓練 

在這個任務中靜音幀部分的特徵是沒有意義的,因此我們需要對數據進行預處理刪除樣本中的靜音部分。但是這會帶來一個問題——數據集中的每個樣本長度不一樣。爲了解決這個問題,我們需要使用Pytorch中的pad_sequence, pack_padded_sequence, pad_packed_sequence,下面簡單介紹一下它們的用法。在Dataloader中有一個collate_fn的屬性,默認的collate_fn函數是要求一個batch中的樣本都具有相同size,但是我們的樣本長度不一樣,這裏我們就需要自定義一個函數傳給collate_fn。


def pad_collate(batch):
    x, y, lens = zip(*batch)
    x_pad = pad_sequence(x, batch_first=True, padding_value=0)
    return x_pad, torch.tensor(y, dtype=torch.float32), torch.tensor(lens)

這樣每個batch的輸出大小都是一樣的,這裏注意我們的每個batch包含三個內容,第一是用於檢測性別的特徵,第二是每個樣本對應的標籤,第三是每個樣本的長度,以上就解決了數據加載過程中樣本長度不一致的問題。

在模型前向傳播的過程中,我們需要將樣本特徵和每個樣本的長度使用pack_padded_sequence進行“打包”成batch,然後將神經網絡的輸出使用pad_packed_sequence進行“解包”得出真正的輸出。因此我們的網絡定義如下,使用了雙向LSTM。這裏我們就解決了BP過程中樣本長度不一致的問題。


class GCNet(nn.Module):
    def __init__(self, in_dim=32, hidden_dim=64, n_layer=2, n_class=1):
        super(GCNet, self).__init__()
        self.n_layer = n_layer
        self.hidden_dim = hidden_dim
        self.lstm = nn.LSTM(in_dim, hidden_dim, n_layer, batch_first=True, bidirectional=True)
        self.classifier = nn.Linear(2 * hidden_dim, n_class)

    def forward(self, x, lens):
        lens = torch.as_tensor(lens, dtype=torch.int64)
        x = pack_padded_sequence(x, lens, batch_first=True,enforce_sorted=False)
        out, _ = self.lstm(x)
        out, lens = pad_packed_sequence(out, batch_first=True)
        out = out[:, -1, :]
        out = self.classifier(out)
        out = F.torch.sigmoid(out)
        return out

                                                                 語音信號處理交流羣:  652292630         

                                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章