ラベル LAME の投稿を表示しています。 すべての投稿を表示
ラベル LAME の投稿を表示しています。 すべての投稿を表示

2011年2月14日月曜日

LAMEの高音質設定について

関連記事:LAMEパラメータの見直し

以前から、非可逆圧縮音声ファイルの作成にはLAMEを使っている。そしてLAMEのフロントエンドとしてはEACを使っている。
EACは手持ちのCDを丸ごとリッピングする他にも、1曲単位でMP3化する場合でも起動して使用している。LAMEに渡すコマンドラインはEACの「エンコードオプション」に設定済みである。

少し前の話になるが、LAMEの高音質向けパラメータの設定について色々と試したことをチラシの裏に書いておく。
この話のゴールは、LAMEにおける”高音質”パラメータのセッティングを見つけることにある。

以下に前提条件を挙げる。
  • 俺的”高音質”とは、可能な限りオリジナルに近いこと
  • 出力ファイルのサイズは無視する
  • 基本的に屋外での視聴用である
可能な限りオリジナルに近いことを求めるのであれば可逆圧縮を使えば良いのだが、ポータブル機器やカーオーディオなど、PC以外では可逆圧縮フォーマットのサポートが少ない。
(全てをAppleでそろえろ、と言うツッコミはなしだ)

現在、家の車はケンウッドのMP3対応カーオーディオである。
車内におけるMP3再生音のチェックのために、ビリー・ジョエルのベスト盤2枚組みCDを1枚のCD-Rに焼いたことがあった。
「おぉ、これじゃあCDチェンジャーユニットいらねーじゃん」 と感嘆したものだった。
最新のカーオーディオではFlac対応が広がりつつある。搭載されるマイコン(CPU)のパワーに余裕ができたのだろうか。
出力ファイルのサイズを無視することについては語るまでもないだろう。保存メディアの単価の下落を考えれば、数十MB程度のサイズの違いは気にしないことにする。

その1:ビットレートについて

一般に「128か192kbpsで充分だよ」と言われるが、俺の場合、192k以下はオリジナルとの違いがはっきり認識できてしまうので、192k以下は無理だ。
(自分がゴールデン・イヤーを持っていると言う自慢ではないので、誤解の無きように)

となると、選択肢は 256k、320k となる。ほとんどのMP3対応機器の上限が320kだからである。
実際に色々なジャンルの曲をピックアップして、256k、320k の聴感テストを実施したところ、やっぱり256kでももの足りない。一番わかり易いのがシンバルの音で、高音のキラキラ感や叩いた後の残響音がどうしても不自然に感じる。
320kについては、オリジナルのWAVファイルと聞き比べることで違いが分かるが、屋外での視聴を考えると、これ以上追求しても無意味なレベルにあると言える。
と言うことで、LAMEによる出力は320kbpsとすることにした。

その2:VBR or CBR

俺的には、VBRは出力ファイルのサイズを減らす目的として使うものとしか考えていない。もしかすると、音質に対して何らかの影響を与えるのかもしれないが、ここでは追求しない。
CBRにて最初から最後まで同じビットレートを使うことは無駄なのかもしれないが、先の前提条件としてファイルサイズは無視している。また、固定ビットレートの方が可変ビットレートよりも、MP3ファイルのデコード処理に必要なプロセッサ負荷が低いのでは?と考える。
プロセッサ負荷が低いと言うことはポータブル機器においてバッテリーの持ちに影響すると考えている。
従って、LAMEによる出力は固定ビットレート(CBR)とすることにした。

その3:各種のフィルター処理について

LAMEのホームページや、LAMEに付属するドキュメントを読むと、”音響心理”的な処理によって色々と頑張っていることが書かれている。
平たく言えば、「どーせ聞こえないんだから、データを削っても問題無し!」となる。
先の前提条件では、限りなくオリジナルに近いことを目指している。つまり、いかに優れたロジックであっても、勝手にデータを削られては困るのである。
そこで、各種のフィルター処理を全く使用しない設定を探ることにした。
(LAMEの開発者の方々には申し訳ないが、こういうユーザーもいるってことで)

ここからが本当のセッティング地獄の始まりである。 ドキュメントのコマンドラインの説明を何度読んだことか。
いい加減、パラメータ編集にも飽きたころ、ふと、思い出した。そーだ、LAMEはオープンソースだったじゃないか!処理の内容が分からなかったら、ソースを読めば良いのだ!
と言うことで、俺はLAMEのソースを読み始めたのだった。

結論から言うと、プリセットパラメータの”--preset insane”が目的の処理に使えることが分かった。
俺はソース中で各種フィルターの設定に用いる構造体を見つけた。コマンドライン引数から”insane”が渡された場合、この構造体の各メンバーには 0.0 もしくは 1.0 が設定されることが分かった。
つまり、パラメータとして 0 もしくは 1 が設定された各種の処理フィルターは”何もしない”のである。
また”--preset insane”は、同時に CBR、320kbps となるので、俺の狙い通りとなり、願ったり叶ったりである。
ところで、各種の音響心理的処理と、ハイパス・ローパスフィルターは区別されているので、続いて、2つのパスフィルターを無効にする。
これには”-k”オプションを使用するが、これは Ver 3.97 までの話で、Ver 3.98 以降では廃止されてしまった。そこで、この”-k”オプションの代わりを探した時の話がこれである。

その4:エンコード品質について

エンコード品質については”-q”オプションでコントロールされる。ドキュメントによると、エンコード品質は、エンコード時の速度とのトレードオフになるそうだ。
とは言え、今時のPCであれば演算のための計算機資源は充分であるので、「一番良いやつで、頼む」となる。
”-q 0”と指定すると、最高品質でエンコードしてくれるそうだ。但し、ドキュメントによると「”-q 0”の指定は多少バギーかもね(てへ)」と書いてある。
しかし、俺は”-q 0”を指定するとLAMEが落ちるとは考えていない。丁度、JPEG圧縮のように、アルゴリズムとデータの内容によっては、偽色やノイズが発生するようなものと考えている。
つまりLAMEの場合ではオリジナルに無い音(ノイズや別の音)が発生することだと思う。
ただ、JPEG圧縮の例の場合、圧縮率が高い場合に色々な不都合が顕在化するので、俺のLAME設定の場合、圧縮率は充分に低いので、多分大丈夫だと思い込む。
と言うことで、エンコード品質は”-q 0”と指定することにする。

その5:結論

先の前提条件と、これまでの調査・実験結果より、俺的LAMEパラメータ設定は、
  • CBR、320kbps
  • 音響心理的アルゴリズム:全てOFF
  • ハイパスフィルター、ローパスフィルター:全てOFF(使用しない)
  • エンコード品質:最高品質
となった。

このパラメータ設定をLAMEのコマンドラインで表すと、
  • (Ver 3.97まで) -k -q 0 --preset insane
  • (Ver 3.98以降) -q 0 --preset insane --highpass -1 --lowpass -1
となる。

その6:備考

何事にしても、自分だけのセッティングを見つけると言う行為は、男子たるものの宿命なのだろう。
(全ての男子とは言わないが)

良い意味での”こだわり”か、悪い意味での”こだわり”と言う自己満足か、そのどちらもだろう。
こうしてブログに書き留めておくのは、自分自身のため(チラシの裏)であり、”こだわり”を持った他者へのメッセージでもあるのだろう。

関連記事:LAMEパラメータの見直し

2011年2月10日木曜日

LAMEパラメータの見直し

関連記事:LAMEの高音質設定について

久々にLAMEのパラメータ設定を見直してみた。

今まではEAC + LAME (Ver 3.97)で320kbpsのMP3ファイルでライブラリ化していた。
今日までVer 3.97を使い続けていたのには訳がある。

今まではEACの「エンコード オプション」にて、
-k -q 0 --preset insane %s %d
としていた。(なお、%s %d はEACのオプションである)

-k は、フィルタを使用せずに全てのバンド幅を対象とするパラメータである。
ところがLAMEのVer 3.98以降は-kパラメータが使用できなくなってしまった。

少し前に、Ver 3.98における-kの代替案をテストしたが、当時はどうしてもLowpassフィルタをdisableにできなかった。-kが使えないことで少し焦っていたようだった。

今日は少し頭を冷やして、ソースコードからあたることにした。
最新のVer 3.98.4のソース一式をDLして、全ソースファイルに"argc"にて検索をかけた。すると、main.c、parse.cがヒットした。

parse.cを参照すると、確かに、-k使用時のエラーメッセージがあり、そのそばのコメントに
Highpass、Lowpassパラメータに-1を渡せ
と書いてあった!

そこで、新しく --highpass -1 --lowpass -1 と指定すると、-kの使用時と同じく”ポリフェーズ ローパスフィルタ OFF”と表示された。(パチパチ)

続いて、エンコード結果の検証を行なった。
テストデータとして、クリス・レアの「オン・ザ・ビーチ」を使って、周波数スペクトルを調べた。

図1:オリジナル

図2:LAME Ver 3.97

図3:LAME Ver 3.98.4

いずれのエンコード結果も、中低音域のスペクトル波形はオリジナルとほぼ同じとなった。
高音域(16k~20k)ではVer 3.98.4の方がオリジナルに近いスペクトル波形となった。


ということで、これからはVer 3.98.4のLAMEを使うことにする。

そしてEACの「エンコード オプション」は、
-q 0 --preset insane --highpass -1 --lowpass -1 %s %d
とする。

関連記事:LAMEの高音質設定について