ストリーミングが当たり前になっても、長年ためてきたMP3やAACのライブラリを聴き続けている人は少なくありません。そうした非可逆圧縮の音源は、ファイルサイズを抑えるためにエンコーダーが高域を切り落としています。たとえば128kbpsのMP3では、16kHz前後より上の成分がほとんど残っていないことが一般的です。

その「失われた可能性のある高域」を推定して補い、10バンドのEQで整え、整えた音をWAV・AIFFに残せるiPhone用音楽プレイヤー 「Aurescale(オーレスケール)」 を、App Storeで公開しました。

App Storeで見る(無料) | 製品ページ:Aurescale

📌 Aurescaleの3行まとめ
① MP3・AAC・FLAC・ALAC・WAV・AIFFを再生し、エンコーダーのカットオフ周波数を自動検出して、その上の帯域を推定生成で補う。「原音」とワンタップで聴き比べ
② 音声処理はFloat64。Kaiser窓ポリフェーズのサンプルレート変換、1024点STFTの解析、ロックフリーのリアルタイム出力
③ 10バンドのパラメトリックEQで整えた音を、再生と同じ処理チェーンでWAV(最大192kHz/32bit float)・AIFFに書き出せる。処理はすべて端末内

「高音質化」をうたうアプリが、あえて「復元ではない」と書く理由

「高音質化」「アップスケール」を掲げる音楽プレイヤーは以前からあります。ただ、非可逆圧縮で捨てられた情報を後から取り戻すことは、原理的にできません。エンコーダーが16kHzより上を切り落としたなら、そこにあった音は、もうファイルの中にはないのです。

Aurescaleはこの事実から出発しました。やっているのは「元の音を復元する」ことではなく、「残っている音の情報から、失われた可能性のある帯域を推定して足す」ことです。だからアプリ内の画面にも、App Storeの説明にも、推定生成であって復元ではないと書いています。効果が音源・設定・再生環境によって異なることも、同じ場所に書きました。

推定で足した音は、聴く人が自分の耳で判断できるべきだと考えています。そのためプレイヤー画面には「高音質化」と「原音」を切り替えるスイッチを置きました。原音モードは推定成分を一切加えないリファレンスで、高精度なサンプルレート変換とスペクトラム表示だけを行います。加える量も、倍音の種類も、自分で決められます。

高音質のために決めた4つの設計方針

1. 足す帯域は「推定」だと明示し、常に原音と比較できるようにする

高域補完は既定でオンですが、切り替えと明示を徹底しました。推定量はスライダーで調整でき、倍音は整数倍音(非線形波形整形で2f・3fに位相同期)と非整数倍音(リングモジュレーションによる周波数シフト)から選べます。加算はカットオフ周波数より上の帯域に限定し、もとから全帯域が残っているロスレス音源では補完を自動でオフにします。

2. 演算精度と時間精度で妥協しない

音声処理はFloat64(倍精度)で行います。サンプルレート変換にはKaiser窓(β=9)のポリフェーズsincフィルタを使い、基準128タップ・256位相で、再生機器の実際の出力レートに追従します。ダウンサンプル時はレート比に応じてタップ数を増やし、遷移帯域を維持します。

高域の解析と生成は、1024点STFT・hop 256(48kHzで窓約21ms、更新約5.3ms)で行い、過渡音への追従性を確保しました。エンコーダーのカットオフ周波数は、信頼できるフレームだけを対象に直近約4秒の統計(80パーセンタイル+EMA)から推定するので、静かなパートやフェードで推定が揺れません。しきい値はコーデック(MP3/AAC/ロスレス)ごとにプロファイルを切り替えます。

3. リアルタイム処理の安定性を、構造で担保する

デコード、DSPワーカー、リングバッファ、リアルタイム出力の4系統を分離しました。出力コールバックの中では、ロックもメモリ確保もI/Oも重い処理も一切行いません。バッファの受け渡しはC11 atomicによるロックフリーのSPSCリングです。端末が高温になったときは補完と解析を自動でバイパスし、サンプルレート変換のタップ数を落として、再生を途切れさせないことを優先します。

4. 聴いている音と、残す音を同じにする

WAV・AIFFの書き出しは、再生と同じ処理チェーンをオフラインで通します。再生中に調整したEQと高域補完の設定が、そのまま書き出しに反映されます。リアルタイムの制約がないため、書き出し時は常にフル品質で処理します。整数出力ではTPDFディザを適用し、ピーク保護は再生時と同じ条件で動作します。

高域補完の仕組み

再生チェーンは次の順番です。

デコード → 高精度サンプルレート変換 → スペクトル補完+倍音生成 → EQ → ピーク保護 → 出力

補完処理はサンプルレート変換の後段、つまり再生サンプルレートで動作します。そのため、生成する帯域を再生側のナイキスト周波数まで広げられます。

補完は残差再構成(y = x + m·r)として実装しています。検出したカットオフ周波数の直下1オクターブをスペクトル上で平行移動してコピーし、測定したスペクトル傾斜に安全側のチルトを加えて包絡を外挿し、信頼度マスクでブレンドします。ステレオリンクしたピーク保護により、補完やEQブースト時のクリップを防ぎます。

これらは決定論的なヒューリスティック処理で、機械学習モデルは搭載していません。処理の正しさは数値テストで検証していますが、それは「人が聴いて必ず良くなる」ことの証明ではありません。だからこそ、原音との切り替えを手元に置いています。

10バンドの高精度パラメトリックEQ

各バンドは中心周波数20Hz〜20kHz、ゲイン±12dB、Q 0.3〜8を調整できます。周波数特性グラフは、スライダーの位置を線で結ぶのではなく、実際の各フィルタの複素周波数応答を合成して、プリアンプと自動減衰を含めた特性を現在の出力レートで表示します。

ブースト時の余裕は、プリアンプと自動ヘッドルームで確保します。自動設定は対数配置の513点で合成特性を評価し、隣り合うバンドの重なりも考慮して正のピークを相殺します。設定の変更は32サンプルの制御クロックと30msの時定数で補間するので、再生を止めずに滑らかに反映されます。低音強調やボーカルなどのプリセットと、全パラメータを記録するマイ設定を用意しました。

整えた音を、WAV・AIFFへ

書き出しはプレイヤー画面の右上、またはライブラリの曲を長押しして「高音質化して書き出し」から行います。

項目内容
形式WAV(16bit/24bit/32bit float)、AIFF(16bit/24bit)
サンプルレート自動、44.1/48/88.2/96/176.4/192kHz
処理高域補完のオン/オフ、推定量・倍音、EQの反映を選択
保存先ファイルアプリの「このiPhone内 > Aurescale > Exports」。共有シートで他のアプリへ
その他モノラル音源はモノラルのまま。進捗表示、キャンセル、バックグラウンド処理に対応

「自動」は、高域補完がオンのときはソースと48kHzの高い方、オフのときはソースのレートをそのまま使います。高いサンプルレート・ビット深度を選ぶだけで、音源にない情報が増えるわけではないことは、書き出し画面にも書いています。

音声処理は端末の中で

再生・解析・EQ・書き出しはすべてiPhoneの中で行い、音楽ファイルを当社のサーバーへアップロードすることはありません。アプリ独自のアカウント登録も不要です。Aurescaleは音楽をダウンロードしたりストリーミングしたりするサービスではなく、お手持ちの音楽ファイルを再生するアプリです。

広告は当社アプリの自社広告だけで、外部の広告ネットワークは使いません。買い切りのアプリ内購入で広告を非表示にできます。

動作環境と価格

項目内容
対応iPhone、iOS 17以降
対応形式MP3、AAC(m4a)、ALAC、FLAC、WAV、AIFF
価格無料。自社広告あり。広告を非表示にする買い切りのアプリ内課金あり
言語日本語、英語

今後

聴取試験と客観指標を組み合わせた補完品質の評価、Core MLによるニューラル帯域拡張の研究・比較(採用する場合も生成処理として明示します)、ギャップレス再生などを検討しています。

関連する記事

MP3の音質がビットレートやカットオフ周波数でどう決まるのか、スペクトルでどう確かめるのか、帯域拡張で何ができて何ができないのかは、MP3の音質は後から良くなるのかにまとめました。

AurescaleをApp Storeで見る(無料)