Озвучка текста в 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, когда голос — часть продукта: репетитор по языку, игровой персонаж, медитация с ведущим, бренд, который должен звучать одинаково на каждом телефоне.