はじめに
はじめまして、株式会社IGSAでAIエンジニアをしているzeronishiです。
IGSAにおける、脳の健康管理アプリ「はなしてね」をはじめとするプロダクト開発や、パートナー事業における共同開発では、音声認識システムを中核技術として利用しています。
多くのサービスで利用される音声認識ですが、音声認識タスクではモデルへの入力である音声と、出力であるテキストの系列長が大きく異なるという問題があります。本記事ではその問題を解決する一般的な手法である、Connectionist Temporal Classification(CTC)とRecurrent Neural Network Transducer (RNN-Transducer)をご紹介します。
対象読者
- 音声認識で用いられるデコーダについて概要を知りたい方
CTCは基本的にPyTorchのものが利用されますが、ソースコードはATen内にありcppで実装されています。
実装レベルで理解されたい方はこちらの実装のctc_loss関数が、pythonで書かれており参考になるかと思います。
音声認識の難しさ
音声認識とは、入力音声から対応するテキストを推定するタスクです。
音声のサンプリング周波数は16000[Hz]や44100[Hz]であり、一般的な音声認識モデルのエンコーダはこの音声データから約20[ms]ごとに1つの特徴量を抽出します。
例えば1[s]の"cat"という音声を入力した場合、エンコーダから得られた$\frac{1[s]}{20[ms]}=50$個の特徴量から"cat"を推論する必要があります。
音声コーパスに収録されているデータは基本的に音声とテキストのペアデータであり、「どの時間(特徴量)が"cat"の"c"に当てはまるか」といった情報(この対応付けをアランメントと呼びます)は収録されていないため、Cross Entropyのような1対1の対応を前提とした損失関数は利用できません。
CTC
CTCではこの入力と出力の系列長が異なるという問題に対処するために、どの文字でもないことを表すブランクトークン(-)を導入し、入力時間フレーム毎にブランクを含む何等かのトークンを出力できるようにします。これにより出力系列長と入力系列長を同じにすることができます。
しかし、アラインメント情報が無いため学習は以前困難です。そこでCTCでは、以下の縮約の結果、正解テキストと合致する全ての系列(パス)の確率の和が最大となるように学習させます。
- 連続する文字は1つに圧縮する
- ブランクを削除する
例えば正解テキスト"cat"の取りうるパスは"--c--aa-tt-"や"-cccaa-t--"などが挙げられます。この二つの縮約を行う関数を$\beta$とおきます。($\beta ^{-1}(cat)=$("--c--aa-tt-", "-cccaa-t--", ...)
下図は縮約の結果"cat"となるすべてのパス($\beta^{-1}(cat)$)を網羅したものです。横軸は時間であり、時間毎に入力$x$は異なります。図中の青矢印は"-c----aa-t-"を表しており、このパスの確率は
p(-c---aa-t-|\mathbf{x})=p(-|x_{1})+p(c|x_{2})+p(-|x_{3})+・・・+p(-|x_{11})
'-c---aa-t-' \in \beta^{-1}(cat)
と求めることができます。
取りうる各パスの確率をこのように求め、最終的に以下の損失関数を最小にするように学習します。
L_{CTC}=-\log{\sum _{\pi \in \beta^{-1}(cat)}p(\pi|\mathbf{x})}
CTCの課題
まずCTCの入力は音声情報のみであり、出力確率分布が時間方向に独立となります。そのため、文脈的に整合性の取れた出力は困難となります。
また、CTCでは入力系列が出力系列よりも長いことが学習の条件となっています。
さらに、CTCの損失の計算方法上、損失を小さくするにはある一つのパスの出力確率を大きくすることになります(確率分布の尖度が大きくなる)。また、ブランクの出力確率が大きくなるという特性があります。
RNN-Transducer
文脈を考慮するための手法としてRNN-Transducerが挙げられます。RNN-TransducerもCTCと同様にブランクを導入し、すべての取りうるパスの出力確率の総和を最大化するように学習が進みます。
RNN-TransducerはEncoder, Pred Network, Joint Networkから構成されます。

Encoderは音声情報$x_{t}$から潜在表現$h_{t}^{enc}$を出力します。一般にEncoderは順方向のLSTMで構成されます。
Pred Networkはこれまでの出力$y_{u-1}$から、言語情報ベクトル$h_{u}^{dec}$を出力します。この自己回帰構造により文脈を考慮することが可能になります。
そしてJoint NetworkはEncoderの出力(音響情報)とPred Network(言語情報)の出力を受け取ることで、音響情報と言語情報の両方を考慮した出力が可能となります。Pred Networkも一般に順方向のLSTMで構成されます。
RNNT Loss
音響情報$x$のインデックスを$t$、モデルの出力$y$のインデックスをuとすると、RNN-Transducerのパスは下図のように表されます。
y(1,1)は1つ目の音響表現ベクトル$h_{1}^{enc}$と1つ目の言語情報ベクトル$h_{1}^{dec}$をJoint Networkに入力した場合に$y_{2}$が出力される確率を表しています。
また、$Ø(1,2)$は$h_{1}^{enc}$と$h_{2}^{dec}$をJoint Networkに入力した場合にØが出力される確率を表しています。
y(t,u)\equiv Pr(y_{u+1}|t,u)
Ø(t,u)\equiv Pr(|t,u)
図中のt=1, u=0のノード(左下)から二重丸のノード(右上)へつながるすべてのパスの総和を最大化するように学習されます。

まとめ
音声認識で用いられるCTCとRNN-Transducerを紹介しました。
構造的にCTCの方がより軽量で、学習が容易ですが、RNN-Transducerモデルと比較して認識精度が落ちるという特性があります。
しかしCTCは出力が独立しているため、文脈は一切考慮せず音響情報のみから推論することが可能です。そのため、医療系のタスクなどの発話そのままの文字起こしを利用したい場合には、CTCの方が適していると思われます。
IGSAについて
IGSAは、社会を温かく柔らかく持続的に支えるAIシステムにより、持続可能な幸せを目指す、東京大学松尾・岩澤研究室発のAIカンパニーです。
脳の健康管理アプリ「はなしてね」や、中古品の画像解析SaaS「スグトリ」などのAIプロダクト提供に加え、潜在的な課題に対し柔軟な開発支援を行うパートナー事業を展開。センシングAI技術を活用した状態の定量化と分析により、人の意思決定をサポートしています。
