見出し画像

unity webGLの音声再生の謎に迫る!

今回はちょっとした技術的な記事です。
最近こういうの書いてなかったのでリハビリを兼ねて。


■序論

unity webGLでゲームを作ったことがある方なら、あの症状に遭遇したことがあるはずです。

音声を再生した時に、謎の「プチッ」というノイズが出たり、あるいは音が変わって聞こえたり。

なんとなくなーなーで直したり妥協したりしていると思いますが、今回あのwebGL上の音声仕様の謎に迫ってみました。

■本論:unity webGLビルドでの音声ファイル

結論から言うと、unity webGL環境では音声ファイルは一括してAACフォーマットで圧縮されビルドされます。


一応wikipediaを貼っておきますが、まあおおざっぱに言えばmp3と似たアルゴリズムを用いた非可逆音声圧縮フォーマットです。

このAACファイル、楽曲のような大きい音声ファイルを圧縮する分には優れたフォーマットなのですが、ゲーム中のワンショットSEなどに使おうとするといろいろ問題が生じます。webGL上での違和感のある音声再生は、一言で言えば、このAACの仕様が原因です。

■AACで劣化しやすい音

自分もAACフォーマットを熟知している!! というわけではないのでこれは経験則でしか言えないのですが、

・開幕からサンプル(波形)に大きい動きがある

この条件に該当する音は、その開幕時のサンプルで耳で聞いてわかるレベルの変化が見えるようになります。例えばアタックノイズの強いバスドラムなんかは、そのアタックノイズの部分が大幅に弱く、尖りのないバスドラムに変質します。これはキー音ありの音ゲーで大問題だ。

ところでハイハットのような「全体的に高音域がある音」はこのような変質はみられません。アタックノイズ付きのバスドラムのような「開始時だけ高音域がある音」でのみこの変質は発生します。AACフォーマットの仕様だろうか?

■対処法はあるか?

実はあります。 ただし最低限の音声処理知識が要ります。

前項でも書いたように、このアタックノイズの変質は、「開幕からそのサンプルがある」場合に生じます。つまりこの変質は、先端に無音部を付与することで回避することができます。0.1秒くらい付与すれば安泰。

ちょっとまて、0.1秒も無音を付与したらSEとしては成り立たないではないか。そうだな。しかし実はwebGL上でもAudioSource.timeSamplesは有効です。 

つまり、あらかじめ音声ファイルに0.1秒の先端無音を付与したうえで、

AudioSource asrc=null;
asrc.timeSamples = 4410;
asrc.Play();

これで勝ちます。ナ、ナンダッテー
(ちょうど4410が不安ならちょっとだけ少なめにしておきましょう)

■まとめ

リハビリレベルの超小規模記事……ていうかTIPSでした。
webGL上でも音声に拘りたい人は活用してみよう!!

……こういうのってQiitaの方が向いている気がするぞ。

■定型句

当記事がいい!とおもったら
スキ!やシェアとかフォローなど、お願いいたします!!


この記事が気に入ったらサポートをしてみませんか?