はじめに
IMAXや、Dolby Atmosのような音を、家で楽しみたい!と思ったことはありませんか?
私は毎日思います。そこで、家でこんな映画音響を再現できたら、ホームシアターもいらないんじゃないかという仮説のもと研究を始めました。
まずは結果から言わせてもらうと、実際に相当なクオリティで再現できました。多分この世で一番最もリアルに再現できていると言っても過言ではないと思います。
実際に生成した動画ファイルを貼っておくのでみてみてください。
今回の方針として、パラメータを耳だけで決めず、論文・規格・測定から根拠を取り、なるべく理論的に裏付けされた内容をシミュレーションして再現しようとしました。
そのうえで、変更のたびに音量をそろえて聴き比べ、最終判断は結局、耳でやりました。
作ったものは cinebinaural という名前で、GitHub に MIT ライセンスで公開しています。
できることはざっくり次の3つです。
- 映画の5.1ch(Blu-ray の TrueHD など)を、仮想の大型シアターで聴いているようなヘッドホン用の音(バイノーラル)に変換する
- 普通のステレオ曲を、AI で5.1chにアップミックスしてから同じように変換する
- 仮想劇場の中で、どのスピーカーがどれくらい鳴っているかの動画を生成する
全体の流れ
ステレオ曲 ──(任意) AI アップミックス──┐
▼
5.1ch(FL FR FC LFE SL SR)──► 仮想劇場で鳴らす ──► 耳に届く音(バイノーラル)
考え方としてはシンプルで、
- 仮想の劇場を作り、スピーカーを配置する
- 各スピーカーから「私の耳」までの伝わり方(BRIR:部屋込みの頭部伝達関数)を計算する
- 5.1ch の各チャンネルを、対応するスピーカーの BRIR で畳み込んで足し合わせる
だけです。問題は、この 2 をどれだけ本物に近づけられるかで、ここに一番時間がかかりました。
仕組み
部屋に関して
今回は、30×24×18 m の仮想劇場として設計しました。容積はおよそ 13,000 m³ で、IMAX クラスの大型館を想定しています。座席はスクリーンから見て後方 2/3 あたりで、いわゆる「いい席」です。
部屋の響きは、次の2つを組み合わせて作っています。
- 初期反射:イメージソース法(3次反射まで)
- 後部残響:統計的な残響(帯域ごとに減衰の速さを変えたノイズ)
イメージソース法は、壁を鏡とみなして「壁の向こうにある鏡像のスピーカー」から音が来ると考える方法です。鏡像の位置から、反射音の到達時間と方向が決まります。
残響時間(RT60:音が 60 dB 減衰するまでの時間)は 0.5 秒にしました。WSDG が IMAX 館の仕様として公開している値です。各面の吸音率は、素材表の周波数特性を保ったまま、Eyring の残響式で RT60 が目標値になるように較正しています。
$$
T_{60} = \frac{0.161,V}{-S \ln(1-\bar{\alpha})}
$$
そのほかに、次の点も物理モデルに入れています。
- 空気吸収(ISO 9613-1)
- スピーカーの指向性:スクリーンのホーンは高域では前にしか音が出ない(DI 約 10 dB)一方、低域は全方向に広がる
- 直接音と響きの比(Hopkins–Stryker の式):席の位置で、直接音と響きの割合がどうなるか
スピーカーの配置と校正
映画館の標準的な配置と校正に合わせています。
| 項目 | 設定 | 根拠 |
|---|---|---|
| スクリーンの L/R | ±37° | 大型館の座席から見た角度 |
| サラウンド | 側壁に片側 6 本のアレイ、耳より 15° 上 | Dolby のシアター技術ガイドライン |
| サラウンドのレベル | −3 dB | 劇場の校正(スクリーン 85 dBC / サラウンド 82 dBC) |
| LFE | +10 dB | SMPTE RP 200(映画の LFE は 10 dB 持ち上げて再生する約束) |
| 低音 | 80 Hz 以下はスクリーン下の床置きサブウーファーへ | IMAX の特許(サブベースを独立させる設計) |
家庭の 5.1ch と違い、劇場のサラウンドは 1 本のスピーカーではなく、**壁に並んだ何本ものスピーカー(アレイ)**で鳴らします。これを再現するため、サラウンドの信号は片側 6 本のスピーカーから、距離に応じた時間差を付けて出しています。
低音に関して
最初は、低音がずんずん鳴ってはいるけど、なんか違うな状態でした。
そこで改めて論文を読み漁り、次の3つを入れました。
- 境界効果:スピーカーが壁や床に付いていると、低域は半空間(Q=2)、床置きのサブは 1/4 空間(Q=4)に放射される
- 低域の残響を伸ばさない:Dolby のガイドラインの推奨範囲の下限(低域の RT60 を中域と同じにする)
- ルームモードの山だけを削る:サブウーファーの定常応答の山だけを、最小位相のノッチで下げる(谷は埋めない)
ここまでやって、ようやく低音の尾が短く締まり、「低音の質は圧倒的に良くなった」と感じるところまで来ました。
HRTF(頭部伝達関数)に関して
HRTF は「ある方向から来た音が、頭や耳の形でどう変わって鼓膜に届くか」を表すフィルタです。これが、ヘッドホンで音の方向を感じさせる肝になります。
最終的には、Neumann KU 100 というダミーヘッドを TH Köln が 2° 刻みで測ったデータ(Bernschütz 2013、CC BY 3.0)を使っています。人間の被験者の HRTF もいくつか試しましたが、KU 100 に落ち着きました(理由は後述の「試行錯誤」で書きます)。
HRTF をそのまま使うと、どの方向の音にも「その耳の形の癖」による色(特定の周波数の盛り上がり)が付き、声質が変わって聞こえます。そこで、各スピーカーの BRIR について、
- 1/3 オクターブで平滑化した両耳平均のパワー応答を平らにする補正を
- 最小位相・両耳同じで掛ける
という音色の補正をしました。両耳に同じ補正を掛けるので、左右の音量差(ILD)や到達時間差(ITD)といった方向のデータは壊れないはずです。
補正の基準は、「部屋込みの定常応答」ではなく「直接音」にしています。Toole(2015)の、「人は部屋の響きを聞き分けていて、音色は直接音で判断している」という主張を見つけたので、このようにしました。
試行錯誤(辛かったこと)
1. 音が「カスカス」になった
最初は、劇場っぽい迫力を出そうと、軽い倍音付加(飽和処理)を入れていました。ところが声質が変わってしまい、なんかカスカスしてる状態になりました。原因は、$x^2$ 型の飽和処理で出る高次の成分が、エイリアシングで折り返していたことでした。完成した映画のミックスに、ミックス的な加工を足すと壊れるというのが最初の教訓で、以降は劇場で起きる物理現象だけを足す方針にしました。
2. エコーのように聞こえる
次に、「パキッとしたメリハリがない」「エコーのように聞こえる」といった問題が出ました。調べると、後部残響の立ち上がりを 202 ms かけてゆっくり上げていたせいで、エネルギーの時間変化に山ができていました。
本来であれば、残響は時間とともに単調に減っていくはずです。
- エコー基準(Dietsch–Kraak の EK):1.07(エコーとして聞こえる側)
- 残響の立ち上がりを 12 ms から単調に減衰する形に直したら、山がを消せた
んでついでに、「エネルギーは単調に減衰しているか」を毎回チェックするようにしました。
3. サラウンドを耳より上にしたら、声が聞き取りやすくなった
劇場のサラウンドは頭より高い位置にあります。これを再現して仰角 +15° にしたところ、台詞が明らかに聞き取りやすくなりました。サラウンドの音と正面の台詞の方向が離れて、空間的なマスキングがほどけたのだと考えています。
ちなみに、使った HRTF(RIEC)は仰角が 10° 刻みでしか測られていないので、15° は間を補間する必要があります。時間波形のまま平均すると、サンプル以下の到達時間のずれで高域が打ち消し合い、5〜12 kHz で −6.7 dB も落ちてしまいました。そこで「振幅特性(最小位相)+ 到達時刻」に分けて別々に補間する方法(Kulkarni ら 1999)にしました。
4. ドラムの芯とベースの明瞭感が消えた
あるシーンで、ドラムの叩く音と、ベースの明瞭感が消えてる、潰れていると色々試していて感じました。
最初は「部屋の響きで低中域がにじんでいるのでは?」と疑い、実際、125〜250 Hz では、エネルギーの約 1/4 が 50 ms 以降に遅れて届いていました。ところが、実際の映画の区間で帯域ごとのバランスを測ると、原因は時間方向のにじみではなく、帯域の傾きであることがわかりました。
劇場で本来鳴るはずの音(5.1ch + LFE+10 dB)に比べて、
| 帯域 | 125 Hz | 4 kHz |
|---|---|---|
| ずれ | +3.4 dB | −3.9 dB |
と、低音が重く、アタックの帯域が引っ込んでいました。
原因は、2つの考え方を混ぜていたことでした。
- 低域:直接音を平らにする基準(Toole の考え方)→ 部屋の響きの分だけ低域が盛り上がる
- 高域:X カーブっぽく 4 kHz 以上を −2 dB 下げるシェルフ(SMPTE の考え方)
両方の「暗くなる側」を重ねていたわけです。Toole(2015)は、X カーブによる高域の低下を「現時点で根拠がない」としているので、それに合わせてシェルフを外しました。
そうすると、キックの芯とベースの輪郭が戻り、ちゃんとベースのアタックの音も明瞭に聞こえるようになりました。
5. 今度は高音が耳に刺さる
シェルフを外したら、今度は「高音域が耳に刺さる。痛いレベル」になりました。マジ耳潰れるかと思いました。
色々探して原因は2つ見つけました。
(a) 耳介の細い共振
他人の耳で測った HRTF には、6〜16 kHz に +3〜6 dB の細い山が残っていました。1/3 オクターブの補正では、それより細い山は取り切れません。自分の耳には無い共振なので、方向の手がかりではなく「刺さる音色」として聞こえてしまっていた。
そこで、1/3 オクターブの輪郭より突き出た分だけを削り、谷(ノッチ)は残す処理を入れました。Iida ら(2007)によると、上下方向の定位は最初の2つの谷(N1、N2)と最初の山(P1、約 4 kHz)でほぼ決まるので、P1 より上(5 kHz 以上)の細い山は削っても定位を大きく損なわないと考え修正しました。
(b) HRTF の左右非対称(これが一番の発見でした)
それでもまだ刺さるので調べると、右耳だけが明るい状態でした。原因は HRTF の左右の非対称です。
使っていた人間の被験者の HRTF は、左右を鏡映しにした方向どうし(例:35° と 325°)で、音が耳に届く時刻が 約 80 µs(4 サンプル) ずれていました。
これが問題になるのは、L と R から同じ音が出るとき(いわゆるファントムセンター)です。左耳には「L からの音」と「R から回り込んだ音」が少し時間差を持って届き、くし形の打ち消し合いが起きます。左右対称な頭なら、この谷は両耳で同じ周波数にできます。ところが到達時刻がずれていると、谷の位置が左耳と右耳で食い違います。
実際に FL と FR に同じノイズを入れて測ると、
| 周波数 | 1 kHz | 2 kHz | 4 kHz |
|---|---|---|---|
| 右耳 − 左耳 | −5.7 dB | +8.6 dB | −8.2 dB |
と、両耳で ±6〜8 dB も違っていました。映画の音楽やドラム、ベースは L/R に振られていることが多いので、まさにここを直撃していたわけです。
最初は「周波数特性の輪郭だけを左右でそろえる」処理を入れましたが、到達時刻が残っているので直りませんでした。最終的には、
- 片耳の HRTF を鏡映しにして、もう片方の耳に使う(完全に左右対称になる)
- そもそも左右対称に作られたダミーヘッド(KU 100)を使う
のどちらかを作り、聴き比べて KU 100 を採用しました。
完成形:standard4
ここまでをまとめた設定を standard4 としてプリセットにしてまとめて完成としました。
python -m cinebinaural.run process movie_5p1.wav out.wav --preset standard4 --no-limit
| 段階 | 内容 |
|---|---|
| standard | 部屋・アレイ・仰角 15°・低音管理・境界効果・劇場の校正 |
| standard2 | + 初期反射を統計的な予測値以内に制限、サブのルームモードの山を削る |
| standard3 | + 音色の補正を直接音基準に(Toole 2015) |
| standard4 | + KU 100、高域シェルフなし、耳介の細い山を削る |
ステレオ曲の 5.1ch アップミックス
映画だけでなく普通の曲も劇場で聴きたかったので、ステレオを 5.1ch にするアップミキサーも作っちゃうことにしました。
流れ
- Demucs(htdemucs_ft)で、ボーカル・ドラム・ベース・その他の4つに分離する
- 各パートから「響き」を取り出してサラウンドへ送る
- 各パートの中央に寄っている成分を FC(センター)へ送る
- 残りを FL/FR へ送る
論文を読んで実装に落とし込んだもの
最初に実装したものは、センターに送るのがボーカルだけでした。測ってみると、**L/R の 120〜500 Hz のエネルギーの 59〜69% が、左右ほぼ同じ音(ファントムセンター)**のままで、キックやベースやスネアは普通ど真ん中に定位しているので、センタースピーカーではなく L/R の2本から鳴ってしまい、前述の「くし形の打ち消し合い」の問題が起きていました。
そこで、次の3つを入れることにしました。
(1) 全パートを L・C・R に振り直す(Avendano & Jot 2004 の考え方)
左右が $L = a,s$、$R = b,s$($a \ge b$)で鳴っている音源なら、共通部分 $b,s$ をセンターへ、残り $(a-b),s$ を L に残します。L 寄りの音は L と C の間に分配されます。
$$
C = \frac{2\min(|L|,|R|)}{|L|+|R|}\cdot \gamma \cdot \frac{L+R}{2}
$$
($\gamma$ は左右のコヒーレンス。響きは動かさないために掛けています)
→ この手法により、ファントムセンターは 33〜41% まで減らすことに成功しました。
(2) 響きの推定を最小二乗法に(Faller 2006)
各時間周波数ビンで $L = S + N_1$、$R = aS + N_2$($S$ は直接音、$N_1, N_2$ は互いに無相関で同じ大きさの響き)とモデル化します。共分散行列から響きのパワーを求め、響きを Wiener フィルタで推定します。
$$
\hat{N}_1 = \mathbf{w}_1^{H}\mathbf{x},\quad \mathbf{w}1 = \mathbf{R}{xx}^{-1}\begin{bmatrix} P_N \ 0 \end{bmatrix}
$$
→ 前方とサラウンドの相関が 0.9 → 約 0.65 に下がりました(サラウンドに前の音が漏れにくくなった)。
(3) サラウンドの無相関化と 10 ms の遅延
振幅は平らなまま、位相だけをランダムに回すフィルタ(振幅の誤差は ±0.2 dB)をサラウンドに掛けます。さらに 10 ms 遅らせることで、前から先に音が届くようにしています。これは先行音効果(Haas 1951:5〜30 ms 遅れた音は、先に届いた音の方向に定位する)を狙ったもので、打音は約 10 ms を超えると別の音として定位されやすくなる(Litovsky ら 1999)ので、10 ms にしました。
python -m cinebinaural.run upmix song.wav song_5p1.wav \
--center repan --ambience ls --surround-decorr --surround-delay-ms 10
ちゃんと分離できているのか?
AI で作られた曲(INMU KING)でも試してみました笑。一部の区間で声っぽいシンセを拾っていましたが、パート同士の相関は 0.07 以下で、きれいに分かれていました。(AIが作ったものでもAIはちゃんと分離できるんですね...)
おまけ:スピーカーの波紋を可視化する
仮想劇場のどのスピーカーが、どれくらい鳴っているかを動画にしました。各スピーカーから、音の大きさに応じて波紋が広がります。
python -m cinebinaural.run video movie_5p1.wav out.wav speakers.mp4 --preset standard4 --lang en
限界
- HRTF は他人(ダミーヘッド)のものなので、頭の外に音が出る感じや、前方の定位には個人差がある
- 扱えるのは 5.1ch のチャンネル音声で、Atmos のオブジェクト音声には対応していない
- 入力は 48 kHz (44.1 kHz の曲は先に変換してください)
まとめ
- 劇場の音は「部屋・スピーカー配置・校正・HRTF」の組み合わせで、かなりの部分を物理的に再現できました
- 一番効いたのは、意外にも HRTF の左右対称性でした。80 µs のずれが、ドラムの芯や高域の刺さりとして聞こえていました
- 「耳で良いと感じる」ことと「理論的に正しい」ことが一致するまで、測定と聴き比べを往復するのが大事でした
ホームシアター、いらないかもしれません(家族に怒られない範囲で爆音で聴けますし)。
本当に、映画館で聴いているような音源で、IMAXにはお金や地理の問題で行ったことはないですが、行ったらきっとこんな音なんだろうな。と、楽しめました。よかったら好きな音源で試してみてください!以上、みてくれた人はありがとうございました!
参考文献
- F. E. Toole, "The Measurement and Calibration of Sound Reproducing Systems," JAES 63(7/8), 2015
- K. Iida et al., "Median plane localization using a parametric model of the head-related transfer function based on spectral cues," Applied Acoustics 68, 2007
- A. Kulkarni et al., "Sensitivity of human subjects to head-related transfer-function phase spectra," JASA 105(5), 1999
- C. Avendano, J.-M. Jot, "A Frequency-Domain Approach to Multichannel Upmix," JAES 52(7/8), 2004
- C. Faller, "Multiple-Loudspeaker Playback of Stereo Signals," JAES 54(11), 2006
- J. He, E.-L. Tan, W.-S. Gan, "Linear Estimation Based Primary-Ambient Extraction for Stereo Audio Signals," IEEE/ACM TASLP 22(2), 2014
- H. Haas, 1951 / R. Y. Litovsky et al., "The precedence effect," JASA 106(4), 1999
- B. Bernschütz, "A Spherical Far Field HRIR/HRTF Compilation of the Neumann KU 100," DAGA 2013
- SMPTE ST 202, SMPTE RP 200, ITU-R BS.775, ISO 9613-1、Dolby のシアター技術ガイドライン、IMAX の公開特許