日曜プログラミング

ゲーム好きの中の人が、自分が作りたいアプリを作る記録です

シャキったかも : ゲームの音を感知し、通知してくれるアプリを作りたい (試作編)

昔から今でも悩ましいこと、それはFF14でシャキったとき(サーバー側でパーティ編成が完了したと通知が飛んできたとき)に45秒以内に返事をしないと、タイムオーバーになること。
このため、パーティ編成待ち状態の人はトイレにもなかなか行けず、我慢できずにトイレに行ったらタイムオーバーになってしまったという経験。あなたにもありますよね・・・・・ありますよね?

そんな時に

そんなアプリを作りたいと考えています。

背景

昔からこの悩みはあったようで

ちょっと検索すると、昔からこういう要望があったようですね。
forum.square-enix.com

今でもたまにFF14の公式ストリーミング放送で、FF14対応のスマホアプリ開発の話が出ていますが、まだシャキった通知に対応したアプリは公開はされてないようですね。たぶん。
チャットシステムをアプリ化するタイミングで、シャキの通知も対応してくるかもしれませんね。(してきたら、私がやることの意味がなくなるわけですが、はい

システム音(とか)も通知してほしい

特に寝落ちしている人を起こしてほしいと考えているのは私だけでしょうか?w
リアルつながりのある人だったら、電話なりLINEなりで起こすのでしょうけど、野良でそれに近いことができたら嬉しいなとか考えています。

Apple Watchを活用したい

これは個人的な要望です( ^∀^) 単にApple Watchが欲しいのです。持ってないのです。
余談になりますが、Apple Watchもシリーズ3になって、フィットネス重視から単体デバイス重視に開発が方針転換された気がします。私もこの流れに乗って、なにかアプリを作りたいなぁとか考えています。

もちろん、Android Wareにも対応させたいですね。

構想

通知方法

最初は通知はメールでもtwitterでもいいと考えていた

実際、スマホに何か新しいアプリを入れなくても、メールやTwitterなどで通知してあげれば問題ないのかなと考えていました。
ただ、それらのアプリの通知って 45秒という制約に間に合わないんですよね。特にメール。

なので、たぶん独自アプリを作ることになるのかなと思います。
slackとかdiscordとかの通知なら早いのかなぁとかは考えているのですが、どうなんでしょう。逆にこの辺りはアプリを入れている人がどれだけいるかにもよる気がします。

ほかにもSMSに通知するという手もありますね。このあたりApple Watchが電話番号対応した甲斐がある気がします! ただその場合 iPad非対応になりますが!

まぁこの辺りはもう少し考えます。

シャキったことを感知する方法

音で感知できないか

できるだけ私は、FF14の中身を触りたくないのです。メモリとか。
あくまでも外側に出てくる情報を駆使して色々こねこねしたいのです。

音で感知することはできないかと考えた時、いくつかの問題点があります。

  • FF14の音をどうやってPC上に取り込むか
  • 音がシャキった音と認識するためにはどうすればいいか
FF14の音をPCで扱う方法

よく、ゲーム実況の生放送をしている人が使う手ですが、ステレオミキサーを使います。
Windowsなら、デフォルトの機能としても備わっています。
この辺りのサイトが参考になるかもです
Windows10で録音 (ステレオミキサーを有効にする) - ぼくんちのTV 別館

macFF14している人でも可能です。私はSoundFlowerというアプリを使いました。
Soundflowerを用いて音声入りの画面キャプチャを撮る方法 - Qiita

PCの設定が難しい人やFF14PS4でプレイしている人も、そんなに嘆くことはありません !
物理的に繋いじゃいましょう

3.5mm ステレオミニプラグケーブル 0.3m (両端ストレート型 オス-オス) AD-711

3.5mm ステレオミニプラグケーブル 0.3m (両端ストレート型 オス-オス) AD-711

マイクとヘッドフォンの穴を繋いでしまえばいいわけです。一番簡単な方法だとは個人的に思います。

シャキった音を、シャキった音だと認識する方法

Visualizerって聞いたことありますか?
音を認識して、その音に合わせて模様が変化するアプリです。(語弊があるきがするけど、簡単にいうとそんな感じ
それをブラウザでやってしまおうという話です。
つまりブラウザで音を聞いて、ブラウザ上で動作するJavascriptで処理して、それがシャキった音だと認識すれば通知するというものにすればいいんじゃないかなと考えています。
 今回はWebAudioAPIを使用します。

参考にしたサイトはこちらです。
まず、ブラウザで音を聞いて、その音に合わせて画面が変化するというサンプルアプリが載っているサイト
liginc.co.jp

実際に音素を解析して、Visualizerにしているサイト
qiita.com

細かい説明は、これらのサイトで説明されているので、ここでは省略します。

実際に作ってみた

シャキったことを画面に表示するだけ

使い方

注意: ブラウザの別のタブで開いている他のサイトでWebAudioAPIを使っている場合は、今回のアプリを試さないでください。きっと強制終了させられます。

まず、以下のURLを開きます。まだブラウザはChromeでしかテストしていません。多分IEじゃ動きません・・・・
https://gelehrtecrest.github.io/shakittakamo/demo/
マイクの許可が求められると思いますので、許可してください。

こんな画面になるはずです。
f:id:gelehrtecrest:20170929152953p:plain

次に、URLバーの右側の、カメラみたいなところをクリックしてください。
f:id:gelehrtecrest:20170929153116p:plain

使用するマイクの種類が選択できます。FF14の音を拾うマイクを選択してください。
Windowsだとステレオミキサー。もしくは物理的にケーブルで繋いだ場合は、既定のデバイスでいいかもです。

この状態でFF14をプレイしてください。
FF14が起動できない環境でのテストは、ファンキットの携帯音を使ってください。
jp.finalfantasyxiv.com

この着信音のうち、「FFXIV_Limit_Break_Charged」がシャキった音だと思います。

実際にシャキらせてみると、ブラウザの文字が変わります。
f:id:gelehrtecrest:20170929153754p:plain

ただこれだけのデモです。ご視聴ありがとうございました!

問題点

 山積みです。問題点。
このアプリを開いてFF14をプレイすると、シャキった音以外にも反応してしまいます。例えば

  • 忠義の剣
  • 光の囁き

このあたりです。
理由は、私が今回作ったデモでは、判定をゆるくしているからです。
どういう判定をしているかは、ちょっとコードをみてみましょう。


gist435d07ac78c5e30ead58391596067a86

何をやっているかというと

  • マイクが拾ってきたとき、一番音量の大きいHzの数値を探す 「getByteFrequencyDataAverage」
  • それを最新20個確保する配列に入れる「buffer_hz」
  • シャキった音のhzだと250程度が20回ほど続く(と予想)し、判定する「is_shakitta」

それだけです。それだけの判定しかしていません。
本来ならもっと真面目に音の波形を比較したりしないと、音楽プロデューサー様に怒られそうですが、今回は許してください。

逆に言えば、もっと音の判定を厳密にすれば、シャキった音だけを判別することが可能だと思います。

ちゃんとした判別ができているかどうかを証明するためには、全ジョブ・全クラスのアクションを試したり、全IDに行ったりしなきゃいけないのですが・・・・・(;;^∀^) まぁシャキ待ちのときは大人しく待機していることを想定しているなら、他のアクションも使わないだろうし、これでいいのかなとは思います。

将来像

今回は試作です。あくまでブラウザでシャキった音を判定するところまでです。
ここから通知をする方法を考えなくてはいけません。

たぶん、既存のクラウドサービスを使い、Push通知を実装し、アプリをスマホに入れてもらう形になるのかなとは思いますが・・・・・そこまでやるかどうかは、まだ未定ということで許してください。


今回はここまで
それではー


スポンサーリンク