見出し画像

音楽に隠し音声!?『ホタルイカ音声暗号』の方法解説!


今回は、音楽に隠し音声をねじ込む方法のご紹介。
「ホタルイカがやってくる日」という楽曲に、とある方法で”隠し音声”を挿入しました。

このような、音楽の中に音声を暗号として挿入する方法を紹介しようと思います。

※今回の内容は恐ろしく高度なテクニックについてのご紹介です。以下の知識について知っておくことで、失敗しにくくなります。知識があやふやのまま作ると、ミスに気づけない可能性もありますので、なるべく理解しておきましょう。
標本化定理
折り返し雑音
振幅変調
デシベル
ギブス現象
リンギング

使うもの

REAPER (推奨)
(ReaJS) Ampliltude Modulator
(ReaJS) Spectrograph Spectrogram Meter
Spline EQ (Freeで十分) (ブリックウォールフィルタが使えればよい)

理論

音声ファイルの中に、隠し音声を挿入するテクニックの紹介です。
暗号の形態としては、音源に、音声を直接知覚できない形で挿入するものです。

サンプルレート

音声ファイルは1秒間にたくさんの点を打つことによって音声を記録しています。

音楽を波形で記録する場合、1秒間に多くの点(標本)を打つわけですが、この1秒間に何個の点(標本)を打つかというのが「サンプルレート」sample(標本)、rate(速度)です。

サンプルレートが高いと、より高い周波数を収録可能になるということが標本化定理によってわかっています。

この半分の周波数のことを特にナイキスト周波数と言います。標本化する音源に、ナイキスト周波数以上の成分が含まれると、それがナイキスト周波数を中心に下の帯域に折り返され、雑音を生じます。ビットクラッシャーなどにあるダウンサンプルというエフェクタは、これを意図的に生じさせるものです。

可聴域

「ホタルイカがやってくる日」の音源のサンプルレートは48000Hz、つまりその半分、24000Hzまで音声が収録されているということになります。
しかし、人間の耳は構造上20000Hzまでしか認識できないと言われています。

つまり、4000Hz分、聞こえない音域が存在します。
電話の音声は4000Hzまでを送信していますが、逆に言えば、4000Hzまで収録すれば音質こそ悪しかれど、音声メッセージが聞き取れるわけです。

振幅変調

暗号音声を何らかの形で20000Hzから24000Hzの間に移動する必要があります。そこで、4000Hzまで収録した音声で正弦波を振幅変調をします。振幅がマイナスになり、波形が反転するほど強く変調することによって、搬送波を出さないようにします。これはいわば「リングモジュレーション」です。
これを行うと、スペクトルがベルトコンベアーのように移動します。

正弦波によるリングモジュレーションのイメージ

移動中は、スペクトルの強さは半分になります。
これができたら、反対側の端にも、実はナイキスト周波数というローラーがあり、これによってスペクトルが折り返され、まさにきれいにスペクトルが上下反転します。

折り返しのイメージ

スペクトルが上下二分され、半分になった音量が折り返しによって元に戻ります。
この操作は波形単位で見ると、波形の標本点が、反転する、反転しない、を交互に繰り返しているだけです。

波形の標本点が交互に反転している様子

なら、このようにスペクトルを反転する操作をリングモジュレータで行えばよいのです。

フィルタリング

暗号音声を入れる際、二つの音の帯域がかぶらないよう、きっちりフィルタをかける必要があります。そこで必要なのが、カットオフ周波数以上・以下をざっくり遮断するブリックウォールフィルタです。しかし。いくら優秀なブリックウォールフィルタのVSTがあろうとも、多少の帯域漏れを考慮する必要はあるので、ガードバンドとして音声が一切ない帯域を1000Hz分考慮します。音楽を19000HzでLPF、暗号を4000HzでLPFします。暗号を24000Hzでリングモジュレーションすると、スペクトルが上下反転し、ミックスした際に音楽が0Hzから19000Hz、暗号が24000Hzから20000Hzになります。

クリッピング対策

帯域ばかりに目が行ってはいけません。今回相手にしているのは振れ幅に上限のあるデジタル音声波形です。二つの波形の合成の結果、クリッピングし、音は割れ、帯域は広がり、海は荒れ、大地は裂け、なんてこともあります。
そこで、すでにフィルタリング済の音声のピークをあらかじめ知っておいた状態で、それらの音声のピークをクリッピングが発生しないような割合で混ぜる必要があります。
楽曲側のピークが V dBの場合、暗号が入るスキは、 V dBから0dBまでの振幅ということになります。
0dBの振幅を1とした場合、クリッピングしていなければ V < 0で、その振幅は

となって、暗号が入るのは、ここから1までの振幅の差分です。よって暗号の振幅は

となり、これをdBに直すと

dBです。
たとえば楽曲側のピークを-0.6dBで調整した場合は、暗号側のピークを-23.52dB以下にするとこの二つの音声をミックスしても絶対にクリッピングすることはありません。

事前準備

オーディオのサンプルレートを48000Hzにする

暗号を制作する過程で、高周波を扱います。「ホタルイカがやってくる日」と同様の形式にするためには、オーディオ再生のサンプルレートを変更する必要があります。プレイバック時にも正しく再生、スペクトログラムの表示がなされるよう、Preferences(デフォルトでCtrl+P)のオーディオデバイスの設定から変える必要があります。
デフォルトのWASAPIだと、44100Hzのサンプルレートになっていたり、それを変更する設定が機種により異なっていたり面倒なので、いっそのことDirectSoundにしてサンプルレートの指定、あるいはオーディオインターフェースがある場合ASIOにしてしまいましょう。

PreferencesのAndioのDeviceの設定(日本語化してない)

「ReaJS Amplitude Modulator」のプログラムを書き換える

ReaJSの中にあるAmplitude Modulatorですが、デフォルトの仕様だと難があるのでカスタマイズします。プラグインを登場させてEditします。

Editボタン

そして、中身の
slider1:440<・・・・・・・
以降を消して次のコードに置き換えてください。

slider1:0<0,24000, 1>Frequency (Hz)

in_pin:left input
in_pin:right input
out_pin:left output
out_pin:right output

@slider
x=(2*$pi*slider1)/srate;

@sample
spl0=spl0*cos(t);
spl1=spl1*cos(t);

t=t+x;

これにより、デフォルトのスライダーの位置が0、スライダーの操作範囲が0~24000Hzまでになり、24000Hzのリングモジュレーションが、標本点と位相干渉によって無音になる問題を、デフォルトでsinになっていた部分をcosにすることで解消しています。

音声の帯域制限とピーク管理

音楽と暗号ともにブリックウォールフィルタをかけ、あらかじめ高めのビットレートで出力し、ノーマライズでピークを0dBにしてください。両方の音源ともにマスタリングは済ませておいてください。
音楽は19000HzでブリックウォールLPF、暗号は4000HzでブリックウォールLPFをかけます。ブリックウォールフィルタはSplineEQで使えますが、持っている方はOzoneEQでも大丈夫です。
ブリックウォールフィルタの後にマキシマイザーやリミッターを絶対に挿さないでください。波形が歪み、帯域漏れが発生します。ノーマライズでのピーク処理は、歪みを発生させないためです。
また、フィルタ前にピーク処理してからブリックウォールフィルタをかけることも避けてください。ギブス現象によってリンギングが発生し、ピークが変わります。

暗号生成

量子化によるきわめて微小な歪みの除去の為、ミックス時にも楽曲側19000Hz、暗号側4000HzでブリックウォールLPFを挿します。ここで、フェーダーを使って楽曲側-0.6dB、暗号側-24.0dBに合わせます。

暗号側は、先ほどのReaJS Amplitude Modulatorを使い、24000Hzでモジュレーションします。そして、二つの音声をバストラックでミックスします。

バストラックで、音声のスペクトログラムを確認します。
下から音声が19000Hzまであり、19000~20000Hzはガードバンドとして音が(ほとんど)なく、そして暗号音声のスペクトルが20000~24000Hzに反転して入っていることを確認しましょう。

音声ミックス後のスペクトル

画像のようになっていることを確認し、wav、サンプルレート48000Hzで出力しましょう。クリップしなければ成功です。

復調

出力されたファイルに、再度Amplitude Modulatorを24000Hzでかけると音声スペクトルがそっくりそのまま反転します。ブリックウォールLPFを4000Hzにセットし、反転した楽曲部分を除去し、マキシマイズすると暗号音声がきっちり聞こえます。

注意点

ピーク制御は慎重に

ブリックウォールフィルタによるリンギングやリミッティングの歪みは厄介です。ミックスした波形のクリッピングや歪みは楽曲、暗号どちらにとってもノイズとして現れるので避けるべきです。
どうしても音圧をあげたい場合、
ブリックウォールLPF→
 マキシマイザー→
  ブリックウォールLPF→
   マキシマイザー→・・・・・・
・・・・・ブリックウォールLPF
と交互に挿して力業で音圧を担保し、出力波形をノーマライズしましょう。

音質劣化の影響を受けやすい

WAVや、FLACでは心配ないですが、MP3や、低ビットレートのAACでは、肝心の高周波帯域がごっそり抜け落ちます。動画の出力時は、AAC386Kbps以上、448Kbps推奨です。
また、この暗号は16000Hz以上がカットされるYouTubeでも再生できないので注意です。

わずかに音圧が下がる

暗号が入るだけの振幅の余力を残すため、楽曲のピークを抑えめにします。その都合で、通常よりわずかに音圧の限界が下がります。また、19000Hz以上の信号が無いため、これによってもLUFSの限界がちょっと下がります。音圧戦争する場合はこの暗号自体お勧めしません。

復元できるか必ず確認

かなりハイテクなことをしているので、ミスやエラーがないか、復元してみるなど、最終チェックをお忘れなく。

困ったことがあったら

ワイに直接聞きに来てくれるのは大歓迎ですが、twitterは文字数制限があったり、不特定多数の人が集まるため、議論に不向きな環境。
そこでDTMコミュニティの出番。
Discordサーバー『音楽熱狂軍団』内で、こういった変態ネタは脳が腐るほど教えます。特に、ボイスチャットで実際に見せながらだと非常に理解しやすいので、ぜひ勇気を出してボイスチャットに凸りましょう!声が出せなくてもトークボットがあるので安心して参加できます。
ただし、コミュニティのルールを守ってもらうために、参加時にルールの確認と規約同意が必須なので気を付けてね。


ワイにうまい棒を恵んでくれると飛んで喜びます。