JA EN
体系音声圧縮
·★ 会員·論文·17分で読めます

ニューラル音声コーデック — EnCodecとLLM音声の土台

MP3やOpusが人手で「捨て方」を設計したのに対し、ニューラル音声コーデックは符号化そのものを学習し、音を有限個の整数トークンに変えます。ベクトル量子化から残差量子化(RVQ)、EnCodecのビットレート計算、そしてVALL-EやAudioLMのような音声LLMがなぜこの上に建つのかまでを、前提知識ゼロから解説します。

対象textタスクcompression

High Fidelity Neural Audio Compression


音を「番号の列」に変える

音声圧縮を1からで見たとおり、MP3やAACは人間の耳の性質を人手で調べ上げ、「聴こえないから捨ててよい成分」を数式で切り分ける装置でした。マスキング曲線もMDCTもビット割り当ても、技術者が設計した部品です。

ニューラル音声コーデックは、この設計をネットワークに肩代わりさせます。波形を小さな表現に畳むエンコーダと、そこから波形を組み立て直すデコーダを大量の音声で同時に訓練し、捨て方は「戻したときの聴こえ方」だけを目標に学ばせる。

これだけなら「少し性能の良い圧縮」で終わります。効いたのは副産物のほうでした。中間表現が有限個の整数になっている。1秒の音声が、たとえば600個の番号の列になる。それは文章と同じ形で、言語モデルがそのまま食べられる

VALL-EのようなTTS、AudioLMのような音声生成、MusicGenのような音楽生成、そして電話のように話せるリアルタイム会話AI。いま音を出すAIのほとんどが、この「音を番号にする層」の上に建っています。圧縮器としてよりも、語彙製造機として重要になったのです。

比喩: 決まった色鉛筆セットで描き直す

送り手と受け手が、まったく同じ1024色の色鉛筆セットを持っているとします。絵を送るとき、色そのもの(RGBの数値)は要りません。「この点は347番」と番号だけ伝えれば、受け手は同じ鉛筆で塗れます。色は完全一致しませんが、1024色あれば近い色は必ず見つかる。これがベクトル量子化です。

もちろん誤差は残ります。そこで2本目の工夫が出てきます。塗り残った差の分だけを、別のセットの鉛筆でもう一度塗る。それでも残った差を、3本目でまた塗る。段を重ねるほど元の色に近づき、送る番号も1個ずつ増える。これが残差量子化(RVQ)で、ニューラル音声コーデックの心臓部です。

大事なのは途中で止められることです。3本目までなら荒いが軽い、8本目までなら精密だが重い。同じ仕組みのまま品質とビットレートを選べる——この性質が、あとで効いてきます。

直感: なぜ「連続」を捨てて番号にするのか

エンコーダの出力は、そのままなら実数のベクトルです。128次元をfloat32で持てば1フレーム4096ビット。圧縮になりません。これを「1024個の代表ベクトル(コードブック)のうち何番目か」に丸めれば、1フレームは log21024=10\log_2 1024 = 10 ビット。400分の1です。連続を捨てて離散にすることが、圧縮の実体なのです。

そしてもう1つ、離散化には圧縮と無関係な効能があります。言語モデルは「有限個の選択肢から次を選ぶ」装置なので、扱う対象が有限の語彙でないと動きません。テキストにトークナイザが要るのとまったく同じ理由で、音にもトークナイザが要る。ニューラルコーデックはその役を兼ねています。

仕組み①: ベクトル量子化(VQ)

エンコーダは畳み込みネットで、時間方向を大きく間引きます。24kHz(1秒24,000サンプル)の音声を320分の1に畳むと、1秒あたり75フレーム。各フレームがD次元のベクトル zz です。

k=argminj{1,,N}zcj2,z^=ckk = \arg\min_{j \in \{1,\dots,N\}} \lVert z - c_j \rVert_2, \qquad \hat{z} = c_k
(1)

zz はエンコーダが出した1フレーム分のベクトル、cjc_j はコードブックのj番目の代表ベクトル、NN はコードブックの大きさ(よく使われるのは1024)、z^\hat{z} は量子化後の値です。要するに式(1)は「手持ちの代表ベクトルの中で一番近いものを選び、その番号 kk だけを送る」と言っているだけです。受け手は同じコードブックを持っているので、番号から ckc_k を引き当てられます。

問題は argmin\arg\min が微分できないことです。勾配がここで途切れると、エンコーダを学習できません。VQ-VAEの解決策は乱暴ですが有効で、順伝播では量子化し、逆伝播では量子化がなかったことにする(straight-through推定)。デコーダに届いた勾配を、そのままエンコーダ出力 zz の勾配として使います。

その代わり、コードブックと zz が勝手に離れていかないように縛りを入れます。

Lvq=sg[z]ck22+βzsg[ck]22\mathcal{L}_{\mathrm{vq}} = \lVert \mathrm{sg}[z] - c_k \rVert_2^2 + \beta \lVert z - \mathrm{sg}[c_k] \rVert_2^2
(2)

sg[]\mathrm{sg}[\cdot] は「ここから先へ勾配を流さない」印(stop-gradient)、β\beta はその強さです。要するに第1項が「代表ベクトルをエンコーダの出力に寄せる」、第2項が「エンコーダに、代表ベクトルから離れすぎるなと罰を与える」。互いに歩み寄らせる2本の紐だと思ってください。実装では第1項を勾配で動かさず、使われたベクトルの移動平均でコードブックを更新することも多くあります。

ここで押さえておきたいのは、コードブックが固定の表ではなく学習で作られることです。初期値はk-meansで置き、訓練が進むにつれて「よく出る音の形」の代表が棚に並ぶ。同じ1024色でも、人の声で訓練したコーデックと音楽で訓練したコーデックでは、並んでいる色そのものが違います。学習データの分布から外れた音——訓練になかった楽器、極端な雑音——が苦手なのはこのためで、古典コーデックのように「どんな入力でも一定の質」とはいきません。

コードブックから最も近い1本を選ぶ操作は、埋め込みのベクトル検索そのものです。

FIG 1クエリをドラッグすると、選ばれる近傍が入れ替わる。ベクトル量子化はこの「最も近い1本」を毎フレーム引き当てて、その番号だけを送る操作です(コーデックが使うのはL2距離)

1つのコードブックで送れる情報は、1フレームあたり ビットだけです。1024色なら10ビット。音楽の細部にはとても足りません。

この先にあるもの

§

ここから先は会員限定です

解説記事371本・教科書26章・学生モード48単元・論文精読6本が、月額¥490ですべて読み放題になります。新しい解説は毎日3本ずつ増えます。いつでも解約でき、解約後も期間の終わりまで読めます。

会員の方はログインすると続きが表示されます

参考文献

  1. High Fidelity Neural Audio Compression. arXiv:2210.13438論文ページ·PDF
  2. SoundStream: An End-to-End Neural Audio Codec. arXiv:2107.03312論文ページ·PDF
  3. Neural Discrete Representation Learning. arXiv:1711.00937論文ページ·PDF
  4. AudioLM: a Language Modeling Approach to Audio Generation. arXiv:2209.03143論文ページ·PDF
  5. High-Fidelity Audio Compression with Improved RVQGAN. arXiv:2306.06546論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です