ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Live TextのインタラクションをAppに追加する
静止画や一時停止したビデオフレームのLive TextサポートをAppに追加する方法をご覧ください。iOS、iPadOS、macOS上の画像ビュー内で、テキストの操作、翻訳、データ検出、QRコードスキャンを簡単に有効化する方法を紹介します。また、インタラクションするタイプの指定、補助的なインターフェイスの管理、潜在的なジェスチャーの競合を解消する方法も紹介します。 ライブカメラのプレビューで検出されたデータでのキャプチャやインタラクションの詳細については、WWDC22の「VisionKitで機械可読コードやテキストをキャプチャする」をご覧ください。
リソース
関連ビデオ
WWDC23
WWDC22
-
ダウンロード
♪ 明るい音楽ヒップホップミュージック♪ ♪ こんにちは 私は Adam Bradford と申します VisionKit チームでエンジニアをしています あなたの App に Live Text を追加する方法を説明します まず Live Text とは何なのか説明します Live Text は画像を分析し認識結果を 操作する機能をユーザーに提供します 住所を地図で開く 電話番号の発呼 URLへのジャンプなどの データ検出ワークフローを提供し テキストの選択とコピーなど コンテンツとインタラクションしたり 検索や翻訳のようなアクションを実行できます Live Text は QR コードの インタラクションにも対応します これをあなたの App でどのように使えるか 想像してみてください もっと詳細が知りたいですか それに適切に回答していきます このセッションでは Live Text APIの一般的な概要を説明し 既存の App にこの API を 実装する方法を説明します そして Live Text を App に追加する際に役立つ ヒントとトリックを見ていきます Live Text API の概要を説明します Live Text API は Swift で利用可能です 静的画像で美しく機能し 一時停止した動画にも適用できます ライブカメラストリームで動画を分析して テキストまたはQRコードなどの アイテムを検索する必要がある場合 VisionKit のデータスキャナーが利用できます 詳細については私の同僚である Ron のこのセッションで確認してください Live Text API は iOS 16 以降の Apple Neural Engine 搭載のデバイスで 使えます Mac の場合は macOS 13 対応の すべてのデバイスで利用可能です 4つの主なクラスで構成されています 使用するには まず最初に画像が必要です この画像は ImageAnalyzer にフィードされ 非同期で分析されます 分析が完了すると結果が ImageAnalysis オブジェクトとして プラットフォームに応じて ImageAnalysisInteractionまたは ImageAnalysisOverlayView に提供されます ここまではある程度単純な 説明だったかと思います ここからは 既存の App に 追加する方法についてデモを行います ここに当社の App があります これはシンプルな画像ビューアであり これはスクロールビュー内に 画像ビューがあります ズームとパンどちらも実行できます しかし このテキストを選択することも データ検出器を起動することもできません これは単純にできないことです ここに Xcode のプロジェクトがあります Live Text をこの App に追加するためには ビューコントローラーの サブクラスを変更します まず初めに ImageAnalyzer および ImageAnalysisInteraction が必要となります ここでは viewDidLoad をオーバーライドし imageview にインタラクションを追加します 次に いつ分析を行うのか知る必要があります
画像が設定された時に まず前の画像で設定された preferredInteractionTypes を まずリセットします これで新しい分析の準備が全て整いました 呼び出す関数を作成し 画像の存在を確認します
そして タスクを作成します 検索したい対象をアナライザに指定するために コンフィギュレーションを作成します 今回はテキストと 機械読み取り可能なコードにします 解析の生成はエラーの場合があるので 適切に処理します これで分析処理を開始する準備ができました analyzeImageWithConfiguration メソッドを呼び出して 解析処理を開始する準備ができました 分析が完了したら 解析が成功したことと 時間の経過によって App の状態が変化している可能性があるため 表示画像が変化していないことを確認します これらのすべての問題がなかった場合 インタラクションに analysis を設定し preferredInteractionTypes を設定します ここでは .automatic を使用します これはデフォルトのシステム動作を提供します これでテストの準備が整ったかと思います ご覧ください Live Text ボタンが表示され テキストを選択できるようになりました これらのインターフェイス要素は 自動的に配置され 画像境界と可視領域の両方の内側に 何もしなくても位置が維持されています Live Text ボタンをタップすると 選択可能なアイテムがハイライトされ データの検出部分に下線が付き クイックアクションボタンも表示されます このクイックアクションは タップで電話をかけることができ 長押しで他のオプションが出ます これはとても便利な機能ですよね これらの数行のコードで ただの画像に命が吹き込まれたのです このシンプルな App は 画像上のテキストを選択したり データ検出器やQRコードを起動したり ルックアップやテキストの翻訳など さまざまな機能を備えています この数行のコードだけで 可能になる機能です Live Text を実装する方法を ご覧いただきましたが これから導入に役立つ いくつかのヒントをご紹介していきます インタラクションタイプから 見ていきたいと思います ほとんどの開発者はテキストを選択できる .automatic を選びます Live Text ボタンがアクティブになると 検出された該当するアイテムに下線が引かれ データ検出器としてハイライトされ ワンタップでアクティベートします これは内蔵 App の挙動と 全く同じです データ検出器を使用せずに テキスト選択のみを行いたい場合は タイプを .textSelection に設定します Live Text ボタンの状態によって 変化することはありません テキストを選択させずに データ検出器のみを使用したい場合は タイプを .dataDetectors に設定します このモードでは選択が無効であるため Live Text ボタンは表示されませんが データ検出器には下線が引かれ ワンタップでアクセスできます preferredInteractionTypes を空白にすると インタラクションが無効になります 最後にテキスト選択や自動モードでも 長押しをすることで データ検出器を有効にすることができます これは allowLongPressForDataDetectorsInTextMode により管理されており デフォルトで true つまり有効です 必要であれば false に設定して無効にします 次に下部にある 補足インターフェースの ボタンについて説明します 通常は右下にある Live Text ボタンと 左下のクイックアクションです クイックアクションは解析から取得された 任意のデータ検出器を表し Live Text ボタン有効時に表示されます サイズ 位置 可視性は インタラクションによって制御されます デフォルトの位置と外観は システム標準にマッチしたものですが App にはカスタムの インターフェース要素があり 干渉したり 異なるフォントやシンボルの ウェイトを使っている場合があります このインターフェースをカスタマイズする 方法を見ていきます まず初めは isSupplementaryInterfaceHidden プロパティについてです テキストを選択できるようにしたいが Live Text ボタンを表示したくない場合 SupplementaryInterfaceHidden を True に設定すると Live Text ボタンまたは クイックアクションが表示されなくなります ContentInsets のプロパティも利用可能です 補足のインターフェースに重なってしまう インターフェース要素がある場合 コンテンツの内側へのオフセットを設定し Live Text ボタンと クイックアクションを表示したときに 既存の App のコンテンツに うまく調和させることができます App がインターフェースに カスタムフォントを使用している場合 supplementaryInterfaceFont を設定すると Live Text ボタンとクイックアクションは テキストに指定したフォントと シンボルのウェイトを使用します ボタンサイズの一貫性を保つために Live Text はポイントサイズを 無視することを留意してください 話は少し変わりますが画像の表示に UIImageView を使用していない場合 ハイライトが画像とずれる場合があります UIImageView であれば VisionKit が その contentMode プロパティを使って contentsRect を自動的に計算しますので ずれません このインタラクションを設定したビューは 画像よりも大きな領域を持っていますが 認識領域の座標は インタラクションの領域との比率です これを修正するには デリゲートメソッドの contentsRectForInteraction を実装し インタラクション領域の大きさを1として 画像の領域を比率で表す Rect に設定すると 解決します 例えば これらの値で Rect を設定すれば 問題が修正されます App の現在のビューレイアウトに対する 画像コンテンツの領域を 正しく正規化された矩形で設定してください contentsRectForInteraction は インタラクション領域の大きさが 変わるたびに呼び出されますが contentsRect が変更されても インタラクション領域の大きさが 変更されていない場合は setContentsRectNeedsUpdate() を呼び出して 明示的に更新するように インタラクションにリクエストします Live Text を導入する際に インタラクションを設定する 最適な場所はどこでしょう 理想的には 画像コンテンツをホストするビューに 直接配置します 前に述べたように UIImageView であれば contentsRect から計算してくれるので 必須ではありませんが お勧めです UIImageView を使用している場合 imageView にインタラクションを設定すれば あとは VisionKit がやってくれます ImageView が ScrollView の中に 配置されている場合 ScrollView にインタラクションを 設定したくなるかもしれませんが これは推奨されておらず contentsRect が継続的に変化するため 管理が難しくなります この場合も解決方法は同じで たとえ拡大機能を実装した ScrollView 内であっても 画像コンテンツをホストするビューに インタラクションを配置しましょう ジェスチャーについて少しお話しますと 控えめに言っても Live Text は 非常に多くのジェスチャーを使っています App の構造によっては 本来 App が処理すべき ジェスチャーやイベントに インタラクションが反応したり その逆もあり得ます このような問題が生じた場合に 修正に役立つテクニックをいくつか紹介します これを修正する一般的な方法として interactionShouldBegin- AtPointForInteractionType を実装し false を返した場合 Live Text のアクションは実行されません 指定されたポイントに インタラクティブなアイテムがあるのか アクティブなテキスト選択があるのか 確認することから始めます テキスト選択のチェックは テキストの他をタップして 選択解除できるようにするために使用します また インタラクションが ジェスチャーに応答していない場合 それは App のジェスチャー認識が 代わりに処理しているからかもしれません この場合 同様の解決策である あなたの gestureRecognizer の gestureRecognizerShouldBegin デリゲートメソッドを実装して 回避することができます 同様の確認を行い その場所に インタラクティブなアイテムがあるか 有効なテキスト選択がある場合は false を返すようにします 余談ですが この例では まず nil を渡して gestureRecognizer の位置を ウィンドウ空間の座標に変換し 次にインタラクションのビューに 変換しています これは インタラクションが 拡大表示された ScrollView にある場合に 必要となる可能性があります ポイントが合わない場合は このテクニックを試してみてください もう1つのオプションとして UIView の hitTest:WithEvent を オーバーライドする方法も便利です ここでもまた似たような話で 前と同じ種類のチェックを行い この場合は適切なビューを返します Appを可能な限り反応を良くするために Neural Engine は非常に効率的な 分析を行いますが ImageAnalyzer で最高の パフォーマンスを得るための ヒントをいくつかご紹介します 理想的には App で同時に使用する ImageAnalyzer は1つだけにしましょう また複数の画像タイプをサポートしていますが 元の画像タイプを送信することで 常に画像変換が最小になります CVPixelBuffer がある場合は 最も効率的です システムリソースを最大限に活用するために 画像が画面に表示されたとき またはその直前にのみ解析を開始します 例えばタイムライン上などで App のコンテンツがスクロールする場合は スクロールが止まってから解析を開始します Live Text はこの API だけでなく App がすでに使っているであろう 複数のフレームワークで対応しています 例えば UITextField または UITextView には カメラを使ってキーボード入力する Live Text をサポートしています Live Text は WebKit および Quick Look でもサポートされています 詳細につきましては これらのセッションを確認ください iOS 16 の今年の新機能として AVKit に Live Text のサポートが追加されました AVPlayerView と ViewController は デフォルトで有効になっている allowsVideoFrameAnalysis プロパティを介して 一時停止フレームでの Live Text に対応します FairPlay で保護されていないコンテンツのみで 利用可能であることに注意してください AVPlayerLayer を使用している場合 解析とインタラクションの管理は あなたの責任ですが 現在のフレームを取得するために currentlyDisplayedPixelBuffer プロパティを 使用することは非常に重要なことです これは適切なフレームが分析されていることを 保証する唯一の方法です 動画再生速度がゼロの場合にのみ 有効な値が返されますが これは shallow copy であり 書き込むことは安全ではありません 繰り返しになりますが FairPlay で保護されていない コンテンツにのみ利用可能です 私たちはあなたの App に Live Text 機能を 提供するお手伝いができることを 嬉しく思っています Live Text チームのみんなを代表して このセッションに参加してくれて ありがとうございます App 内の画像にどのように使用されるのか 楽しみにしています 楽しい時間を過ごしてください! ♪
-
-
2:37 - Live Text Sample Adoption
import UIKit import VisionKit class LiveTextDemoController: BaseController, ImageAnalysisInteractionDelegate, UIGestureRecognizerDelegate { let analyzer = ImageAnalyzer() let interaction = ImageAnalysisInteraction() override func viewDidLoad() { super.viewDidLoad() imageview.addInteraction(interaction) } override var image: UIImage? { didSet { interaction.preferredInteractionTypes = [] interaction.analysis = nil analyzeCurrentImage() } } func analyzeCurrentImage() { if let image = image { Task { let configuration = ImageAnalyzer.Configuration([.text, .machineReadableCode]) do { let analysis = try await analyzer.analyze(image, configuration: configuration) if let analysis = analysis, image == self.image { interaction.analysis = analysis; interaction.preferredInteractionTypes = .automatic } } catch { // Handle error… } } } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。