音声圧縮を1から — 聴こえない音を捨てる技術
MP3はなぜ1/10以下のサイズで「同じように」聴こえるのか。聴覚マスキング→MDCT→ビット割り当ての順で音声コーデックの原理を前提知識ゼロから解説し、MP3/AAC/Opusの使い分けまでつなげる。
生の音は思ったより重い
音は空気の圧力が細かく揺れる波です。マイクはこの揺れを電圧に変え、ADコンバータが一定間隔で電圧を測って数値の列にします。CD品質なら1秒間に44,100回、1回の測定を16ビットで、それをステレオ2チャンネル分。掛け算すると 44,100 × 16 × 2 = 約141万ビット/秒、1分あたり約10MBです。5分の曲で50MB——スマホで音楽が聴き放題になる世界は、このままでは来ませんでした。
MP3の定番設定である128kbpsは、この約1/11です。ZIPのような可逆圧縮(元に完全に戻せる圧縮)では、音声波形はほとんど縮みません。波形の数値列は一見ランダムに近く、繰り返しパターンがほぼ無いからです。桁を1つ落とすには「完全に戻せる」ことを諦め、何かを捨てるしかない。では何を捨てるか。音声コーデックの答えは明快で、人間の耳に聴こえない音を捨てます。
比喩: 電車の中のささやき声
静かな部屋でなら聴こえるささやき声も、走る電車の轟音の中では消えます。声は物理的には存在しているのに、知覚されない。これが聴覚マスキングです。耳の内部では、大きな音が鳴ると基底膜という器官のその周波数付近の感度が占有され、近くの小さな音の情報が脳に届かなくなります。
コーデックが利用する性質は2つあります。
- 周波数マスキング: 大きな音は、周波数が近い小さな音をかき消す。1kHzの大きなトーンが鳴っている間、そのすぐ隣の周波数の小さな音は聴こえない。影響の届く範囲は「臨界帯域」と呼ばれる耳の解像度の単位で決まる。
- 時間マスキング: 大きな音の直後(そしてわずかに直前)の小さな音も聴こえない。シンバルが鳴った直後の数十ミリ秒、耳は「回復中」で細かい音を拾えない。
つまり人間の耳は高性能ですが、穴だらけの測定器です。音声コーデックはこの穴の地図——心理音響モデル——を信号ごとに計算し、穴の中にだけ劣化を押し込みます。
直感: 捨てるのではなく「雑音を隠す」
正確に言うと、コーデックは音を選んで「削除」しているわけではありません。やっているのは数値を粗く丸めること(量子化)です。丸めればビット数は減りますが、丸めた分だけ元との差、つまり量子化雑音が生まれます。音声圧縮の本質は、この雑音をマスキングの傘の下に隠すことです。
心理音響モデルは周波数帯域ごとに「ここでは雑音がこのレベル以下なら聴こえない」というマスキング閾値を計算します。信号の強さと閾値の比(SMR: signal-to-mask ratio)が大きい帯域は丁寧に(多ビットで)、小さい帯域は雑に(少ビットで)量子化する。全帯域で雑音が閾値の下に収まれば、データは1/10でも耳には元と区別がつかない——これが「聴こえない音を捨てる」の正体です。
この「周波数に変換して、粗く丸めて、劣化を知覚の穴に押し込む」という三段構えは、JPEGが画像でやっていることとまったく同じ構造です。丸めの荒さを上げると何が起きるかは、画像のほうが目で見えるぶん体感しやすいので、ここで触ってみてください。
仕組み: MDCT — 継ぎ目なくブロックを刻む
周波数帯域ごとに丸めの粗さを変えるには、まず波形を周波数成分に分解する必要があります。音は刻々と変わるので、波形を短いブロック(たとえば2048サンプル≒43ミリ秒)に切って、ブロックごとに変換します。
コメント
コメントにはログインが必要です