Androidのビットパーフェクトオーディオ:神話 vs 現実
Androidでのビットパーフェクト再生の本当の意味、思った以上に難しい理由、オーディオチェーンが密かに音楽をリサンプリングしていないか確認する方法。
ビットパーフェクトとは?
ビットパーフェクト再生とは、DACに届くオーディオデータがソースファイルに保存されているものと同一であることを意味します。類似ではありません。「十分近い」でもありません。ビット単位で同一です。
信号が真にビットパーフェクトであるためには、デコーダー出力とDAC入力の間のオーディオチェーンで何もデータを変更してはなりません。つまり:
- リサンプリングなし。44.1 kHzのファイルは48 kHzではなく44.1 kHzで再生される。
- ボリューム調整なし。デジタルボリュームスケーリングはサンプル値を変更する。
- DSP処理なし。EQ、クロスフィード、ReplayGain、リミッティング — これらすべてが信号を変更する。
- ディザリングなし。量子化アーティファクトをマスクするためにノイズを追加してもデータは変わる。
チェーンのどの段階でも1つのサンプルでも変更されれば、出力はもはやビットパーフェクトではありません。これは二値的な性質です — 「ほぼビットパーフェクト」というものは存在しません。
なぜこれが重要なのか?すべての変換にはある程度のエラーが導入されます。リサンプリングは補間アーティファクトを追加します。ボリュームスケーリングは実効ビット深度を減少させます。高品質な処理でも処理であることに変わりありません。高解像度ソースファイルと対応DACに投資したリスナーにとって、オリジナル信号の保持がすべてのポイントです。
AndroidがビットパーフェクトtoBeを困難にする理由
Android上のすべてのオーディオアプリは、AudioFlingerと呼ばれるシステムコンポーネントを通過します。これはオーディオミキサーおよびルーター — スマートフォン上のすべてのアプリからオーディオを取得し、ハードウェア用の単一の出力ストリームに統合する中央ハブです。
問題は、AudioFlingerがオーディオのサンプルレートについて独自の意見を持っていることです。ほとんどのAndroidデバイスはAudioFlingerを48 kHzで構成しています。音楽が異なるレートの場合 — CD品質の44.1 kHz、ハイレゾの96 kHz — AudioFlingerはデバイスの構成レートに合わせてリサンプリングします。
このリサンプリングは静かに行われます。音楽プレーヤーは「再生中:44.1 kHz FLAC」と表示するかもしれませんが、DACに届く実際の信号はオペレーティングシステムによって48 kHzに変換されています。ほとんどのプレーヤーはこれが起こっていることすら知らず、ましてやあなたに知らせることもありません。
Androidのオーディオパスは次のようになっています:
アプリ -> AAudio API -> AudioFlinger -> オーディオドライバー -> ハードウェア
AudioFlingerはすべてのオーディオパスの中間に位置しています。デスクトップオペレーティングシステム(Windows WASAPIの排他モードなど)ではアプリがオーディオハードウェアへの排他的アクセスを取得できることがありますが、AndroidにはAudioFlingerを完全にバイパスする方法がありません。常にチェーンに存在しています。
これは微妙な理由からも重要です。44.1 kHzから48 kHzへの変換はきれいな整数比ではなく、アーティファクトを導入する補間が必要です。これらのアーティファクトはスマートフォンのスピーカーでは聴こえないかもしれませんが、解像力のあるヘッドフォンセットアップや品質の良いDACでは、プレミアムを支払ったかもしれないオーディオの不必要な劣化を表します。
USB DACソリューション
外部USB DACは状況を大きく変えます。USB DACをAndroidデバイスに接続すると、オーディオドライバーはスマートフォンの内部48 kHz構成にロックされるのではなく、DACのネイティブサンプルレートをサポートできる可能性があります。
鍵はサンプルレートネゴシエーション — DACが実際にサポートするレートを照会し、正しいものをリクエストするプロセスです:
- アプリはレートを指定せずに一時的なオーディオストリームを開き、AndroidにUSBデバイスがネイティブサポートするものを報告させます。
- アプリは現在のトラックに最適なレートでストリームをリクエストします。
- ストリームが開いた後、アプリは実際に付与されたレートを読み戻します — Androidがリクエストと異なるレートを付与した可能性があるためです。
- 付与されたレートがソースファイルと一致しない場合、アプリはリサンプリングするかエラーを報告するかを決定する必要があります。
多くのUSB DACは44.1 kHzから384 kHzまでのレートをサポートしています。AndroidのドライバーがDACを適切にサポートしている場合、アプリはトラックのネイティブレートをリクエストし、リサンプリングなしで付与される可能性があります — アプリによるものもOSによるものもなく。
しかし、「適切にサポートしている」という文中でかなりの仕事をしています。AndroidのUSBオーディオクラスドライバーは実際のUSB通信を処理し、その動作はデバイスとAndroidバージョンによって異なります。あるスマートフォンで完璧に動作するDACが、別のスマートフォンではドライバーの癖を持つ可能性があります。これがAndroidのUSBオーディオの現実であり、どのアプリも完全に抽象化することはできません。
ビットパーフェクト再生の確認方法
ほとんどの音楽プレーヤーは、オーディオに実際に何が起こっているかを教えてくれません。「再生中」のインジケーターとおそらくファイルフォーマットは表示されますが、実際の信号経路 — リサンプリングが行われたかどうか、ハードウェアがどのレートで動作しているか、OSが処理を挿入したかどうか — は見えないままです。
私たちはまさにこの問題を解決するためにEchoboxの信号経路診断を構築しました。診断画面はオーディオチェーン全体をリアルタイムで表示します:
- ソースフォーマット — ファイルのコーデック、サンプルレート、ビット深度
- デコード段階 — デコーダーが生成したもの
- DSPチェーン — どの処理段階がアクティブで、どれがバイパスされているか
- 出力フォーマット — オーディオAPIに送信される実際のサンプルレートとフォーマット
- デバイスレート — ハードウェアが動作しているレート
- リサンプリングインジケーター — チェーンのどこかでリサンプリングが行われている場合の明示的な警告
96 kHz FLACがスマートフォンのDACが96 kHzをサポートしていないために48 kHzにリサンプリングされている場合、それが表示されます。ビットパーフェクトモードがアクティブですべてのステージがバイパスされている場合、それも表示されます。推測なし、期待なし、「HDオーディオ」バッジが何かを意味することを信じる必要なし。
このレベルの透明性はまれです。ほとんどのプレーヤーはオーディオパイプラインをブラックボックスとして扱い、内部で何が起こっているかを確認するツールを提供しません。オーディオ品質に真剣な人にとって、確認は能力と同じくらい重要です。
Echoboxがビットパーフェクト出力を実現する方法
私たちはEchoboxのアーキテクチャを3つのレイヤーで設計しました。それぞれが特定の理由で選ばれています:
- FlutterがUIを処理します — あなたがインタラクトする画面。
- Rustがデコード、ファイルI/O、状態管理、オーケストレーションを処理します。
- Zigがリアルタイムオーディオコールバックを処理します — OSが次のオーディオサンプルのチャンクを要求するたびに約10ミリ秒ごとに実行されるコード。
この分離がビットパーフェクト再生にとって重要です。Zigオーディオエンジンはロックフリーリングバッファ(Rustが充填)からプリデコードされたサンプルを読み取り、通常は7段階のDSPチェーンを適用します:ReplayGain、プリアンプ、パラメトリックEQ、クロスフィード、ボリューム、グラフィックEQ、リミッター。
ビットパーフェクトモードが有効な場合、Zig DSPチェーン全体がバイパスされます。コールバックはリングバッファから出力バッファにサンプルを直接コピーし、処理は一切行いません。Rust側では、アプリが:
- オーディオAPIからトラックの正確なネイティブサンプルレートをリクエスト — デバイスのデフォルトレートではなく、ソースファイルに一致するレート。
- 実際のストリーム構成を読み戻して、付与されたレートを確認。
- 静かなリサンプリングを拒否。DACがリクエストされたレートを提供できない場合、再生は信号を静かに劣化させるのではなく、明確なエラーで失敗します。
直接的なサンプルレートネゴシエーション、DSPバイパス、および透明なエラーハンドリングの組み合わせにより、Androidが許容する真のビットパーフェクト出力に最も近いものが得られます。私たちが制御するもの — アプリケーションレベルの処理 — は真にビットパーフェクトです。AudioFlingerとUSBドライバー内で何が起こるかはAndroid次第ですが、一致するレートを持つ十分にサポートされたUSB DACでは、AudioFlingerは通常サンプルを変更せずにパススルーします。
ビットパーフェクトが必要ない場合
ビットパーフェクトモードはツールであり、普遍的な目標ではありません。オフにしておく優れた理由があります:
EQを使用する場合。ヘッドフォンの周波数応答を補正するパラメトリックEQプロファイルがある場合、ビットパーフェクトモードはそれを完全にバイパスします。EQはDSPチェーンがアクティブな場合にのみ機能します。多くのリスナーにとって、良いヘッドフォンで適切にチューニングされたEQは、補正されていないヘッドフォンを通じたビットパーフェクト信号よりも良いリスニング体験を生み出します。
ReplayGainを使用する場合。ライブラリ全体でのボリューム正規化は、各トラックにゲイン調整を適用する必要があります。これはDSP処理であり、ビットパーフェクトモードでは無効になります。異なる時代やジャンルのアルバムを聴く場合、ReplayGainなしのトラック間のボリュームジャンプは不快になる可能性があります。
クロスフィードを使用する場合。ヘッドフォンクロスフィードはスピーカーで聴こえる耳間クロストークをシミュレートし、ヘッドフォンリスニングの誇張されたステレオ分離を軽減します。微妙ですが、多くのリスナーが長時間のセッションでの疲労を軽減すると感じています。ビットパーフェクトモードではバイパスされます。
ルーム補正を使用する場合。リスニング環境を測定して補正フィルターを作成した場合、それもDSPチェーンの一部です。
ビットパーフェクトモードのポイントは、常に良い音がするということではありません。ポイントは選択肢があることです。ハードウェアをテストしたり、DACを比較したり、単に何も音楽を変更していないことを知りたいときに、DACが未変更の信号を受信していることを確認できます。そして、DSP処理が真に体験を改善する場合にはオフにできます。
ほとんどのリスナーは、実際にはビットパーフェクトをオフにして良いEQプロファイルを使用した方がより良い音を得られます。ビットパーフェクトは確認とテスト用であり、日常的なリスニング用ではありません。私たちは一つの答えがすべての人に当てはまるふりをするのは不誠実だと考え、Echoboxに両方のパスを組み込みました。
要約
- ビットパーフェクトとは、ファイルとDACの間でオーディオ信号にゼロの変更を意味します — リサンプリングなし、ボリューム変更なし、DSPなし。
- AndroidのAudioFlingerはデフォルトで通常48 kHzにリサンプリングし、ほとんどの音楽プレーヤーはそれをバイパスしたり検出したりすることさえできません。
- USB DACはソースファイルのネイティブサンプルレートをサポートすることで、ビットパーフェクトへの道を提供しますが、成功は特定のDACに対するAndroidのドライバーサポートに依存します。
- 確認は主張よりも重要です。Echoboxの信号経路診断はすべてのステージで何が起こっているかを正確に表示するため、推測する必要はありません。
- ビットパーフェクトとDSPは相互排他的です。EQ、クロスフィード、ReplayGain、リミッティングはすべて信号の変更を必要とします。Echoboxでは、特定のセッションでどちらが重要かを選択できます。
- どのアプリもAndroidのオーディオシステムを完全にバイパスすることはできません。私たちは未変更の信号を届けるためにコントロールできるすべてのことを行いますが、AudioFlingerは常にパスに存在しています。一致するレートを持つサポートされたUSB DACでは、通常透過的です。
関連ガイド:FLACとロスレスオーディオを理解する | Androidでのハイレゾオーディオ | オーディオのルーム補正 | オーディオファイルプレーヤーとは