見出し画像

1行で翻訳機能を追加できる Translation API #WWDC24

WWDC24のセッション "Meet the Translation API" を見たメモ

⚠️ 本記事の画像、引用部分は基本的に同セッションからの引用です。

アプリに翻訳機能を入れられますよ、というもの。iOS, iPadOS, macOSで利用可能。

フレームワークのドキュメントはこちら:


2つのオプション

アプリ内で翻訳を提供するための選択肢として、以下の2つがある:

  1. Simple overlay

  2. Flexible translation

1行で書けるオーバーレイ翻訳

たった1行 `translationPresentation` メソッドを呼ぶだけで、引数に指定したテキストが翻訳されたものが表示されるようになる。

ボタンを押すだけで、

翻訳がオーバーレイされる:

ターゲット言語を変更するオプションもある:

こちらはiOS 17.4で追加されたもので、iOS 18を待たずとも今すぐ利用できる。

柔軟なテキスト翻訳

さすがにシンプル過ぎるので、多くのユースケースではもうちょっと実装をコントロールできるAPIが必要だと思う。

たとえばこんな感じで、原文を上書きするんじゃなくて、同時に表示したいケース:

TranslationSession

翻訳結果のUIでの見せ方をカスタマイズしたいetc.の柔軟にやりたい場合に使うのが `TranslationSession` クラス。

  • 一度に複数の文字列を翻訳可能

  • Swift Concurrencyを使用して結果を取得できる

こちらはiOS 18以降で利用可能。

最小実装コード:

let session: TranslationSession
let inputStrings: [String] = ...

let requests: [TranslationSession.Request] = inputStrings.map { init(sourceText: $0) }
for response in try? await session. translations (from: requests) {
   handle (response: response)
}

`TranslationSession` のインスタンスを自分でつくることはないらしい。こんな感じで `.translationTask` を用いてクロージャ経由でインスタンスを取得し、UIに結果を表示する:

翻訳が発生するタイミングをコントロールする

`TranslationSession.Configuration` を利用するらしい。

このクロージャはコンフィギュレーションが変更されるたびに実行されます。最初に翻訳をトリガーするには、コンフィギュレーションをnil以外の値に設定します。翻訳を再びトリガーする必要がある場合、SwiftUIがクロージャを再び実行することを認識するように設定を変更する必要があります。新しいテキストを翻訳したいのであれば、ソースもしくはターゲット言語を変更するか、設定に対してinvalidateを呼び出すことでできます。

サポートしている言語

日本語もサポート。

オンデバイス翻訳/言語モデルのダウンロード

各言語のモデルはダウンロードされ、`TranslationSession` はオンデバイスで翻訳処理を行うという話。

ここでの重要な点は2点

  • これらのモデルは、システム上のすべてのアプリで共有される

  • だいたいフレームワークがいい感じにやってくれる

APIが詳細を処理します。あなたのアプリが翻訳するとき、フレームワークは言語がまだインストールされていない場合にのみダウンロード許可を求めます。また、ダウンロード中にユーザーに進捗状況を表示するのもAPIが行います。そして、ユーザーがこのシートを解除しても、あるいはアプリから完全に離れても、これらのダウンロードはバックグラウンドで継続されます。

その他解説されていること

  • 言語の選択方法

  • バッチ翻訳(一度に複数の文字列を翻訳)

  • ベストプラクティス


ここから先は

0字

文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/