Dwango Media Village の上田です。以前私達は日本語音素アラインメントツール pydomino(https://github.com/DwangoMediaVillage/pydomino) を開発し、その内容を記事にしました。その記事では、音素 (ア段母音 a
や マ行子音 m
など) を更に細かい要素に分解した弁別的素性に着目しました。しかしこの手法では「いつどの音素が話されているか」を細かくラベリングした“ハードアラインメント” データが必要で、これを用意するには人力でのラベル付けや既存ツールを使った機械的なラベル生成が必要となり、データ量が限られてしまうという課題がありました。
そこで、音声データを入力するとデータ内で音素が切り替わる瞬間(音素遷移イベント)だけを検出するニューラルネットワークモデルを Connectionist Temporal Classification (CTC) Loss [1] の最適化によって学習する手法を取り入れることで新たに開発しました。これによりハードアラインメントがなくても学習でき、より多くの音声データを活用できるようになります。実際の実験でも、従来の方法(弁別的素性に基づくアラインメント)より高い精度が得られることを確認しました。
この新しい手法を組み込んだ pydomino は以下のGitHubレポジトリからすぐに導入でき、GPUなしで使用できます。本記事ではどんな仕組みで学習しているのか、どのようにアラインメントを推定しているのかを詳しく紹介します。
git clone --recursive https://github.com/DwangoMediaVillage/pydomino
cd pydomino
pip install .
前回の記事では日本語音素を弁別的素性のバイナリラベルの集合として扱い、その予測結果から音素アラインメントを推論する手法を発表しました。この弁別的素性を予測するニューラルネットワークの学習にはハードアラインメント済みのラベルデータが必要という制限がありました。しかし人間のアノテーションによるハードアラインメント済みのデータは量が少ないため、julius音素アラインメントキットによる機械的ハードアラインメントラベルを導入してハードアラインメントデータを用意していました。ハードアラインメントデータを用意するということはその分だけ作業コストが増えることになったり、学習に利用できるデータ量が限られてしまう問題があります。
本稿ではこの問題を解決する手法を提案します。提案手法は時間フレーム単位で音素遷移イベントの発生を予測するモデルをCTC Lossで最適化し、アラインメント推論時には Viterbi アルゴリズム [2] を用います。CTC Loss による最適化の際、blankトークンは「音素遷移イベントが起きていない」という意味で使うことができます。この学習フレームを使うことでハードアラインメントデータなしに学習ができるようになり、さまざまな巨大な日本語音声データセットをそのまま使えるようになります。
今回アラインメントツールの対象となる音素集合 \( \Omega \) は弁別的素性のものと同じ39種類です。39種類の内容は前回の弁別的素性によるアラインメントツールの記事を参照してください。推論時の入出力は変わらず以下のようになります:
入力 | 16kHz 単チャンネル音声波形 | \( \boldsymbol{x} \in [0, 1]^{T} \) |
読み上げ音素列 | \( \boldsymbol{l} \in \Omega^{M} \) | |
出力 | 各音素が読まれた時刻の区間 | \( \boldsymbol{Z} \in \mathbb{R}_{+}^{M \times 2} \) |
ここで、読み上げ音素列 \( \boldsymbol{l} = (l_1, l_2, \cdots l_M) \) は両端に pau
音素を持ち(\( l_1 = l_M = \mathrm{pau} \))、各音素が読まれた時刻の区間 \(\boldsymbol{Z} = [\boldsymbol{z}_1, \boldsymbol{z}_2, \cdots \boldsymbol{z}_M]^{\top}\) は\(\boldsymbol{z}_m = [z_{m1}, z_{m2}]\) で 音素 \( l_m \) が時刻 \( z_{m1} \)秒 から \( z_{m2} \) 秒の間で読まれていることを表します。
弁別的素性を用いるモデルとは異なり、音素ラベルは口蓋化せず音素遷移系列へ変換します。例えば “意識 (i sh I k I
)” とだけ読み上げたデータの場合、音素遷移系列は先頭と末尾に無音を表す音素トークン pau
を挿入して [pau, i→sh, sh→I, I→k, k→I, pau]
になります。ここで、x→y
の表記は音素 x
から 音素 y
への遷移を表します。先ほど出した例にもあるとおり、入力された音素列を音素遷移列にするときには前処理として読み上げ音素列の先頭と終端が必ず pau
トークンであることを確認して、そうでなければ pau
トークンをそれぞれ先頭に挿入したり、末尾に追加します。こうすることで、音素の読み始めと読み終わりを表現します。
本稿のネットワークの予測対象となる音素遷移トークン全体の集合には、日本語の発音上起こり得ない音素遷移は含まれません。例えば k
から t
への音素遷移は起こり得ないため、ネットワークの予測対象外の音素遷移となります。本稿では、以下の ✓ の部分の音素遷移トークンのみを対象としました。音素遷移トークン全体の要素数は 556 となります。
先 \ 後 | pau | 子音 | 有声母音 | 無声母音 | N | cl |
---|---|---|---|---|---|---|
pau | ✓ | ✓ | ✓ | ✓ | ||
子音 | ✓ | ✓ | ||||
有声母音 | ✓ | ✓ | ✓ | ✓ | ✓ | |
無声母音 | ✓ | ✓ | ||||
N | ✓ | ✓ | ✓ | ✓ | ||
cl | ✓ | ✓ | ✓ | ✓ |
音声に対する前処理は弁別的素性によるアラインメントツールの記事と同じく、秒間100フレームの対数メルスペクトログラムを使います。
音素遷移イベントの予測にはTransformer [3] のEncoder部分を使います。
$$ \begin{aligned} \boldsymbol{S} &= \mathrm{LogMelSpectrogram}(\boldsymbol{x})\\ \boldsymbol{\pi}, \boldsymbol{\phi} &=\mathrm{TransformerEncoder}(\boldsymbol{S})\end{aligned} $$ここで、 \( \boldsymbol{\pi} \in \mathbb{R}^{T' \times |\Delta|}, \boldsymbol{\phi} \in \mathbb{R}^{T'} \) はそれぞれ、\( \pi_{ti} \) が時刻 \(t\) で音素遷移 \(i \) が発生した確率、\( \phi_{t} \) は時刻 \(t\) で音素遷移が何も発生しない確率、\(T'\) は時間フレーム数、\( \Delta \) は音素遷移の全パターン集合で、\( |\Delta| = 556 \) はその要素の総数です。 学習時の損失は、CTC Loss を計算しています。
ネットワークの出力した遷移予測確率 \( \boldsymbol{\pi}, \boldsymbol{\phi} \) と ユーザの入力した読み上げ音素系列から生成した音素遷移トークン列 \( \boldsymbol{w} \in \Delta^{M+1}\) を入力として、以下のAlgorithm 1~4 で記述するViterbiアルゴリズムを使って音素アラインメントを出力します。このとき、CTCLoss で用意する blank
トークンの予測確率を"遷移が起きていない確率"の意味で使うことができます。
今回も 前回の記事と同様に割り当てる最低時間フレーム数 \( N \in \mathbb{N} \)を導入しました。\(N=1\) で一般的な Viterbiアルゴリズム と等価になります。 なお、ここでは
$$ \begin{aligned} \sum_{s=t}^{t} \phi_s &= \phi_t\\ \sum_{s=t'}^{t} \phi_s &= 0 &(t' > t) \end{aligned} $$とします。
\begin{algorithm} \caption{Viterbi Algorithm} \begin{algorithmic} \INPUT $\boldsymbol{\pi} \in \mathbb{R}^{T' \times I}, \boldsymbol{\phi} \in \mathbb{R}^{T'}, \boldsymbol{w} \in \Delta^{M + 1}, N \in \mathbb{Z}_{+}$ \OUTPUT $\boldsymbol{Z} \in \mathbb{R}_{\ge 0}^{M}$ \STATE $\boldsymbol{A} \in \mathbb{R}^{T' \times (M + 1)} =$\CALL{initialize}{$\boldsymbol{\pi}, \boldsymbol{w}$} \STATE $\boldsymbol{\beta} \in \mathbb{B}^{T' \times (M + 1)} =$\CALL{forward}{$\boldsymbol{A}, \boldsymbol{\phi}, N$} \STATE $\boldsymbol{Z} \in \mathbb{R}_{\ge 0}^{M \times 2} =$\CALL{backtrace}{$\boldsymbol{\beta}, N$} \end{algorithmic} \end{algorithm} \begin{algorithm} \caption{Initialize} \begin{algorithmic} \INPUT $\boldsymbol{\pi} \in \mathbb{R}^{T' \times |\Omega|}, \boldsymbol{w} \in \Omega^{M + 1}$ \OUTPUT $\boldsymbol{A} \in \mathbb{R}^{T' \times (M + 1)}$ \FOR{$t = 1$ \TO $T'$} \FOR{$m = 1$ \TO $M + 1$} \STATE $a_{tm} = \pi_{t,w_m}$ \ENDFOR \ENDFOR \end{algorithmic} \end{algorithm} \begin{algorithm} \caption{Forwarding} \begin{algorithmic} \INPUT $\boldsymbol{A} \in \mathbb{R}^{T' \times (M+1)}, \boldsymbol{\phi} \in \mathbb{R}^{T'}, N \in \mathbb{Z}_{+}$ \OUTPUT $\boldsymbol{\beta} \in \mathbb{B}^{T' \times (M+1)}$ \STATE $\boldsymbol{\alpha} \in \mathbb{R}^{T' \times (2M+3)} = \{ - \infty\}^{T' \times (2M+3)}$ \STATE $\boldsymbol{\beta} \in \mathbb{B}^{T' \times (M+1)} = \{ \boldsymbol{\mathrm{false}} \}^{T' \times M+1}$ \FOR{$m = 1$ \to $2M+3$} \IF{$m=1$} \STATE $\alpha_{1, 1} = \phi_{1, 1}$ \FOR{$t = 2$ \TO $T'$} \STATE $\alpha_{t, m} = \alpha_{t-1, m} + \phi_{t}$ \ENDFOR \ELSEIF {$m = 2$} \STATE $\alpha_{1, 2} = a_{1, 1}$ \FOR{$t = 2$ \TO $T'$} \STATE $\alpha_{t, m} = \alpha_{t-1, m-1} + a_{t, 1}$ \ENDFOR \ELSEIF {$m = 4, 6, 8, \cdots, 2M + 2$} \FOR{$t = m / 2 * N$ \TO $T'$} \STATE $\alpha_{t, m} = \alpha_{t-1, m-1} + a_{t, 1}$ \ENDFOR \ELSEIF {$m = 3, 5, 7, 9, \cdots, 2M +1$} \FOR{$t = (m-1) / 2 * N$ \TO $T'$} \STATE $x^{(\mathrm{transition\_before\_N\_frames\_ago})} = \alpha_{t-1, m} + \phi_{t}$ \IF {$t - N + 2 \le 0$} \STATE $x^{(\mathrm{transition\_N\_frames\_ago})} = - \infty$ \ELSE \STATE $x^{(\mathrm{transition\_N\_frames\_ago})} = \alpha_{t-N+1, m-1} + \sum_{t' = t - N + 2}^{t}\phi_{t'}$ \ENDIF \IF {$x^{(\mathrm{transition\_N\_frames\_ago})} > x^{(\mathrm{transition\_before\_N\_frames\_ago})}$} \STATE $\beta_{t-N, m-1} = $\TRUE \ENDIF \STATE $\alpha_{t, m} = \max(x^{(\mathrm{transition\_N\_frames\_ago})}, x^{(\mathrm{transition\_before\_N\_frames\_ago})})$ \ENDFOR \ELSE \FOR{$t = m / 2 * N$ \TO $T'$} \STATE $x^{(\mathrm{transition\_before\_1\_frames\_ago})} = \alpha_{t-1, m} + \phi_{t}$ \STATE $x^{(\mathrm{transition\_1\_frames\_ago})} = \alpha_{t-1, m-1} + \phi_{t}$ \IF {$x^{(\mathrm{transition\_1\_frames\_ago})} > x^{(\mathrm{transition\_before\_1\_frames\_ago})}$} \STATE $\beta_{t-1, m-1} = $\TRUE \ENDIF \STATE $\alpha_{t, m} = \max(x^{(\mathrm{transition\_1\_frames\_ago})}, x^{(\mathrm{transition\_before\_1\_frames\_ago})})$ \ENDFOR \ENDIF \ENDFOR \end{algorithmic} \end{algorithm} \begin{algorithm} \caption{Backtracing} \begin{algorithmic} \INPUT $\boldsymbol{\beta} \in \mathbb{B}^{T' \times M + 1}, N \in \mathbb{Z}_{+}$ \OUTPUT $\boldsymbol{Z} \in \mathbb{R}_{\ge 0}^{M \times 2}$ \STATE $t=T'$ \STATE $m=M$ \STATE $z_{M, 2} = t$ \WHILE{$t > 0$} \IF{$\beta_{tm}$} \STATE ${t = t - N}$ \STATE $z_{m, 0} = z_{m-1, 1} = t / 100$ \STATE ${m = m - 1}$ \ELSE \STATE $t = t - 1$ \ENDIF \ENDWHILE \STATE $z_{1, 1} = 0$ \end{algorithmic} \end{algorithm}
ここからは、前向き対数確率の計算方法を説明します。
まず最初の非blank遷移トークンの前向き対数確率 \( \alpha_{t, i} \)は
$$ \alpha_{t, i} = \sum_{t'=1}^{t-1} \log \phi_{t'} + \log \pi_{t, i} $$で計算できます。
次に、音素遷移トークンから音素遷移トークンへ遷移するときの、前向き対数確率の計算を考えます。求める前向き対数確率は
$$ \begin{aligned} \alpha_{t, i} &= \max_{1 \le s \le t-N}\left\{ \alpha_{s, i-2} + \log \pi_{t, i} + \sum_{t' = s+1}^{t-1} \log \phi_{t'} \right\}\\ &= \max_{1 \le s \le t-N}\left\{ \alpha_{s, i-2} + \sum_{t' = s+1}^{t-1} \log \phi_{t'} \right\} + \log \pi_{t, i} \end{aligned} $$になります。ですが、この計算アルゴリズムでは計算量が \(\mathcal{O}((T')^3 (M + 1)) \) かかってしまいます。そこで、動的計画法で計算量の短縮を図ります。
この第1項は最初と最後のblankトークンの位置 \(i\) にて、\(i\) を固定した状態で \(t = 1, 2, \cdots, T'\) と順番に
$$ \alpha_{t, i} = \max\left\{ \alpha_{t-1, i} + \log \phi_{t}, \alpha_{t -N + 1, i-1} + \sum_{t' = t - N + 2}^{t} \log \phi_{t'} \right\} $$を計算し、最初以外の非blankトークンにて
$$ \alpha_{t, i} = \alpha_{t-1, i-1} + \log \pi_{t, i} $$を計算することと同じなため、これにより計算量は \(\mathcal{O}(N T' (M + 1)) \) に短縮できます。 最後のblankトークンの前向き対数確率の計算では、発話前後の何も喋っていない区間に対してのアラインメント制約がないため、
$$ \alpha_{t, i} = \max\left( \alpha_{t-1, i-1}, \alpha_{t-1, i} \right) + \log \phi_t $$で計算できます。これにより 1音素に最低でも \( N \) フレーム の時間を割り当てる制約を保ったままアラインメントを予測できます。
今回の実験では前回の記事で紹介した弁別的素性予測LSTMモデルとの比較実験をします。学習データと評価データはそれぞれ弁別的素性の記事と同様、CSJデータセット [4] とITAコーパスマルチモーダルデータ [5] を用います。評価指標も記事の内容と同じですので、そちらでご確認ください。弁別的素性予測LSTMモデルは私達が配布しているpydominoツール を使います
音素遷移の予測には 4層のAttention層で構成した Transformer Encoder を使いました。各Attention層には self attention 層 と feed-forward 層が1つずつあり、self attention層は ヘッド数 \(4\) 、attention次元が \(256\) です。feed-forward層の中間次元数は \(2048 \) です。
ITAマルチモーダルデータセットを用いてアラインメント誤り率を評価指標とした性能比較結果は以下のようになります。なお、弁別的素性予測LSTMモデルと今回の音素遷移予測Transformerモデルでは、1音素あたりの最低割り当て時間フレーム数 \( N \) が最良のアラインメント誤り率になる値が異なるので、それぞれのモデルで最良のアラインメント誤り率になる値を採用しました。その値は弁別的素性予測LSTMモデルでは \( N = 5\) 、音素遷移予測Transformerモデルでは \(N = 2\) です。
手法 | アラインメント誤り率(%) |
---|---|
弁別的素性予測LSTM | 10.410 |
音素遷移予測Transformer | 8.576 ± 0.226 |
比較の結果、音素遷移予測Transformerは前回の記事で紹介した弁別的素性予測LSTMよりも良い日本語音素アラインメント予測精度があることがわかりました。
さらに、ITAマルチモーダルデータセットには各音声信号データ内の開始と終端に長めの無音区間が含まれており、この両端の無音区間がアラインメント誤り率の比較に影響を及ぼしているかどうかを検証しました。
ITAコーパスマルチモーダルデータの音声を入力とする際、音声データの両端にある無音区間を含めず入力したときのアラインメント誤り率は以下のようになります。音声データ全体を入力した比較実験と同様、各モデルごとに1音素あたりの最低割り当て時間フレーム数 \( N \) が最良のアラインメント誤り率になる値を採用して比較しました。その値は弁別的素性予測LSTMでは \( N = 5\) 、音素遷移予測Transformerでは \(N = 3\) です。
手法 | アラインメント誤り率(%) |
---|---|
弁別的素性予測LSTM | 16.787 |
音素遷移予測Transformer | 14.049 ± 0.417 |
これにより、音声データ全体を入力したときでも発話区間だけ入力したときでも、音素遷移イベントに基づくTransformer導入によるアラインメント性能向上を確認できました。
前述の比較実験では現在のpydominoよりも提案手法のほうが性能が良いことを確認ました。しかし、これだけではニューラルネットアーキテクチャをLSTMからTransformerに置き換えたこと以外の要因が性能向上に寄与している可能性があります。そこで、弁別的素性予測Transformerと音素遷移予測LSTMを用意してこれら4種類の日本語音素アラインメントの性能を比較します。
結果は以下のようになりました。
最低割り当て時間フレーム数 \(N\) | 弁別的素性予測LSTM | 弁別的素性予測Transformer | 音素遷移予測LSTM | 音素遷移予測Transformer |
---|---|---|---|---|
1 | 11.640 | 14.498±0.091 | 49.027±16.393 | 8.707±0.264 |
2 | 11.386 | 14.186±0.066 | 58.734±22.439 | 8.576±0.226 |
3 | 11.174 | 13.857±0.085 | 60.695±22.814 | 8.628±0.205 |
4 | 10.785 | 13.463±0.101 | 62.862±23.107 | 9.571±0.367 |
5 | 10.410 | 13.029±0.118 | 64.080±22.672 | 12.166±0.807 |
6 | 11.081 | 13.366±0.129 | 65.915±19.498 | 18.111±1.518 |
7 | 17.445 | 18.557±0.115 | 71.297±12.895 | 32.963±1.875 |
弁別的素性予測Transformerよりも音素遷移予測Transformerのほうがアラインメント精度が良いことから、モデルだけではなく音素遷移を対象とすることが性能向上に寄与していることが分かりました。また、LSTMでは弁別的素性よりも音素遷移を使った場合が悪くなることから、音素遷移予測とTransformerの組み合わせが重要であることが分かりました。
また、音声データの両端にある無音区間を含めず入力したときの音素アラインメント誤り率も同様に計測しています。
最低割り当て時間フレーム数 \(N\) | 弁別的素性予測LSTM | 弁別的素性予測Transformer | 音素遷移予測LSTM | 音素遷移予測Transformer |
---|---|---|---|---|
1 | 19.225 | 23.869±0.188 | 50.062±14.365 | 14.652±0.622 |
2 | 18.654 | 23.280±0.161 | 52.802±16.598 | 14.300±0.416 |
3 | 18.073 | 22.712±0.125 | 54.360±17.095 | 14.049±0.417 |
4 | 17.410 | 22.043±0.096 | 55.397±17.144 | 14.287±0.429 |
5 | 16.787 | 21.343±0.113 | 55.791±16.946 | 15.899±0.452 |
6 | 18.045 | 21.862±0.127 | 55.483±15.051 | 21.090±0.475 |
7 | 28.100 | 30.148±0.135 | 58.239±10.517 | 34.465±0.509 |
先程の結果と同様のことが、発声区間のみのデータでも有効であることがわかりました。
本稿では、音素遷移イベントの発火を予測するモデルを CTC Lossで学習することによって、ハードアラインメント不要な音素アラインメント学習を紹介しました。ITAコーパスマルチモーダルデータによる評価実験によって、以前紹介した弁別的素性に基づく音素アラインメントよりアラインメント精度が良いことがわかりました。状態遷移の瞬間を予測するモデルをCTC Lossにより最適化することでアラインメントを推定するフレームワークは、音素アラインメント以外にも、点として発生するイベントに置き換えられる任意の時系列データに関する問題にも応用が期待できます。
[1] GRAVES, Alex, et al. Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks. In: Proceedings of the 23rd international conference on Machine learning. 2006. p. 369-376. https://www.cs.toronto.edu/~graves/icml_2006.pdf
[2] VITERBI, Andrew. Error bounds for convolutional codes and an asymptotically optimum decoding algorithm. IEEE transactions on Information Theory, 1967, 13.2: 260-269. https://ieeexplore.ieee.org/abstract/document/1054010/
[3] VASWANI, Ashish, et al. Attention is All you Need. Advances in Neural Information Processing Systems, 2017. https://papers.nips.cc/paper_files/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html
[4] MAEKAWA, Kikuo. Corpus of Spontaneous Japanese: Its design and evaluation. In: ISCA & IEEE Workshop on Spontaneous Speech Processing and Recognition. 2003. https://www2.ninjal.ac.jp/kikuo/SSPR03.pdf
[5] ITAコーパスマルチモーダルデータベース https://zunko.jp/multimodal_dev/login.php