日本語学習アプリや音声付き教材を作っていると、Text-to-Speech(TTS)は「入れれば終わり」ではありません。端末ごとに声質や発音、利用可否が変わると、学習体験そのものが揺らぎます。
そこで私は、Codename One 向けの Android 専用 CN1Libとして、日本語オフラインTTSを実装し、GitHub で公開しました。
Repository: https://github.com/jsfan3/nihonjindes-cn1lib-tts/
Codename One は「惚れ込んでいる」開発基盤
この CN1Lib は Android 専用です。クロスプラットフォームを狙っているわけではありません。それでも私は Codename One を選びました。理由は明快で、開発者の生活を大幅に楽にしてくれるからです。
- UI・イベント処理・ネットワーク・ストレージなどが一貫した設計で、アプリの土台が安定する
- ネイティブ要素を必要な箇所だけに閉じ込められる(複雑さを局所化できる)
- そして何より CN1Lib という形で「難しい実装を、使いやすい API に落とし込める」
CN1Lib は、公開 API だけでは扱いづらい/実装が重い仕組みを、アプリ側からはシンプルに呼べるように整えるための器です。ただし、作る側にとっては簡単ではありません。今回もまさにそこが勝負でした。
何を実現したのか:Open JTalk + Mei(Normal)による日本語オフライン音声合成
この CN1Lib は Open JTalk をベースに、Mei(Normal)音声で日本語テキストをオフラインで読み上げできるようにします。Android 上で完結し、通信や端末の TTS 設定に依存しません。
特長(開発者目線):
- 端末間で音声がブレない(同じエンジン・同じ音声を内包するため)
- オフライン動作(ネットワーク・追加ダウンロード前提の構成を避けたい用途に適する)
- 軽量で組み込みやすい(アプリに「使うための最小限」を提供することを意識)
- 読み上げ速度やピッチなど、教材・学習用途で重要なパラメータを扱える設計
「端末に入っている TTS」に頼らないメリット
システム TTS 依存は手軽に見えますが、教育系・コンテンツ系では典型的に問題になります。
- 日本語音声が端末に存在しない/無効化されている
- メーカー・OS・音声パックで品質が変わる(同じ文章でも印象が変わる)
- OS 更新で挙動や声が変わる(教材の再現性が崩れる)
- フォールバックで意図しない音声に切り替わるなど、体験の統一が難しい
この CN1Lib を使うと、アプリ側が提供する音声体験を「端末の偶然」に預けずに済みます。学習アプリにとって、これはそのまま品質と信頼性に直結します。
公開について(CC0 を選んだ理由)
この CN1Lib は、私自身の時間と労力をかなり投入して作りました。だからこそ、同じ課題にぶつかる次の開発者の参入障壁をできる限り下げたい。その意図で、私が書いた部分は CC0(実質的にパブリックドメイン相当)として公開しています。
「まず使えるものが欲しい」「まず動くものをベースに改良したい」——そういう場面で、手続きや制約が障害にならないようにしました。
まずはここから
詳しい導入手順、動作確認用の APK、サンプルはすべてリポジトリにまとめています。
日本語オフライン読み上げを Codename One(Android)で必要としている方は、ぜひチェックしてください。
ところで、生成AIが新しいコードのほぼすべてを作り出すようになった今、著作権について議論するのは意味がありません。AIは人間の知識をすべてパブリックドメインであるかのように扱い、著作権に関する法律をまったく気にせず誰にも報酬を支払いません。少数の多国籍企業がすべての人の知的財産を盗んで富を築いています。それなら著作権を放棄したほうがましでしょう。しかしこの議論は遠回りになってしまうのでこれ以上は触れません。
役に立ったら Star を付けてもらえると、継続的な改善の励みになります。
.jpg)
(2026年1月8日、私のギャラリーへ)