Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クラウド翻訳サービスはもう不要!? オンデバイス翻訳 Translation API を使い倒そう

クラウド翻訳サービスはもう不要!? オンデバイス翻訳 Translation API を使い倒そう

クラウド翻訳サービスはもう不要!?オンデバイス翻訳 Translation API を使い倒そう

SwiftUI と Translation API を活用し、クラウドに依存しないオンデバイス翻訳の可能性に挑戦!このスライドでは、translationPresentationTranslationSession を使った翻訳アプリ開発の実践例とともに、オンデバイス翻訳の利点や課題について詳しく解説しています。

主なトピック
1. translationPresentation の登場
iOS 17.4 で導入された、わずか 1 行のコードで翻訳ポップオーバーを表示できる新しいモディファイア。デモコードを交え、便利な標準 UI と翻訳自動検出の魅力を紹介しています。

2. TranslationSession を MVVM で活用する方法
iOS 18 で実装可能になった TranslationSession を ViewModel に統合。効率的な翻訳処理とライフサイクル管理のコツを解説します。

3. Translation API の活用例
翻訳機のようなアプリ構築や、大量の文字列を効率的に翻訳する手法について議論。オフライン翻訳の可能性を引き出すための具体例を示しています。
紹介アプリ: ワンタップ通訳アプリ『One通(ワンツー)』(https://apps.apple.com/jp/app/id6670566421)

4. 開発Tips
- 言語モデルのダウンロード方法と注意点
- 翻訳モデルの自動削除に対処する方法
- translationTask を活用した柔軟な翻訳実行の実装例

5. watchOSやウィジェットでの利用可能性
翻訳機能の制約を分析し、将来的な可能性を模索。

まとめ
- translationPresentation はシンプルな実装で便利な UI を提供しますが、自由度が低い場面もあることを説明。
- 一方、TranslationSession は開発の自由度を大幅に高めるが、View と密接なライフサイクル管理が必要。
- Translation API を活用したアプリ開発の可能性を探りながら、現時点での制約も明らかにしています。

登壇イベント: Chiba.swift #2 (https://chibaswift.connpass.com/event/331925/)

Ryutaro Okamoto / kuromelon257

December 06, 2024
Tweet

More Decks by Ryutaro Okamoto / kuromelon257

Other Decks in Technology

Transcript

  1. ໨࣍ 1. translationPresentation ͷొ৔ 2. TranslationSession Λ MVVM Ͱ࢖༻͢Δ 3.

    Translation API ͷ׆༻ྫ 4. Translation API ։ൃ Tips 5. watchOS, ΢ΟδΣοτͰ࢖͑Δʁ
  2. translationPresentation ͷ࠷খ࣮૷ͱσϞ … [ެࣜDoc]https://developer.apple.com/documentation/swiftui/view/translationpresentation(ispresented:text:attachmentanchor:arrowedge:replacementaction:) var body: some View { VStack

    { TextField("຋༁ର৅", text: $sourceText) Button("຋༁͢Δ") { isPresented.toggle() } } .translationPresentation( isPresented: $isPresented, text: sourceText ) }
  3. translationPresentation ͷಛ௃ • iOS 17.4 Ҏ্ • ࢦఆͨ͠จࣈྻΛ຋༁͢ΔϙοϓΦʔόʔΛදࣔ • ࣮૷͸࠷খͰΘ͔ͣ1ߦ

    • ຋༁ݴޠ͸ࣗಈݕग़ • ಡΈ্͛ɺίϐʔ౳͕Ͱ͖Δศརͳ UI ෇͖ • ΦϯσόΠεͰͷ຋༁ • ΦϑϥΠϯͰར༻Մೳ • ࢖͍์୊ Translation API ͷڧΈʂ
  4. translationPresentation ͷ຋༁݁Ռऔಘ . VStack { TextField("຋༁ର৅", text: $sourceText) .textFieldStyle(RoundedBorderTextFieldStyle()) Button("຋༁͢Δ")

    { isPresented.toggle() } Text(targetText) } .translationPresentation( isPresented: $isPresented, text: sourceText, replacementAction: { translatedText in // [຋༁Ͱஔ͖ସ͑]λοϓ࣌ targetText = translatedText } )
  5. ໨࣍ 1. translationPresentation ͷొ৔ 2. TranslationSession Λ MVVM Ͱ࢖༻͢Δ 3.

    Translation API ͷ׆༻ྫ 4. Translation API ։ൃ Tips 5. watchOS, ΢ΟδΣοτͰ࢖͑Δʁ
  6. translationTask ͷ࠷খ࣮૷ͱσϞ . VStack { Text("຋༁ର৅: " + sourceText) Text("຋༁݁Ռ:

    " + targetText) } .translationTask( source: .init(identifier: "ja-JP"), target: .init(identifier: "en-US") ) { session in Task { let response = try! await session.translate(sourceText) targetText = response.targetText } }
  7. translationTask ͔Β TranslationSession Λऔಘ (View) ……………………. VStack { TextField("຋༁ର৅", text:

    $sourceText) Text("຋༁݁Ռ: " + targetText) Button("຋༁") { Task { targetText = await vm.translate(sourceText: sourceText) } } } .translationTask( source: .init(identifier: "ja-JP"), target: .init(identifier: "en-US"), action: vm.setSession )
  8. translationTask ͔Β TranslationSession Λऔಘ (ViewModel)ɹɹɹɹ…..………. View ͔Βऔಘͨ͠ TranslationSession Ͱɺ ࣗ༝ͳλΠϛϯάͰ຋༁ͷ࣮ߦ͕Մೳ

    final public class ContentViewModelImpl: ContentViewModel { var session: TranslationSession? func setSession(_ session: TranslationSession) async { self.session = session } func translate(sourceText: String) async -> String { let response = try! await session?.translate(sourceText) return response?.targetText ?? "" } }
  9. MVVM ʹ͓͚Δ TranslationSession ͷ؅ཧͷ஫ҙࣄ߲ ………………….. • TranslationSession Πϯελϯεͷ ʮण໋͸ੜ੒ͨ͠ View

    ʹґଘʯ • WWDC ͷηογϣϯͰ͸Ӭଓతʹอ࣋͠ͳ͍Α͏ʹ஫ҙשى • View ͱಉ͡ϥΠϑαΠΫϧͷ ViewModel Ͱͷ؅ཧͰ͋Ε͹໰୊ͳ͍ • લड़ͷϞσΟϑΝΠΞҎ֎Ͱ͸ TranslationSession ͷΠϯελ ϯεੜ੒͸ෆՄ • ແཧ΍Γॻ͍ͯ΋ίϯύΠϧΤϥʔ • SwiftUI ͷ View ͕ແ͍؀ڥͰ͸࢖༻ෆՄ [WWDC2024]https://developer.apple.com/videos/play/wwdc2024/10117/
  10. ໨࣍ 1. translationPresentation ͷొ৔ 2. TranslationSession Λ MVVM Ͱ࢖༻͢Δ 3.

    Translation API ͷ׆༻ྫ 4. Translation API ։ൃ Tips 5. watchOS, ΢ΟδΣοτͰ࢖͑Δʁ
  11. ໨࣍ 1. translationPresentation ͷొ৔ 2. TranslationSession Λ MVVM Ͱ࢖༻͢Δ 3.

    Translation API ͷ׆༻ྫ 4. Translation API ։ൃ Tips 5. watchOS, ΢ΟδΣοτͰ࢖͑Δʁ
  12. ʲ։ൃ Tips 01ʳݴޠมߋͷํ๏ • translationTask ͷҾ਺Λมߋ͢Δͱ TranslationSession ͕ࢦఆݴޠͰ࠶ੜ੒ • ೖग़ྗͰ21ݴޠରԠ

    .translationTask( source: vm.sourceLocale.locale.language, target: vm.targetLocale.locale.language, action: vm.setSession ) ϓϧμ΢ϯͰ஋Λมߋ
  13. • ݴޠϞσϧ͸ଞΞϓϦͱڞ༗ʢެࣜ ຋༁ͳͲʣ • ݴޠϞσϧ͕ͳ͍৔߹μ΢ϯϩʔυͷ UI ͕දࣔ • ॳճ͸ΦϯϥΠϯͰμ΢ϯϩʔυ͕ඞཁ •

    γεςϜσʔλྖҬʹอଘ • ⚠ ୺຤ͷۭ͖ετϨʔδ͕ṧഭ͢ΔͱࣗಈͰ࡟আ • TranslationSession.prepareTranslation() Ͱ ຋༁Մೳঢ়ଶͷνΣοΫՄೳ • ࣗಈ࡟আ࣌ʹ prepareTranslation ͷνΣοΫΛ؏௨ • translate Ͱద౰ʹ຋༁͠ catch ͢Ε͹൑ఆՄೳ ʲ։ൃ Tips 02ʳݴޠϞσϧͷμ΢ϯϩʔυ
  14. ໨࣍ 1. translationPresentation ͷొ৔ 2. TranslationSession Λ MVVM Ͱ࢖༻͢Δ 3.

    Translation API ͷ׆༻ྫ 4. Translation API ։ൃ Tips 5. watchOS, ΢ΟδΣοτͰ࢖͑Δʁ
  15. ·ͱΊ 1. translationPresentation • iOS17.4 Ҏ߱ɺ1ߦͰ࣮૷ՄೳɺσϑΥϧτͷ UI ͕͋Δɺ։ൃࣗ༝౓͕௿͍ 2. TranslationSession

    • iOS18 Ҏ߱ɺΫϥ΢υ຋༁αʔϏεͷ୅ΘΓʹͳΓಘΔɺ։ൃࣗ༝౓͕ߴ͍ 3. Translation API ͷ׆༻ྫ • ຋༁ػϥΠΫͳΞϓϦΛ࡞੒Մೳ 4. Translation API ։ൃ Tips • উखʹ຋༁Ϟσϧ͕࡟আ͞ΕΔࣄ৅ʹ஫ҙ⚠ 5. watchOS, ΢ΟδΣοτͰ࢖͑ͳ͔ͬͨͰ͢…
  16. ࣗݾ঺հ • Ԭຊ ཾଠ࿠ʢ͓͔΋ͱ ΓΎ͏ͨΖ͏ʣ • LINEϠϑʔגࣜձࣾ • 𝕏 :

    @kuromelon257 • Yahoo!ϑϦϚ ( چ PayPayϑϦϚ ) • #ήʔϜ։ൃ #ҭࣇ #ཱྀߦ #ྉཧ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠