Voiceflowを使った、ノンコーディングで始めるAlexaスキル開発のハンズオン資料です。
以下を事前に準備しておいてください。
以下で使用します。事前に準備しておいてください。
https://voiceflow.com/にアクセスします。Voiceflowアカウントを持っていない方は、"Sign up free"をクリックしてアカウントを作成しましょう。
※すでにアカウントを持っている方は、これ以降の作業は不要です。"Sign in"をクリックしてログインし、次の章に進みましょう。
"Sign up with Google" をクリックします。
gmailのログイン画面が出てきたらログインします。
登録後にかんたんなアンケートがありますので、順に答えていきましょう。なお、どれを選択したとしてもVoiceflowの利用に影響はありませんので安心してください。"Continue"をクリックして進めます。
Voceflowを使う目的(個人利用か、仕事か)を聞いてくるので、適当に選んでください。選んだら、"Continue"をクリックします。
Voiceflowをどういうふうに使うのか(デザインやプロトタイピング、開発やリリース)を聞いてくるので、適当に選んでください。選んだら、"Continue"をクリックします。
プログラミング経験があるか?を聞いてくるので、適当に選んでください。(経験なし、少しだけ経験あり、経験豊富)。選んだら、"Complete"をクリックします。
以下の画面が出てきたらログイン完了です!ちなみに動画の方はVoiceflowのCEOであるBradenさんです。"Get started"をクリックします。
"My First Project" という最初のプロジェクトが開いた状態になっていますが、これは使いません。左上の"<"をクリックします。
プロジェクトの一覧画面が表示されます。Voiceflowでは、AlexaスキルやGoogle Homeアクションを「プロジェクト」という単位で管理します。右の列にあるのがさっき開いていた、アカウント作成と同時に最初に自動作成される「My First Project」ですね。左の列にはサンプルのプロジェクトが並んでいます。
このハンズオンでは、この一覧画面でプロジェクトの新規作成から行いますので、これらのプロジェクトはすべて使用しません。プロジェクトを作成するとこの画面に一覧表示される、と思ってもらえればよいです。
これで準備が整いました。いよいよ次の章からAlexaスキルを作っていきます!
このハンズオンでは以下のようなスキルを作成します。
ユーザ :アレクサ、我が家の食卓を開いて
アレクサ:我が家の食卓へようこそ!このスキルでは我が家のおすすめのレシピをご紹介しますよ。
なんのレシピを聞きますか?
ユーザ :肉じゃがのレシピを教えて
アレクサ:わかりました。では肉じゃがの4人分のレシピです。
じゃがいも、500グラム、玉ねぎ、1個、牛肉細切れ、200グラム、糸こんにゃく、100グラム、
サラダ油、小さじ1、水300ミリリットル、濃口醤油、大さじ4、みりん、大さじ4、酒、大さじ3、
砂糖、大さじ3、です。
他のレシピも聞きますか?
ユーザ :いいえ
アレクサ:わかりました。今日のご飯が楽しみですね。また利用してくださいね。
ではスキルを作成していきましょう!
プロジェクトの一覧画面で、Default Listと書いてあるところの一番下の"Create Project"をクリックします。
スキルの基本情報を入力します。
"Enter your project name" にスキル名を入力します。スキル名がスキルの呼び出し名になります。今回は「我が家の食卓」と入力します。
国・言語は、日本語向けスキルなので、"Japanese(JP)"にチェックを入れて、"English(US)"のチェックを外します。
最後に"Continue"をクリックします。
スキル開発用のキャンバス画面が表示されます。この画面が基本となります。
では早速やってみましょう!左のメニューから、"Speak"と書かれたブロックをドラッグアンドドロップして、Homeブロックの右側に置きます。
右側にSpeakブロックのメニューが出てきました。"Tell Alexa what to say..."と書かれたところに以下の文章を入力します。
我が家の食卓へようこそ!このスキルでは我が家のレシピをご紹介しますよ。
StartブロックとSpeakブロックを線でつなげます。Startブロックの右端の四角の部分からSpeakブロックの左端の四角の部分までドラッグしてつなげてください。
さらに、もう一つSpeakブロックを追加しましょう。場所は先ほど作成したSpeakブロックの右でよいです。中の文章は以下を入力します。
何のレシピを聞きたいですか?
そしてSpeakブロック同士をつなげます。こんな感じになります。
ではここで一旦保存しましょう。Voiceflowでは、保存は定期的に自動で行われますが、右上にフロッピーのアイコンが表示されている場合はまだ保存されていない状態なのでクリックして保存します。最新の状態で保存済みの場合は緑のチェックマークが表示されます。
ではテストしてみましょう。
Voiceflowは、標準でテスト機能を持っています(右上の矢印のアイコンがそれです)。ただし、以下のような問題があります。
ということで、テストはAlexa開発者コンソール側で行うこととします。
Alexa開発者コンソールへのアップロードは右上の"Upload To Alexa"をクリックします。
はじめてアップロードする場合は、Alexa開発者コンソールとの連携ができていませんので、連携設定を行う必要があります。"Login with Amazon"をクリックします。
Amazonへのログイン画面が表示されますので、Amazon.co.jpのアカウントでログインします。
開発者コンソールへのアクセス権の確認が行われますので「許可」をクリックします。
この画面が表示されれば連携は完了です。"Continue"をクリックして、スキルをアップロードします。
アップロードの進捗が表示されます。
"Upload Successful"と表示されれば、アップロードは完了し、Alexa開発者コンソールでのテストが可能になります。"Test on Alexa Simulator"をクリックします。
Alexa開発者コンソールのテストシミュレータ表示されます。
ではテストしてみましょう。左の「日本語」と書かれた横の入力欄に「我が家の食卓をひらいて」と入力しENTERキーを押してください。
Voiceflowで設定した通りの文章が表示(発話)されましたでしょうか?
まだ、少ししか喋らせていないのでテストというほどのものでもないですが、Voiceflowでのスキル開発は、
という一連の流れの繰り返し、ということを理解してください。
では、引き続きスキルの作成を進めましょう。
先程の会話の最後では「なんのレシピを聞きたいですか?」ということで、ユーザに対して質問をしています。すなわちユーザからの発話を元に以後の会話が分岐していくことになります。いよいよプログラムらしい感じになってきましたね!
Voiceflowで、ユーザの発話を元に分岐を作るにはChoiceブロックを使うのが一番簡単なのですが、現状少し問題があり、
これらはそのうち治るかもしれませんが、現状、こういった「ユーザの発話」と「それに応じた分岐」を行うには、Interactionブロックを使う必要があります。Interactionブロックを使うには、Alexaの「VUIの仕組み」を少し知る必要があります。
では、VUIの仕組みについて学んでいきましょう。VUIに必要な要素は以下の3つとなります。
それぞれ順に説明していきます。
最初に説明したスキルの応答例の中に、ユーザが「やりたいこと、してほしいこと」が書いてあります。それはなんでしょうか?
ユーザ :肉じゃがのレシピを教えて
要は、特定の料理の「レシピの内容を教えてほしい」ということですよね。
こういった 「ユーザがやりたいこと」「ユーザが言いそうなこと」 をスマートスピーカー開発の世界では 「インテント(意図)」 といいます。簡単に行ってしまうと、これらのインテントの内容に応じて、適切な応答を返すように機能を作る、のがスマートスピーカースキルの開発ということになります。
今回の応答例では書いてませんが、例えば「レシピを教えて」と言う前に、そもそもレシピの種類は何があるんだろう?という疑問があってもおかしくありません。その場合には多分ユーザはこう言うでしょう。
ユーザ :レシピの種類を教えて
両方ともレシピに関するインテントであるということは共通ですよね?でもユーザが言ってることは微妙に違いませんか?そして、それぞれに対して返ってくる答えも違いますよね?
インテント①
ユーザ :肉じゃがのレシピを教えて
具体的な料理に対するレシピの内容が知りたい、これに対する答えは、
カレーライスのレシピは、じゃがいも、500グラム、玉ねぎ、1個、・・・
インテント②
ユーザ :レシピの種類を教えて
どういうレシピの種類があるか知りたい、これに対する答えは、
肉じゃが、カレーライス、カルボナーラがあります
このように、ユーザが聞きたい意図が違う、すなわち、返ってくる答えも違うということは、複数のインテントが存在するということを表しています。したがって、これらはそれぞれ別のインテントとして設計する必要があるということになります。Alexaに限らず、他のスマートスピーカー等でもこの考え方は共通なので、まずはこういうものだという風にご理解ください。
さらに、どんなスキルを開発するかに関係なく、共通のインテントというものも存在します。
アレクサ、終了して
アレクサ、スキルの使い方を教えて
レシピを教えてくれるスキルであっても、天気を教えてくれるスキルであっても、スマートスピーカーを操作する場合にはこういうことってありますよね?こういったスマートスピーカーそのものの機能に関するインテントを「標準インテント」といいます。これらはスキルの種類や内容に関係なく、スマートスピーカーを操作する上で必要な共通機能なので予め用意されており、応答内容だけは開発者が設定することになりますが、機能としての振る舞いは決められた形になります。
それに対して、最初に例としてあげた「レシピの種類をおしえて」や「〇〇〇のレシピを教えて」は、そのスキル固有の機能、すなわち、スキル固有のインテントになりますので 「カスタムインテント」といいます。これは開発者が自由に作成することができます。
まとめると、カスタムインテントは開発者がそのスキルの一機能としての振る舞い、応答内容も含めてイチから実装するもの、標準インテントは予め用意されたルールに従って応答だけ設定するもの、と覚えてください。
再度、先程のカスタムインテントの例を見てみましょう
ユーザ :肉じゃがのレシピを教えて
肉じゃがの部分は置いといて、このインテント、この通りにいいますか?あなたならどう言いますか?
「肉じゃがのレシピ、教えて」(微妙に違う)
「肉じゃがのレシピ!」(動詞がない)
「今夜は、肉じゃがにしよーかー」(独り言っぽい)
「肉じゃが!」(めんどくさい)
意図としてはすべて同じですが、言い方は様々ですよね?これらのユーザの発話の「パターン」を 「サンプル発話」といいます。音声認識の技術は格段に進歩しましたが、文脈の解析はまだまだ完璧ではありません。そこで、こういったユーザの言いそうなパターンを可能な限り網羅することで、より高い精度で多くのユーザの要求に答えることが可能となります。
また、これはカスタムインテントだけではなく、標準インテントでも同じです。標準インテントの場合には予めユーザのサンプル発話が内部的に用意されていますが、それでもすべてのユーザの発話パターンに対応できるわけではないため、より精度を高めたい場合にはサンプル発話を追加することも可能です。
もう一度、カスタムインテントを見てください。
ユーザ :肉じゃがのレシピを教えて
何度も繰り返すようですが、肉じゃがのレシピを知りたいというインテントですね。じゃあこれが例えばカレーライスだったらどうでしょうか?カルボナーラだったらどうでしょうか?こういうのを一つ一つインテントとして用意していたらキリがないですよね?このようにインテントの目的は同じだけれども、その中に一部異なる部分が含まれる場合、すなわち 「可変」となる部分を 「スロット」といいます。スロットを使うことで、
ができるようになり、より柔軟なスキル開発ができるようになります。
インテント、サンプル発話、スロットの関係を図にまとめるとこんな感じになります。
なんとなく雰囲気がわかったでしょうか?現時点では、まだよくわからない部分もあるかもしれませんが、それは実際のスキル開発の中で学んでいきましょう!
ではインテントを作っていきましょう。左のメニューの"Advanced"をクリックすると、Interactionブロックというのが出てくるので、これを二つ目のSpeakブロックの右に配置して、線でつなぎます。
次に、Interactionブロックの中の設定を行います。
まず、スロットの設定です。Interactionブロックの中のSlotsタブをクリックして、Add Slotsをクリックし、以下を設定していきます。
こういう感じになります。
次に、インテントの設定です。Interactionブロックの中のIntentsタブをクリックして、Add Intentsをクリックし、以下を設定していきます。
例として「肉じゃがのレシピを教えて」のサンプル発話を入力してみましょう。「肉じゃが」の部分がスロットになりますので、入力する内容は「[recipe_name]のレシピを教えて」になりますね?スロットを入力する場合は"["を入力すると自動的に候補が出てきます。
そのままENTERキーを押すとそれが入力され、スロットの場合はブルーで強調表示されます。
続けて「のレシピを教えて」を入力しますが、スロットの前後には必ず半角スペースが含まれる必要があるので注意してください。
入力し終わったら必ずENTERキーで確定させてください。
同様にして、以下を入力して下さい。
こんな感じになります。
最後に、インテントごとの分岐の設定です。今回はインテントが一つだけですが、複数のインテントの場合はもちろん、スロットを使う場合には必ず設定が必要になります。Interactionブロックの中のChoicesタブをクリックして、Add Choiceをクリックします。
Interactionブロックに分岐が増えたのがわかるでしょうか?ここで Select Intent から先ほど作成した"recipe_intent" を選択することで、「xxxxxのレシピを教えて」と言われた場合はこの分岐に入るという紐付けができたことになります。
もう一つ、先程インテントの中で設定したスロット、これは後で分岐の条件として使います。Voiceflowでは、If変数による分岐ができるIfブロックというのがあります。スロット値を変数にしたい場合は、スロットと変数のマッピングが必要になります。
まず変数を作成しましょう。画面一番左の"</>"のアイコンをクリックします。
変数(Variable)の画面が表示されます。真ん中の入力欄に"recipe_name"を入力します。これが変数名になります。最後にENTERキーを忘れずに。
一番下に先程の変数が表示されればOKです。
では再度Interactionブロックに戻って、スロットと変数のマッピングを行います。Choicesタブの、先程作成したrecipe_intentの中にある"Add Variable Map"をクリックします。
スロットと変数をそれぞれ選択する項目が出てきます。
Slotに"recipe_name"、Variableに"recipe_name"をそれぞれ設定します。こんな感じになります。
これでInteractionブロックの設定は終わりです。たかだか分岐処理にこれだけの設定が必要なのか、と感じたかもしれませんが、慣れればそれほど時間もかからないようになりますので、ぜひ覚えてください。
これで、ユーザが発話したレシピ名を変数で処理できるようになりましたので、いよいよ、本当の分岐処理になります。
では、ここから分岐処理を行います。前の章でもお話したとおり、変数による分岐はIfブロックを使います。
左のメニューの"Logic"をクリックすると、Ifブロックが出てくるので、これをInteractionブロックの右において、1と書いてある四角とつなげます。
Ifブロックの中に条件を設定していきます。設定する条件は以下となります。
では、「肉じゃが」から設定していきます。Ifブロックを作ると最初から1のルートができていますので、ここに「肉じゃが」の設定を入れます。Ifブロックの設定は少しわかりにくいので順を追って設定してきます。
valueと書いてある横の青いアイコンをクリックします。
ドロップダウンリストが表示されるので、"Variable" を選択します。
これで変数名を選択することができるようになりますのでクリックします。
recipe_nameを選択します。
recipe_nameがIf文の条件になりました。横の青いアイコンをクリックします。
ドロップダウンリストが表示されるので、"=" を選択します。
value のところに「肉じゃが」と入力します。
これで一つの条件が完成です。続けて "Add If Statement" をクリックして、「カレーライス」「カルボナーラ」の条件を設定します。最終的にはこんな感じになります。
Ifブロックの右端の四角が増えているのがわかるでしょうか?これがそれぞれの条件の番号と対応していて、それぞれの条件に合致したら処理が別れていくということになります。どれにも合致しない場合は"Else"という流れになります。
さあ、これであとはAlexaにそれぞれのレシピの内容を喋らせるだけです。
ここまで来るともうおわかりですよね?Speakブロックをそれぞれに用意して、レシピの内容を喋らせるだけです。レシピの文章は以下に用意しましたのでコピペしてお使いください。
肉じゃがのレシピです。じゃがいも、500グラム、玉ねぎ、1個、牛肉細切れ、200グラム、糸こんにゃく、100グラム、サラダ油、小さじ1、水300ミリリットル、濃口醤油、大さじ4、みりん、大さじ4、酒、大さじ3、砂糖、大さじ3、です
カレーライスのレシピです。玉ネギ、1個、ニンニク、1かけら、生姜、15グラム、ローリエ、1枚、カレールー、220グラム、ブイヨン、1200CC、です
カルボナーラのレシピです。パスタ、100グラム、ベーコン、40グラム、卵、1個、パルメザンチーズ、大さじ3、ブラックペッパー、適量、オリーブオイル、適量、水、1リットル、塩、大さじ1、です
すいません、そのレシピはまだありません。現在ご紹介できるレシピは、肉じゃが、カレーライス、カルボナーラです。
こういう感じになります。
elseのところについて説明しておきます。
elseは、Ifブロックで設定した条件にどれも合致しなかった場合のフローになります。単に「そのレシピはないよ」と言って、終わってしまっても良いんですが、できればもう一回ユーザに言い直してもらうほうが親切ですよね?(じゃないと、ユーザに最初からやり直してもらわないといけなくなります。)
ということで、こんな感じで線を引いてみましょう。
ちょっと線がかぶって見にくいですよね。こういう場合は、「すいません、そのレシピは・・・」のSpeakブロックをドラッグします。
線が自動で引きなおされて見やすくなりましたよね。このように一旦線を引いたブロックを動かすと自動で線が引き直されます。ブロックをたくさん作っていくと見にくくなって処理がわからなくなるので、こんな感じで見やすくしておくのがおすすめです。
これで、説明にないレシピをユーザが発話した場合、以下のような感じで、会話フローが元に戻ることになります。
アレクサ:すいません、そのレシピはありません。現在ご紹介できるレシピは、肉じゃが、カレーライス、カルボナーラです。
どのレシピを聞きたいですか?
(・・・以後、繰り返し・・・)
では、各レシピのSpeakブロックの続きも作成していきましょう。レシピを説明したあとの流れは以下のような感じでした。
アレクサ:わかりました。では肉じゃがの4人分のレシピです。
じゃがいも、500グラム、玉ねぎ、1個、牛肉細切れ、200グラム、糸こんにゃく、100グラム、
サラダ油、小さじ1、水300ミリリットル、濃口醤油、大さじ4、みりん、大さじ4、酒、大さじ3、
砂糖、大さじ3、です。
他のレシピも聞きますか?
ユーザ :いいえ
アレクサ:わかりました。今日のご飯が楽しみですね。また利用してくださいね
まず、「他のレシピも聞きますか?」というのをSpeakブロックで追加します。ここはどのレシピの説明をしたとしても共通なので、以下のように線を引くことができます。
次は、ここで「はい」「いいえ」の分岐になります。
Interactionブロックのところで説明しましたが、ユーザの発話内容で分岐させたい場合、現状はInteractionブロックとIfブロックを組み合わせて使うしかないということでしたが、Alexa開発において、「はい」「いいえ」は少し特殊な位置づけとなっており、この場合はInteractionブロックだけで実現できます。
まず、Interactionブロックを置いて、先程のSpeakブロックから線を引きます。Interactionブロックの中のChoicesタブを開いて"Add Choices"をクリックします。
"Select Intent"から"YesIntent"を選択します。これが「はい」になります。
同様にして"Add Choices"をクリックして、今度は「いいえ」になる"NoIntent"を選択します。2つとも設定するとこんな感じになります。Interactionブロックに分岐ができているのがわかりますでしょうか。
あとは線を引くだけですね。まず、「はい」の場合、「他のレシピを聞きますか?」に対して「はい」と答えているので、レシピの選択まで戻せばいいだけですね。
次は「いいえ」です。Voiceflowではブロックの後ろに何も線を引かなければそこで処理が終了します。ただ、できれば最後に挨拶させたいですよね。ということでシナリオどおり「今日のご飯が楽しみですね。また利用してください」と喋らせることにします。もうわかりますよね?
最後にここまでの全体像を載せておきます。
できたらアップロードしてテストしてみてください。想定どおりに動きましたか?
いかがでしたか?通常のAlexaスキル開発では、VUIの知識に加えて、プログラミングの知識、クラウド(Amazon Web Service)の知識も必要になりますが、Voiceflowでは、VUIの知識は必要ですが、プログラミングやクラウドの仕組みを知らなくてもGUIだけでスキル開発を行うことができます。プログラミングの初心者や苦手な方でもアイデア次第でスキルを作成することができますので、ぜひトライしてみてください!
これで一通りスキルが動作するようになりましたが、ブラッシュアップする余地は残されています。興味のある方は、以下のようなことを実現するにはどうすればよいか、試してみてください。
以下に参考となる情報をまとめておきます。英語が多いですが、一度見てみてください。
https://university.getvoiceflow.com/
Voiceflowのドキュメントや説明ビデオ、チュートリアルなどが豊富に揃っています。
https://www.youtube.com/channel/UCbqUIYQ7J2rS6C_nk4cNTxQ/featured
Voiceflowのチュートリアルビデオが揃っています。
https://www.facebook.com/groups/voiceflowgroup/
Facebookのグループです。各国のユーザから活発な意見や質問が飛び交ってますが、Voiceflowの中の人がマメに答えてくれます。参加申請が必要ですが、すぐに許可してくれます。
https://forum.getvoiceflow.com/
会員制のフォーラムです(要登録)。不具合、機能リクエスト、などいろいろあります。
Voiceflowの画面の右下にあるこのアイコンをクリックするとチャットサポートが利用できます。時間帯があえば結構迅速にレスしてくれます。
順不同です。