はじめに(前回までのあらすじ)
前回の記事では、自宅のk3s(Raspberry Pi 4上のシングルノードKubernetes)をバッチ実行基盤にして、223機種のイヤホンをHarmanターゲットとの周波数特性(FR)の乖離でスコアリングし、Kaggleの価格データと突き合わせて「コスパランキング」を作りました。
ただし、前回の記事の最後にはこう書いていました。
前回の記事の核心だった「曲のスペクトルに特性を合成する」ステップは、今回のバッチにはまだ組み込んでいません。今のtechnical_scoreは汎用的なターゲット追従度でしかなく、特定の楽曲でどう聴こえるかは反映できていません。
さらに遡ると、最初の記事ではiTunes APIのプレビュー音源とAutoEqの補正データを使って「同じ曲『Crazy F-R-E-S-H Beat』を聴いたときの各イヤホンの出力差」を可視化していました。
今回は、その「同じ曲」の要素を、前回作った大規模バッチパイプラインに合流させます。
今回の設計
なぜ生のFR実測データ + 独自の重み付けにしたか
前回、AutoEqの補正値ではなく生のFR実測データに切り替えた話を書きました。その方針を維持しつつ、今回は「曲の周波数エネルギー分布」を新しい入力として追加します。
考え方はシンプルです。
- 従来(前回まで): 20Hz〜10kHzの全帯域を均等に見て、ターゲットカーブとの乖離をRMSで算出
- 今回: 曲がエネルギーを持つ帯域の乖離は重く、曲がほとんど鳴らさない帯域の乖離は軽く扱う
weighted_score = sqrt( Σ( w_i × (curve_i − target_i)² ) / Σ(w_i) )
w_i が曲の各帯域のエネルギー重みです。
曲のエネルギー分布をどう作ったか(song_energy.py)
「Crazy F-R-E-S-H Beat」のiTunesプレビュー音源(M4A、30秒)をffmpegでWAVに変換し、以下の手順でエネルギー分布を作りました。
- 4096サンプルのHann窓でオーバーラップさせながらFFT(Welch法によるパワースペクトル推定)
- 対数周波数グリッド(analyze.pyと同じ300点)の各点について、±1/6オクターブ幅で平均化
- パワーではなく振幅(√power)を使い、さらに
log1pで圧縮してから正規化
3番目の圧縮が今回の設計上の肝です。音楽のパワースペクトルは低域に極端に偏っているため、生のパワーをそのまま重みにすると低音の帯域がスコアをほぼ独占してしまいます。圧縮の強さは恣意的な選択で、変えれば結果も変わります。この点は正直に書いておきます。
magnitude = np.sqrt(np.maximum(band_power, 0))
compressed = np.log1p(magnitude)
weights = compressed / compressed.sum()
出来上がった重みはこのような分布でした(48〜60Hz帯、つまりキック/ベースの基音域にピークが集中)。
図1: コスパ上位5機種のFRカーブ(色付き線)と、楽曲のエネルギー分布(グレー塗りつぶし)の重ね合わせ
結果:順位はどう変わったか
223モデル中、順位の変動幅は最大でも±8位程度でした。
Sony EX1000 S4: rank 196 → 204 (delta=-8)
DUNU SA6: rank 71 → 64 (delta=+7)
Shangling ME800 02: rank 63 → 70 (delta=-7)
ThieAudio L3 C 00: rank 123 → 116 (delta=+7)
Moondrop Spaceship: rank 144 → 151 (delta=-7)
コスパランキングの上位10件はほぼ変化なし。上位に来るBLONやTin HiFi、Moondropの安価機は、もともと低域がなだらかでターゲットに近いため、低域重視の重み付けをしてもしなくても評価があまり変わらなかった、というのが実態です。
正直、「曲を変えたらコスパランキングがガラッと変わる」ような派手な結果は今回は出ませんでした。これは
- (a) 重み付けの圧縮が効きすぎていて曲の影響を弱めている
- (b) そもそも今回選んだ曲がボーカル主体のJ-POPで、極端な帯域の偏りがなかった
のどちらか、あるいは両方が原因と考えられ、まだ切り分けられていません。
せっかくなので:前回の主観比較を、この手法で再現してみる
最初の記事ではBose・qdc SUPERIOR・Final A5000・AirPods Pro/4を主観+AutoEqベースで比較していました。同じ土俵で比較できないか、そのうちBoseとAirPods Proを、今回のデータソースで探してみました。
結果、当初使っていたCrinacle系のミラーデータベースにはBoseのデータもAirPods Proのデータも存在しないことが分かりました(イヤホンマニア向けの測定データベースなので、コンシューマー向けANCイヤホンはカバー範囲外のようです)。
そこで、AutoEqが参照インデックスとして持っているRtings社の実測データ(Bruel & Kjaer 5128リグ)に直接あたったところ、AirPods Pro(第2世代)とBose QuietComfort Earbuds II(前回記事と同じモデル)の生データが公開されていました。せっかくなので、前回記事にはなかったSony WF-1000XM4(既存データセット内)も加えて3機種で比較しました。
図2: AirPods Pro (第2世代)、Bose QuietComfort Earbuds II、Sony WF-1000XM4のFRカーブと、楽曲のエネルギー分布
見えてきたのは、前回記事とは少し違う顔でした。
- Bose QuietComfort Earbuds II: 200Hz〜1kHzをやや抑えつつ、2〜4kHz付近で+8dB近い強いピーク。前回「引き算の美学」と書いた中低域の話は今回のデータでも確認できましたが、高域はむしろ3機種中もっとも主張が強いという新しい発見がありました
- AirPods Pro (第2世代): 低域はなだらかに減衰し、2〜3kHzと6〜7kHzに2つの山
- Sony WF-1000XM4: 3機種中もっとも素直な形。ピークも2kHz付近のみでなだらか
曲がエネルギーを持つ50〜100Hz帯だけを見ると、この帯域で一番早く減衰し始めるのは実はSonyで、AirPods ProとBoseの方が長く持ち上がっています。前回「低音の王様のはずのBoseが数値上は控えめ」と書いた発見を、また別の角度からひっくり返す結果になりました。
データソースについての注記
- AirPods Pro 2 / Bose QuietComfort Earbuds IIはRtings社の実測生データを直接取得。JSON内に複数トライアル分の列があったため単純平均を代表値にしています
- Sony WF-1000XM4は既存データセット内にLチャンネルのみ存在したため、L単独の値です(他2機種はL/R平均)
- qdc SUPERIOR、Final A5000、AirPods 4は、今回参照できたデータソース内には見つかりませんでした。前回記事の全機種を再現するには、別の測定データベースかReview系サイトをもう少し探す必要があります
まとめ
「同じ曲で重み付けする」というアイデア自体はパイプラインに組み込めましたが、今回選んだ曲・今回の圧縮パラメータでは、コスパランキングを大きく揺さぶるほどの効果は出ませんでした。一方で、前回とは別の3機種(AirPods Pro、Bose、Sony)を同じ土俵に乗せたことで、「Boseの高域の主張の強さ」という前回とは違う切り口の発見がありました。
次回予告
- 圧縮パラメータ(log1pの強さ)を変えて、曲の影響がどこまで結果を揺さぶるか感度分析をしてみたい
- テンポや帯域構成が全く違う曲(例えば重低音特化のEDMや、逆に高域中心のアコースティック曲)でも同じ分析をして、曲によってコスパランキングがどれだけ変わるかを見てみたい
- qdc SUPERIORやFinal A5000のデータも、別のデータソースを探して前回の全機種比較を完成させたい
編集後記
同じ手法を使っても、対象の機種を変えると全く違う発見が出てくるのが面白いところです。「高いイヤホンには高いだけの理由がある」のか「安いイヤホンのコスパがすごい」のか、まだ結論には程遠いですが、少なくとも「グラフの読み方は一つじゃない」ということだけは、はっきりしてきました。

