ガイド

Kotlin で Android アプリに自然な音声読み上げを

Android には音声読み上げが組み込まれています。TextToSpeech クラスを使えば、スマホに入っているエンジンでどんなテキストもオフラインで無料で読み上げます。ただ、聞こえる声は端末、エンジン、ダウンロード済みの声しだいで、同じアプリでもスマホごとに違う声になります。

無料の SuperClonica エンジンなら、Android アプリにどこでも同じ自然な声を持たせられます。方法は2つ。リソースとして同梱する事前音声化ファイルか、アプリが呼び出す音声サーバーです。このガイドでは両方を Kotlin のコード付きで紹介し、システムのエンジンで十分な場面も説明します。

Android アプリを話させる3つの方法

多くのアプリは組み合わせます。UI にはリソース、ユーザーのテキストにはサーバー、予備にシステムのエンジン。

  • TextToSpeech:スマホに入っているエンジン。オフラインで無料ですが、声は端末ごとに違います。
  • raw リソース:決まったセリフを SuperClonica で一度音声化してアプリに同梱。
  • 音声サーバー:アプリが SuperClonica サーバーにテキストを送り、返ってきた WAV を再生します。
  • SuperClonica は31言語を話します。中国語にはまだ対応していません。

無料でオンラインで声を選ぶ

どの声のページでも、アプリのセリフを30〜100文字で入力し、言語を選んで生成ボタンを押します。数秒で合う声かが分かります。アカウント不要で、スマホからそのまま使えます。

音声化したセリフをリソースで同梱

リソースはオフラインで遅延もありませんが、変更には新しいアプリのバージョンが必要です。

  • PCでエンジンを使ってセリフを音声化:python -m pip install superclonica-cpu のあと、superclonica --text "おかえりなさい!" --voice F1 --lang ja --output welcome.mp3。
  • ファイルは res/raw に置きます。リソース名に使えるのは小文字、数字、アンダースコアだけです。
  • セリフを再生:MediaPlayer.create(context, R.raw.welcome).start()
  • 再生が終わったら、setOnCompletionListener などでプレーヤーを解放しましょう。

自前の音声サーバーを呼ぶ

自分で管理するマシンでサーバーを動かします:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。Android は既定で暗号化されていない HTTP をブロックするので HTTPS の内側に置き、SUPERCLONICA_API_KEY を設定して自分のアプリだけが使えるようにします。OkHttp なら、セリフ1つがリクエスト1回です。メインスレッドの外、たとえば Dispatchers.IO のコルーチンで実行します:val body = """{"text": "ご注文の商品を発送しました。", "voice": "F1", "lang": "ja"}""".toRequestBody("application/json".toMediaType()); val bytes = client.newCall(Request.Builder().url("https://tts.example.com/synthesize").post(body).build()).execute().body!!.bytes(); val file = File(cacheDir, "line.wav").apply { writeBytes(bytes) }; MediaPlayer().apply { setDataSource(file.path); prepare(); start() } キーを Authorization ヘッダーで付け、くり返すセリフのファイルはキャッシュしましょう。

システムの TextToSpeech で十分なとき

通知の読み上げ、アクセシビリティ補助、プロトタイプ、ネットなしで話す必要のあるアプリなど、声が「伝わればよい」ならシステムのエンジンで十分です。語学の先生、ゲームキャラクター、ガイド付き瞑想、どのスマホでも同じ声で聞こえるべきブランドなど、声が製品の一部なら SuperClonica を選びましょう。