РУКОВОДСТВО

Озвучка текста в Kotlin для Android естественными голосами

В Android синтез речи встроен: класс TextToSpeech читает любой текст движком, установленным на телефоне, офлайн и бесплатно. Какой голос услышит пользователь, зависит от устройства, движка и скачанных голосов, поэтому одно и то же приложение звучит на каждом телефоне по-своему.

Бесплатный движок SuperClonica даёт Android-приложению один естественный голос везде, двумя способами: заранее озвученные аудиофайлы в ресурсах или сервер синтеза, к которому обращается приложение. В этом руководстве — оба способа с готовым кодом на Kotlin и когда системный движок всё же правильный инструмент.

Три способа заставить Android-приложение говорить

Многие приложения их сочетают: ресурсы для интерфейса, сервер для пользовательского текста, системный движок как запасной.

  • TextToSpeech: движок, установленный на телефоне, офлайн и бесплатно, с голосами, разными на разных устройствах.
  • Raw-ресурсы: каждая неизменная реплика озвучена один раз в SuperClonica и лежит в приложении.
  • Сервер синтеза: приложение отправляет текст на ваш сервер SuperClonica и проигрывает полученный WAV.
  • SuperClonica говорит на 31 языке; китайский пока не поддерживается.

Подберите голос бесплатно онлайн

На странице любого голоса впишите реплику своего приложения, от 30 до 100 символов, выберите язык и нажмите «Озвучить». Через несколько секунд вы услышите, подходит ли голос, без регистрации, прямо с телефона.

Поставляйте озвученные реплики ресурсами

Ресурсы работают офлайн и без задержки; правка — это новая версия приложения.

  • Озвучьте каждую реплику на компьютере движком: python -m pip install superclonica-cpu, затем superclonica --text "С возвращением!" --voice F1 --lang ru --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 реплика — один запрос, выполняемый не в главном потоке, например в корутине на Dispatchers.IO: val body = """{"text": "Ваш заказ уже в пути.", "voice": "F1", "lang": "ru"}""".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, когда голос — часть продукта: репетитор по языку, игровой персонаж, медитация с ведущим, бренд, который должен звучать одинаково на каждом телефоне.