【Apple Intelligence】Writing Tools入門
本記事は Apple Intelligence の Writing Tools (ライティングツール/作文ツール) [1] に関するWWDC24のセッション "Get started with Writing Tools" (Writing Toolsの導入)を要約したものです。
Writing Toolsのアプリへの導入方法や関連API、処理の仕組みについて学べます。
セッション概要
アプリにおいてユーザーによるテキストの校正、書き直し、変換をサポートするWriting Tools(作文ツール)の機能をご紹介します。いずれかのテキストビューで記述したテキストをユーザーがブラッシュアップできるようにするため、Writing Toolsとアプリがどのように連携するかについて詳しく解説します。テキストの取得および処理の仕組みや、カスタムのテキストビューでWriting Toolsをサポートする方法を習得できます。
Introduction
Writing Tools(作文ツール)は、あらゆる種類のアプリのテキストビューで利用できる新しい機能スイートです。Writing Toolsは記述したテキストをブラッシュアップするのに役立ちます。
本セッションではまずWriting Toolsの概要をご紹介します。
Writing Toolsの概要
まずWriting Toolsの概要をご紹介します。
Writing ToolsはiOS、iPadOS、macOSのテキストビューでテキストの校正、書き直し、変換をサポートします。
提案がインラインで表示されるため、変更をすばやくシームレスに確認して反映できます。
ネイティブテキストビューではテキストを選択するとWriting Toolsがキーボードの上側に表示されます。またコールアウトバーの隣にも表示されます。
macOSでは コンテキストメニューやメニューでも利用可能です。
Writing Toolsでできることについて詳しく見ていきましょう。
テキストを校正し、スペルや文法上のエラーなどの間違いを表示できます。
Writing Toolsの提案を1つずつレビューすることができます。
Writing Toolsではテキストを書き直したり、
より親しみやすく、プロフェッショナルで簡潔なスタイルに編集できます。
また、テキストを要約したり、重要なポイントにまとめたり、リストや表に変換したりもできます。
Writing Toolsは 編集不可のテキストにも使えます。
結果はパネルに表示され、その結果をコピーまたは共有することができます。
アプリへの統合方法
嬉しいことに UITextView
, NSTextView
, WKWebView
を使用している場合は、特に作業をすることなくそのまま動作します。
ただ UITextView
またはNSTextView
で Writing Toolsのフル機能を利用するには TextKit 2を使う必要があります。TextKit 1を使っている場合は書き直された結果をパネルに表示するという限定的な機能しか利用できません。
TextKit 2の詳細についてはこちらの関連セッションをご確認ください。
内部処理/仕組み
Writing Toolsを呼び出したときに内部では何が起きているのでしょうか。
まず、より良い結果をツールから得るために、ユーザーによる選択範囲を全文まで拡張します。
また、モデルがテキストの文脈を把握できるように、選択範囲の周囲にあるテキストも使用します。
Writing Toolsは Attributed text によるリッチテキストをフルサポートしています。
モデルは、関連するテキストが書き直されたテキストに含まれている限り、スタイル・リンク・添付ファイルなどの属性を保持します。
最後に、リストと表への変換についてですが、テキストビューでリストや表がサポートされている場合、NSTextList
とNSTextTable
をテキストストレージに送信します。
writingToolsAllowedInputOptions
を使って、テキストビューが表を処理するかどうかを制御できます。これについては後で説明します。
UITextViewDelegate
の新メソッド
モデルがテキストを処理している間、Writing Toolsセッションの実行中はアニメーションが表示されます。
セッションの実行中はアプリの同期を一時停止したり、誤編集を回避したりする必要があります。
そこで Writing Tools用にテキストビュー デリゲートメソッドを新たに導入しました。
func textViewWritingToolsWillBegin(_ textView: UITextView) {
// Take necessary steps to prepare. For example, disable iCloud sync.
}
func textViewWritingToolsDidEnd(_ textView: UITextView) {
// Take necessary steps to recover. For example, reenable iCloud sync.
}
if !textView.isWritingToolsActive {
// Do work that needs to be avoided when Writing Tools is interacting with text view
// For example, in the textViewDidChange callback, app may want to avoid certain things when Writing Tools is active
}
textViewWritingToolsWillBegin
ではアプリの状態をWriting Tools用に準備することができます。例えば 同期を一時停止したり、テキストストレージに対するすべての直接操作を停止できます。
textViewWritingToolsDidEnd
では、同期を再開するなど、アプリを元の状態に戻すことができます。
またUITextViewに 新しいプロパティとして isWritingToolsActive
を追加しました。 これによりテキスト操作を行う際にWriting Toolsがテキストビューに操作を実行していないかどうか確認できます。
新しいデリゲートメソッドとプロパティは UITextView
とNSTextView
の両方で 利用できます。
テキストストレージ
テキストが長い場合は、書き直されたテキストは別々のチャンクでテキストビューに配信される場合があります。
モデルが実行中であることを示すために、処理されているテキストにアニメーションを適用します。
モデルが処理を終えた後 "Original"ボタンをタップすると、元のテキストと書き直されたテキストを切り替えられます。
校正の場合、提案された変更は 自動的にテキストビューに適用されます。
それぞれの提案を確認して、拒否することができます。
Writing Toolsの実行中、基盤となるテキストストレージは どうなっているのでしょうか。
実際にはWriting Toolsは毎回テキストストレージの変更を行います。つまり、Writing Toolsの実行中はテキストストレージの永続化はできません。ユーザーが後で変更を元に戻せるようにWriting Toolsの変更は取り消しスタックにもプッシュされます。
カスタマイズ
アプリに合わせ Writing Toolsの動作をカスタマイズしたい場合もあるでしょう。
そのためにテキスト入力特性に関する各種のAPIを用意しました。
textView.writingToolsBehavior = .limited
textView.writingToolsBehavior = .none
デフォルトでは システムは可能な限りインラインでWriting Toolsを機能させます。その場合は何もする必要はありません。この方法がアプリに適さない場合は writingToolsBehavior
を.limited
に設定し、Writing Toolsをパネル表示にするか、 .none
に設定してテキストビューの Writing Toolsを完全にオプトアウトできます。
また writingToolsAllowedInputOptions
を使用して、テキストビューでリッチテキストや表をサポートするかどうか指定できます。
textView.writingToolsAllowedInputOptions = [.plainText]
textView.writingToolsAllowedInputOptions = [.plainText, .richText, .table]
この設定をしない場合 テキストビューは プレーンテキストとリッチテキストをレンダリングできますが、表はレンダリングできないと想定します。テキストビューがプレーンテキストのみを受け付ける場合や、表を扱える場合は該当するオプションを明示的に指定できます。
最後に、 WKWebView
向けに 同様のAPIも用意されています。
// For `WKWebView`, the `default` behavior is equivalent to `.limited`
extension WKWebViewConfiguration {
@available(iOS 18.0, *)
open var writingToolsBehavior: UIWritingToolsBehavior { get set }
}
extension WKWebViewConfiguration {
@available(macOS 15.0, *)
open var writingToolsBehavior: NSWritingToolsBehavior { get set }
}
extension WKWebView {
/// @discussion If the Writing Tools behavior on the configuration is `.limited`, this will always be `false`.
@available(iOS 18.0, macOS 15.0, *)
open var isWritingToolsActive: Bool { get }
}
WKWebViewConfiguration
経由で同じ列挙型を指定できます。
WKWebViews
のデフォルトの動作は .limited
であることに注意してください。フルに動作させたい場合は それを明示的に設定する必要があります。
Writing Toolsセッションが 実行中であるかどうかを知るために isWritingToolsActive
プロパティを 確認または監視できます。
-
Appleの一般ユーザー向け(非開発者向け)ドキュメントでは「作文ツール」と翻訳されている。「ライティングツール」と翻訳している大手メディアの記事もあり、WWDCセッション日本語訳版ではそのまま"Writing Tools"と表記されていたりと日本語でどう扱うかはあまり定まっていない。 ↩︎
Discussion