DeepSpeech:Scaling up end-to-end音声認識コメント


conventional ASR vs E2E ASR


既存の音響モデルは波形から特徴を抽出した後
AM(音響モデル)、PM(発音モデル)、LM(言語モデル)を使用してテキストを作成します.このときAM,PM,LMは別々に学習する.
E 2 Eモデルはこれとは異なり,音響的特徴を入力することによって直接テキストに変換するモデルである.
E 2 Eモデルでも必要なものがあります.
1. Feature Extraction
2. (external) Beam search Decoder
3. (external) Language model

モデルこうぞう


全部で5階あります.
3つの線形層,双方向rnn,2つの線形層からなる.
モデルの入力にはスペクトルを用いた.
lossはCTCLossを使用した.
(CTCLossを直接実現する必要はなく、nn.TCLossを使用するだけです.)
最初の3階は以下の通りです.

nn.functional.hardtanhを利用してclipped機能を実現できます.
論文では第4層に双方向rnnを用いた.
論文では,より多くの演算とメモリが必要であるためLSTMは使用されていないが,https://github.com/mozilla/DeepSpeechの最新バージョンコードから見ると,すべてLSTMが使用されている.
(第4層をrnnに変えて学習したところ,rnnの固有問題勾配が消失したため,学習率をかなり小さくしてこそ学習時間が長くなるがlstmに変えてrnnよりずっと安定であることが分かった.)
第5層は、順方向ユニットと後方向ユニットを加算した値を入力とする線形層である.
6番目の線形層を通過した後,softmaxを適用して各文字の確率分布を得た.
論文の5、6階について説明します.

オンライン層では、これを正規化するために、rnnには適用されず、損失率を5%~10%の間に設定する.

モデルpytorch実装

class FullyConnected(torch.nn.Module):
    """
    Args:
        n_feature: Number of input features
        n_hidden: Internal hidden unit size.
    """

    def __init__(self,
                 n_feature: int,
                 n_hidden: int,
                 dropout: float,
                 relu_max_clip: int = 20) -> None:
        super(FullyConnected, self).__init__()
        self.fc = torch.nn.Linear(n_feature, n_hidden, bias=True)
        self.relu_max_clip = relu_max_clip
        self.dropout = dropout

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = self.fc(x)
        x = torch.nn.functional.relu(x)
        x = torch.nn.functional.hardtanh(x, 0, self.relu_max_clip)
        if self.dropout:
            x = torch.nn.functional.dropout(x, self.dropout, self.training)
        return x

class DeepSpeech(torch.nn.Module):
    """
    DeepSpeech model architecture from *Deep Speech: Scaling up end-to-end speech recognition*
    [:footcite:`hannun2014deep`].

    Args:
        n_feature: Number of input features
        n_hidden: Internal hidden unit size.
        n_class: Number of output classes
    """

    def __init__(
        self,
        n_feature: int,
        n_hidden: int = 2048,
        n_class: int = 40,
        dropout: float = 0.0,
    ) -> None:
        super(DeepSpeech, self).__init__()
        self.n_hidden = n_hidden
        self.fc1 = FullyConnected(n_feature, n_hidden, dropout)
        self.fc2 = FullyConnected(n_hidden, n_hidden, dropout)
        self.fc3 = FullyConnected(n_hidden, n_hidden, dropout)
        self.bi_rnn = torch.nn.RNN(
            n_hidden, n_hidden, num_layers=1, nonlinearity="relu", bidirectional=True
        )
        self.fc4 = FullyConnected(n_hidden, n_hidden, dropout)
        self.out = torch.nn.Linear(n_hidden, n_class)

   def forward(self, x: torch.Tensor) -> torch.Tensor:
        """
        Args:
            x (torch.Tensor): Tensor of dimension (batch, channel, time, feature).
        Returns:
            Tensor: Predictor tensor of dimension (batch, time, class).
        """
        # N x C x T x F
        x = self.fc1(x)
        # N x C x T x H
        x = self.fc2(x)
        # N x C x T x H
        x = self.fc3(x)
        # N x C x T x H
        x = x.squeeze(1)
        # N x T x H
        x = x.transpose(0, 1)
        # T x N x H
        x, _ = self.bi_rnn(x)
        # The fifth (non-recurrent) layer takes both the forward and backward units as inputs
        x = x[:, :, :self.n_hidden] + x[:, :, self.n_hidden:]
        # T x N x H
        x = self.fc4(x)
        # T x N x H
        x = self.out(x)
        # T x N x n_class
        x = x.permute(1, 0, 2)
        # N x T x n_class
        x = torch.nn.functional.log_softmax(x, dim=2)
        # N x T x n_class
        return x

出題-https://pytorch.org/audio/stable/_modules/torchaudio/models/deepspeech.html
2.2 Language Model
3. Optimization
省略

4.1 Synthesis by superposition


トレーニングデータを増やすために,データ合成を用いた.
特にノイズ環境では
noisy speech = audio + noise
このようにしてデータが生成される.
この場合、1000時間clean speechを用いて1000時間のノイズspeechを生成するには、十分なノイズ軌跡が必要であることに注意してください.10時間程度のノイズ追跡を適切に繰り返してノイズ付き音声を生成すると、モデルはノイズを記憶し、合成データから除去する可能性がある.
したがって、1つの単一ノイズ源を使用するよりも、複数の短いクリップを用いて重畳するほうがよい.

4.2 Capturing Lombard Effect


ノイズ環境でASRモデルを学習する場合,「Lombard Effect」が問題となる.演説者は騒音環境で音をよりよく伝えるために、わざと声を育てる.これらのフィーチャーは、静的環境から取得したデータセットでは見つかりません.訓練データにLombard effectを適用するために,人々の音声を録音する際に,意図的にノイズ環境を作成し録音し,訓練セットとして使用する.