音の表現 — メルスペクトログラムとトークン化
音声モデルが波形をそのまま食べない理由から出発し、短時間フーリエ変換 → メル目盛り → 対数 → 離散トークンという変換の連鎖を前提知識ゼロで解説。窓長のトレードオフ、MFCCがDCTを捨てた事情、音響トークンと意味トークンの違い、そして設定を1つ間違えるだけで音が壊れる現場の落とし穴まで。
Robust Speech Recognition via Large-Scale Weak Supervision
一次資料 — この記事の根拠
論文の発表 2022-12-06→この解説の公開 2026-08-273年9か月後
HuBERT: Self-Supervised Speech Representation Learning by Masked Prediction of Hidden UnitsarXiv:2106.07447論文ページ·PDFRobust Speech Recognition via Large-Scale Weak SupervisionAlec Radford, Jong Wook Kim, Tao Xu ほか · 2022-12-06 · v1arXiv:2212.04356論文ページ·PDF
原文の要旨(Abstract)を読む
We study the capabilities of speech processing systems trained simply to predict large amounts of transcripts of audio on the internet. When scaled to 680,000 hours of multilingual and multitask supervision, the resulting models generalize well to standard benchmarks and are often competitive with prior fully supervised results but in a zero-shot transfer setting without the need for any fine-tuning. When compared to humans, the models approach their accuracy and robustness. We are releasing models and inference code to serve as a foundation for further work on robust speech processing.
マイクが渡してくるのは1本の数列
マイクがやっていることは単純です。空気の圧力の上下を一定間隔で測り、数字として書き留める。それだけです。音声認識でよく使う16 kHzなら1秒あたり16,000回測るので、10秒しゃべった音声は16万個の数字が一列に並んだ帯になります。
この帯の中に、あなたの声も、隣の部屋の物音も、部屋の壁の反射も、すべてが1本の波として溶け合っています。人間の耳はここから言葉を取り出せますが、機械にこの16万個をそのまま渡すのは、本を「紙の上のインクの濃さの数値」として読ませるようなものです。読めないわけではないけれど、あまりに遠回りです。
だから音声を扱うシステムはほぼ例外なく、波形をいったん別の表現に変換してから本題に入ります。この記事は、その変換の連鎖 — フーリエ変換 → メル目盛り → 対数 → 離散トークン — を一本の道として辿ります。どれか1つを知っていても、なぜその順に並んでいるかが分かると景色が変わります。
比喩: 楽譜という圧縮
オーケストラの演奏を紙に残すことを考えます。空気の振動そのものを書き写すのは不可能ですが、私たちには楽譜があります。楽譜が残しているのは「いつ・どの高さの音が・どれくらいの強さで鳴るか」だけで、奏者の音色の細部も、ホールの反響も、波の位相も書かれていません。それでも別の楽団が読めば、同じ曲が鳴ります。
スペクトログラムは、機械のための楽譜です。音を「縦=高さ、横=時間」の表に直したもので、楽譜と同じく位相を捨てています。
メルスペクトログラムは、その五線譜の間隔を人間の耳の感度に合わせて引き直した楽譜です。低い音域は細かく、高い音域はざっくりと書く。
そしてトークン化は、楽譜の音符を「有限個の決まった記号」に丸める操作です。手書きの音符を活字にするようなもので、こうすると音が文字列になり、言語モデルという既存の強力な機械にそのまま食べさせられます。
なぜ波形をそのまま食べないのか
理由は3つあります。
1つ目は、冗長すぎること。 16 kHzで30秒の音声は48万点です。Transformerの自己注意は系列長の2乗の計算量なので、この長さは正面から扱う気になれません。
2つ目は、耳に同じ音が、数列としてはまったく違うこと。 同じ「あ」を1ミリ秒だけずらして録音すると、数字の並びは総取り替えになります。振幅を少し変えても、位相が反転しても、人間には同じ音に聞こえるのに数列は別物です。波形を直接扱うネットワークは、この「どう変わっても同じ音」という不変性を、まずゼロから学ばなければなりません。
3つ目は、意味に効く量が時間領域では見えないこと。 「あ」と「い」を区別しているのは、声道の共鳴によってできる周波数の山(フォルマント)の位置です。ところが波形をいくら睨んでも、その山は見えません。周波数に直した瞬間に、初めて目に見える特徴になります。
周波数の表現に移すと、3つとも同時に軽くなります。系列は10ミリ秒刻みまで短くなり、位相を捨てることで不変性が最初から手に入り、フォルマントは画像の縞模様として現れます。
仕組み①: 短時間フーリエ変換(STFT)
「混ざった波を、高さごとの成分にほどく」道具がフーリエ変換です(この変換自体の仕組みと、なぜ高速に計算できるのかはFFTを1から理解するで扱っています)。
ただし10秒の音声にフーリエ変換を1回かけると、10秒ぶんの周波数成分が1枚のグラフに潰れてしまい、「その音がいつ鳴ったか」が完全に失われます。曲全体の楽譜が、和音1つに要約されてしまうようなものです。
そこで、音を短く切ってから変換します。25ミリ秒くらいの窓で切り出し、その窓の中だけフーリエ変換する。窓を10ミリ秒ずつずらしながら繰り返す。これが短時間フーリエ変換(STFT)です。
記号の意味を1つずつ。 が波形の数列、 が窓の長さ(サンプル数)、 が窓をずらす幅(ホップ長)、 が窓関数、 が何番目の切り出しか、 が周波数の番号です。式(1)が言っているのは、「 番目に切り出した短い音の中に、 番の高さの波がどれだけ含まれているか」を、すべての と について並べた表を作る、それだけです。
この は複素数で、大きさ(成分の強さ)と角度(位相)を持っています。ここから位相を捨て、大きさの2乗 (パワー)だけを残したものがパワースペクトログラムです。
最後の は、要するに「周波数 の正弦波」を表しています。それを信号に掛けて全部足す、というのは内積そのものです。信号がその正弦波と同じ向きに揃っているほど、和が大きくなる。周波数分析の正体は、無数の正弦波との内積を一斉に取る作業です。
窓の長さが、見える世界を決めてしまう
STFTで最初に決めるのは窓の長さです。そしてこれは、後から取り返せないトレードオフを含んでいます。
窓を長くすると、その中に入る波の周期が増えるので周波数の分解能が上がり、近い高さの音を細かく見分けられます。代わりに、その長さの中で起きた変化はすべて1枚に潰れるので、時間の分解能が落ちます。破裂音の立ち上がりのような一瞬の出来事がぼやけます。窓を短くすると、まったく逆のことが起きます。
がおおよそ一定、という関係で、片方を良くすればもう片方が悪くなる。これは実装の都合ではなく、時間と周波数という2つの見方の間にある原理的な制約です。
音声で25ミリ秒窓・10ミリ秒ホップが定番なのは、「この程度の時間なら口や舌の形はほとんど変わらない」という経験則に合うからです。音楽の解析ではもっと長い窓(2048点など)が好まれます。和音の構成音を見分けたいので、周波数側に分解能を寄せるわけです。
窓関数(Hann窓など)を掛ける理由も押さえておきます。信号を四角く切り取ると、切り口で値が急に0に落ちます。この段差は、フーリエ変換の目には「あらゆる高さの成分が薄く混じっている」と映ります。実際には鳴っていない周波数に、偽の成分がばらまかれる。これをスペクトル漏れと呼びます。両端を滑らかに絞る窓関数は、その段差をなくすための細工です。
コメント
コメントにはログインが必要です