ニューラル音声コーデック — EnCodecとLLM音声の土台
MP3やOpusが人手で「捨て方」を設計したのに対し、ニューラル音声コーデックは符号化そのものを学習し、音を有限個の整数トークンに変えます。ベクトル量子化から残差量子化(RVQ)、EnCodecのビットレート計算、そしてVALL-EやAudioLMのような音声LLMがなぜこの上に建つのかまでを、前提知識ゼロから解説します。
High Fidelity Neural Audio Compression
一次資料 — この記事の根拠
この解説の公開 2026-08-25
High Fidelity Neural Audio CompressionarXiv:2210.13438論文ページ·PDFSoundStream: An End-to-End Neural Audio CodecarXiv:2107.03312論文ページ·PDF
Neural Discrete Representation LearningarXiv:1711.00937論文ページ·PDF
AudioLM: a Language Modeling Approach to Audio GenerationarXiv:2209.03143論文ページ·PDF
High-Fidelity Audio Compression with Improved RVQGANarXiv:2306.06546論文ページ·PDF
音を「番号の列」に変える
音声圧縮を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フレームは ビット。400分の1です。連続を捨てて離散にすることが、圧縮の実体なのです。
そしてもう1つ、離散化には圧縮と無関係な効能があります。言語モデルは「有限個の選択肢から次を選ぶ」装置なので、扱う対象が有限の語彙でないと動きません。テキストにトークナイザが要るのとまったく同じ理由で、音にもトークナイザが要る。ニューラルコーデックはその役を兼ねています。
仕組み①: ベクトル量子化(VQ)
エンコーダは畳み込みネットで、時間方向を大きく間引きます。24kHz(1秒24,000サンプル)の音声を320分の1に畳むと、1秒あたり75フレーム。各フレームがD次元のベクトル です。
はエンコーダが出した1フレーム分のベクトル、 はコードブックのj番目の代表ベクトル、 はコードブックの大きさ(よく使われるのは1024)、 は量子化後の値です。要するに式(1)は「手持ちの代表ベクトルの中で一番近いものを選び、その番号 だけを送る」と言っているだけです。受け手は同じコードブックを持っているので、番号から を引き当てられます。
問題は が微分できないことです。勾配がここで途切れると、エンコーダを学習できません。VQ-VAEの解決策は乱暴ですが有効で、順伝播では量子化し、逆伝播では量子化がなかったことにする(straight-through推定)。デコーダに届いた勾配を、そのままエンコーダ出力 の勾配として使います。
その代わり、コードブックと が勝手に離れていかないように縛りを入れます。
は「ここから先へ勾配を流さない」印(stop-gradient)、 はその強さです。要するに第1項が「代表ベクトルをエンコーダの出力に寄せる」、第2項が「エンコーダに、代表ベクトルから離れすぎるなと罰を与える」。互いに歩み寄らせる2本の紐だと思ってください。実装では第1項を勾配で動かさず、使われたベクトルの移動平均でコードブックを更新することも多くあります。
ここで押さえておきたいのは、コードブックが固定の表ではなく学習で作られることです。初期値はk-meansで置き、訓練が進むにつれて「よく出る音の形」の代表が棚に並ぶ。同じ1024色でも、人の声で訓練したコーデックと音楽で訓練したコーデックでは、並んでいる色そのものが違います。学習データの分布から外れた音——訓練になかった楽器、極端な雑音——が苦手なのはこのためで、古典コーデックのように「どんな入力でも一定の質」とはいきません。
コードブックから最も近い1本を選ぶ操作は、埋め込みのベクトル検索そのものです。
コメント
コメントにはログインが必要です