♾️

アプリをSiri / Apple Intelligence対応にする方法

2024/06/23に公開

本記事は、WWDC24の "Bring your app to Siri" (アプリをSiri対応にする)というセッションを記事形式にしたものです [1]

Learn how to use SiriKit and App Intents to expose your app's functionality to Siri and Apple Intelligence. Discover which intents are already available for your use, and how to adopt App Intent domains to integrate actions from your app into the system. Find out what metadata to provide, how to make your entities searchable with Spotlight, how to integrate your app with in-app search, and much more.
SiriKitとApp Intentsを使って、あなたのアプリの機能をSiriとApple Intelligenceに公開する方法を学びます。どのインテントがすでに利用可能か、App Intentドメインを採用してアプリのアクションをシステムに統合する方法をご紹介します。提供すべきメタデータ、Spotlightでエンティティを検索可能にする方法、アプリ内検索とアプリを統合する方法などをご紹介します。
- セッション概要より

本記事の内容を5分のLTにまとめたスライド版もあります:

https://www.docswell.com/s/shu223/57V712-apple-intelligence#p11

Introduction

今日は、アプリをSiriに対応させる方法について説明します。

  • Introduction

    • まずは、そのためのフレームワークについて説明します。
  • What's new

    • そして、Apple Intelligenceの導入による今年の新機能についても説明します。
  • Actions

    • Siriがあなたのアプリでアクションを実行できるようにする新しいAPIも。
  • Personal context

    • そして、あなたが直接統合することができるいくつかのエキサイティングなパーソナルコンテキスト機能。
  • Wrap-up

    • 最後に、今日のセッションの重要なポイントをまとめます。

では、なぜSiriとアプリを統合する必要があるのでしょうか?

Siriがあれば、人々はデバイスのどこにいても、あなたのアプリでアクションを起こすことができます。

Siriは、あなたのアプリを見ている人に素早くアクションを実行してもらうのにも最適です。既存のフレームワークSiriKit、そしてAppIntentsを使って、これをどのように実現できるかを探ってみましょう。

iOS 10では、SiriKitが導入されました。開発者は、SiriKitが提供するインテントを使用して、音楽の再生やテキストメッセージの送信など、すでにSiriに依頼しているアクションを実行できるようになります。

18

このセッションの後半では、この機能が今年どのように進化したかをご紹介します。

iOS 16では、アプリをSiri、ショートカット、Spotlightなどと統合するための新しいフレームワーク、App Intentsを導入しました。あなたのアプリが既存のSiriKitドメインと重複しない場合、App Intentsはあなたにぴったりのフレームワークです。

20

App Intentsの詳細については、今年のビデオ「Bring your app's core features to users」をご覧ください。

(「Bring your app’s core features to users with App Intents」の要約記事はこちら↓)
https://zenn.dev/shu223/articles/corefeatures_appintents

Siriの新機能

今年はApple Intelligenceのおかげで、Siriに大きな改良が加えられています。

新しい大規模な言語モデルにより、Siriの体験はこれまで以上に向上しています。まだSiriとあなたのアプリケーションを統合していないなら、今がそのチャンスです。

Conversational improvements

Apple Intelligenceによって、私たちは3つの重要な方法でSiriを大きく前進させるために必要な基礎的機能を手に入れました。

26

  • 第一に、Siriはより自然な音声であなたに話しかけられるようになりました。

  • 第二に、Siriはより文脈に関連した、よりパーソナルな存在になります。AppleのインテリジェンスがSiriに画面上の認識を提供するため、Siriはあなたが見ているものを理解し、それに対してアクションを起こせるようになります。

  • そして3つ目は、より豊かな言語理解のおかげで、より自然にSiriに話しかけることができるようになったことです。

たとえ言葉に詰まったとしても、Siriはあなたの言いたいことを理解します。すでにSiriKitを採用しているアプリケーションには、これらの改善が自動的に無料で提供されます。

Action capabilities

Siriの体験を再構築し、あなたがデバイスで行うことをもっと理解できるようにしました。

30

Siriはあなたに代わって、アプリケーション内やアプリケーション間でより多くのアクションを起こせるようになりました。

Actions

App Intent domains

膨大なアプリの世界をAppleのインテリジェンスに接続する手段として、App Intentsフレームワークに深く投資することでこれを実現しました。その結果、App Intent ドメインと呼ばれる一連の新しいAPIを構築しました。それらをお見せしましょう。

34

ドメインは、ブック、カメラ、スプレッドシートといった種類の機能に特化して設計された、App Intentに基づくAPIの集まりです。iOS 18では、これらのドメインのうち12個をリリースします。

メールと写真は今日から試すことができます。

これらはそれぞれ、柔軟な音声インタラクションをサポートするために訓練され、テストされた新しいアクションの幅広いセットを含みながら、本当に簡単に導入することができます。

今年、Siriは12のドメインにわたって100種類以上のアクションをサポートするようになりました。

これらを使ってできることの一例として、Darkroomのようなアプリは、photos.setFilter インテントを使用して、ユーザーにこう言わせることができます: 「昨日メアリーを撮った写真に映画のようなプリセットを適用して」

もしあなたのアプリがこれらのドメインでカバーされる機能を持っているなら、これらの新しいAPIはあなたのために設計されました。

Assistant Schemas

Introduction

Siriは時間の経過とともに、より多くのアプリを理解し、より多くのアクションを取ることができるようになります。

アシスタントスキーマと呼ばれるものを使って、App Intent ドメインのアクションを構築する方法をお見せしましょう。

スキーマは過負荷な用語なので、定義しておこう。

49

辞書では、クラスのすべてのメンバーに共通するものの概念と呼ばれています。Siriの文脈でその意味を紐解いてみよう。

53

  • Appleのインテリジェンスは、Siriに今お話したような領域で新しい能力を与える基礎モデルによって支えられています
  • これらのモデルは、特定のShapeをもつインテントを予想するように訓練されている
    • Shapes はスキーマと呼ばれるもので、Assistant Schemas はAPIと呼ばれるものです
    • 正しいShapeでアプリのインテントを構築すれば、私たちのトレーニングの恩恵を受けることができ、自然言語の複雑さを心配する必要はない
  • 必要なのは perform メソッドを書くことだけで、あとはプラットフォームにお任せください

Shape

今年は、写真の作成やメールの送信など、100種類以上のインテントに対応するスキーマを構築した。

56

これらはそれぞれ、そのインテントを採用するすべての人に共通するインプットとアウトプットのセットを定義している。これが私の言う「Shape」である。このすべてのジオメトリの真ん中に、あなたのアプリに適したエクスペリエンスを定義するための完全な創造的自由を持つ、あなたの実行メソッドがあります。

Apple Intelligence のライフサイクル

では、アシスタントスキーマの動作を示すために、Apple Intelligenceを使ったシリアルリクエストのライフサイクルを説明しましょう。すべてはユーザーリクエストから始まります。

59

このリクエストはApple Intelligenceにルーティングされ、モデルを通して処理されます。

私たちのモデルはスキーマを推論するために特別に訓練されており、Apple Intelligenceがユーザーのリクエストに基づいてスキーマを予測できるようになっています。適切なスキーマが選択されると、リクエストはツールボックスにルーティングされる。

60

のツールボックスには、デバイス上のすべてのアプリからのアプリインテントのコレクションが、スキーマごとにグループ化されて格納されています。あなたのインテントをスキーマに適合させることで、あなたはモデルにそれを推論する能力を与えます

61

最後に、アプリのインテントを呼び出してアクションを実行します。結果が表示され、出力が返されます。

実装

ということで、ダイアグラムについてはもう十分です。コードに飛びましょう。

AppIntent

63

写真アルバムを作成するためのアプリのインテントです。

65

スキーマに準拠するには、App Intentの宣言の前に1つの追加のSwiftマクロを追加するだけ。

この新しいマクロは、AppIntentドメインにバインドされているスキーマを引数に取ります。この例では、photos がドメインで、createAlbum がスキーマです。スキーマのShapeはコンパイル時にすでに分かっているので、App Intentに追加のメタデータを提供する必要はない。

つまり、ここでのコードはさらに次のように減らすことができる。

69

スキーマに準拠したインテントは、そのShapeがわかっているおかげで、コードで定義するのが簡単です。

とはいえ、シェイプが最も柔軟であるとは限りません。

でも心配しないで、この場合は円を四角にすることができる。

74

AssistantIntent は、必要に応じてオプションのパラメータで拡張することもでき、Shapeに少し柔軟性を持たせることができます。

(サンプルアプリの実際のコード)

@AssistantIntent(schema: .photos.createAlbum)
struct CreateAlbumIntent: AppIntent {
    var name: String

    @Dependency
    var library: MediaLibrary

    func perform() async throws -> some ReturnsValue<AlbumEntity> {
        let album = try await library.createAlbum(with: name)
        return .result(value: album.entity)
    }
}

AppEntity

App Intentsフレームワークには、アクションを構築するためのインテントだけが含まれているわけではありません。このインテントから返される AlbumEntity のように、アプリの概念をモデリングするためのエンティティも含まれています。

また、アプリのエンティティをSiriに公開するための新しいマクロも追加されました。

75

インテントと同様に、この新しいタイプを採用するのは、アプリのエンティティ宣言にコードを1行追加するだけと簡単です。

AssistantEntity も、定義済みのShapeの恩恵を受けることができます。

その結果、AppEntity の実装がより簡潔になります。

80

AssistantIntent と同様に、AssistantEntity は、必要に応じて新しいオプションのプロパティを宣言することで、そのShapeを超える拡張も可能です。

83

この "Album Color" プロパティのように。

(サンプルの実際のコード)

@AssistantEntity(schema: .photos.album)
struct AlbumEntity: IndexedEntity {

    // MARK: Static

    static let defaultQuery = AlbumQuery()

    // MARK: Properties

    let id: String

    var name: String
    var creationDate: Date?
    var albumType: AlbumType

    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(
            title: "\(name)",
            subtitle: albumType.localizedStringResource
        )
    }
}

AppEnum

そして最後に、enumです。AppEnum をSiriに公開するのは、エンティティ、インテントと同じくらい簡単です。

85

新しい AssistantEnum マクロをenum宣言に追加するだけで、あとは私たちが処理します。

88

(サンプルの実際のコード)

@AssistantEnum(schema: .photos.albumType)
enum AlbumType: String, AppEnum {
    case custom

    static let caseDisplayRepresentations: [AlbumType: DisplayRepresentation] = [
        .custom: "Custom"
    ]
}

AssistantEnum は、その友人たちとは異なり、列挙のケースにいかなるShapeも課さないので、実装時に完全な表現力を発揮することができます。

Xcode demo

さて、新しいAssistant Schemaマクロを紹介しましたが、Xcodeのデモはいかがでしょうか?私は、デバイス上の写真を表示して整理するためのメディアライブラリアプリに取り組んでいます。私のアプリをSiriと統合してアクションを実行する方法をお見せしましょう。このアプリは、サンプルコードのダウンロードも可能です。

私のアプリを起動すると、この美しいギャラリーに入ります、

92

私のデバイスで利用可能な写真とビデオの両方が含まれています。

96

写真をクリックしてフルスクリーンで見ることができる。
上部のメニューをクリックすると、お気に入りや共有などのアクションを実行できる。

では、Xcodeに切り替えて、アプリのコードをお見せしよう。

ライブコーディング中のトランスクリプト

私のアプリには、アセットとアルバムという2つの基本的なモデルタイプがあります。assetsがどのように定義されているかをお見せしましょう。

アセットとは、ライブラリ内の写真やビデオを表すオブジェクトです。

アセットには、タイトルや作成日など多くのプロパティがあります。

ファイルの一番下に、entityという計算プロパティがあり、これはアセットクラスをモデルにしたAppエンティティを返します。ご覧のように、このエンティティには、私のモデルから直接ハイドレートされた多くのプロパティが含まれています。

これを選択してDefinitionにジャンプし、私のエンティティがどのように定義されているかを見てみましょう。このエンティティは、私のライブラリの指定されたアセットをモデル化しています。

タイトル、作成日、場所など、多くのプロパティを公開しています。

エンティティは、アプリのコンテンツをモデル化するための素晴らしい方法です。また、AppIntentsと組み合わせることで、システムがエンティティに対してアクションを実行できるようになります。

アクションといえば、私はすでにAppIntentを書いて、自分のアプリで特定のアセット・エンティティーを開くようにしている。

ここで、OpenAssetIntent は、ターゲットパラメータであるassetToOpenと、アプリのNavigationManagerなど、このアクションを実行するために必要ないくつかのアプリの依存関係を受け取ります。このインテントをSiriに公開し、自分のアプリをApple Intelligenceと統合する方法を紹介しよう。今年、AppIntentドメインを使って、新しいOpen Photoスキーマを採用することで、これを実現できる。

新しいAssistantIntentマクロをAppIntent宣言に追加してみよう。

入力し始めると、コード補完候補が表示される。

まず、写真のドメインを選びます。次に、オープンアセットスキーマを選びます。

これで完成だ。それではアプリをビルドしてみましょう。

あれ、この新しいエラーは何だろう?インテントをSiriに公開するときは、関連するエンティティや列挙型も公開する必要があります。このエラーを修正するために、アセットエンティティの定義に飛びましょう。ああ、エンティティを公開するのを忘れていたようだ。新しいAssistantEntityマクロを宣言に追加して修正しよう。入力を始めると、オートコンプリートが再び写真を提案してきた。これで、このエンティティのスキーマとして asset を選択できるようになりました。もう一回ビルドしてみよう。素晴らしい。これで以前のエラーは修正されたようだが、この新しい適合性を追加することで、私のエンティティに新しいビルドの失敗が発生している。私たちのモデルは、特定のShapeのエンティティを期待するように訓練されています。もし私がエンティティをスキーマに適合させれば、コンパイラーは私のエンティティのShapeを検証する追加チェックを行うことができます。この場合、半分提案された編集のプロパティが欠けているようだ。

では、追加してみよう。ほら!欠けていたプロパティを追加することで、私のエンティティはスキーマの形と一致するようになり、ビルドは成功しました。コンパイラは、既存のアプリのインテントをスキーマに適合させるのに役立つ素晴らしいツールです。

ゼロから始める場合、あなたの代わりに必要なシェイプを埋めるコード・スニペットも公開しています。

私のモデルには、写真をお気に入り登録するメソッドがすでにあります。

それを使って、この機能をSiriに公開する新しいアプリのインテントを作ってみよう。

アセットインテントファイルに戻りましょう。

今回は、代わりにテンプレートを使ってみましょう。このプレースホルダーを実際のエンティティタイプに置き換えて、アプリの依存関係を取得し、実装するだけです。

これで完了だ。コンパイラーは満足し、私のビルドは成功した。

165

デモでお分かりのように、アシスタント・スキーマを使用すると、既存のアプリ・インテントに対してビルド時に追加の検証を行うことができます。この検証により、スキーマの実装が、モデルがトレーニングされたシェイプと一致することが保証されます。また、Xcodeのスニペットを公開することで、ゼロからスキーマを構築するのがさらに簡単になります。

Testing

それでは、Shortcutsアプリでこれらをテストして実行する方法について説明しましょう。

169

他のアプリインテントと同様に、スキーマに準拠したアプリインテントは、自動的にShortcutsアプリのアクションとして表示され、Shortcutsエコシステム全体に接続されます。これには、パーソナルオートメーション、ホームスクリーンショートカットなどが含まれます。

Shortcutsアプリは、今日アシスタントのスキーマをテストするのに最適な方法です。将来的には、これらの同じインテントとエンティティが自動的にSiriと連動するようになります。

Shortcuts demo

前のデモの OpenAssetIntentUpdateAssetIntent を覚えていますか?ショートカットアプリを使ってこれらのアクションを実行し、エンドツーエンドでテストする方法をお見せしましょう。

まず、ショートカットアプリを起動します。

174

上部のプラスボタンをタップすると、新しいショートカットを作成できる。

175

次に、"AssistantSchemaExamples" をタップして、自分のアプリのアクションをフィルタリングすることができる。

Open Photos から始めましょう。

176

素晴らしい。では、保存してみましょう。

177

これで新しいタイルができました。このタイルをタップすると、先ほどのアセットを開くインテントが実行されます。

179

いくつかの選択肢が表示されます。そのうちの1つを選んで、アプリで開くことができます。

180

ご覧の通り、アクションは実行され、私のアプリは正しい画像に移動した。

デモで見たように、ショートカットは今日アクションをテストするのに最適な方法です。将来的には、同じインテントが自動的にSiriでも使えるようになるだろう。

パーソナルコンテキスト

Apple Intelligenceは、Siriにあなたのパーソナルコンテキストの豊富な理解を提供します。つまりSiriは、安全でプライベートな方法で、あなたのデバイス全体で利用可能なすべての情報を検索し、推論することができるのです。

まずはアプリ内検索から。

186

既存の ShowInAppSearchResultsIntent の上に構築され、システムはアプリの検索機能を直接利用することができる。

Siriがユーザーを検索結果に直接ナビゲートします。このアプリインテントを使用すると、Superhumanのようなメールアプリは、ユーザーに「Superhumanで自転車を検索し、アプリで結果を表示する」という機能を提供できます。

これは、私のアプリで検索結果を表示するための App Intent です。

187

既存の ShowInAppSearchResultsIntent タイプに準拠しています。

今日、アプリの組み込み検索機能をSiriと統合するために、システムドメインの下に新しいアシスタントスキーマを導入します。

この新しいスキーマに準拠するには、次のように、アプリのインテント宣言の前にSwiftマクロを追加するだけです。

193

この検索インテントも、定義済みのシェイプの恩恵を受けることができます。

ShowInAppSearchResultsIntent 型をドロップすることもできます、

196

その結果、より簡潔なアプリ・インテントの実装になります。

(サンプルアプリの実際のコード)

@AssistantIntent(schema: .photos.search)
struct SearchAssetsIntent: ShowInAppSearchResultsIntent {
    static let searchScopes: [StringSearchScope] = [.general]

    var criteria: StringSearchCriteria

    @Dependency
    var navigation: NavigationManager

    @MainActor
    func perform() async throws -> some IntentResult {
        navigation.openSearch(with: criteria.term)
        return .result()
    }
}

Demo

先ほどのデモを踏まえて、Siriが自分のアプリで写真を検索できたら素晴らしいと思いませんか?新しいシステム検索マクロを使えば、それが可能になります。

その方法をお見せしましょう。

199

私のアプリにはすでに検索バーが内蔵されており、場所によって画像を絞り込むことができる。

201

newと入力すれば、ニューヨークの写真を検索できる。

Xcodeに戻って、この機能をSiriに公開する方法を見てみよう。

ライブコーディング中のトランスクリプト

私のナビゲーションマネージャーには、すでにOpenSearchWithCriteriaというメソッドがあります。このメソッドは、指定された条件に一致する検索結果を表示するページにユーザーをルーティングする。

私はすでに検索資産アプリのインテントを持っています。このインテントでは、ナビゲーションマネージャを活用して、アプリに結果を表示します。

システムアクション用の新しいアプリインテントドメインで、同じインテントをSiriとApple Intelligenceに公開できるようになりました。その方法をお見せしましょう。

検索用にこの新しいアシスタントスキーマを追加することで、Siriはユーザーを私の検索結果UIに直接ルーティングできるようになります。それで終わりです。

ビルドして実行し、ショートカットを使って実際にテストしてみましょう。

もう一度、ショートカットアプリを開いて、新しいアクションを作ることができる。

215

自分のアプリをフィルタリングできる。

217

今回は、Search Photosを使って保存してみよう。

218

それでは実行してみましょう。

219

このアプリは検索条件のパラメータを取るので、値を入力するよう促される。

220

サンフランを検索してみよう。

221

ご覧の通り、私のアクションは正常に実行された。

222

そして、ゴールデン・ゲート・ブリッジの美しい写真を見ることができた。

デモでお分かりのように、アプリ内検索は、ユーザーを私のアプリに呼び込み、その美しいUIで結果を表示する素晴らしい方法です。

今年はSiriの機能を拡張し、私のアプリのコンテンツをより深く理解できるようにします。

Apple Intelligenceのおかげで、Siriはセマンティック検索ができるようになりました。

226

つまり、私がペットを検索するとき、Siriは単にペットという単語を探すのではありません。猫、犬、そしてヘビさえも検索してくれる。LLMを使えば、Siriはペットとは何かを理解します。あなたのコンテンツを見つけたら、直接アクションを起こすことができます、

例えば、お気に入りのペットの写真を友だちと共有したり。

あなたのアプリでは、App Intentsフレームワークを使用して、この追加のコンテキストを提供するエンティティを定義することができます。

231

Indexedentity と呼ばれる新しいAPIに準拠することで、Siriにアプリのコンテンツを検索する機能を提供し、セマンティックインデックスで情報を利用できるようになります。IndexedEntity の詳細については、App Intentsの新機能に関するこちらのセッションをご覧ください、

まとめ

Appleのインテリジェンス機能のおかげで、今年はSiriの新時代の幕開けとなりました。あなたのアプリケーションをSiriと統合するために必要なツールは、今日から利用できます。ソフトウェアアップデートでは、アプリ内アクションとパーソナルコンテキストの提供を予定しています。

このセッションでは、メディアライブラリアプリをSiriに対応させる手順を説明しましたが、まだ実際に動作するデモはご覧になっていません。

今日のセッションを終える前に、あなたのアプリで今後何ができるようになるのか、こっそりお見せしましょう。

238

「この写真をカリフォルニアのアルバムに追加して」

「ジョシュにメールして」

240

まとめ。

  • Apple Intelligenceの新しい大規模な言語モデルのおかげで、Siriはこれまで以上に有能で、より柔軟で、よりインテリジェントになりました。
  • SiriKitとApp Intentsは、あなたのアプリケーションをSiriに統合するための2つのフレームワークです。あなたのアプリが既存のSiriKitのドメインと重ならない場合は、App Intentsが最適なフレームワークです。
  • インテリジェンスといえば、Siriがあなたの代わりにアプリ内でアクションを起こします。新しいAssistant Schema APIを採用することで、あなたのアプリもその恩恵を受けることができます。
  • 次に見るべき素晴らしいビデオはこちらです。ご視聴ありがとうございました。
脚注
  1. 個人的には動画よりも記事で読むほうがスクロールしながら読みたい部分を拾い読みできて楽なので、このような形式にしておくことにしました。 ↩︎

Discussion