Slide 1

Slide 1 text

NewsPicksで音声入力 SiriKitを試してみた UZABASE Meetup#5 2016/08/25

Slide 2

Slide 2 text

自己紹介 ● 福頼(ふくより)一平 ● 2016年1月入社(2015年11月から2ヶ月アルバイト) ● いちおうiOSエンジニアのつもり ● 最近は設計、サーバー開発、Web開発、ログ分析が多い ● 前職は、金融系システム会社で株式、先物オプション、FXのシステム開発

Slide 3

Slide 3 text

SiriKit (Intents, Intents UI) ● SiriKitというフレームワークはない ● IntentsとIntents UIというフレームワーク ○ Intents … Siriからの入力(Intent)を受け取り、処理を行い、処理結果を返す ○ Intents UI … Intentsで返した処理結果を独自の UIで表示する ● 単体のアプリとして実装するのではなくApp Extensionとして既存のアプリ(本体ア プリ)に組み込む 引用: https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html Siri NewsPicksSiriExtension NewsPicks

Slide 4

Slide 4 text

Intents Domain ● サードパーティアプリでSiriKitが利用できるシーンは限られている (Siriが反応するフレーズがあらかじめ決められている) ● 6つのIntents Domain、16のUser Intention Intents Domain User Intention(やれること) VoIP Calling 音声通話・ビデオ通話の開始、通話履歴の検索 Messaging メッセージの送信・検索 Photo Search 写真の検索、スライドショーの再生 Payments 他のユーザーへの支払い、支払い要求 Workout ワークアウトの開始・終了など Ride booking 乗車予約、予約状況の確認

Slide 5

Slide 5 text

Intents Domain ● サードパーティアプリでSiriKitが利用できるシーンは限られている (Siriが反応するフレーズがあらかじめ決められている) ● 6つのIntents Domain、16のUser Intention Intents Domain User Intention(やれること) VoIP Calling 音声通話・ビデオ通話の開始、通話履歴の検索 Messaging メッセージの送信・検索 Photo Search 写真の検索、スライドショーの再生 Payments 他のユーザーへの支払い、支払い要求 Workout ワークアウトの開始・終了など Ride booking 乗車予約、予約状況の確認 →独自のIntentを  追加することはできない

Slide 6

Slide 6 text

NewsPicksって ニュースアプリじゃな かったっけ?

Slide 7

Slide 7 text

SiriKit 使えないじゃん ヽ(ι´Д`)ノ

Slide 8

Slide 8 text

まとめ

Slide 9

Slide 9 text

というわけにも いかないので・・・

Slide 10

Slide 10 text

Intents Domain ● サードパーティアプリでSiriKitが利用できるシーンは限られている (Siriが反応するフレーズがあらかじめ決められている) ● 6つのIntents Domain、16のUser Intention Intents Domain User Intention(やれること) VoIP Calling 音声通話・ビデオ通話の開始、通話履歴の検索 Messaging メッセージの送信・検索 Photo Search 写真の検索、スライドショーの再生 Payments 他のユーザーへの支払い、支払い要求 Workout ワークアウトの開始・終了など Ride booking 乗車予約、予約状況の確認 なんとなくニュースの 検索に使えそう 差出人 →配信メディア 受信日時 →ニュースの配信日時

Slide 11

Slide 11 text

Siriがやってくれること1 - Message Intents ● ユーザーの言葉を適切に(?)解釈し、要素に分解し、Intentオブジェクトに変換す る 「NewsPicksでソフトバンクが含まれるメッセージを検索」   アプリ名   検索キーワード     User Intention ○ 実際には「ソフトバンクが」が検索キーワードとして認識される ○ 「メッセージを検索」ではなく「ニュースを検索」にしたいがニュースのドメインは提供されていないの で、アプリで処理されず Web検索が行われる

Slide 12

Slide 12 text

Siriがやってくれること2 - Message Intents ● 処理を行うための情報が足りない場合、インタラクティブに追加情報を取得する Siri: 「どなたからのメッセージを検索しますか?」 あなた: 「渡辺さん」 Siri: 「どなたからのメッセージを検索しますか?」 あなた: 「日経」 Siri: 「私には"日経"はわかりませんでした。」 →ニュースなのでメディア名を差出人として指定したいが、  Siriは「日経」さんを人として認めてくれない

Slide 13

Slide 13 text

IntentHandlerの処理の流れ 引用: https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/ResolvingandHandlingIntents.html

Slide 14

Slide 14 text

IntentHandlerの処理の流れ 引用: https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/ResolvingandHandlingIntents.html パラメータ解決フェーズ ・検索キーワード ・送信者 ・受信日時 などを検証、必要に応じて取得

Slide 15

Slide 15 text

IntentHandlerの処理の流れ 引用: https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/ResolvingandHandlingIntents.html パラメータ解決フェーズ ・検索キーワード ・送信者 ・受信日時 などを検証、必要に応じて取得 確認フェーズ レスポンスの生成。メッセージ送信 前の確認などを行う

Slide 16

Slide 16 text

IntentHandlerの処理の流れ 引用: https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/ResolvingandHandlingIntents.html パラメータ解決フェーズ ・検索キーワード ・送信者 ・受信日時 などを検証、必要に応じて取得 確認フェーズ レスポンスの生成。メッセージ送信 前の確認などを行う 実行フェーズ 実際のメッセージの送信や検索を 行う

Slide 17

Slide 17 text

実装

Slide 18

Slide 18 text

● ターゲット追加 ○ アプリとしてではなく、 App Extensionとして動作する ● Info.plistに追加 ● ハンドラ(実際の処理)を実装 実装方法 メッセージを送信する 最初に呼ばれるメインクラス →Intentのタイプによって  ハンドラを振り分け メッセージを検索する

Slide 19

Slide 19 text

IntentHandlerの振り分け ● INExtensionクラスを継承 ● INExtensionはINIntentHandlerProvidingプ ロトコルの実装クラス ● 複数のDomainをサポートする場合でも全て このメソッドが呼ばれる ● 今回はメッセージを検索する Intentをサポー トするので、入力は INSearchForMessagesIntent ● 返すIntentHandlerは INSearchForMessagesIntentHandlingを実 装したクラス(SearchMessageHandler) ● Xcodeが生成するサンプルコードは、ひとつ のクラスに全て実装されているが、 Intent毎 あるいはDomain毎にクラスをわけた方がい いと思う

Slide 20

Slide 20 text

IntentHandlerの実装 resolve confirm handle メッセージの検索の場合、 INSearchForMessagesIntentHandlingを実装 送信者を検証・解決する例: ユーザーが指定した(話した)送信者が問題ない場合 →INPersonResolutionResult.success(with:)  →次のパラメータの検証・解決 送信者が不正または指定されていない場合 →INPersonResolutionResult.needsValue()  →Siriがユーザーに誰からのメッセージを検索するか聞いてくれる

Slide 21

Slide 21 text

IntentHandlerの実装 resolve confirm handle メッセージの検索の場合、 INSearchForMessagesIntentHandlingを実装 メッセージの検索で特に確認することないので省略!

Slide 22

Slide 22 text

IntentHandlerの実装 resolve confirm handle メッセージの検索の場合、 INSearchForMessagesIntentHandlingを実装

Slide 23

Slide 23 text

IntentHandlerの実装 resolve confirm handle メッセージの検索の場合、 INSearchForMessagesIntentHandlingを実装 検索ワードが指定されない場合があるのでバリデーション にわかには信じがたいが、 resolveフェーズで検索ワードを要求 する術がない

Slide 24

Slide 24 text

IntentHandlerの実装 resolve confirm handle メッセージの検索の場合、 INSearchForMessagesIntentHandlingを実装 検索APIを実行

Slide 25

Slide 25 text

IntentHandlerの実装 resolve confirm handle メッセージの検索の場合、 INSearchForMessagesIntentHandlingを実装 検索結果のオブジェクトを生成 ・内容はニュースのタイトル ・送信日時はニュースの公開日時 ・送信者はメディア で代替する

Slide 26

Slide 26 text

Demo

Slide 27

Slide 27 text

Demo 検証環境 ・Xcode8 beta6 ・iOS10 beta7

Slide 28

Slide 28 text

Demo 検証環境 ・Xcode8 beta6 ・iOS10 beta7 「MeetUpで渡部さんからのソフトバンクが含まれる メッセージを検索」

Slide 29

Slide 29 text

どう話せばSiriは認識するのか ● 「MeetUpで渡部さんからのソフトバンクが含まれるメッセージを検索」 →OK。検索ワード「ソフトバンクが」、送信者「渡部」 ● 「ミートアップでソフトバンクが含まれるメッセージを検索」 →NG。「ミートアップ」がMeetUpアプリとして認識されない。 ● 「ミートアップで日経からのソフトバンクが含まれるメッセージを検索」 →NG。「ミートアップ」がMeetUpアプリとして認識されない。 ● 「MeetUpで日経からのソフトバンクが含まれるメッセージを検索」 →NG?。検索ワード「日経からのソフトバンクが」、送信者「-」 ● 「MeetUpでメッセージを検索」 →NG。ハンドラの処理は行われるが、検索ワードがないのでエラー。

Slide 30

Slide 30 text

まとめ(所感) ● SiriKit(Intents, Intents UI)が利用できるシーンは限られている ● NewsPicks(ニュースアプリ)では、それっぽく動作させることはできるが、プロダクト としてリリースすることは難しい ● Siriの認識精度は(少なくとも日本語では)あまりよくない ● 煩雑なやりとりをしてまでSiriを使うメリットはあるのか? ○ 運転中や料理中などは便利かも?

Slide 31

Slide 31 text

おわりに ● iOS10で導入されるSiriKitを実際に試して見たが、NewsPicksでは使えそうにない ● 新しい技術は実際に試してみて、感触が良ければ取り入れることにしているが、今 回のように使えないこともある ● 一見無駄なことをしているようにも思えるが、新しい技術を使ってみるのって楽しい ですよね ● ユーザベース、ニューズピックスではMeetUp以外にも隔週くらいでLTやってるので 新しい技術に触れる機会がたくさんあります! ● 新しいこと好きなそこのあなた、一緒に働いてみませんか?

Slide 32

Slide 32 text

Fin.