inosyanのブログ読者になるinosyanのブログプログラム、家庭菜園、僕が興味を持ったことを書いていきますこの広告は、90日以上更新していないブログに表示しています。前回の記事「指輪型ガジェット「ORII」のBackerになった」で書いたように、音声アシスタントに興味がでてきたので、Googleアシスタント用のアプリを作ってみました。inosyan.hateblo.jpこちらが実際に動いている様子です。Googleアシスタント用アプリ「バトルゲーム」を公開しました。Homeで「バトルゲームにつないで」と言うと起動します。興味を持ってからアプリを作ってリリースするまで、そんなに大変ではありませんでしたが、いくつか注意すべき点もあるので開発に興味を持った方のためにメモを残します。作り方の手順についてはいろんな方が説明されていますのでそちらをご覧ください。Googleで新規にプロジェクトを作り、Actionsでアクションを作るとDialogflowにエージェントが作られます。DialogflowにはFulfillmentという画面があり、そこがプログラムを書く場所です。EditorをEnableにすると、サンプルのプログラムを見ることができます。サンプルコードはこのようになっています。agent.handleRequest(intentMap);});コメントアウトしてある関数が2箇所あります。コメントアウトを解除してintentMapに紐づけている箇所のコメントも外します。ところはあらかじめ作っておいたインテントの名前を書きます。ほうは問題ないのですが、googleAssistantHandlerのほうを有効にして、シミュレーターで実行しようとするとエラーが出ます。response.これだけだと原因がわからないので、プログラムで何が起きてるのかログを見てみます。画面下のリンクからFirebaseのログが開きます。ログにはこのようにありました。(internal/process/next_tick.js:73:7)agentの内部で起きている問題のようです。バージョンを変えます。"2.4.0",に変更すると直ります。サンプルとバージョンの不一致の問題なので、近い将来には解決すると思います。デプロイまでに時間がかかるのでその対策プログラムを修正してDeployボタンを押すとデプロイを開始します。するとデプロイが終わったと表示されます。この時にはまだシミュレーターで見ても修正が反映されていません。反映までにはここから1〜2分ほどかかるようです。Intent」の最初のセリフにバージョンを喋らせています。作ったアプリをリリースするにはプライバシーポリシーを用意しなければなりません。ほとんどの人は作ったことはないと思います。Googleもそこはわかっているようで、テンプレートを用意してくれています。選ぶと、このようなダイアログが開きます。リンクを開くと、テンプレートのドキュメントが開くのですが、テンプレートの説明は書いてあるのに肝心のテンプレートがありません。テンプレート内容が書かれていないサンプルドキュメント運良く僕は、テンプレートが書かれているバージョンのリンクを知っていました。リンクには、別のドキュメントへのリンクが設定されていて、そちらのドキュメントにはテンプレートの文章が書かれていました。テンプレート内容が書かれているサンプルドキュメントこのテンプレートの指示どおり、${APPNAME}と${DEVELOPER}の箇所を自分のアプリ名と開発者名に置き換えて、手順の箇所を削除して共有設定を誰でも見れるようにしたものをプライバシーポリシーとして申請しました。翌日、審査に落ちたとのメールが来ました。理由はプライバシーポリシーが日本語では無かったからです。僕が作ったアプリは日本語用だったので、その場合は日本語のプライバシーポリシーが必要とのことでした。日本語に訳して再提出したら審査に通りました。ご参考までにそのドキュメントのリンクを載せておきます。これを元に作成する場合は、アプリ名「バトルゲーム」と、開発者名「イノシャン」は、ご自身の情報で置き換えてください。プライバシーポリシーアプリは「終了」で終わらせる必要があるはじめの審査で落ちた理由はもう一つあり、それは「終了」の言葉でアプリが終わらなかったことです。アプリが終了したときに連勝記録を喋らせたかったので、デフォルトのインテントは使わずFulfillmentに処理を書いて起き、「中断」という言葉でその処理を行うようにしていました。「終了」という言葉でも終わらせないといけないようです。「中断」を「終了」に変え、念のため似たような言葉に反応するようにしました。呼ぶと終了させることができるようです。agent.add(conv);会話ごとに保持する変数の扱い作り方のサンプルを見ると、例えばホテルの予約システムの場合、システムが提示した選択肢の中からユーザーが選んだものを会話中システムが保持することは出来るようです。「連勝記録」のような、ユーザが選択肢から選ぶようなものではなく、システムが増減させることのできる変数をどうやって作るのか、はじめは分かりませんでした。いう変数に連勝記録を保持するとします。外側に置いておけば、連勝記録は保持されます。うまくいったように見えますが、これがうまくいくのは同時にプレイしているユーザーが一人の時だけです。2台の端末から同時にアクセスするとどちらも同じ連勝回数になってしまい、混乱してしまいます。このことから、どうやらこのプログラムは、会話ごとに別のインスタンスが作られるわけではなく、1つのインスタンスがすべての会話を処理していることがわかります。変数はテーブルにして、会話ごとにデータを分けるようにしました。会話のセッションごとに違う値が入っているので、キーとして使えそうです。data;ただ、このままでは会話ごとにデータが増えるのでメモリが心配です。終了コマンドが呼ばれたらdeleteするようにはしていますが、途中で会話をやめるかもしれず、そうなるとデータが残り続けてしまいます。会話ごとのデータの更新日も記録し、1日以上経った古いデータを消す処理を会話の開始時に行うようにしています。});}もし1日に何百万人もアクセスするようなコンテンツなら、全件ループするこのような方法は良くないですが、GoogleアシスタントやDialogflowはアクセス数の上限があるのでその心配はありません。DBを使う手もありますが、今回のゲームはシンプルに作りたかったので使いませんでした。スマートなやり方があるのかもしれませんが、今回はこうしました。いくつか注意が必要な箇所はありましたが、それでもリリースまでわりと簡単に出来て面白いと思いました。審査も1回落ちましたが申請して翌日には結果が返ってくるので合計2日しかかかりませんでした。開発は絵を書くこと以外はすべてWebブラウザ上で出来ました。Editorで書きましたが、行数が多くなるとブラウザでは狭いので、ローカルで書いたものをデプロイするほうが良いかもしれません。Editorで充分です。気軽にできるので趣味でプログラムを書く人にもおすすめです。1はてなブログをはじめよう!inosyanさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。