WWDC Quick Look 💓 By SwiftGGTeam
Design high quality Siri media interactions

Design high quality Siri media interactions

元の動画を見る

ハイライト

このセッションは SiriKit Media の高周波再生リクエストを使用します。 INMediaSearch デバッグ、Siri のボキャブラリー、および Now Playing コマンドを使用して、オーディオ アプリが音声再生を毎日の信頼できるエントリ ポイントにする方法を説明します。

主要内容

オーディオ アプリが Siri に接続されている場合、最も危険な失敗シナリオは単純です。ユーザーが初めて「アプリを再生して」と言ったときに、何も再生されません。 Danny Mandel 氏は、音声対話の信頼しきい値が従来のインターフェイスよりも高いため、最初は再生成功率を最優先事項として直接挙げました。最初の失敗の後、ユーザーは再試行しない可能性があります。 (00:37)

2 番目の品質問題は起動速度です。 CarPlay は、文字通りの原稿の中で具体的に名前が付けられています。人々が車内でハンズフリーで操作している場合、Siri はタイムアウトについてより厳密になります。アプリがすぐに再生を開始しない場合、システムはプロセスを終了します。メディア アプリ向けの Siri エンジニアリングへの投資は、まず安定した再生スタックと低遅延の起動に重点を置く必要があります。 (01:07)

このセッションの核となる判断は、実際のトラフィック分布に基づいて行われます。 SiriKit Media リクエストの半分以上は、「アプリを再生する」などの一般的な再生です。約 30% はメディア名のみを述べています。約 5% はアーティストとの複合検索です。約 5% はプレイリスト クエリです。これら 4 種類のリクエストをうまく実行することで、その時点での SiriKit Media トラフィックの 90% 以上をカバーできます。 (02:31)

残りの品質は、Siri があなたの話を理解できるかどうかによって決まります。汎用モデルは音楽のジャンル、メディア タイプ、シーケンス、リリース日をすでに理解していますが、ユーザー自身のプレイリストについては認識しておらず、アプリに固有の番組やプレイリストについても認識していません。 INVocabulary そしてグローバル語彙 plist はこれらの名前を Siri に同期する役割を果たします。 MPRemoteCommandCenter そして MPNowPlayingInfoCenter Siri の再生コントロールと「何を再生しているか」という質問が同じ Now Playing インフラストラクチャを通過できるようにします。 (08:23)

詳細

使用 INMediaSearch 高頻度の再生リクエストに対応するため

(05:46) インテント ハンドラーの最も重要なエントリは次のとおりです。 resolveMediaItems(for:with:)。 Siri はユーザーの言葉を解析して、 INPlayMediaIntent、メディア クエリ条件は次のように設定されます。 intent.mediaSearch。一般的なプレイには存在しない可能性があります mediaSearch; 「音楽を再生」するだけで済みます mediaType; 「特別災害チームごっこ」にかかるのは mediaName; 「特別災害チームによるプレイ・メイビー・サムタイム」はタイトルとアーティストの両方を採用します。 「WWDC プレイリストを再生」には時間がかかります mediaType プレイリストと mediaName WWDCへ。

func resolveMediaItems(for intent: INPlayMediaIntent, with completion: @escaping ([INPlayMediaMediaItemResolutionResult]) -> Void) {
    let mediaSearch = intent.mediaSearch
    resolveMediaItems(for: mediaSearch) { optionalMediaItems in
        guard let mediaItems = optionalMediaItems else {
            return
        }
        completion(INPlayMediaMediaItemResolutionResult.successes(with: mediaItems))
    }
}

キーポイント:

  • intent.mediaSearch は、Siri によってアプリに提供される構造化クエリです。デバッグするときは、まずどのフィールドに値があるかを確認します。
  • 2番目 resolveMediaItems(for:) この例では、アプリ独自の検索ロジックがマッピングを担当します。 INMediaSearch 実際のメディアアイテムに。
  • 空の mediaSearch 直接失敗として扱うことはできません。セッションでは、一般化された再生が最も大きな割合を占めており、アプリはデフォルトの再生戦略を準備する必要があると明確に述べています。
  • 戻る INPlayMediaMediaItemResolutionResult.successes(with:) これは、この解析により再生可能な候補が取得されたことを意味し、次のステップは再生プロセスに入るということです。

ユーザー語彙を使用した個人コンテンツ認識を修正する

(10:01) Siri の自然言語モデルは一般的な音楽概念を認識しますが、ユーザー自身のプレイリスト名は誤解されやすいです。セッションの例は「70 年代のパンク クラシック」です。デフォルトのモデルは特定する可能性があります。 70s 発売年として、そして punk classics メディア名として。プレイリスト名をユーザーの語彙と同期した後、Siri はそれをプレイリスト タイトルとしてアプリに渡します。

let vocabulary = INVocabulary.shared()
let playlistNames = NSOrderedSet(objects: "70s punk classics")
vocabulary.setVocabularyStrings(playlistNames, of: .mediaPlaylistTitle)

キーポイント:

  • INVocabulary.shared() 現在のアプリのユーザー語彙エントリを取得します。
  • の順序 NSOrderedSet は理にかなっていて、Siri は最初に来る用語を優先します。
  • .mediaPlaylistTitle これらの文字列がメディア プレイリストのタイトルに属していることを Siri に伝えます。
  • ユーザー用語集は、ユーザーが作成したプレイリストなどの個人的なコンテンツに適しており、ユーザーのアーティストや購読しているポッドキャストの名前を優先するために使用することもできます。
  • Siri サービスへの単語リストの同期は、ネットワークとバッテリーの状態によって影響を受ける可能性があるため、実際のアプリでは同期に時間がかかる必要があります。

グローバル語彙を使用してアプリ ディレクトリを説明する

(11:28) グローバル語彙は、すべてのユーザーに表示される App ディレクトリ エンティティ用です。これはアプリとともに配布される静的な plist であり、人気のある音楽や一般的なポッドキャストをリストする必要はありません。このセッションでは、これらの一般的なエンティティが通常、すでに Siri のモデルに含まれていることが明らかになります。リストする必要があるのは、アプリに固有で、モデルによって誤解されやすい名前のみです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>ParameterVocabularies</key>
	<array>
		<dict>
			<key>ParameterNames</key>
			<array>
				<string>INPlayMediaIntent.playlistTitle</string>
			</array>
			<key>ParameterVocabulary</key>
			<array>
				<dict>
					<key>VocabularyItemSynonyms</key>
					<array>
						<dict>
							<key>VocabularyItemPhrase</key>
							<string>70s punk anthems</string>
						</dict>
					</array>
					<key>VocabularyItemIdentifier</key>
					<string>70s punk anthems</string>
				</dict>
			</array>
		</dict>
	</array>
</dict>
</plist>

キーポイント:

  • ParameterNames を指す INPlayMediaIntent.playlistTitle、これらの用語がプレイリストのタイトル フィールドに影響を与えることを示します。
  • VocabularyItemIdentifier アプリが受け取る値です INMediaSearch.mediaName
  • VocabularyItemPhrase は、Siri がユーザーの発言と一致させるために使用するフレーズです。
  • グローバル語彙は、アプリ ディレクトリに固定されているプレイリスト、プログラム、またはその他のメディア エンティティに適しています。
  • ユーザーボキャブラリーとグローバルボキャブラリーの命名方法は異なりますが、最終的には Siri がメディア意図の対応するフィールドを埋めるのに役立ちます。

Siri 再生コントロールを Now Playing に接続します

(16:29) 現在、再生コントロールは次のように実装されています。 MPRemoteCommandCenter。 Siri は、「一時停止」、「再開」、「次のトラック」、「前のトラック」などのコマンドを聞くと、それらを同じコマンド ハンドラーのセットにルーティングします。この設計により、音声コントロール、コントロール センター ボタン、CarPlay Now Playing 画面共有が可能になります。

主要な API:

  • MPRemoteCommandCenter.pauseCommand 一時停止を処理します。
  • MPRemoteCommandCenter.playCommand 再生の再開を処理します。
  • previousTrackCommand そして nextTrackCommand 前後のトラックを処理します。
  • skipForwardCommand そして skipBackwardCommand ユーザーが指定したジャンプ期間を interval コマンドの属性。
  • changeRepeatMode そして changeShuffleMode 開いた状態または閉じた状態のみを処理します。ランダム モードまたはリピート モードで再生を開始したい場合は、セッションが必要です。 INPlayMediaIntent

(20:11) Siri が依存しているのは MPNowPlayingInfoCenter 「これは何の曲ですか?」などの質問に答えるとき少なくとも MPMediaItemPropertyTitleMPMediaItemPropertyArtist そして MPMediaItemPropertyAlbumTitle 入力しないと、Siri は再生されている内容に応答するための十分なコンテキストを取得できません。

エラー処理もシステム セマンティクスに従う必要があります。コマンド ハンドラーがインストールされていない場合、Siri はエラー ダイアログを表示します。コマンドが一時的にサポートされていない場合は、コマンドを無効にすることができます。異常に失敗した場合は失敗結果を返します。これは、アプリ内で音声エラーのセットをカスタマイズするよりも安定しています。

重要ポイント

  • 何をすべきか: SiriKit Media の再生リクエスト QA マトリックスを作成します。 実行する価値がある理由: セッションによって提供される 4 種類の高頻度リクエストは、現在のトラフィックの 90% 以上をカバーします。これらのシナリオを最初にテストすることは、すべてのフィールドを均等に分散するよりも効果的です。 開始方法: resolveMediaItems(for:with:) インテント ハンドラーのブレーク ポイントで、一般化された再生、メディア名のみ、メディア名とアーティスト、プレイリストの 4 つの発話を 1 つずつテストし、どのフィールドがオンになっているかを記録します。 INMediaSearch 満たされています。

  • 機能: 同期 INVocabulary ユーザーが作成したプレイリストの場合。 実行する価値がある理由: ユーザー自身の名前は、自然言語モデルによって誤って分割される可能性が最も高くなります。 「70年代パンククラシック」などの名前は、時代名、ジャンル名、メディア名に分けられます。 開始方法: アップデート INVocabulary.shared() プレイリストの作成、名前変更、削除後に、 NSOrderedSet 最も一般的に使用される名前または重要な名前を最初に配置し、タイプを次のように設定します。 .mediaPlaylistTitle

  • 何をすべきか: アプリの一意のパブリック ディレクトリをグローバル語彙 plist に書き込みます。 実行する価値がある理由: グローバル語彙により、Siri はアプリのインストール後にすべてのユーザーが共有するプログラム、プレイリスト、またはチャンネル名を理解できるようになります。これは、ブランド名、短縮名、簡単に言い表せる名前に特に適しています。 開始方法: App ディレクトリに固定されており、Siri によって誤判断されやすいメディア エンティティをリストします。設定のみ ParameterVocabularies これらのエンティティにとって。一般的な音楽ジャンルや人気のあるアーティストを plist に詰め込まないでください。

  • 内容: Siri テストの一部として Now Playing コマンドを使用します。 実行する価値がある理由: Siri の一時停止、再開、次のトラック、およびスキップは、次の場所に直接ルーティングされます。 MPRemoteCommandCenter。ここでのバグは音声、コントロールセンター、CarPlayに同時に影響します。 開始方法: 同じテスト スクリプトを使用して、コマンド ハンドラー、無効ステータス、失敗ステータス、スキップ間隔を確認し、次を使用します。 MPNowPlayingInfoCenter Siri がタイトル、アーティスト、アルバムの質問に答えられるかどうかを確認します。

  • 内容: アプリ内で利用可能な Siri 再生方法をユーザーに求めます。 実行する価値がある理由: 逐語的には最後に、ユーザーが Siri 機能の存在を知った後、Siri の関与を最大 10 倍に増やすことができると述べられています。音声ポータルはインターフェイスの外側に隠されており、教育自体が機能品質の一部です。 開始方法: 再生ページ、曲リスト ページ、または車のシーンへの初回接続時に、「Siri に ControlAudio で WWDC プレイリストを再生するよう依頼する」などの特定の文パターンを表示し、意図のサポート範囲と一致するコピーライティングを維持します。

関連セッション

コメント

GitHub Issues · utterances