Otomo チーム二子橋

Swift

GitHub

スマホを見ない一人旅。耳で巡るAI旅コンパニオン

Toshihiro Nogata

Reo Nishida

推しアイデア

一人旅で「隣にいて案内してくれる人」をAIで再現するアプリ、Otomo。事前に選んだ気になるスポットに近づくと、その場で解説が自動で流れ、Apple Watchが方角と距離を教えてくれる。スマホを取り出さなくても、声と腕時計の矢印だけで旅が進む。

作った背景

一人旅は自由な反面、「あれ何だろう」を一緒に驚いたり、指をさして教えてくれる相手がいない。かといって解説を読もうとスマホを覗き込むと、今度は目の前の景色を見逃してしまう。その両方をなくして、画面を見ずに旅を続けられる体験を作りたかった。

推し技術

位置情報でスポットや経路上のガイド地点への接近を検知し、解説を自動再生。解説が途切れて沈黙が続くと、道中ナレーションや「ひとりの時間」の内省プロンプトが間を埋める仕組みを実装。

プロジェクト詳細

作るもの

一人旅のための、耳で完結するAI旅行コンパニオン。 出発地・経由地・到着地を選ぶと、乗り換えAPIで実在する経路・所要時間を確認したうえで出発する。歩いている間は、ルート沿いの実在スポット(地図データ由来)の中からLLMが紹介する価値のあるものを選び、近づいたタイミングで解説を自動再生。会話が途切れた沈黙は、LLMが生成する道中ナレーションや内省の問いかけで埋める。Apple Watchは次の目的地への方角と距離を矢印で示し続けるので、スマホを見なくても進む方向がわかる。一日の終りには、訪れた場所・道中で流れた解説・その場で選んだ写真をひとまとめにし、足跡と統計を重ねた1枚のシェア画像として書き出せる。

主な機能

  • 位置情報連動のプロアクティブ観光解説(接近検知で自動再生、スポットは実地図データからLLMが厳選)
  • 沈黙を埋める道中ナレーション・内省プロンプト(LLM生成)
  • Apple Watchの方角案内(次の目的地への矢印表示。スマホを見ずに歩ける)
  • 訪れた場所・解説ログ・写真をまとめて書き出すジャーナル共有カード

技術スタック

フロントエンド(iOS / watchOS)

  • Swift + SwiftUI(ネイティブのみ)。iPhoneアプリ本体 + Apple Watchアプリの2ターゲット構成。
  • 状態管理: Swift Observation(@Observable)。
  • MapKit: スポット検索・逆ジオコーディング、経路のポリライン描画、共有カード用の地図スナップショット生成(MKMapSnapshotter)。
  • CoreLocation: 現在地監視とスポットへの接近判定、Apple Watchの方角センサー(heading)によるコンパス表示、CLGeocoder。
  • AVFoundation: AVSpeechSynthesizer(オンデバイス音声合成フォールバック)、AVAudioPlayer(AI音声再生)、AVAudioSession(AirPods/スピーカー両対応の.playback設定)。
  • PhotosUI: PhotosPickerによる複数写真選択。
  • WatchConnectivity: iPhone⇔Apple Watch間の経路・案内状態の同期(startNavigation()から実際に送信されている)。
  • 永続化: 端末内DocumentsにJSONで記録・写真を保存(サーバー・アカウントなし)。

バックエンド

  • TypeScript製Vercel Serverless Functions(@vercel/node)。実際に呼ばれているのは3本:
    • /api/guide — スポット解説文の生成(GuideClient経由、Navi画面で使用)
    • /api/route-guide-points — MapKit由来のPOI候補からLLMが紹介する価値のあるものを選び解説を書く(RouteGuideService経由)
    • /api/route-briefing — 沈黙埋め用の道中ナレーションをまとめて生成(RouteBriefingService経由)
    • /api/tts — テキストを音声(mp3)に変換(SpeechService経由)
  • LLM/音声: OpenAI API(テキスト生成 gpt-4o-mini、音声合成 gpt-4o-mini-tts)への薄いプロキシ。

インフラ・運用

  • ホスティング: Vercel(backendディレクトリをルートに指定し手動デプロイ)。
  • シークレット管理: OpenAI APIキーはVercel環境変数OPENAI_API_KEY。iOS側はSecrets.swift(gitignore対象)。
  • ローカル署名設定: [[[Config/Local.xcconfig(gitignore対象)でXcode署名・バンドルIDを分離。](URL Here)](URL Here)](URL Here)

挑戦

どちらも初めてのハッカソンのため、縛られすぎずに柔軟に進めていく。

としひろ: ・初めてのSwift/Xcodeでのネイティブアプリ開発 ・iPhone・AirPods・Apple Watchの3デバイス連携 ・LLMのTool Useで外部APIと接続するagenticな構成

れお: ・初めてのSwift/Xcodeでのネイティブアプリ開発 ・iPhone・AirPods・Apple Watchの3デバイス連携 ・写真のGPSメタデータと位置情報を組み合わせたジャーナル機能

Toshihiro Nogata

@7941279412f702c2