記事を書いた後で調べたところ、Roberto's public listening testsやSebastian's Public Listening Testsなど、パブリックリスニングテストを公開しているサイトがあった。一応記事は残しておくが、音質の評価については、筆者1人をサンプルとしたいい加減なテスト結果を当てにせず上記リンク先を参照して欲しい。
ビットレートに関しては、MP3の場合192kbpsもあれば十分。生のWaveファイル(CD音質で44100Hzx16bitx2ch=1411kbps)が5分で約42MB、128kbpsで5MB弱、192kbpsで7MB強、256kbpsだと10MB弱だが、高音域の再現性にどうしてもこだわりたい場合や利用者による音の加工を歓迎したい場合は、可逆圧縮を使うのも手。可逆圧縮だと派手な音(音圧が高くて高音域が厚い)ほど圧縮しにくい傾向があるのだが、そういう音は非可逆圧縮でもハイビットレートでないと歪みやすい。音質の表現は再生環境に強く影響され、実際のところ、へっぽこな機器を使って小さめのボリュームで再生するなら、128kbpsでも非可逆圧縮と区別がつかない。
一応サンプルファイルも用意した(次の項目で説明するファイルも含まれている)。kanon_f_200.apeは前述のfluid-mixの音をTimidity++のアンプ200%で録音、kanon_e_150.apeは同じく前述のeaw-mixの音をTimidityのアンプ150%で録音したもの。Monkey's Audio はバージョン3.99を使用し、圧縮レベルは標準に設定した(高圧縮設定にしても、処理が遅くなるばかりであまりサイズが縮まない)。最後のサステインの違いを反映してか、fluid-mixの方が3秒ほど録音時間が長い。fluid-mixの方が音圧を稼ぎやすく250%くらいまでいける。また、音圧が高い分あまり圧縮が効いていない。eaw-mixは15秒過ぎ(と55秒過ぎ)にノイズっぽい波があって150%がギリギリ。一瞬のドンヅキを無視すれば200%くらいまでいける。以下すべてのファイルでfluid-mixは200%、eaw-mixは150%の録音レベルを用いた。
kanon_f_gogo.MP3とkanon_e_gogo.MP3は、Timidity++の機能を使ってgogo.dll(バージョン3.13a)から出力したもの。ビットレートは128kbpsのCBR、サンプルレート44100Hz、エンファシスなし、ジョイントステレオにしてある(比較のため、以下すべてCBR+ジョイントステレオ+エンファシスなしのサンプルレート44100Hzで録音)。心理音響モデルは、gogo.dllでもlameでも、最近のバージョンではオフにできない設定になっている模様(コンパイルオプションを変えてリコンパイルしないとオフにできないらしい)。あまり関係ないが、デフォルトで出力したらID3タグの「ジャンル」の項目が「アニメもの」になっている。Timidity++の仕業かgogo.dllの仕業かは知らないが、なかなか粋な初期設定だ。
kanon_f_128.MP3とkanon_e_128.MP3は、Lifeからlame(バージョン3.96.1)に、エンコード速度2(デフォルト値)+心理音響モデルあり+プリセットなしで出力したもの。後ろの数字がそれぞれ192・256となっているのは、同じ設定でビットレートだけを上げたもの。VBRなどを使えば、同じファイルサイズでもより音質を上げられる。ひと手間かけただけあって、gogo.dllから出した音と比べると明らかによい。これは、gogo.dllの性能がlameに劣っているということを示すものではなく、ビットレートと音質のコストパフォーマンスに多少目を瞑って処理速度を優先しているだけの話。以前はエンコード速度0(最高音質モード)でエンコードしたファイルを掲載していたが、lameの3.96.1はにバグがあり、ノイズが乗ることがあるらしいのでサンプルを差し替えた。
筆者の耳だと、Lilithのバージョン0.991で再生してCreativeのSound Blaster PCI-128(もらい物:ありがとうHGW)から松下のSA-AK15(もらい物:ごく普通のいわゆる「ステレオ」だが、メンテが悪かったのかもともとそんなものなのか「3万円クラスのラジカセよりはサイズの分よく鳴ります」程度のモノ)を通してaiwaのHP-X122(実売1500円の激安ヘッドフォン)で聞くと、可逆圧縮とlame128kbpsの違いは大音量でもほとんど気にならない(せいぜい「演奏している部屋が変わった」ような気がする程度:プラセボ効果もあるので誤差みたいなものだろう)。スピーカーから大音量を出して正面で聴くのであればまた話が違ってくるが、実際にはそんなことはめったにしない(というか、近所迷惑なのでできない)。ということで、冒頭には192kbpsという数字を出したが、筆者が自分の部屋で聴く分には128kbps(せいぜい欲張っても160kbps)で十分だったりする(まあ、筆者の場合貧乏すぎて再生環境が非常にアレなので、あまり参考にはならないかもしれないが)。
lameの設定(コマンドラインオプション)や変換時の注意については、詳細な解説がいくつもあるのでそちらを参照。MP3はLAMEでエンコして、コマンドラインオプションを語れ!、AnonymousRiver Siteのspellbound、スラッシュドットジャパンのttさんの日記(既出のものも再掲)あたりには目を通しておくとよいだろう。
再生環境が少しマトモになったので、改めて聴き比べをしてみた。ファイルは上の項目で使ったものと同じ。CreativeのサウンドカードSB Audigy LSから出した音をsonyのLBT-V610(通称リバティ:1990年ごろのモデルなので17年選手、スピーカは背面バスレフ式3ウェイ2ユニットで体積は多分20リットルくらい)のアンプとスピーカで再生した。前回同様、再生にはLilithのバージョン0.991を使った。擬似ブラインドテストとして、比較対象となる2つの音源をそれぞれ聞き込んでからループ再生モードにして、目を瞑ったまま次曲ボタンを連打してどちらが先に演奏されるかわからなくした上で、交互に再生してみてどちらがどちらのファイルか当てるという実験も行ってみた。
Waveファイル(ape形式に圧縮して配布している)とMP3ファイルは以前使ったファイルをそのまま流用した。Ogg Vorbis(v1.1.0)のエンコードにはLilithを使用(Audio Encoderのものより高速で音質もよかった)。ACCはiTunesを使った。oggとACCはデフォルト設定からビットレートだけを変更している(ACCの「VBRエンコーダを使う」や「音声ファイル用に最適化」のチェックは入れていない)。ファイルの再生にはLilithを使用し、ACCファイルおよびその比較対象ファイルの再生はVLCプレイヤーで行った。
まず圧縮vs非圧縮だが、MP3(lame)の256kbbsモードでもわずかに空気が変わる。圧縮ファイルには微妙なわざとらしさというか、やや不自然な「音がヌケてます感」がつく。擬似ブラインドテストは10回やって1回間違えた。
MP3同士の比較では、lameの128kbpsが午後のこ~だの128kbpsに圧勝した。比較にならないくらい違うので擬似ブラインドテストは行っていない。lameの198kbpsと256bpsでは、198kbpsの方が微妙にライブ感が落ち、艶もやや鈍る。擬似ブラインドテストは、やはり10回やって1回間違えた。Waveとの差も広がっている。
ogg(設定0.6:公称220kbpsだがファイルサイズ的に192kbps相当)とMP3(lame:192kbps)の比較はかなり微妙。間違いが多すぎて擬似ブラインドテストが成立しなかった(5回やって3回間違えた時点でやる気をなくした)。AACの192kbbsは、Lilithでm4aファイルを読めないため擬似ブラインドテストは行わなかったが、oggやMP3よりも艶があるような気がする(擬似とはいえブラインドテストをやっていないので何とも言えないが、生Waveとも聴き比べたところ、意図的に艶を過剰演出しているのかもしれない)。
ogg(設定0.4:公称172kbpsだがファイルサイズ的に128kbps相当)とMP3(lame:128kbps)はそこそこ違い、擬似ブラインドテストは5回やって1回間違い。MP3の方が金物の音に重みがある(理屈上はMP3の方が高域が削れるので、その影響かもしれない)。AAC(128kbps)とMP3(lame:128kbps)だと、やはり擬似ブラインドテストは行っていないが、AACが明らかに音がよい。
さんざんテストしてから気付いたのだが、テスト用のサンプルとしてサウンドフォントから録音した音というのは(事前にさんざん加工されているので)あまり適切でなかった(一応、スペアナで「上まで音が出ている」ことは確認済み)。今度機会があったら、楽器別やスタジオ録音/ライブ録音別、音楽のジャンル別で聞き比べてみたい。とはいえ「音が変わるか否か」の判定自体は一応できたので、とりあえずよしとしたい(身体的にも精神的にもかなり大変だったし)。
上記のチョンボにめげず結論めいたものも一応書いておく。128kbpsではAACが優秀。低ビットレートの制限にAACのコンセプトが噛み合った結果だろう。192kbpsは接戦だが、原音に忠実な分やや艶の落ちるMP3やoggに対し、AACは忠実さよりも「圧縮ファイルなりの高音質」を選択しているように思える(デコード時に「圧縮後にこんな波形だから、圧縮前はこうだったはず」というような予測をして響きを補っているのかもしれない)。
160/192/256kbpsあたりの使い分けはけっこう微妙で、「サイズはさほど変わらないのだから余裕のある256kbpsで」というのにも説得力はあるし「音質の差が問題になることはまれなのだからサイズの小さい160kbpsで」というのも一理ある。用途の問題もあるが、好みや気分の占める割合も大きいだろう。ちなみに160:192:256=1:1.2:1.6=0.833..:1:1.33..=0.625:0.75:1である。
可逆圧縮vs非可逆圧縮については、非可逆圧縮すると音が変わるのは間違いないが、筆者が所有している程度の機材と聴覚では、192kbps前後の非可逆圧縮で実用上問題になるような劣化はほとんど現れない。スピーカの前に姿勢を正して座って、最初から音に違いがあることを前提に、両方の音を耳に焼き付けて、神経が磨り減るほどの集中力を使って、大音量の音声を繰り返し聴いて、それではじめて聴き取れる程度の違いである。
またこれは、シンバルのような高域に繊細な音が含まれる楽器を録音してあるから判別がつくのであって、記録されている周波数が低いとほとんど判別がつかない。サンプルファイルの中に、サイレントギター(ARIAのSinsonido)をライン録音して128kbpsと64kbpsのmp3に圧縮したもの(guitarで始まるファイル名:15KHzから上はほとんど音が入っていない)を用意したが、ブラインドで判別できる人はどれだけいるだろうか(筆者はほとんどわからなかった)。このことから、録音されている周波数が低ければ、ビットレートはあまり上げなくても済むだろうと考えられる。
たとえば64kbpsのジョイントステレオは、32kbpsのモノラル2本を左右に振ったもの(64kbpsの完全なステレオと同義)よりは音質がよく、64kbpsのモノラル2本を左右に振ったもの(128kbpsの完全なステレオと同義)よりは音質が悪いはずである。冷静に考えれば当たり前のことなのだが、多少注意が必要なので触れておく。
ジョイントステレオは、左右チャンネル独立データ(discrete方式)と左右和+左右差データ(Middle Side方式)を併用する(jointさせる)記録方法である。左右の音圧は1次のスカラ量なので、和と差が記録されていれば簡単な一次方程式で完全に復元できる(ちなみに、ミドルサイドはもともとステレオマイキングの形式を指す言葉で、無指向性マイクによるミドルの出力と横向き双指向性マイクによるサイドの出力を加算する方法である)。
左右チャンネルの音声が似通っていれば左右差は常にゼロに近い値になり、低いビットレートでも再現度を高められるデータになる(圧縮が効きやすい)。左右チャンネルにまったく無関係な音声が入っていると左右差はホワイトノイズに近い分布を示し、圧縮が効きにくくなる(左右のチャンネルを独立に圧縮した方が効率がよくなる)。
左右チャンネルの音声がまったく異なり常に独立データモードで圧縮された場合、64kbpsのジョイントステレオは32kbpsのモノラル2本の音質と等しくなるはずである(妙な誤解があるようだが、これ以上の悪化はない)。反対に、左右にまったく同じ音声が入った音源を常に左右差ゼロのミドルサイドモードで圧縮する場合、少なくとも理論上、64kbpsのジョイントステレオを64kbpsのモノラル2本とほぼ同等の音質にできるはずである。
実際には2つのモードが適宜使い分けられるため、結果的に、64kbpsのジョイントステレオは32kbpsモノラル2本と64kbpsモノラル2本の中間くらいの音質になる(どちら寄りになるかは元の音源次第)。独立データモード部分とミドルサイドモード部分では前者の方が音質的に苦しいため、できれば可変ビットレート(VBR)にしてこの部分をサポートしてやるべきなのだろう(実験はしていないが、モード切替え部分でシンバルなどの質感が変わってしまう可能性を排除できない)。
しかし、mp3の場合黎明期にCBRのみの対応が主流だったため、VBRの採用に抵抗がある人も多いのではないかと思う(2008年現在においても、シークなどで扱いが面倒になるケースがある)。そういう筆者も、128kbpsのVBRにするくらいなら192bpsのCBRにしてしまう(ギリギリまでファイルサイズを削る必要性がないのなら、このように力技で対応するのも1つの解だと思う)。Ogg Vorbisなど比較的新しい形式であれば最初からVBRを使う設定になっているものが多く、この辺に気を使う必要があまりない。
現在、互換性優先のデータはCBRジョイントステレオのmp3、対応アプリケーションでだけ読めればよいデータはOgg Vorbisというのが筆者の使い分けである(CBRとVBRを切り替えながらmp3だけ使う案もあるのだろうが、設定が煩雑になりうっかりミスも考えられるので、筆者はコーデックごと使い分けている)。また、当然ではあるが、モノラルデータが必要な場合は先にミックスダウンしてから圧縮した方が圧縮してからミックスダウンするよりも有利である。
高域について、上記の設定で44.1KHz/192kbpsのmp3(lame)だと「Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz」という表示が出る(同じ条件でビットレートだけ128kbpsにすると「17249 Hz - 17782 Hz」という表示になり、48KHzの192kbps/128kbpsでは「19548 Hz - 20129 Hz」/「17226 Hz - 17806 Hz」である)。
実際にホワイトノイズ(左右のチャンネルに同じ音が入ったステレオファイルで、-6dbにノーマライズした)を圧縮した波形をスペアナ見ると、192kbpsで19KHz、128kbpsで17KHzあたりから上がばっさり切れている。Ogg Vorbisの設定0.4(128kbps相当)は18900Hz、設定0.6(192kbps相当)は48KHzにローパスフィルタが自動設定されるが、実際には設定0.6で18.5KHzから21KHzにかけて加速をつけながら減衰し(20KHzで5db、21KHzで20dbくらいの減衰)それより上はばっさり、設定0.4だと18.5KHzあたりから上がばっさり切れる。サンプルファイルのwn441で始まるファイルがテスト結果である。
数字だけ見るとOgg Vorbisがえらく優秀だが、高域の音を残すために何らかの犠牲は払っているはずで、ホワイトノイズの再現性がよいことが即高音質につながるわけではないことに注意。また、蒼弓さんという方がチューニングしたaoTuVというOgg Vorbis互換エンコーダがあり、評判が非常によい(2008年10月現在、フロントエンドのoggdropXPdはRareWaresなどで入手できる)。2004年から、aoTuVのコードはオフィシャルなエンコーダー(バージョン1.1以降)にも取り込まれている。
オーバーシュートは、mp3の192kbpsで3.9db、128kbpsで3.6db、Ogg Vorbisの設定0.6で4db、設定0.4で5dbだった。元の信号がホワイトノイズなのでかなり大きく歪んだが、通常ここまで大きくオーバーシュートすることはほとんどない。反対に言うと、上記の値くらいのマージンをとっておけば、クリップの心配がほぼなくなる。
非可逆圧縮を繰り返すとステップ応答やパルス応答が乱れ、アタックがややぼやける。Waveを1回だけ圧縮したファイルとその後mp3をWaveに戻してまた圧縮する作業を5回繰り返したファイル(Audacityからlameを使用、192Kbps)を用意したので各自確認してみて欲しい(繰り返し圧縮したファイルはピーク音圧が下がっているが、上下反転してから合成してみればわかるように、アタック部分以外の音量はほぼ同じである)。擬似ブラインドテストは行っていないが、このくらい違えばブラインドでも気付く人はけっこういると思う(ギターはアタックが明確な楽器なので変化が目立っているが、ヴォーカルだけならもう少しわかりにくくなるだろう)。2回や3回なら実用上の支障はないと思うが、あまり頻繁に圧縮を繰り返すのはよくないようだ。
非可逆圧縮はファイルの最初に無音が挿入される仕様のものが多い(プリギャップといい、エンコーダ由来のエンコーダディレイとデコーダ由来のデコーダディレイに内訳される:lameで試したところ、48KHzサンプリングでも44.1KHzサンプリングでも192kbpsでも128kbpsでも、CBRならトータル1105サンプルだった)。lame3.87時代のものだが、エンコーダ別のギャップをまとめたサイトがある。曲間のギャップを埋めるコマンドラインオプション(-nogap)はあるが、単発エンコードでギャップレスにするオプションは筆者が探した限り見つからなかった。なお、mp3が扱うコンテナという単位に合わせるために、ファイルの最後もパディングされる(=1コンテナに満たない部分が0で埋められる=微妙に長くなる)。Ogg Vorbisは仕様上プリギャップなし(ギャップレス)の圧縮に対応している。