ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Translation APIについて
新しいTranslationフレームワークを使用して、アプリにおいて複数の言語間でテキストを翻訳する方法を解説します。 システムUIに迅速に翻訳を表示する方法や、アプリUIのテキストの大規模なバッチを翻訳する方法を習得できます。
関連する章
- 0:00 - Introduction
- 2:10 - Simple overlay translation
- 4:01 - Flexible translation
- 11:34 - Language support
- 12:48 - Best practices
リソース
関連ビデオ
WWDC23
-
ダウンロード
Machine Translationチームのエンジニア Louieです 「Meet the Translation API」へようこそ 旅行中はしばしば 多くの異なる言語間で 翻訳する必要に迫られます 翻訳アプリの素晴らしい点は これらの言語をすべて話さなくて済むことです Appleは言葉の壁をなくし 機械学習を活用した翻訳機能のメリットを ユーザーに提供しようと取り組んでいます
これらの1つが翻訳アプリです テキストを入力すると 様々な言語に翻訳できます
また システム全体の翻訳は システム上のどのアプリでも翻訳シートを 表示できます
そして カメラ翻訳は 画像や身の回りにあるテキストを 翻訳できます 本セッションで 新しいAPIを ご紹介できることを嬉しく思います これらのAPIは 様々な翻訳機能や 翻訳アプリを支える 機械学習モデルを利用できるため みなさんのアプリでそのパワーを存分に 活用できるようになります
ここで説明するすべての Translation APIは iOS iPadOS macOSでサポートされています ここでは iPhoneを例としていますが コードはiPadとMacでも機能します
私はハイキングが好きで ヨーロッパの様々な コースを見つけるアプリを作成しています アプリにはコースの説明があり ユーザーは自分が行ったハイキングコースの レビューを投稿できます レビューは任意の言語で書けるので 知らない言語で書かれていても ほかのユーザーが 理解できるようにしたいと思います ユーザーが作成するコンテンツなので ローカライズだけでは不十分です このアプリを例に すべての人にとって 役立つアプリにするための 翻訳機能の追加がどれほど簡単か お見せします お話する内容の概要は次の通りです まず アプリ内で翻訳を提供するための 2つのオプションを紹介します 1つ目は 翻訳オーバーレイを表示する 非常にシンプルなAPIです 2つ目は より柔軟なテキスト翻訳APIです
次に サポートされている言語と またそれを プログラムで確認する方法を説明します
最後に 翻訳作業時の ベストプラクティスをご紹介します それでは始めましょう
アプリに翻訳を追加する最も簡単な方法は .translationPresentation()を使うことです たった1行のSwiftUIコードで ユーザーの言語に翻訳された テキストを表示できます 必要なのは 翻訳するテキストを指定して 翻訳をトリガすることだけです
このAPIは最近公開されており 実際のアプリにすぐに導入できます
これでユーザーは 他の言語のレビューを見つけた際に
翻訳を表示するシステムUIを 簡単に利用できます
この機能のアプリへの追加が どれほど簡単かお見せします まず プレゼンテーションの表示を 制御するストレージを追加します
次に 翻訳をトリガするボタンを コンテキストメニューに追加します このボタンを押すと showsTranslationがtrueになります
最後に .translationPresentation()を 追加します
showsTranslationが trueであれば常に表示し レビューテキストを渡して 翻訳するように指定します これだけです
これで 知らない言語のレビューでも ボタンを押すだけで 翻訳を表示できるようになりました
必要に応じて ターゲット言語を 変更するオプションもあります
ここで利用できる機能は iOSの他の場所で利用できる システム全体の翻訳機能と同じですが テキスト選択ではなく アプリよってトリガされます とても簡単に追加できるので 一部のアプリにとっては最適です しかし 翻訳を一度に1つだけ表示するだけでは 理想的ではない場合もあります 例えば 翻訳されたコメントを 複数同時に表示できるようにするには どうすればよいでしょうか 各レビューに インラインで 翻訳を表示できれば便利です このようなニーズに対応できるように 柔軟な翻訳APIを開発しました それについて説明します 柔軟な翻訳APIの中心は TranslationSessionクラスです TranslationSessionを使用すると 一度に1つ以上の文字列を翻訳し 一般的なSwift asyncの構文で 結果を取得できます
結果をどのようにUIに 表示するかはあなた次第です
TranslationSessionのインスタンスは 自分では作成しません 場合によってはユーザーに UIを表示する必要があるからです 代わりに .translationTaskをビューにアタッチし TranslationSessionインスタンスを 渡すためのクロージャを呼び出します この例では ビューが画面に表示される時に クロージャが1回実行されます
しかし通常は 翻訳を実行するタイミングを より詳細に制御する必要があります TranslationSession.Configurationが ここで役立ちます
この状態では クロージャは 構成が変更されるたびに実行されます 最初に翻訳をトリガするには configurationをnil以外の値にします もう一度翻訳をトリガする場合は configurationを変更して SwiftUIに クロージャを もう一度実行するよう伝えます これを行うには ソース言語または ターゲット言語を変更します 新しいテキストを翻訳する場合は configurationに .invalidate()を呼び出すこともできます より柔軟なこのAPIも アプリに簡単に導入できます 実際にお見せしましょう TranslationSession.Configurationの ストレージを追加します nilから始まるので ユーザーがトリガするまで翻訳は待機します
次に この構成を使用する .translationTask()を追加します
構成が変更され nilでない場合はいつでも これが呼び出され 翻訳用のセッションが提供されます
次に 翻訳を実行します
セッションに 一連のテキストの翻訳を指示します
ここで 既に実装した関数を使用して
フィルタリングされたすべてのレビューから 翻訳リクエストを作成します 結果は1つずつ 同期されずに返されます
各結果が届くたびに 実装済みの関数が呼び出され その関数は翻訳の結果を取得し
モデルオブジェクトに追加して UIを更新します
次に 翻訳をトリガする必要があります 1言語ずつレビューを表示する フィルタシステムをすでに追加しました 言語を選択すると フィルタリングした レビューを翻訳するボタンが表示されます しかし 実装が未完了なので まずはそこからです
まず configurationが すでに存在するか確認します 存在しない場合 まだ翻訳されていないという ことなので 設定を作成します
ここではデフォルトの イニシャライザを使います これにより言語が自動的に選択されます 使用する言語を管理する方法を もう少し詳しく説明します
configurationがすでにある場合は 翻訳済みであるということですが ユーザーは再度の翻訳を望んでいます SwiftUIはソースコンテンツが 変更されたことを認識できませんが .invalidate()を呼び出すことで configurationが変更され .translationTaskクロージャが再実行され 新しいコンテンツが翻訳されます 必要なことはこれだけです 私のアプリでどう機能するか説明します
日本語のレビューに絞り込み ボタンを1回押すだけで
翻訳が完了してレビューに追加され レビューを1つずつ翻訳しなくても 一度にすべて読むことができます
ユーザーは このハイキングコースを 高く評価しているようですが 難易度が高いコースのようです 私の旅行では 長距離のハイキングを する時間がないので 別のコースを見てみましょう
この「Tulips and Windmill Walk」は 私が求めているコースかもしれません ユーザーのレビューを確認してみましょう
ほとんどのレビューがオランダ語なので 翻訳してみましょう
ここでオランダ語を翻訳しようとすると その言語をダウンロードするよう促す メッセージが表示されます 何が起こっているか説明しましょう
TranslationSessionはオンデバイスの MLモデルを 使用して翻訳を実行します
これらのモデルは 翻訳アプリを含む システム上のすべてのアプリで共有されます ユーザーが言語をダウンロード済みの場合 アプリでもその言語を使用できます
APIが細かい処理を行います アプリが翻訳を行う際 言語がインストール されていない場合にのみ フレームワークは ダウンロードの許可を求めます また ダウンロードの進行状況を 表示する処理も行います これらのダウンロードは ユーザーがこのシートを閉じたり アプリから完全に離れても バックグラウンドで継続されます 次に 言語を選択する方法を 説明します ソース言語とターゲット言語を 指定することも 先ほどのように 自動的に動作させることもできます
言語を.translationTaskで 直接指定するか TranslationSession.Configurationで 指定します
ソース言語にnilを指定すると コンテンツの言語を自動的に 識別しようとします フレームワークが言語を判断できない場合 ユーザーに言語を選択するよう求めます ターゲット言語としてnilを指定すると 適切な翻訳先の言語が選択されます この選択は ソース言語と ユーザーの優先言語に 基づいて行われます
Localeと Locale.Languageは 様々な形を取るので 正直なところ やや混乱を招く可能性があります 知っておくべき多数の組み合わせや バリアントがあるためです 例えば どのAPIが言語を返すかによって 言語だけの場合や バリアントのある言語 地域のある言語 または一見関係なさそうな地域のある 言語などがあります 例えば 日本在住のフランス語話者(fr_JP) などです
LanguageAvailability.supported Languages APIによって 返された言語を使用すると 最良の結果が得られます
任意のコンテンツがどの言語かを知る方法に ついて疑問に思うかもしれません 可能な限り TranslationSessionに ソース言語としてnilを指定して 自動的に識別させることをおすすめします ただし テキストの言語を 特定する必要がある場合は NLLanguageRecognizerを使用できます processString関数を呼び出し dominantLanguageを取得して TranslationSessionが使用できる Locale.Languageに変換します
多くのアプリで 複数の文字列を 一度に翻訳する機能が必要です 先ほどの異なるユーザーレビューを 翻訳する時のような場合や アプリがドキュメントや画像内の様々な 文字列を翻訳することが 必要になる場合もあります
同じ言語の複数の文字列を翻訳する時は 文字列を1つずつ翻訳する機能ではなく バッチ翻訳機能を使うのが 最も効果的かつ効率的です
これには2つの方法があります 1つ目は すべての結果を生成した後 元の順序で一度に返します 順序が常に同じなので より簡単で使いやすく 各応答に対して何をすべきか 理解しやすいです また すべての翻訳が終わるのを待ってから 翻訳を表示する場合にも最適です
2つ目は 結果の生成後 AsyncSequenceのように ストリーミングにより返します この方法が優れているのは 最初の結果が より早く届くので UIの応答性が向上し 結果をすぐにUIに反映できる点です 結果をストリーミングで返す この関数の使用時は リクエストごとにclientIdentifierを 設定することをおすすめします これにより 受け取った応答を識別できます 詳しくはドキュメントを参照してください
次に サポート対象の言語について説明します 本日説明したAPIは これらの言語をすべてサポートします 翻訳アプリのサポート言語と同じです
今年は新たに ヒンディー語のサポートを追加しました 翻訳アプリだけでなく みなさんのアプリでも より多くのユーザーが 翻訳を利用できるようになります
新しいLanguageAvailabilityクラスを 使用すると 翻訳機能でサポートされている言語を 確認できます このリストは サポート対象の言語の 追加に応じて 更新される可能性があります
また ある言語から別の言語への翻訳の サポートの有無も確認できます フレームワークはすべての言語の組み合わせを サポートしているわけではありません
例えば 米国英語と英国英語からヒンディー語への サポート状況を確認すると この組み合わせが サポートされていることがわかります それらの言語がダウンロード済みの場合 インストール済みであると報告されます
一方で 英語のバリアント間や 同じ言語間での翻訳のサポート状況を 確認すると それらのペアが サポートされていないことが報告されます サポートされていないペアを指定して TranslationSessionを 作成することはできますが 翻訳を試みるたびにエラーが返されます ソース言語ではなく ソーステキストのスニペットを使用して サポート状況を確認する関数もあります
翻訳を導入する際の ベストプラクティスを見てみましょう まず 開発は必ず iPhone iPad またはMac上で行ってください ご紹介した翻訳APIは シミュレータでは機能しません
次に .translationPresentationと .translationTaskの モディファイアは いずれも コンテンツ自体にアタッチしてください .translationPresentation()は iPadとMacのポップオーバーであるため 適切なビューを ポイントするようにしてください このコードでは ポップオーバーが ボタン自体をポイントするため 元のビューをブロックする可能性があります
代わりに モディファイアをコンテンツや そのコンテナにアタッチすれば ポップオーバーは翻訳対象の コンテンツを適切にポイントし コンテンツを隠すことはありません
特別な注意が必要になるのは 複数の言語からコンテンツを翻訳する時です
リクエストのバッチ内のソーステキストは すべての同じ言語である必要があります 同じバッチに異なる言語が混在していると 適切な結果が得られません 画面の例では ドイツ語とスペイン語が 同じバッチに含まれているため 意味不明な翻訳になるでしょう
代わりに この画面のように 同じセッションを使用して 各言語を別々のバッチで翻訳するための 個別の呼び出しを行う必要があります
コードでは 1つのリクエストに 複数の言語を含むコンテンツを 含めてはいけないことを意味します この例では ドイツ語とスペイン語が 同じリクエスト配列に含まれています
代わりに 1つのセッション内で 言語ごとに 個別に関数を呼び出します ここでは ドイツ語を翻訳してから スペイン語を翻訳しています ここで重要なことは セッションのソース言語が nilでなければならないことです これにより このセッションでは 最初に各バッチの言語を識別します
また サポートされている言語のみを 指定する必要があります そうしないと そのセッションの すべての翻訳がエラーになります
コンテンツの言語が不明な場合や どの言語に翻訳するか不明な場合は 必ずnilを 使用して フレームワークに選択を任せてください ユーザーがどの言語を必要とする 可能性が高いか 事前に分かっている場合 翻訳せずに ダウンロードの承認を ユーザーに求めるために TranslationSession. prepareTranslation() を使用します
これは ユーザーがオフラインで翻訳を 利用する際に有用です そのためには 事前にダウンロードを 開始する必要があります アプリが時間とともに変化するコンテンツを 翻訳する必要がある場合 このAPIを 使用して事前に ダウンロードの承認を得られるので 画面をブロックせずに済みます
TranslationSessionインスタンスの 格納方法には注意が必要です TranslationSessionは内部で 様々な処理を行いますが 場合によっては ユーザーにUIを表示する必要があります これは アプリのビューに アンカーを設定することで実現できます TranslationSessionの各インスタンスは アンカーされたビューに紐づいているため 基盤となるビューが消えると 機能しなくなります
つまり ビューの存続期間を超える 永続モデルオブジェクトなどに インスタンスを格納してはなりません あとでそのセッションを 使えなくなる可能性があるためです
最後に 翻訳で新しいSF Symbolsを 利用できるようになりました 翻訳APIをトリガする箇所や 本セッションで説明した 翻訳機能を参照する場合など UIのどこでも利用できます
以上をまとめます 「.translationPresentation()」を 使用して アプリ上のシステムUIで翻訳を 表示する方法を採用してください 翻訳機能をアプリのUIと 高度に統合したい場合は 柔軟なTranslation APIを使用できます
フィードバックアシスタントを通じて ご意見をお聞かせください 問題が発生した場合や 改善点の要望がある場合は ぜひお知らせください 翻訳を組み込むことで みなさんのアプリは より広く利用されることでしょう ご視聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。