オフライン対応型登山アシスタントアプリの構想

https://qiita.com/EasyCording/items/7b830d507569a736fbc4

前半はダラダラとくだらないことを書いた。
結局の結論としては、イザというときに話せる英会話フレーズ集を登山通訳ガイドのマニュアルとして、スマホに完備するというのが良さそうである。

# システム仕様

登山アシスタントＡＰＰの仕様

* オフラインでの音声変換入力が可能なこと
* 日本語の音声入力から英語に辞書変換できること
* 単語は登山に限定したものでよい
* 日本語を英語に直す
* 次に英語からセマンティック検索で例文を抽出する
* テキストを提示する
* スマホで使えること

# 機能ブロック図
オフライン対応型登山アシスタントアプリがサーバーレスアーキテクチャで構成されています。

```plantuml
@startuml
package "オフライン対応型登山アシスタントアプリ" {
   node "クライアントアプリ" {
       component "音声認識" as voice_rec
       component "音声合成" as voice_synth
       component "オフライン翻訳エンジン" as offline_trans
       component "例文データベース" as example_db
       component "フレーズブック" as phrase_book
       component "履歴管理" as history
       component "設定" as settings
   }

   package "オフラインデータ" {
       database "オフライン例文データベース" as example_data
       database "オフライン英会話フレーズ集" as phrase_data
   }

   voice_rec ..> offline_trans : 音声入力
   offline_trans --> example_db : 翻訳結果を検索
   offline_trans --> phrase_book : 翻訳結果を検索
   example_db --> voice_synth : 例文の読み上げ
   phrase_book --> voice_synth : フレーズの読み上げ
   history --> voice_synth : 履歴の読み上げ
   settings ..> voice_rec : 音声入力設定
   settings ..> offline_trans : 翻訳設定
   settings ..> voice_synth : 音声合成設定

   example_db <-- example_data
   phrase_book <-- phrase_data
}
@enduml
```

# システム動作

> 例文データベースとフレーズブックのデータがアプリに内蔵されています。
> オフラインで動作するため、インターネット接続は不要です。
> 大規模なデータの処理やアプリの容量増加など、課題もあります。

```plantuml
@startuml
actor User
participant App as "クライアントアプリ"
participant VoiceRec as "音声認識"
participant OfflineTrans as "オフライン翻訳エンジン"
participant ExampleDB as "例文データベース"
participant PhraseBook as "フレーズブック"
participant VoiceSynth as "音声合成"
participant History as "履歴管理"

User -> App : 音声入力
App -> VoiceRec : 音声認識
VoiceRec -> OfflineTrans : 日本語テキスト
OfflineTrans -> ExampleDB : 英語テキストを検索
OfflineTrans -> PhraseBook : 英語テキストを検索
ExampleDB --> App : 例文を表示
PhraseBook --> App : フレーズを表示
App -> VoiceSynth : 音声合成リクエスト
VoiceSynth --> User : 音声出力
App -> History : 履歴を保存

@enduml
```

# 技術スタック

スマホアプリは知見無し
→　アンドロイドアプリはCHATGPTで出来るのだろうか？

しかしながら、明確な目標を持つことが大事

```plantuml
@startmindmap
* スマホアプリ
** iOS
***_ プログラミング言語
****_ Swift
***_ フレームワーク
****_ SwiftUI
** Android 
***_ プログラミング言語
****_ Kotlin
***_ フレームワーク
****_ Jetpack Compose
** 音声認識エンジン
***_ Google Speech-to-Text
****_ オフライン対応
***_ Apple Speech-to-Text
****_ オフライン対応
** 音声合成エンジン
***_ Google Text-to-Speech
****_ オフライン対応
***_ Apple Speech-to-Speech 
****_ オフライン対応
** 翻訳エンジン
***_ T5
****_ オフラインモデル
***_ Meena
****_ オフラインモデル
** データベース
***_ オフライン例文DB
****_ SQLite形式
****_ 全文検索エンジン内蔵
***_ オフライン英会話フレーズ集
****_ SQLite形式
****_ 全文検索エンジン内蔵
@endmindmap
```

# 画面構成

なんだか、PLANTUMLの実験みたいになってきたな～

```plantuml
@startuml
salt
{
{+
  |=タイトルバー
    メニューボタン
    タイトル
    ボタン
}
  {+
    |= メイン画面 |
   {^ メインビュー
      +++翻訳ボックス+++
      音声入力ボタン 
   }
   {^ 例文/フレーズビュー
      例文/フレーズリスト
      音声読み上げボタン
   }
  }
{+
  |=ナビゲーションバー
   メニューボタン
}
}

@enduml

```

# ガントチャート

まあ、ＧＷ中にモック完成までやってみるか・・・

```plantuml

@startgantt
project starts the 2024-05-01

[要件定義] lasts 1 days
[設計] starts at [要件定義]'s end
[設計] lasts 1 days
[開発] starts at [設計]'s end
[開発] lasts 2 days 
[テスト] starts at [開発]'s end
[テスト] lasts 2 days
[リリース] starts at [テスト]'s end
[リリース] lasts 2 days 
@endgantt

```

# 最後に

オフラインで使えるポケトークで良くね？

https://www.esquire.com/jp/lifestyle/a42273902/how-to-find-the-best-portable-translation-machine-and-recommended-item/