前の章では、機械にとって音とは、最初から「ことば」ではなく、
・空気の揺れ
・数字の列
・周波数の集まり
・声らしさを表す特徴
として扱われることを見てきました。
でも、特徴を取り出せるようになっただけでは、まだ機械は本当に「聞ける」わけではありません。
そこからさらに、
・この音は何という言葉なのか
・この流れはどう文字になるのか
・逆に、人らしい声をどう作るのか
を学ばなければなりません。
音声処理モデルの発展は、機械が、音の特徴を手がかりに聞き取り、さらに話す方向へ進んできた歴史なのです。
この章では、
音を認識する → 音声と文字を結びつける → 音を作る
という流れで見ていきます。
隠れマルコフモデル ― 音を認識する
音声は、画像と少し違います。
画像は一枚の中に情報が広がっているけれど、音声は時間の中を流れていくからです。
「こんにちは」と言うときも、
こ
ん
に
ち
は
が同時にあるわけではなく、順番に流れていきますよね。
つまり音声認識では、時間とともに変わる音の流れを、どう追いかけるかがとても大切になります。
ここで長く使われてきたのが、隠れマルコフモデル(HMM)です。
隠れマルコフモデルでは、表に見えているのは音の特徴量だけれど、その裏には
・今はこの音素っぽい状態
・次はこの音素っぽい状態
という見えない状態の流れがある、と考えます。
「隠れ」というのは、その状態が直接見えていないからです。
たとえるなら、舞台の幕の向こうで俳優たちが場面を切り替えていて、私たちには裏側の動きは見えないけれど、表に聞こえてくる声や流れから「今はこの場面だな」と推測する感じです。
音声認識でも、機械は音の特徴そのものだけを見るのではなく、この音の流れの裏には、どんな音素の並びが隠れているのかを考えながら認識していました。
音素辞書
ここでHMMに関わる大事なものが、音素辞書です。
音声認識では、最終的には「単語」を認識したい。
でも機械は、その前に音の流れを音素の並びとして考えることが多いです。
たとえば、ある単語がどんな音素の並びでできているかをまとめたものが、音素辞書です。
つまり音素辞書は、この単語は、こういう音の部品の並びでできていますという設計図のようなものです。
隠れマルコフモデルは、音の特徴量から隠れた音素の流れを推定しながら、その流れを音素辞書と照らし合わせて、最終的に単語へ近づいていきます。
たとえるなら、耳で聞こえた音の流れをそのまま単語にするのではなく、いったん「どの音の部品が並んでいそうか」を考え、その並びがどの単語の設計図に近いかを確かめる感じです。
つまりHMMは、音声を、時間の中で移り変わる隠れた音素状態として捉え、音素辞書を手がかりに言葉へ近づけるモデルだったのです。
隠れマルコフモデルが、音とAIの歴史において、大きな役割を果たしたのは、音声が「流れるもの」だという性質を、かなり自然に扱ったことです。
声は、ぴたりと区切られたブロックではなく、少しずつなめらかにつながっています。
その流れの中で「今どんな音らしいか」を追うには、隠れマルコフモデルのような時系列モデルが向いていました。
だから隠れマルコフモデルは、音声認識の古典的な中心として長く使われてきたのです。
CTC ― 音声と文字を結びつける
ここで次の難しさが出てきます。
音声認識では、声の波は細かく時間に沿って続いています。
でも、私たちが欲しいのは最終的には文字列です。
たとえば「こんにちは」と言ったとしても、
機械の側では細かい時間刻みで音が並んでいます。
その一つひとつの瞬間に、
これは「こ」
これは「ん」
これは「に」
と、ぴったり対応づけるのは簡単ではありません。
声は伸びたり縮んだりするし、同じ音でも話す速さは人によって違う。
つまり、音声の時間の長さと文字の並びは、きれいに一対一にはならないのです。
ここで重要になるのが、CTCです。
CTCは、長い入力系列と、短い出力系列をうまく対応づけるための仕組みです。
名前だけだと難しいけれど、やっていることの芯はとても大事です。
たとえば音声は、時間方向にたくさんのフレームがあります。
でも最終的な文字列は、もっと短い。
その長さの違いを、そのままでは扱いにくい。
そこでCTCでは、空白文字(blank)を加えて考えます。
この空白文字は、「この時間には、まだはっきりした文字を出さない」「同じ文字が続いている途中かもしれない」といった余白の役割をします。
たとえば、最終的に「あ」という一文字にしたいときでも、内部では
空白
あ
あ
空白
のような並びを通して表すことができます。
そして、空白を取り除いたり、連続する同じ文字をまとめたりすることで、最終的な出力文字列を得ます。
つまりCTCは、入力の長さと出力の長さが一致しなくてもいいように、空白文字を含んだ柔らかい対応づけを用意するのです。
たとえるなら、長い歌を聞いて歌詞を書き起こす場面に似ています。
歌では、一つの音が長く伸びたり、少し間が空いたりしますよね。
でも最終的に欲しいのは、きれいな歌詞です。
CTCは、そのとき、途中に「まだ文字にならない時間」があってもよいと考えられるようにしてくれます。
だから、音の細かい流れと最終的な文字列を、無理にぴったり一対一で結びつけなくてもよくなります。
深層学習で音声認識をするとき、「この時刻にこの文字」と細かくラベルづけするのは大変です。
でもCTCを使うと、最終的な文字列がわかっていれば、途中の細かな位置合わせを少しゆるやかに扱えます。
だからCTCは、音声認識の深層学習を進めるうえで、音声の時間の流れと文字列のあいだに橋をかける、大事な仕組みになったのです。
WaveNet ― 音を作る
ここまでの話は、主に「声を聞き取る」側の進歩でした。
でも音声処理には、もう一つ大きな方向があります。
それが音声合成です。
つまり、機械が、人間らしい声を作れるようになることです。
ここで有名なのが、WaveNetです。
WaveNetは、音声の波形そのものをかなり直接的に扱いながら、自然な音声を生成しようとしたモデルです。
ここで大事なのは、WaveNetがCNNを使っていることです。
「え、音声なのにCNN?」と思うかもしれません。
CNNは画像のモデルという印象が強いよね。
でも、CNNは「近くの情報の並び」を扱うのが得意なので、時間に沿って並ぶ音声にも応用できます。
つまりWaveNetでは、音声の波形を時間方向の並びとして見て、CNNでその流れを捉えながら音を作っていきます。
Dilated Causal Convolution
ここでWaveNetの大きな特徴になるのが、Dilated Causal Convolutionです。
名前は長いけれど、二つに分けると考えやすいです。
Causal Convolution
まず Causal は、未来を見ないという意味です。
音声を順番に生成するとき、今の音を作るのに、まだ出していない未来の音を見てしまったら不自然ですよね。
だからWaveNetでは、これまでに出した音だけを見ながら、次の音を作るようにします。
これは、書きかけの文章を見ながら続きを書くGPTに少し似ています。
まだ書いていない未来の文は読めません。だから今までの流れだけを頼りに次を書くのです。
Dilated Convolution
次に Dilated は、少し飛び飛びに広く見るという意味です。
普通の畳み込みだと、近くの音しか見えません。
でも音声では、少し前の流れだけでなく、もっと広い時間範囲も大事になることがあります。
そこでDilated Convolutionを使うと、畳み込みの見る範囲を少しずつ広げながら、遠い過去の情報も取り込みやすくなります。
たとえるなら、隣の言葉だけでなく、少し前の文章も見返しながら書く感じです。
WaveNetは、
・CNNを使って音声の波形を扱い
・Causal Convolutionで未来を見ずに順番に生成し
・Dilated Convolutionで広い時間の流れも見られるようにした
モデルだと言えます。
だからWaveNetは、音の波を、過去の流れを見ながら一つずつ自然に描いていくモデルと考えるとわかりやすいです。
昔の音声合成では、どこか機械っぽい平板な響きになることも少なくありませんでした。
でもWaveNetは、よりなめらかで、より人間らしい声へ近づこうとしました。
つまりWaveNetは、「機械が声を理解する」だけでなく、「機械が自然な声を話す」方向の大きな前進でもあったのです。
まとめ
隠れマルコフモデル(HMM)
→ 音声を、時間の中で移り変わる隠れた音素状態として捉える
→ 音素辞書を手がかりに、音の流れを言葉へ近づける
→ 古典的な音声認識モデル
CTC
→ 音声の細かい時間の流れと、最終的な文字列の長さが一致しなくても扱いやすくする仕組み
→ 空白文字を加えて、柔らかく対応づける
→ 深層学習による音声認識の大事な橋渡し
WaveNet
→ CNNを使って音声の波形を扱う音声合成モデル
→ Dilated Causal Convolutionで、未来を見ずに広い流れを捉えながら音を生成する
→ より自然な音声合成へ進んだ代表的モデル
next ▶ 音声処理の活用例