Texto a voz en Kotlin para Android con voces naturales
Android trae texto a voz integrado: la clase TextToSpeech lee cualquier texto con el motor instalado en el teléfono, sin conexión y gratis. La voz que oye el usuario depende del dispositivo, del motor y de las voces descargadas, así que la misma app suena distinta en cada teléfono.
El motor gratuito SuperClonica da a una app de Android una sola voz natural en todas partes, de dos formas: archivos de audio generados de antemano e incluidos como recursos, o un servidor de voz al que llama la app. Esta guía muestra las dos con código Kotlin listo y dice cuándo el motor del sistema sigue siendo la herramienta adecuada.
Tres formas de hacer hablar una app de Android
Muchas apps los combinan: recursos para la interfaz, servidor para el texto del usuario y el motor del sistema como respaldo.
- TextToSpeech: el motor instalado en el teléfono, sin conexión y gratis, con voces que cambian según el dispositivo.
- Recursos raw: cada frase fija se genera una vez con SuperClonica y va dentro de la app.
- Un servidor de voz: la app envía el texto a tu servidor SuperClonica y reproduce el WAV que devuelve.
- SuperClonica habla 31 idiomas; el chino aún no está disponible.
Elige una voz gratis en línea
En la página de cualquier voz, escribe una frase de tu app, de 30 a 100 caracteres, elige el idioma y pulsa el botón para generarla. En unos segundos oyes si encaja, sin cuenta, en tu propio teléfono.
Incluye frases generadas como recursos
Los recursos funcionan sin conexión y sin retraso; un cambio exige una nueva versión de la app.
- Genera cada frase en tu ordenador con el motor: python -m pip install superclonica-cpu, y luego superclonica --text "¡Hola de nuevo!" --voice F1 --lang es --output welcome.mp3.
- Pon los archivos en res/raw; los nombres de recurso solo admiten minúsculas, dígitos y guiones bajos.
- Reproduce una frase: MediaPlayer.create(context, R.raw.welcome).start()
- Libera el reproductor al terminar, por ejemplo en setOnCompletionListener.
Llama a tu propio servidor de voz
Ejecuta el servidor en una máquina que controles: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu. Android bloquea el HTTP sin cifrar por defecto, así que ponlo detrás de HTTPS, y define SUPERCLONICA_API_KEY para que solo tu app pueda usarlo. Con OkHttp, una frase es una petición, hecha fuera del hilo principal, por ejemplo en una corrutina con Dispatchers.IO: val body = """{"text": "Tu pedido ya está en camino.", "voice": "F1", "lang": "es"}""".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() } Añade una cabecera Authorization con la clave y guarda en caché los archivos de las frases que se repiten.
Cuándo basta con el TextToSpeech del sistema
El motor del sistema basta cuando la voz solo tiene que entenderse: leer una notificación, una ayuda de accesibilidad, un prototipo o una app que debe hablar sin ninguna red. Elige SuperClonica cuando la voz es parte del producto: un profesor de idiomas, un personaje de juego, una meditación guiada, una marca que debe sonar igual en todos los teléfonos.