【PHP】phpで音を鳴らす

皆さんはphpで音を鳴らしたいと思ったことがありますか?
私はありません。

いえ、↓こういうのではなく

イメージ的には↓こういった感じのやつです。

おそらく長い人類史の中でもphpで音を鳴らそうと思った人はけっして多くないでしょう。
その証拠に「php 音」で検索してみると、phpで音は鳴らせないと書く記事やhtmlで音を再生する記事しか出てきません。

しかし、もしあなたが人類史上稀にみる”phpで”音を鳴らすことを望む人ならば、この記事が役立つかもしれません。

今回はphpのopenal関数の紹介です。

 

openal関数はphpでOpenALを扱うための関数です。
OpenALについて深く理解する必要は今のところありません。PCから音を鳴らすためのライブラリ程度の理解で問題ないです。

OpenALとは
https://openal.org/
https://ja.wikipedia.org/wiki/OpenAL
ドキュメント
https://openal.org/documentation/OpenAL_Programmers_Guide.pdf

OpenALはゲームなど様々なアプリケーションで使用されています。
自分が昔使っていたSFMLという描画ライブラリも音関連の機能はOpenALが使用されていました。

phpのopenal関数ですが、OpenALの主要な機能はおおよそサポートされているので、直接OpenALを扱うのと大差ない程には音を出す感覚が掴めるはずです。
とはいえ、phpで音を鳴らしたところでブラウザでは再生されませんし、Web系の周辺技術としての意義は皆無だと思います。
(何のためにあるんでしょうね、この機能は)

 

それでは、openal関数を使用するために必要なモジュールをインストールしていきます。
(モジュールの概要はここで公開されています。)

※このモジュールはいくつかの問題により、今のところphp8.0以上では使用できないか、ソースを変更して機能を制限しないとビルドが行えません。(2021/8/30)
※phpのバージョン切り替えツールでphp8.0を使用している場合も同様の問題が起きる可能性があります。
※今回はWSL2(ubuntu20.04)でphp7.4を使用しています。

まず必要なツールなどを用意するために任意のディレクトリで下記のコマンドを実行してください。

次に拡張モジュールのソースと、ビルドに必要なopenalのソースを用意します。
どちらもダウンロードして任意のディレクトリへ配置してください。
git cloneでも問題ありません。
https://github.com/Ponup/php-openal(拡張モジュールのソース)
https://github.com/kcat/openal-soft(ビルドに必要なopenalのソース)

ダウンロードが完了したら、php-openalのディレクトリ(/path/to/php-openal)へ移動してビルドを行います。

最後にphp.iniの任意の箇所に下記を追記してください。
(他のextensionの記述に近い箇所がおすすめです。)

 

 

ここまででopenal関数を使う準備が整いました。

ここで少しWSL環境などでopenal関数を使用する際の注意点を書いておきます。

ここまでの手順を踏んだ状態でopenal_device_openという関数を実行しようとすると下記エラーが発生することがあります。

このエラーの一部はサウンドデバイスを見つけることが出来なかった場合に発生するもので、解消するためにはWSLからサウンドデバイスを使用できるようにしなければいけません。
WSLはWindowsが持つサウンドデバイスへのアクセスが出来ないので、PulseAudioを使用するのが一般的のようです。

WSLとWSL2でも設定方法が違い、書いていくと長くなるので自分が参考にしたサイトのリンクを貼っておきます。(WSL2向け)
https://astherier.com/blog/2020/08/wsl2-ubuntu-sound-setting/

これはphp以外の言語で音を出すときにも同様です。

また、オーディオデバイスが正常に認識されているかは下記のコマンドでテストすることが可能です。

これでphpで音を鳴らす準備が整いました。

 

ここに単純なノイズを鳴らすための簡単なソースを用意しました。
正常に動作していれば数秒間ホワイトノイズが再生されます。

簡単にコメントで説明を書いていますが、詳しい関数の説明は次回に解説できればと思います。

次 => (未定)

Share on Facebook0Tweet about this on TwitterShare on Google+0Email this to someone