Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
VUI設計後の実装からリリースまでのポイント
Search
Yoichiro Tanaka
April 16, 2018
Technology
1.7k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
VUI設計後の実装からリリースまでのポイント
Yoichiro Tanaka
April 16, 2018
More Decks by Yoichiro Tanaka
See All by Yoichiro Tanaka
世界中の開発者と共に モノづくりをするために必要な6つのこと
yoichiro
19
6.5k
スマートスピーカーとは
yoichiro
2
1.1k
CM06 既存サービスを AI アシスタント対応する際の勘所
yoichiro
1
660
Assistant - Google I/O 2019 Extended
yoichiro
2
2.2k
VUIが作る未来 〜 NEM9
yoichiro
0
580
Google Assistant & Actions on Google Latest Updates
yoichiro
1
1.4k
Actions on Google Overview
yoichiro
0
610
Actions on Google Latest Updates
yoichiro
1
160
Actions on Google Latest Updates
yoichiro
1
890
Other Decks in Technology
See All in Technology
型は壁、Rustでもバグを直すな、表現できなくせよ
nwiizo
12
1.7k
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
170
なぜ私たちのSREプラクティスはなかなか機能しないのか 〜システムより先に組織を見る〜 / Why our SRE practices aren't really working
vtryo
1
2.4k
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
220
なぜ人は自分のプロジェクトを 「なんちゃってアジャイル」と 自嘲するのか
kozotaira
0
260
しぶいSRE: サーバから見えない障害にどう向き合うか。ラストワンマイルのデバッグ実践 / Shibui SRE
kanny
12
4.8k
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
1
2k
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
2.6k
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
320
AI時代における最適なQA組織の作り方
ymty
3
460
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
390
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
820
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
270
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
How to build a perfect <img>
jonoalderson
1
5.8k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Side Projects
sachag
455
43k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Claude Code のすすめ
schroneko
67
230k
My Coaching Mixtape
mlcsv
0
170
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
460
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Transcript
VUI設計後の実装からリリースまでのポイント Yoichiro Tanaka, Google Developers Expert
Yoichiro Tanaka Software Engineer / IT Architect Google Developers Expert
(Web) twitter.com/yoichiro google.com/+YoichiroTanaka
この資料は何か? Googleアシスタント向けアプリとして数当てゲーム「イートアンドバイト」を開発した際 に行った、 • 設計時のポイント • 実装時のポイント • レビュー提出時のポイント をまとめたものです。
イートアンドバイトの動作風景
None
None
None
None
None
None
None
設計時のポイント
設計ツール VUI向けの設計ツールは「皆無」な状況 • 業界全体が模索状態、今度ツールがいろいろ出てくるはず。 • とはいえ、何もなしでは、デザインは困難。 Actions on Googleでのオススメと自分なりのメソッドを見つける。
僕が考えたメソッド 1. 脚本を書きまくる。 2. コンテキストを洗い出す。 3. コンテキストの遷移を図示する。 4. インテントを洗い出して、コンテキストの遷移に挟める。 5.
インテントの出入り口に対話を当てはめる。
1. 脚本を書きまくる
Google Spreadsheetで「交互の背景色」機能で行の色分けをしておくと便利
Happy Path から順にシナリオを書いていく Happy Path Scenario 2 Scenario 3
Happy Path
もう一度遊ぶ
ヘルプ
ヒント
3回間違えた
2. コンテキストを洗い出す
2. コンテキストを洗い出す 話の文脈が変化した場所を探して、変化前と変化後を「コンテキスト」として抽出して いく。 • 「3桁の数字を聞いて、判定結果を答えている」という文脈 • 「正解した後、もう一回遊ぶかどうかを尋ねている」という文脈 • 「3回間違えた後、ヒントを聞きたいかどうか尋ねている」という文脈
Happy Path - 「ゲーム中」から「もう一度遊ぶか?」に話題が変化した → コンテキストが変わった
ヘルプ - 「ゲーム中」にヘルプを聞いたけれど、「ゲーム中」に変わりはないので、コンテキストは「ゲーム中」のまま
3回間違えた - 3回間違えたことで「ゲーム中」ではなく「ヒントを聞きたいか?」を尋ねるコンテキストに変化
3. コンテキストの遷移を図示する
「ゲーム中」 「もう一度遊ぶかどうか?聞い ている最中」 「ヒントが欲しいか?聞いてい る最中」 コンテキストの遷移を図示することで、会話の流れの概略を把握できる
4. インテントを洗い出す
4. インテントを洗い出す ユーザの「意図(= アプリへの意思表示、要望)」を抽出する。 • 「コンテキスト」は、どちらかというと「アプリ都合」。 • 「インテント」は、「ユーザ都合」で考えていく。
Happy Path - 「3桁の数字を言って当てる」= "input.numbers" 、「もう一度遊ばないと表明する」= "play_again.no"
Happy Path - "input.numbers" インテントは、コンテキストを変える(game から play_again に)
3回間違えた - "input.numbers" インテントは、hear_hint コンテキストにも変えることがある
ヒント - 「ヒントを聞く」= "help_hint" インテント
4. コンテキストの遷移にインテントを挟める
コンテキストの遷移を図示することで、会話の流れの概略を把握できる
None
None
5. インテントの出入り口に対話を当てはめる
None
例: 「ゲーム中」から「ヒントを聞くかどうか尋ねる」コンテキスト間にインテントを入れて対話を当てはめる
例: 「ゲーム中」から「ヒントを聞くかどうか尋ねる」コンテキスト間にインテントを入れて対話を当てはめる 789 1イート0バイトです。ヒントを聞き たいですか? はい 3桁の数字の合計は、16です。
例: 「ゲーム中」から「ヒントを聞くかどうか尋ねる」コンテキスト間にインテントを入れて対話を当てはめる 789 ヒント 1イート0バイトです。ヒントを聞きたいですか? はい 3桁の数字の合計は、 16です。 3桁の数字の合計は、 16です。
続けましょう。3桁の数字をどうぞ。 1イート0バイトです。 よくわかりませんでした。 3桁の数字をどうぞ。 いいえ 123 ???
脚本 • Google SpreadSheet 脚本からのVUI設計 VUI設計 • Google SpreadSheet •
UML: ステートチャート図 • UML: アクティビティ図
実装時のポイント
実装時のポイント • VUI設計からDialogflowへのマッピング • インテントからアクションの抽出とその実装コードの作成 • いつでも会話を終了できる
Dialogflowへのマッピング
789 1イート0バイトです。ヒントを聞きたいですか? 1イート0バイトです。 おめでとうございます! 3イートです。もう一度遊びますか?
789 1イート0バイトです。ヒントを聞きたいですか? 1イート0バイトです。 おめでとうございます! 3イートです。もう一度遊びますか? Training phrases Input context Output
context Response Intent
Intent Input context Output context Training phrases Response
アクションとフルフィルメント
アクションの発見 インテントに対するレスポンスが 1つに決まることは 希なこと。ユーザの発言やコンテキスト、アプリの 状況に応じて動的に変わる。 → フルフィルメントが次を決定する。 • Output contexts
• Response フルフィルメントに処理を指示するために、アクショ ンを定義して指定する。
Action name Use Fulfillment
フルフィルメント 開発者がコードを書く対象は、このフルフィルメントになる。 • HTTPS+JSONを扱えれば、基本的に何でも良い。 • Node.js向けの actions-on-google-nodejs を使うのが一般的。 ◦ https://github.com/actions-on-google/actions-on-google-nodejs
• Cloud Functionsとの親和性がある。 ◦ GCP/Firebase Cloud Functions (外部通信しなければ無料枠で Ok) ◦ 似たような他のソリューションでも問題ないはず
Dialogflow Fulfillment • Action name • Arguments (= Parameters) •
... HTTPS request
const DialogflowApp = require("actions-on-google").DialogflowApp; const ACTION_INPUT_WELCOME = "input.welcome"; exports.fulfillment =
(req, res) => { const app = new DialogflowApp({request: req, response: res}); const inputWelcome = app => { app.ask("こんにちは。◦◦です。・・・"); }; const actionMap = new Map(); actionMap.set(ACTION_INPUT_WELCOME, inputWelcome); app.handleRequest(actionMap); }; フルフィルメントのテンプレートコード
Responseの決定に使用するコード // 会話を継続してユーザに次の意図を発言してもらう app.ask("正解です!おめでとうございます。もう一度遊びますか? "); // 相手が何も言わなかった際の再プロンプトを第 2引数に指定する app.ask( "正解です!おめでとうございます。もう一度遊びますか?
", ["よく聞こえませんでした。再度遊びますか? ", ...] ); // 会話を終わる app.tell("わかりました。また遊びましょう。 ");
Output Contextsの決定に使用するコード // Output Contextを設定する const CONTEXT_PLAY_AGAIN = "play_again"; app.setContext(CONTEXT_PLAY_AGAIN,
1); // 1 はLifespan // Input Contextを削除する const CONTEXT_GAME = "game"; app.setContext(GAME, 0); // 0 によって削除される
アクションを跨いだ情報保持に使用するコード // 会話セッションの範囲内で情報を保持する app.data.answer = "123"; // 会話セッションが終了しても次の会話向けに情報を保持しておく app.userStorage.answer =
"123";
const inputNumber = app => { const number = app.getArgument("number");
const answer = app.data.answer; if (number === answer) { app.setContext("game", 0); app.setContext("play_again", 1); app.ask("正解です!もう一度遊びますか? "); } else { app.setContext("game", 1); app.ask("◦イート◦バイトです。"); } }; 実際のコードの例
5秒以内にレスポンスを返すこと。 レスポンスを複数返すことは現状できない。 フルフィルメント実装のポイント
いつでも会話を終了できる
コンテキストの遷移を図示することで、会話の流れの概略を把握できる
コンテキストの遷移を図示することで、会話の流れの概略を把握できる
どのコンテキストにいても、ユーザが会話を終了することができるようにしておかなけ ればならない。 → レビュー時には「終了」というフレーズでいつでも会話を終わらせることができるか どうか確認している模様。 → app.askForConfirmation() で「はい」「いいえ」のみを受け付ける場面でも指摘さ れてしまうことがあるので要注意。 いつでも会話を終了できる
レビュー提出時のポイント
アプリの情報登録 • アプリ名、発音 • アプリの説明文 • 画像、アイコン • 呼び出しフレーズ •
開発者情報 • プライバシーポリシー、利用規約 • カテゴリ • その他もろもろ 基本的には、右図のページに必要となる情報を登 録していくことになる。
アプリ名 Googleアシスタントが「アプリ名」を期待通りに認識 してくれるかどうかを早めに確認しておくことがオス スメ。 → Googleアシスタントでアプリ名を声で認識させ て、どのようなテキストになるかを試す。 → あと「早い者勝ち」なので。 ”さいたまけんこうつうとりしまりけいかく
” 期待してたテキスト: 埼玉県交通取締計画 認識結果のテキスト : 埼玉県交通取締り計画 → アプリ名「埼玉県交通取締り計画」
画像、アイコン 小さなアイコンは「丸型」アイコン。 → 四隅が描画されないことを見越したアイコンにし なければならない。
呼び出しフレーズ レビュアーは登録された全ての呼び出しフレーズを 試して、実際にアプリが起動するかをちゃんと確認 している。 → しかも、全てのデバイスで!起動しなければ、 Rejectされる。 特に Implicit Invocation
は全てのデバイスで確認 することが大事。 上記の2つ目のImplicit InvocationはAndroidアシ スタントではOkだったのでレビュー提出するも、実 はGoogle HomeではNGであり、結果Rejectになっ てしまった。
プライバシーポリシー、利用規約 レビュー時に「内容そのもの」についてはさほどチェックされていない模様。 → 自分を守るために責任をもって内容を決めることが大事。 「正しいアプリ名」が書かれているかどうかはちゃんとチェックされる。
まとめ
まとめ Googleアシスタント向けアプリを設計、実装し、リリースするために、 • 設計時のポイント • 実装時のポイント • レビュー提出時のポイント を事前に把握しておけば、スムーズにリリースに辿り着くことができます。
Fin.