# Nihongo Pocketを、ミャンマーの通信環境を前提にして設計した話 | Muscle Industry

> ExpoとCloudflareを活用した構成、通信が不安定な環境でも学習を進めやすくする音声配信、AIとミャンマー語母語話者の協働による教材レビュー工程を紹介します。

Canonical: https://muscleindustry.work/ja/blog/nihongo-pocket-offline-audio-design
Language: ja

2026/08/04

# Nihongo Pocketを、ミャンマーの通信環境を前提にして設計した話

ExpoとCloudflareを活用した構成、通信が不安定な環境でも学習を進めやすくする音声配信、AIとミャンマー語母語話者の協働による教材レビュー工程を紹介します。

[#nihongo-pocket](https://muscleindustry.work/ja/blog/tags/nihongo-pocket)[#expo](https://muscleindustry.work/ja/blog/tags/expo)[#offline](https://muscleindustry.work/ja/blog/tags/offline)[#cloudflare](https://muscleindustry.work/ja/blog/tags/cloudflare)

![Nihongo Pocketのホーム画面と辞書画面](https://muscleindustry.work/assets/apps/nihongo-pocket/feature-graphic.webp)

## 不安定な通信環境でも学習を継続しやすくする

Nihongo Pocketは、ミャンマー語を母語とする学習者向けの日本語学習アプリです。JLPTのN5からN1を意識した単語、日常会話、文法ドリル、読解教材、辞書機能を備え、日本語音声とミャンマー語の解説を組み合わせて学べるように設計しています。

開発にあたって重視したのは、通信環境が安定しない状況でも学習を継続しやすい仕組みづくりでした。

ミャンマー現地の通信環境は、地域や時間帯によって接続が不安定になることがあります。回線の切断が起きると大容量のダウンロードが途中で止まりやすく、従量制のモバイル回線では通信量そのものが学習者の負担になります。常時高速な通信を前提とした設計は、利用実態に合いにくい場面があります。

そのため本アプリでは、教材をあらかじめ取得しておくことで、オフライン状態でも学習を進められる設計を基本方針としました。

## 技術スタックと設計方針

クライアントはExpo・React Native・TypeScriptで構築し、画面遷移にはExpo Routerを採用しています。学習の進捗やダウンロード状態は、端末ローカルのSQLiteへ記録する構成です。

-   モバイル基盤: Expo 57 / React Native 0.86 / TypeScript
-   ルーティング: Expo Router
-   ローカルデータベース: expo-sqlite（学習進捗・完了ドリル・教材メタデータの管理）
-   ファイル管理: expo-file-system（音声・教材パックのキャッシュと展開）
-   音声再生: expo-audio（端末内音声ファイルの再生）
-   バックグラウンド処理: expo-background-task（中断されたダウンロードタスクの再開処理）
-   API・制御面: Cloudflare Workers + Hono（教材マニフェスト配信、進捗バックアップAPI）
-   データストア: Cloudflare D1（匿名ユーザーIDに基づく学習進捗の遠隔バックアップ）
-   静的配信・ストレージ: Cloudflare R2 + CDN（音声バンドル、教材JSON、アセット配信）
-   パイプライン基盤: Node.js + TypeScript CLI（原稿整合性検証、TTS一括生成、パック生成）

UIの操作やドリルの解答結果は、まず端末内のSQLiteへ書き込まれます。クラウドとの同期はデータの消失を防ぐためのバックアップであり、サーバーからの応答を待たずに次の問題へ進める導線を基本としています。

## インストール直後から使える初期教材と分割配信

アプリ導入時の通信エラーによる離脱を抑えるため、初期状態で利用できる軽量なスターター教材をアプリ内に同梱しています。入門レベルの重要単語や基礎ストーリー、付随する音声ファイルがあらかじめ含まれており、初回の通信接続を待たずに学習を始められます。

それ以降の詳細な教材は、レベル別・テーマ別の「教材パック」として分割配信しています。1パックあたりの容量はおよそ3〜6MBを目安としており、学習進度や利用可能な通信環境に合わせて小分けに取得できます。

ダウンロードが完了した教材パックは端末内に保存され、通信が切断された状態でも利用できます。ストレージ容量を節約したい場合は教材パック単位で削除できますが、記録されたスコアや学習進捗はローカルDBに維持されます。

## 音声の事前生成と端末内再生

語学学習において発音の確認は重要ですが、再生ボタンを押すたびに音声をストリーミング取得する構成では、低速回線下で再生までに待ち時間が生じやすくなります。

Nihongo Pocketでは、日本語音声を「Irodori TTS」を用いたテキスト音声合成（TTS）により事前に一括生成し、Cloudflare R2経由で端末ストレージへ保存した上で再生する方式を採っています。通信を介さずに端末内のファイルを読み出すことで、再生時の待ち時間を抑えています。なお、これらの音声は合成音声であり、人間の個別収録ではありません。

音質面では、語学の聞き取りに必要な明瞭度を保ちつつファイルサイズを抑えるため「MP3 32kbps・モノラル・サンプリング周波数24kHz」を採用しました。教材切り替え時の音量差を抑えるため、生成パイプライン側で各音源のラウドネス（音圧）を均一に調整しています。

## 音声バンドル化によるHTTPリクエストの集約

数千個に及ぶ小さな音声ファイルを1つずつHTTPリクエストでダウンロードすると、接続確立のオーバーヘッドや通信待ちが重なり、全体の取得時間が長引く原因になります。

この課題を軽減するため、複数のMP3ファイルを連結した `audio.bundle` と、各音声の開始バイト位置・サイズ・ハッシュ値を記録した `audio-index.json` を生成するバンドル機構を導入しました。

開発時の検証環境（全37パック・計9,620個の音声ファイルを対象とした初回取得の測定条件）において、個別取得で想定された9,657回のHTTPリクエストを、バンドル化により101回へと集約できました。この検証条件下でのリクエスト回数の削減率は98.95%となり、検証時の最大バンドルファイル容量は約4.24MiBでした。なお、この数値はHTTPリクエスト回数の削減率であり、通信時間や全体の通信容量そのものが98.95%削減されたことを意味するものではありません。

端末に保存された `audio.bundle` はアプリ内で個別MP3へと展開され、位置・サイズおよびSHA-256ハッシュ値が検証されます。教材更新時も、変更のない音声ファイルは端末ローカルのデータを再利用し、差分の生じた音声のみを取得する構成を採っています。

## 通信切断時の再開処理と整合性の確認

ダウンロードの途中で通信が切断された場合でも、それまでに取得が完了した状態を損ないにくい設計を意識しています。ダウンロード進捗はSQLiteで管理され、アプリの再起動やフォアグラウンド復帰、ネットワーク再接続時に中断箇所からの再開を試みます（実際の再開挙動は、OSのタスク管理や通信状況、端末の空き容量などに依存します）。

利用者が手動でダウンロードを一時停止・再開できるUIを備えているほか、「Wi-Fi接続時のみダウンロード」という設定も用意し、モバイルデータ通信の消費を制御できるようにしています。

また、教材のテキスト情報（JSON）を音声バンドルよりも先に取得する設計にしています。これにより、音声データの取得が完了していなくても、テキストベースの学習や問題演習を先行して開始できます。

配布ファイルにはSHA-256チェックサムを付与し、取得データの整合性を確認して必要に応じた再取得を行います。教材URLにはバージョン情報を含めており、更新配信中であっても利用中の教材構成との不整合を防ぐ配慮をしています。

## AI活用と母語話者フィードバックを組み合わせた教材制作

N5からN1を対象とした語彙、例文、日常会話、練習問題を効率的に整備するため、AIによるドラフト作成や機械的な検証フローを取り入れています。

一方で、AIの出力したミャンマー語表現が実際の生活文脈で自然に用いられているかを確認するため、ミャンマー語母語話者による確認体制を設けています。制作工程は複数の役割を分担して進めています。

1.  AIによるドラフト生成: シラバスに基づく例文や設問の初稿作成、語彙重複のチェック
2.  スクリプトによる機械検証: 文字コード、禁止語、JSON構造の整合性確認
3.  開発者による仕様レビュー: 学習導線や難易度の適合性確認
4.  母語話者によるフィードバック: 実際の生活感覚や文脈に応じた表現の確認

すべての教材項目について母語話者の完全な個別確認が完了しているわけではありませんが、AIによる網羅的なドラフト生成や機械検証と、開発者の判断、母語話者からのフィードバックを組み合わせることで、教材の品質と表現の自然さを継続的に調整しています。

## 利用環境の前提に合わせたアプリ設計

常時高速な通信環境を前提にできれば、リソースを都度ストリーミング取得する構成も選択肢に入ります。しかし、実際の利用環境において通信が途切れやすい場面を想定すると、端末内に取得済みの教材を用いて手元で学習を続けやすくする仕組みが重要になります。

Nihongo Pocketでは、オフラインでの利用性や通信量の配慮を単なる個別機能としてではなく、データ構造、音声コーデック、配信パイプライン、レビュー工程に至る設計の前提として位置づけて開発を続けています。

[Nihongo Pocketの紹介ページを見る](https://nihongo-pocket.muscleindustry.work/)

[App StoreでNihongo Pocketを見る](https://apps.apple.com/jp/app/nihongo-pocket/id6789896820)
