ハリー・ポッターに出てくる呪文を一音でも間違えるとハーマイオニーに怒られたり、爆発するWebアプリを作ってみた


## 作ろうと思ったきっかけ
私は大学時代、ハリー・ポッターの映画に出会い、**ハリーが魔法学校に入学し、魔法の授業を受けたりする世界観がすごく魅力的**でワクワクしながら観ていました。自分達の世界に**魔法学校があったら私も通って魔法を習得してみたい**と思ってます。以前、USJでワンドマジックという杖を振って呪文を唱えることで魔法を擬似体験できるイベントがあったのですが、友人と予定が合わず結局行けず。。今はやってないみたいですが、最近、プログラミングの勉強をしていて、もしかしたら、何か近いものは作れるかも。。**せめてほんのちょっと気分だけでも魔法を使えた気になれるアプリ**を作ってみたいなと思っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/fb7e2caa-c5fd-e27f-720c-f0b9d1aac0ae.png)

## 映画『ハリーポッターと賢者の石』に出てくる好きなワンシーン
ハリーポッターの最初に出てくる呪文で私が特に好きな魔法が**ウィンガーディアム・レビオーサ**です。物体を浮遊させる魔法ですが、授業中、発音を間違える生徒が続出してなかなかうまく羽を浮遊させることが出来ません。ハリーの友達の**ロンも呪文を唱えるのに大苦戦**。”**ウィンガーディアム・レビオサー**”と唱え、発音が間違っていたために**全然羽が浮遊しません**。**思わず何度も杖を振ってしまい、ハーマイオニーに注意されてしまいます**。ロンはムッとして、ハーマイオニーにそんなに言うなら手本見せてよっていってやらせてみたら、ハーマイオニーは一回で成功を決めてしまう。それをみた、**シェーマス・フィネガン**もトライ。”**ウィンガード・レビオサー**”と間違えて呪文を唱えてしまい、羽を浮遊させるつもりが**爆発させてしまいます**。授業中のカオスな雰囲気、そして私がこのシーンで好きなのは、爆発させてしまった子。失敗することもあるけど、ここまで大失敗するのも、私はなんか逆に愛せるなって思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/6934e02e-fd93-ab5c-d500-7b814224e99f.png)



## 今回、作りたいアプリ
”**ウィンガーディアム・レビオ―サ”を正しく言えてるか判定してくれるアプリ**を作ります。杖を振りながら”ウィンガーディアム・レビオ―サ”を唱えてみる。アプリが音声認識し、正しく言えてたらヘドウィクのテーマが流れ、ほんのちょっとハリー・ポッターの世界の気分を味わうことが出来ます。間違えた呪文を唱えると間違え方に応じて、異なる挙動をしまします。**ロンと同じ間違え方”ウィンガーディアム・レビオサー**”の場合、**ハーマイオニーに怒られる音声が流れます**。**シェーマス・フィネガンと同じ間違え方”ウィンガード・レビオーサ”の場合**は爆発音が流れます。

**実際に作ったアプリはこちら(↓)**

・**PCで試す場合** (私が試したときはPCの方が認識精度がめちゃめちゃ良かったです！　おススメ）　

https://649ec1f14b9251032b2cf599--papaya-wisp-b49037.netlify.app/



## 開発環境、使用アプリ・ライブラリ
[CodePen](https://codepen.io/)
[Netlify](https://app.netlify.com/)



## コードの解説
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="yLQMmaw" data-user="citqlvue-the-looper" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/citqlvue-the-looper/pen/yLQMmaw">
  音声認識 &amp; 発話_mod2</a> by 吉田健一 (<a href="https://codepen.io/citqlvue-the-looper">@citqlvue-the-looper</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

6行目から8行目で3種類の音源(a)ヘドウィグのテーマ、(b)爆発音、(c)ハーマイオニーに怒られる音声のURLを指定し、Audioオブジェクトを定義します。13行目から18行目でWeb音声APIを使用し、音声認識するための準備をしております。26行目から72行目では音声認識出来たときの処理を書いています。音声認識したrecognizedWordを取ってきて、呪文に応じて条件分岐し再生するmp3を変えており、異なるアラートが表示されるようになっております。74行目からモーダルを表示する関数を書いています。

## 動作の様子

<iframe width="1040" height="780" src="https://www.youtube.com/embed/nHYvAnQbrpE" title="ウィンガーディアムレビオ―サ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>



## 本アプリの発展性
実は本アプリ、会社の後輩に使って頂き、色々貴重なコメントを頂きましたので紹介いたします。
野生のトロールが現れ格闘の場面で、ロンがウィンガーディアム・レビオ―サでトロールの杖を浮遊させ、その杖がなんとトロールの顔面に落ちてきて気絶するシーンがあります。結果的にロンがウィンガーディアム・レビオ―サ倒したことになるのですが、たとえば本アプリで呪文を唱えることで敵と格闘するようなゲーム性、そういった要素を持たせたら面白いのでは、というコメントを頂きました。私自身、ゲームはほとんどしない人、ゲームボーイのSaGa2で歴史が止まってる人ですが、すごく面白そうって思いました。こういった要素もアプリ開発に取り入れていきたいなと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217319/34ef202b-5b71-5386-cadb-f1c160928565.png)


## 参考情報 
mp3データのアップロード先として、色々選択肢があると思いますが、今回私はAWSのS3を選択しました。
ただ、デフォルトではブロックパブリックアクセスが無効になっているので、外部からアクセスできないため、以下の要領で解除し、使用しました。他にも色々方法はあるかと思いますが、初学者の私が一番最初に思いついた方法はこれでした。何か参考になれば幸いです。

・AWS S3のブロックパブリックアクセスを無効にする方法

https://blog.serverworks.co.jp/s3_bucket_public_access_block_202204

・LINE Messagin API使って音声データを送るときにAWS S3にアップロードしたらうまくつながったときの話

https://teratail.com/questions/rdl6i5tgou317v