サルにもわかる Dialogflow FAQ

#はじめに  
##同じ苦しみを味あわないために  
**これから随時、Dialogflow(ダイアログフロー)についてのFAQを覚書含めて掲載していこうと思います。**
Dialogflowは、あまりプログラミングしないでもGoogle Homeとかのアプリを自前でできちゃう優れもの。
簡単と思って、「よし、やってみよう！」と安易に手を出すと実は結構.....
いやー、JSONって何？Node.jsって何って、結構単純なことでつまずいたり、ころんだり？の試行錯誤の繰り返し。
私のような還暦迎えたおじいちゃんには、ちと難儀です。
ここでは、**「難しい理屈はなし」**にして、**「どうすればいいか」**に的を絞った**Dialogflow ＦＡＱ**を随時追加作成していきます。というよりは、自分の覚書的なものかもしれませんが....
ところで、内容が間違っていたり、勝手に思い込んで書いたりすると思います。
ですがそこは、還暦おじいちゃんと思って、「そこは違うよ」って優しく教えてくれたら嬉しいです。
宜しくお願いいたします。 

#まずは、準備段階で必要な知識

## Ｑ１．「Dialogflow」ってなにそれ？  
- ブラウザからの簡単操作で Google Home とかスマホとかの音声会話アプリを作成できる。
- あんまりプログラムを書かないでいい。
- 一般公開もできちゃうし、友達に自慢できちゃう、遊び心をくすぐるツールです。

## Ｑ２．必要なものは？環境は？
- PCのＷＥＢブラウザ環境ががあればＯＫ。できればGoogle chromeが良いかな。
- スマホしかない人は、IFTTT(イフト)という、お手軽なのがあるのでそっちをどうぞ。
- GoogleのユーザIDが必要です。Google chromeが使える時点これはクリアしてると思いますが。

#さてここからが本題です。
**自分が困ったこと書き綴っていきますね！**
## Ｑ３．なにから手を付けていいかわからない
- これは今でもわからない。選択肢というかDialogflowが独立した存在みたいで、いろいろなものと連携させることができる拡張性があるから？やれHerokuだの、ラズベリーパイだのLineに、メッセージ投げたり、スプレッドシートに書き込みしたり。「なにから手を付けていいかわからない＝やりたいことが決まっていない」ということかもしれない。まずは試行錯誤して、そのうちやりたいことが見えてきて、何をすればいいか見えてくるのかもね。

## Ｑ４．**Event**ってなに？必要？
- Google Homeに話しかける以外の、以外のスピーカーが発話する条件です。
- 例えば、最初にアプリが呼び出された時とか、
- Fulfilment っていうのを通じて外にあるサーバーに問い合わせた時とか
- ビギナーレベルだと、これじゃないとだめってことは思いつかない(私には)
- 気になるかたは、ググってみるのもよいでしょう。  
参考：[Dialogflowで応答文の一部にwebhookの結果を設定する方法](https://qiita.com/makopo/items/79e8dfa1db2f5159ea75)  
（訂正）
いや、これ必要だわ。どういうケースかというと、今回作ろうとしている発音練習アプリ。
（１）アプリ：Bookと発音して！
（２）利用者：Book！
（３）アプリ：その発音は「誤り/正しい」です。
って、いう動作ができないんです。なぜかというとアプリ自身が出した問題を覚えてないから、正解かどうかわからないんです。まだ試してないですが、Eventでデータを返して、Contentsを利用で記憶させて再度自分で問題と、利用者の発話を比較すればいいかなって思う。(未確認)

## Ｑ５．話す**音程**とか**速さ**は変えられる？
- 変えられます。SSMLというのを使います。HTMLみたいな感じです。
- Action On Google にsimulatorの画面に**「AUDIO」**というのがあって、サンプルが入っています。一度実行すると上書きされて消えます。

## Ｑ６．**SSML**を使うと発話しない？
- 多分文法エラーかな？
  - 先頭が＜ｓｐｅａｋ＞からはじまらないと、発話しませんでした
  - タグが一か所でも間違っているとちゃんと読みません。ペアかどうかチェックしてみてください。
    発話できるかどうかAction On Google にsimulatorの画面に**「AUDIO」**というのがあるので、ここに喋らせてみるとよいです。内容をコピペして、**「UPDATE AN LISTEN」**ボタンをクリックするとだけです。タグに色がつくので文法エラーが簡単に発見できます。

## Ｑ７．**Intent**の設定の下の方に**Fulfillment**があるはずなのにないない？
- 左のセレクター(パンクズリスト？)**Fulfillment**をクリックして、**WebfhookかInline Editor**をENABLEDにしないとチェックボックスは出てきません。つまらないことですが、私ははまりました。  

## Ｑ８．**Entity**を設定したりがたいへん面倒くさい
- コピーは、**Entities**一覧の一覧の右に、CSVとかJSONでダウンロードできます。
- ダンロードしたものを右上のCREATE ENTITYみぎの「・・・」をクリックしてUploadできます。
- 追加する画面の右上の「SAVE」ボタンの右「・・・」をクリックして**「SWITVH TO ROW MODE」**にすると、JSONやCSVソースをインラインで直接編集できます。
 ほんと、きめ細かいですね。感謝感謝！

## Ｑ９．**デバッグログ**って出せない？
- **Fulfillment**の画面の下に、**「View execution logs in the Firebase console」**っていうリンクをクリックすると、ログの画面が表示されます。Inline Editorなどに、「console.log('Request headers: ' + JSON.stringify(request.headers));」とか書いておくと表示されますし実行エラーも表示されます。

## Ｑ１０．デバッグログの**内容が切れている？**「...」みたいになってる
- なんかわかんないけど、選択してエディタにコピペしたら見えない分も表示されました。
- 今日、前記＝先日とレイアウトが変わっている。ログ横いっぱいに、そしてログをクリックするとアコーディオンが開きます。これは便利。

## Ｑ１１．サンプルソースをFulfillmentのInline Editorに張り付けたけど動いてないみたい？
- デバッグログ見てエラーが出ているか確認
- 出ていたらもしかするとだけど、API V2を使っているか確認する。**V1とV2**では仕様に互換がまったくないみたいです。  
仕様とには、選択肢があるのはちょっと厄介だなー。どっちらがいいか＝どっちが動くのか判断しにくいから。

## Ｑ１２．Fulfillmentにある**Webhook と Inline Editor** 同時に使えるの
- 両方使わないか、どちらか片方だけのようです。

## Ｑ１３．最初は、**User says入力**には**ExampleモードとTemplateモード**モードがある　★takatamaさんからテンプレートモードが削除されたとの情報をいただきました。余裕できたら改めて訂正させていただきます。ごめんあさい。
![図１.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/fb2312a2-106b-ccc1-6352-389897162e10.jpeg)
- 図の**「＠」**とか**「”」**のところをクリックするとどちらかに切り替わる。
- とりあえずデフォルトで良いと思います。知らなくても影響もないので。
- 要するに「私は**$Name**です」って変数にするか「私は**宮下**です」って書くかどうかの違い。
- [ここのサイト](https://miningbusinessdata.com/template-vs-example-mode-api-ai/)のアニメーションGIF見たら意味が分かりました。
- このエディタはテキストボックス入力中に自動で単語を認識して、変数定義する超親切機能がついてます。
- 英語なら**「I am Miyashita」**と入れれば簡単にEntityから単語を探せます。でも日本語みたいに続けて書いてみると**「IamMiyashita」**ってなっちゃう。
- 本来、日本語だからこそ生きる（？）テンプレートモード「私は**$Name**です」ですが、個人的には、入力が楽でも、時間がたったら視認性が落ちると思う。
- この説明、信じるか信じないかは、あなた次第。説明長すぎ......
- 
## Ｑ１４．マニュアルが英語？まいったなー
- ブラウザの翻訳機能だと、ソースコードまで翻訳したりしてわかりにくいこともあります。こちら「[天使やカイザーと呼ばれて](https://www.eisbahn.jp/yoichiro/)」に日本語翻訳があったりしますから参考にしてください。  
でも、私の場合翻訳されていても、結果は同じでしたが....(涙)

## Ｑ１５．ラズベリーパイ（通称ラズパイ）ってよく、検索にひっかかるけど？
- もともと教材だったカードサイズのPCです。性能含めてコスパがいいから、組み込みとかに重宝するみたいです。
- ですがボードだけ買うなら安いですが、モニタとか電源とかケース揃えるくらいなら、中古WinタブレットかノートPCの方が無停電付きで便利だし、スペックもいい、使わない時はネットとか楽しめるし。
- 趣味としてお遊びで使うならべつ....！？

## Ｑ１６．Google Homeの方から話させるには？
- サーバーを立ててGoogle Homeにメッセージを投げる感じ。通称ラズパイとかが流行してますが、QEMUというWindows上で動くエミュレータでまずは試してみるのが吉。私のスキルでは無理でした。WindowsにNode.js入れてなんとか喋りましたが、「あっ、そう」って感じです。
- だれもいないときにしゃべったらキモイので人感センサーとか顔認証とか連携できたら楽しいかもしれないけど、それなりの知識がないと無理そう。
- オウムやインコに言葉を教えたりとかするとかならいいかもね。

## Ｑ１７．Contextsを使うのと、Fllow-up intentどちらを使う？
- Fllow-up intentは自動でContextsを設定して作成してくれる感じ。
- Fllow-up intentは、Contextsの名前が気に入らなかったので修正したらFllow-up intentが解除された。おいおい。またやり直し？って感じになったのでContextsの使い方を理解して自分でやった方があとあと吉！って感じ。

## Ｑ１８．Contextsを使うと、何がいいの？
- 勝手な解釈でざっくり言うと、「ｘｘｘｘしていいですか？（アプリ）⇒はい（私）」っていうのが実現できます。「はい」というのは使う場面で意味が変わる言葉です。なのでいままで何を話していたのかを、やり取りの回数という期限付きで覚えさせる感じです。
- まだ試してないのですが、普通は発話内容が変数に記憶され、別のIntentが別の会話を拾った時には消えて、最新の発話だけ変数に入りますが、同じContextsを使っておくことで、以前の発話=変数が使えるらしい。⇒まだ試してないので保証なし。
- Contextでチョットはまったのでメモっておきます。なにかというとContextsに「MENU」という名前を使ったら、なぜか認識されない。小文字＆別の名前にしたらうまくいった。競合というか予約語にヒットしたのかな？とりあえずは、大文字は避けた方が無難です。

## Ｑ１９．**Googleへの問合せ**してみた
- 回数に上限があるみたいですが、無料で問合せができるらしい。問題は有料でもいいからサポート受けてとっとと解決したいくらい。
- Action on Googleの登録でエラーがApp informationの発音でどうもエラーがでるのと、ウェイクワード(アプリ呼び出しのキーワード)認識してくれないので、エラー時なった時に入力欄の下に表示された。
「contact support.」と出ているので問合せしました。製品不具合の問合せさえ自動返信以外戻ってこないことも多い中、さすがと言うしかない。
- 質問の時には先に、言語を選んでおかないと、自分の場合はせっかく入力しても、英語で問い合わせると言われて改めて言語を選んでから再入力しました。

## Ｑ２０．Intentの**テキスト応答**（Default Response）を**複数行**にできる？
- 長い文言書く場合とか、音声に変化を持たせたい時に１行に全部書くのは大変。
- 例えばこういうのが入れ垂れます。
<speak>
    Greetings!<break time="1s"/>
    Konnichiwa!<break time="1s"/>
    This is English pronunciation practice.
    Please say the desired level
    <prosody rate="slow">1.</prosody>
    or
    <prosody rate="slow">2.</prosody>
    Then, please.<break time="1s"/>
    <prosody rate="slow">Soledewa?<break time="0.3s"/> douzo.</prosody>
</speak>
普通に入力して改行だと、次の入力に行きます。こんな時は**「Shift + 改行」**で行の挿入ができます。
不便を感じて試しにやってみたらできました。

## Ｑ２１．メニューにある**Integrations**ってなに？
- 全体の関連を理解していないのと、英語ができないので意味が分からず、使う必要もなかったのでそのまま放置していましたが[こちら](https://medium.com/veltra-engineering/ok-google-call-a-gae-service-by-google-home-please-7611b3f16042)に「Integrationsにて、Daialogflowにて設定した内容を、Actions on Google側に連携」って書いてあるのを見つけた。
- とはいえよくわからず、Google先生に通訳してもらったらなんのことはない。アプリ作ったあとにAction on Googleを呼び出してテストするためのものらしい。他にも用途はあるみたいだけど。

## Ｑ２２．**申請のリジェクト**ってなに？
- 自分の作ったアプリを公開するのに審査が必要で、審査に落ちたってことらしい。
- 普通のWindowsアプリとかだと自己責任だけど、Googleのアプリとして公開するから責任もつらしい。テストまでしてくれるなんて、なんかすごい。
- 申請が通ると**$200＋オリジナルTシャツ**がもらえるらしい。今もそうなのかは不明。

## Ｑ２３．**General Languages**ってどう使うの？
- DialogflowとAction on Googleにも設定する箇所があるけど、わかりません。
- 還暦バンザイ.....お手上げ。誰か教えて。

## Ｑ２４．**api.ai**ってなに？
- Dialogflowの以前の名前。経緯に興味があればググってみる。
- 検索するときのキーワードに入れるといいかも。

## Ｑ２５．**会話設計**の注意点
- 使う人のことを考えないと公開申請がリジェクトされるらしい。
- 最初に「こんにちは」とだけ言うのはNGっぽい。
- 理由は、相手がそのあとどうしていいかわからないから。
- 「こんにちは。ｘｘｘです。ｘｘｘするならOK、終了するならバイバイと言って...」みたいにするらしい。
- 要するにヘルプデスク的な感じで、「如何しましたか？」ってところから入るみたいです。
- IFTTTを使ったときには、先にやりたいことを指示するので、会話の入り口が違う感じですね。

## Ｑ２６．**転ばぬ先の杖、バックアップ**について
- うっかり事故、なぜか動かないとかを防ぐためにもバックアップは大切です。
- **Export and Imports**っていうソースダウンロードする機能あります。
- Dropboxに保存すると、一か月以内なら、過去のものが取り出せます。
- ** ほんと取った方がよいなとつくづく感じる今日この頃。時々ソースが戻ってしまう？

## Ｑ２７．Contextで、文脈理解するアプリにする？
- そもそも文脈って何かってことですが、要するに「空気を読む＝話の流れを意識する」ってことでしょうね。多分
- おそらくプログラマに言わせるなら、絞り込み条件だと思います。
- 他のサイトを見るとinput context や output contextとか出てくるけど、「input=さっきまで何はなしてたっけ？」で 「output=今なんの話してるんだっけ」となる。と私は思う。
- 例えば、住所の入力で「都道府県を言ってもらった」としてらそのしるしとして「output=PrefecturesOK」って印を立てる。そして次に実行される市町村を言ってもらうインテントは、「input=PrefecturesOK」という都道府県をすでに聞いてある前提でないと発動しないように作る。
- 、、とここまで割と簡単に理解できが。けど、前に言った都道府県名がわからない。その時は、イベントの取り方みたいに、ActionのValueに**「#context_name.parameter_name」**って定義すればよいみたい。
- なるほど。うまく考えてあるなー。Googleがapi.aiを買収したのもわかるね。

## Ｑ２８．**Event**は、Filfillmentからの値を受け取りたいときに使う
- イベントを使わないで単純にテキストを返す（＝喋る）のもよいのだけど、Fulfillmentの返した値を記憶りたり、それを音声出力する場合に使うらしい。
- 取り出し方、Contextと同じで、#＋イベント名．値を保持している変数名となります。

## Ｑ２９．バックアップのすすめ
- 理由はわからないけど、呼び出しのワード読み取らず、エラーが発生した。
- 別のプロジェクトはチャント動くので、ソース壊してしまった？と思って、ブラウザをリロードしたり、TEST DRAFTボタンクリックしたり。
- そうこうしているうちにまた動くようになった。もーうっ意味不明

## Ｑ３０．Googleさんへ問い合わせ
- 何度かやり取りしているうちに、自分が作っているアプリは無理だってことがわかった。(うまく説明できないので説明は割愛します)
- 英語と日本語を使いたかったのだけど無理みたい。SSMLの言語切り替えとか対応してほしいとおもうのであります。
- なんか、いろんなことでハードルたかいー。

## Ｑ３１．**相変わらず、はまりまくって**一向に進まない。
- 先日の、発音トレーナーだけど再挑戦中。
- そしたらまたまたまたまた、ハマった。
![1111.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/44d7f46c-c70b-f853-d9b7-353e815a0671.jpeg)  
**図の上の方にあるエラーの意味がわかんない。最初はOKだったんだけど、タイトル触ってたらこうなった**
- ひたすらググる。奇跡的に見つかったのがこれ！
![333.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/3c1941ac-0a25-90d3-ca8f-38ab87e771e7.jpeg)  
- 英語はできないのだけで、Make sure they all include....?...もしかして、呼び出しの文章はタイトルの単語が全部必要ってこと？
![2222.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/03f46142-fcdb-ef8b-f32a-d1b98e09e5a7.jpeg)  
**試しに、こういう風に直してみたら、見事に消えた！**...英語はやっぱり必要だと感じる今日この頃。

## Ｑ３２．発音トレーナーを別プロジェクトにして作り直し手見た。
- もちろん作成途中。JSを勉強しなくてはならないから.....アハハ
- 実は、ググっていたら、同じ悩みを持っている人がいた、欲を出して、英語と日本語のマルチ言語設定したのが間違いらしい。
- そしてマルチにするとろくなことがないとも書いてあった。
- 作り直したら、言語のｘｘが入ってないとかのエラーも消えた。よしよし。
- 設定する機能はあるけど削除するGUIはないらしい。へぇーGoogleさんにしてはちょっとって感じがしないでもないけど人のことは言えるような技術は自分にはない。
- 

## Ｑ３３.ところで下の図の、チェックボックスは何に使うのだろうか？
![7777.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/3b04f46c-3f95-04c7-e8c1-91b46fb5a316.jpeg)  
- 日本語環境で英語モードする場合は外さないとだめなのかな？
- こんど調べてみようっと。

## Ｑ３４.**奇跡？**なんとアプリの申請、このあとどうしたらいい？
- 英語の発音トレーナが実装できないことわかって、気分変えるために料金検索を作成した。
- 申請したら....徹夜で作って朝申請したら午後に、おめでとうメールが来てた。
- この後、どうすればいいのだろう？
- どうも調べたら、もう公開されていて「公開中止」ができるみたいです。ふーん。
- 公開したアプリですが、「ハロー料金検索」と言います。どなたかよくも悪くも感想がもらえたら嬉しい


## Ｑ３５.結構苦しんだ***アプリ名の付け方***
- 最初は、他の方のページを参考に一般的でないものにしました。
- 我が家のわんこの名前を使って「パピー配送料金検索」としました。
- Action on Googleで、テキストベースでテストしていて最後まで全然気が付かなかったのですが、、、、
- 実機だと名前を聞き取ってくれないんです。
- 「ハロー、配送料金、検索」は長くて結構私の様な爺にはつらいので、名前はひといきさくっと言える長さにしました。
- 「ハロー料金検索」に落ち着きました。

## Ｑ３６.**ヤマトを認識してくれない？**でもヤマト運輸は認識する
- なんでだろう、他と衝突してないかをさんざん調べたが不明。
- エンティティには「ヤマト、やまと、やまと運輸、クロネコ、黒猫、ヤマト宅急便、ヤマト宅配便､､､､､思いつくのは全部入れたつもり
- ふと、どう認識しているのかな？と思った時に思い出した。
- Dialogflowにトレーニング機能があるからもしやっと思って見てみた。
- ガビーン！！やられたー。
- ななッなんと、「YAMTO」ってなってる。しかも大文字。凹みました。
- 次のバージョンには宇宙戦艦、森雪、宇宙戦艦、木村拓哉主演をヤマトエンティティに追加します。

## Ｑ３７.テストしててなぜか、**応答がありません** となってしまう？
- Fulfillmentを使っていないのになぜか応答なしになる。
- ほんとに困った。最初はDialogflowのバグかな？って疑ったり。Googleさんごめん。
- 反省して、もう一度目を凝らすと、ありゃ！パラメタの定義が間違っている。しかも使わないもの。
- 消したら、サクッといきました。

## Ｑ３８.Intentの変数定義に、**変数名+「.original」**があるけど？
![おりじなる.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/0aef61fe-6907-74ef-90ae-525bda34acb9.jpeg)
- 一応確認してみた。想像通りだったけど。
- 変数名+「.original」には聞き取った言葉が入っている。これを選択すると、変数を参照してもオリジナルが取得されるようになる。
- どういうときに役に立つのだろう？

## Ｑ３９.**以前に、バックアップのすすめ**を書いたけど。
- この時、自分はソースをいちいち手でコピーしていた。結局ぐちゃぐちゃで意味がない。
- なんとここにあるじゃないですか。
- ![バックアップ.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/ecdfaab2-da62-af01-087d-f2058c455e1d.jpeg)

- それとバックアップって何事もなければ不要ですが、捨てていかないとどんどん増えちゃいます。
- 僕は、Dropboxに入れています。１か月間は保存した履歴が残りいつでも戻せます。１か月したら戻せなくなりますが、そこまで古いと戻す意味もないですよね。
- インポートやリストアもついているので結構いいですよね！

## Ｑ４０.**ＪＳ**（Java Script）で超はまった
- 実は僕はまだ、Inline Editorに記述してある言語が何なのかわかっていない。
- 当たり前すぎるらしく、どこにも「ｘｘｘ言語だよ」って書いてるページが見当たらない。見つけられないだけかも。
- そのくらい無知だからちょっとしたことではまる。
- どういうとこかというと、動いていたロジックの名前を変えたせいで動かなくなった。
- エラーでは、オグジェクトがどうのこうのと言っているらしい。
- そういえばラズパイだかレズバイだかわからんけどNODE.JSとかいってたから、まずJS前提で調べてみた。それから数時間。
- JSは、「関数名の先頭を大文字にするとオブジェクトになる」、、、？はぁ～？何それ。慣例としてじゃなくて？
- 、、、という「落ち」、いや「無知」でした。簡便してよー。以上、

## Ｑ４０.Dialogflowで**少しずつ作りこみには限界がある**
- Dialogflowはいろんな機能を上手に組み込みしていて、最初はわけわかんなくて使いにくいなと感じた。
- でも使っていくうちに、「このUIにかわる良い提案は無理だなって感じる。制限だらけのWEB画面で「よくぞここまで」って誉めてもよいと思う。
- とはいえ、今のUIでは少々きつい。
- まず問題点はエンティティ。ちゃんとしたものを作ろうとすると、あっという間にページ内で収まらなくなるし、日本語が使えないからほんとわかりにくい。
- 知らぬ間に、同じものを登録してしまったりする。同じ言葉が複数あっても警告もでない。
- キーワードもいろいろ思い浮かぶし、Intentを記述している最中でも思いついたり、テスト中に思いついたりもする。
- ここはやっぱりEXCEL君の出番でしょ！
- と、いうわけで作ってみました。効率が結構あがったこともあるけど、画面を切り替えて探す面倒がなくなりました。
- サンプル画像掲載しておきます。欲しいという人が一人でもいたなら公開しますので連絡ください。
- 「一覧」の列は、自動で●を出してフィルタで一覧を出せるようにしました。
![EXCEL.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/ba270268-1764-a36c-e3e4-573026e9a809.jpeg)

- 内容は、定義名の単なる日本語化です。
- コピペ用は関数作りました。右の欄の定義をCSVに変換しています。これをこのまま、Dialogflowコピペします。
- たいしてものではないですが、効率は劇的に上がりました。

## Ｑ４１.作っているうちに**ぐちゃぐちゃに？**
- ちょっと複雑な動きというか、ｘｘｘ問い合わせ、＆ｙｙｙ問い合わせを組み込みといった場合、お互いの言葉が干渉してしまいます。
- もちろんそんな時のために「コンテキスト」があるわけです。
- follow-up intentもあります。
- 僕の場合は、少しずつ試行錯誤派なのでfollow-up intentにしてしまうと、名称の英語のスペル間違いに後で気が付いた時に名前の変更ができません。できますが、階層が解除されちゃいます。
- なので僕は、Contentsを利用しています。
- でもこれもブラウザ上では全体が見えません。なのでここでもEXCELのお力を借りました。
-![EXCEL2.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/0cfccc36-6468-9efc-15fc-5b559f2d2de2.jpeg)

- 見たまんまなんですが、流れを１画面に入れています。作成途中なので埋まっていないところ多いですが雰囲気だけ汲んでください。
- Intentは先頭に番号を入れて流れを見やすくしました。
- A1に調べたいキーワードを入れると、該当する場所がピンク反転します。
- 特定のコンテキストがどこからどこまで有効なのかとかがチェックできて、すごく便利！自己満足かな。
- こんな工夫をしているうちに、「作っては消し、また作って」みたいなことがだいぶなくなりました。

## Ｑ４２．**０．５３ ＆ ０．５３**にしたらだいぶよくなった。声の高さと、速さは自分には合わなかった。
- なんのことかわからないかと思いますが、実はこれ音声のピッチとスピードです。
- よくサンプルには low, medium, high ってありますが、僕が女性の声で試した感じではピッチ ０．５３ スピード ０．５３が割といい感じでした。
- ちょっと早いかなって気もしますが、僕は、ユーザが音声の高さやスピードを変更できるようにしました。
- 低い声にすると男性的な声になりますが、柔らかい感じで結構いいです。たしか０．４０ピッチくらいだったかな？
- 音声の高さや話す速さの実装は、 必須な感じですね。簡単だし実装しておいた方がいいですね。

## Ｑ４３．**え、バックアップれさてない？** Inline Editorの罠
- Inline Editorの分がZIPに入っていない
- ちょっと驚き。それとも他に入っているのだろうか？とりあえずテキストでバックアップしていおいた方が良さそうです。

## Ｑ４４.なんか**凄そうな機能** 機械学習(ML Serrings)はって何？
- ２カ所くらいになんか凄そうな機能がありました。
![機械語学習.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/c4d78708-78e2-a673-d580-656df19fc8f5.jpeg)
![機械語学習2.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/9f1c53ea-883f-6aa1-ce86-bd4dd47f29ac.jpeg)
- 機械学習のモード(ルールベースと機械学習)を変更したり、バックプロップの精度かとかあるらしいですが、意味わからなかったので僕は無視、**取りあえずきにしない**ことにしました。

## Ｑ４５．** Googleさんにリジェクトされた話 **
- 審査に出すと結構直ぐに返事が返ってきます。ちゃんと見ているのか？って思うくらい早いんですが、ちゃんとチェックしてます。
- 宅配料金検索を作ってみたのですが、荷物のサイズ162センチの時に応答が返りませんってことでした。佐川とヤマトの荷物のサイズは似ているんですが、サイズの上限が違うときにエラーなっていました。「やまと」と判断するところを「ヤマト」としてました。Googleさんありがとう！今度はちゃんとチェックします。（反省）
- スマホの時に音声が出ないと指摘されました。原因が分からず、問合せました。なんと、再現テストしました長い言葉はスマホはNGとの回答でした。Googleさんありがとう！（また反省、スマホのことぜんぜん眼中になかったです）

## Ｑ４６．** Googleの安心感 ** 
- Googleさんに「イベントが複数上がらない」って質問しましたが、調査するので少し待って欲しいとのことでした。
- 待つこと１週間、返事が来ました。最近発生した不具合で改修されたとの回答。Googleさんありがとう。
こういうのってほんと、安心できますねー。そうそう、メールは解決しましたありがとうってメール出すと、普通は返信こないけど- - Googleさんはこちらが最後のメールになることなくて、丁寧に返信してきます。きの気配りがほんと流石です。Google信者になりそう。

## Ｑ４７．** 音声の速度や高さはノープログラミングでできます！ ** 
- 多分、皆さん当たり前にやっていることを、自慢げに説明するのも恥ずかしかったのですが、最近、「いいね」を時々もらえるので、思い切って私のやり方を公開します。もちろん、還暦爺のやることです。プログラミングのはずはありません。
- 説明下手なので内容を直接画像にしました。結論から先に！
 ![説明０.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/de752e9d-3b6c-1cee-f27f-a0d1bedeaf3b.jpeg)
ピッチも同じ感じで設定します。
これだけ見たら十分の人もいますね。きっと。素人考えでここまで悩みました。
音声の速さを変数にするだけの話です、あとはそれを忘れないようにCONTEXTにするだけ。
WELCOMEの時のインテント設定
![説明４.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/8998af74-3680-6495-7b77-6de707f8be1f.jpeg)
エンティティの設定です。速度と高さですが、お好みで設定します。
![説明１.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/5390ba22-aa32-72eb-1c31-02559fe53f1a.jpeg)

![説明５.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/21b050d7-fc67-ae32-6e1d-9d30223c5a9c.jpeg)

使うときはこうです。
![説明６.jpg](https://qiita-image-store.s3.amazonaws.com/0/130555/cc41e9c9-52f0-6df8-7419-667ba79ef499.jpeg)

## Ｑ４８．** Action on Google からプロジェクトが消せない？ **
- 英語嫌いの、マニュアル読まない性格なので微妙にはまった。
- テストで作ったプロジェクト。再利用すればよいのだけどプロジェクトIDがいまいち。最初から当たり障りないのにしておくのが後で吉。
- プロジェクトIDは消せないので削除したいがなぜか消えない。消すときはDialogflow側で先に消してから、Action on Google側で消すのが吉！
- プロジェクト自体は１ヶ月くらいの猶予があるらしい。あまり追加削除をすると制限を超えて登録できなくあるので、過去のものを再利用するのがよいと思いました。**ただ、正しいはずなのに思った動作をしないという場合は削除して追加するのが吉とでるケースもあると聞く**


## Ｑ４９． Ｑ．４０の補足 エクセルマクロ 
- インテント用のＣＳＶをＥＸＣＥＬで作成する時に使ったマクロのソースです。
- 素人プログラムだけど自分で作るよりは早くなると思うので載せておきます。気に入らないところは適当に直して使ってください。
- 使う時にはこんな感じ。「=CsvConv(F4:BJ4,TRUE)」CSVにしたい場所を範囲にする。TRUEをFLASEにすると空欄も含めて変換します。

``` Basic:Macro

'選択範囲にあるをCSV形式にする
'引数は処理範囲、nulloffは未入力を対象にするかどうかです
Function CsvConv(arg As Range, nulloff As Boolean) As String
    Dim c As Range, csv, wcma As String
    wcma = ""
    If nulloff = True Then
        For Each c In arg
            wk = esccsv(c.Value)
            If wk <> "" Then
                csv = csv & wcma & """" & wk & """"
                wcma = ","
            End If
        Next c
        CsvConv = csv
    Else
        For Each c In arg
            wk = esccsv(c.Value)
            csv = csv & wcma & """" & wk & """"
            wcma = ","
        Next c
        CsvConv = csv
    End If
End Function

'CSVの"エスケープ処理
Function esccsv(arg As String) As String
    wk = ""
    wlen = Len(arg)
    For i = 1 To wlen
        c = Mid(arg, i, 1)
        If c = """" Then
            wk = wk & """"""
        Else
            wk = wk & c
        End If
    Next i
    esccsv = wk
End Function

```
## Ｑ５０．** PHPを使ってみたくてはまった **
- PHPだと環境とか意識しなくても使えるからいいかなって思って試した。スマホにPHPを入れて、無料のドメイン使えばテストも簡単だし、使わないスマホならあるし、電気代気にしなくていいじゃんって思ったんです。
- 結果、なにやっても動かず。「応答がありません」って言われる。
- あちこちググってみると、答えがあった。[Actions on Googleで'final_response' must be set.エラーの対処法](https://qiita.com/tutti225/items/ca8f71ce2fd168e2e005)にありました。
- API V2が正式リリースになったんで使おうとしたのが仇になった AND 勉強になった。ローカルのサーバーはAPI V2は×なんどさ。
- こういう情報でも公開してくれると文字を読むのが苦痛の爺には本当に助かる。感謝感謝！m(_ _)m

## Ｑ５１．** Fulfillmentで会話を継続 or 終了がV1とV2で変わったらしい **
- V2ではconv.ask()とconv.close()なったみたい。
- 私が書くと間違えそうなのでこちらのサイトでどうぞ。Ｖ１はこちら[「**DialogflowのFulfillmentで会話を継続 or 終了させるメソッドの使い方**」](https://qiita.com/donchan922/items/304e370bb84557ae43ca) 、Ｖ２はこちら[**「Dialogflow v2の会話を継続 or 終了させるメソッドの使い方」**](https://qiita.com/h-takauma/items/1c26d0e43b3a6ce849b9#_reference-880877af778e6c923c7d) 

## Ｑ５２．** ああ、勘違い　Dataflow　**
- Dataflowここ見て調べていたら、今まで知らなかったこと書いてあったので、印刷してマーカー引いたりして、なんでJavaなのかと思っていました。
- おや？なんか変？ばかだった、DialogflowとDataflow を読み違えていた。
- 老眼も還暦も言い訳にはなりませんね。

## Ｑ５３．** 認証ってなんでしょう？ **
- ざっくり言うと自分だと証明するか、してもらうこと。IDとパスワードを入れることみたい？
- API V2になるとGoogleの外にいるプログラムの呼び出しには認証とか暗号鍵とかでググる必要」があるみたい。
- 今後Fullfilmentを使う場合必要らしい。
- 自分が一番混乱したのは、ユーザアカウント認証とサービスアカウントの二つがあることを理解していなかったこと。以下を読んで初めてわかりました。

[Google Cloud Platform Auth ガイド](https://cloud.google.com/docs/authentication?hl=ja#getting_credentials_for_server-centric_flow) 
[一番わかりやすい Authの説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)


## Ｑ５４．** 困ったらマニュアルに帰る、サポートを使うのもいい **
- 昨年２０１７年までマニュアルがほぼ英語だったように記憶している。
- だからずっと敬遠してました。翻訳しても読みずらいし。
- でもマニュアルの日本語化が結構すすんでいるように思いますから見直してみては如何でしょう。
- そうそう、Googleの神サポートも有効に使ってみては如何でしょうか？

## Ｑ５５．** 自分で作成した外部のAPI呼び出し外部の？ **
- 実は方法が複数あるらしい。なので知らないでググったら、混乱しました。
- こちらにプロジェクト構成がかいてありました。初心者にもわかりやすく書いてありました。  
[Action on Google の全体像と プロジェクトを作成するまで](https://createandscrap.wordpress.com/2018/01/05/get-start-aog-1/)

## Ｑ５６．** 分かりやすい会話フロー **
- 面倒だから会話フローなんて必要ない気もしますが、ある程度大きいプロジェクトにする場合は作る前に頭の中を整理しておくといいと思う。今は作っている時間がないとか、作成中にどんどん仕様が変わってしまい収集がつかないとかにならないためにも必要です。
- こちらが、今まで見てきた中で一番分かりやすかったフローです。手順概要を見てください。  
[Google Home連携でタスク登録 & 確認をしてみよう！](https://developer.cybozu.io/hc/ja/articles/115005687586-Google-Home%E9%80%A3%E6%90%BA%E3%81%A7%E3%82%BF%E3%82%B9%E3%82%AF%E7%99%BB%E9%8C%B2-%E7%A2%BA%E8%AA%8D%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-)
- 何がいいかというと、質問と回答のながれが色分けですっきりしてます。通常の処理フローはモノクロ前提で表現しているので複雑になりやすいです。

## Ｑ５７．** Googleアシスタントが「2カ国語で質問すること」が可能になったらしい ** (更新日:2018/09/26)
- 以前に、発音トレーナーの作成にチャレンジした時にGoogleさんより複数言語は未対応との回答を頂きました。
- 2018年8月時点の情報によると、２ヶ国まで対応できるようになったとの事です。
- 発音トレーナー再チャレンジしたい所ですが、徹夜が当たり前になってて年内は厳しい感じ。
- 還暦爺さんに頼るのよそうよーっ。

## Ｑ５８．**actions-on-google-nodejs V2へのマイグレーション** (更新日:2018/12/29)
- 久しぶりの更新です。その理由はAPI V2のドキュメントを全く理解できなかったので、誰かがやさしく説明してくれるのを待っていたからです。
- やっと最近それらの記事があるサイトを見つけました。Yoichiro Tanakaさんのホームページです。
- [こちらに載っていました。](https://www.eisbahn.jp/yoichiro/2018/05/migration_aog_sdk_to_v2.html)
- 記事にも書かれていますが、３つのポイントがあるようです。V1からV2への移行で苦戦している方（自分だけ？）必読です。
- ①「Action name RoutingからIntent name Routingに変更する」
- ②「非同期処理の場合は Promise を返す」
- ③「コンテキストの設定と削除」
- とありますが、何よりのポイントは、API V2 は V1とは別物と考えることです。マイグレーションしたい場合は移行ではなくて作り直し＝リニューアルと思った方がよいようです。

## Ｑ５９．**Ｖ２コードテンプレートの罠** (更新日:2018/12/29)
- デフォルトで表示されるコードが公式ドキュメント（例えばGoogle Node.jsクライアントライブラリバージョン1移行ガイド）に対するアクションと間違っているとのことです。
- そもそも僕には間違っていることすら理解できてはいませんが、[こちらのたかたまさんの「Dialogflow V2のInline Editor用コードテンプレート」](https://qiita.com/takatama/items/c8146faf9f04fc6b0698)がすごく参考になりました。
- Ｑ５８に書いたように、やはり今までのＶ１とＶ２は別のフレームワークと考えた方が混乱しなさそうです。



# FAQにするはずだったけど、なんかブログみたいになってきてしまった。いつか整理せねば！

## **最後に． 随時アップしていきますね。そうそう、英語の発音トレーナーを作ろうと思っています。難しいことはせず、だれでも手軽に学べるようにしたいです。それではまた。**