Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android

Usa texto a voz en Android para leer mensajes entrantes

by
Difficulty:IntermediateLength:MediumLanguages:

Spanish (Español) translation by Ana Paulina Figueroa Vazquez (you can also view the original English article)

Las aplicaciones con interfaces que hacen uso de la voz tienen un atractivo único. Estas tienden a lograr que sus usuarios sientan que están usando algo futurista. Desde sus inicios, Android ha tenido una funcionalidad de texto a voz (TTS, o text-to-speech en inglés) muy robusta. Este año, Google ha añadido muchas voces de alta calidad a su motor de TTS, y esta es una razón más por la que los desarrolladores deben usar esta funcionalidad en sus aplicaciones.

En este tutorial aprenderás cómo crear una aplicación simple — con una interfaz de usuario minimalista — que puede recibir mensajes de texto y leerlos al usuario.

Prerrequisitos

Asegúrate de tener configurado el paquete Eclipse ADT. Puedes descargarlo en el sitio web de Android Developer. Para obtener los mejores resultados, también vas a necesitar un dispositivo Android real y algunos amigos que puedan enviarte mensajes de texto.

1. Crea un nuevo proyecto

Abre Eclipse y crea una nueva aplicación de Android. Asigna el nombre SMSReader a esta aplicación. Si estás pensando en publicar esta aplicación en Google Play para compartirla con tus amigos, entonces asegúrate de usar un nombre de paquete único. Configura el valor de Minimum Required SDK (SDK mínimo requerido) para que sea Android 2.2 y establece el Target SDK (SDK destino) en Android 4.4.

New Android Application window

Esta aplicación tendrá una Activity. Selecciona Create Activity (Crear Activity) y elige Empty Activity (Activity vacía).

Create an Empty new Activity

Asígnale el nombre MainActivity y haz clic en Finish (Finalizar).

Name the Activity

2. Edita el manifiesto

Esta aplicación necesita tres permisos:

  • RECEIVE_SMS para saber que el dispositivo ha recibido un SMS
  • READ_SMS para leer ese SMS
  • READ_CONTACTS para relacionar el número telefónico del remitente con un nombre (si es posible)

Agrega las siguientes líneas a tu AndroidManifest.xml.

Esta aplicación solamente va a tener una orientación de pantalla, vertical. Por lo tanto, edita la etiqueta activity y agrégale el siguiente atributo:

Ahora el manifiesto está completo.

3. Edita strings.xml

No es absolutamente necesario, pero almacenar todas las cadenas que la aplicación usa en el archivo res/values/strings.xml es una buena práctica. Edita este archivo para que tenga el siguiente contenido:

La mayoría de estas cadenas se usan en el siguiente paso.

4. Edita el diseño

Edita res/layout/activity_main.xml para añadir lo siguiente:

  • un TextView para mostrar el nombre de la persona que envió el SMS más reciente
  • un TextView para mostrar el contenido del SMS más reciente
  • Un ToggleButton para activar y desactivar la salida de voz

Después de añadir código para posicionar y estilizar estos elementos, tu archivo deberá tener el siguiente contenido:

El diseño para nuestra aplicación ahora está terminado.

5. Crea una clase de ayuda

Ahora vamos a crear una clase de ayuda para el motor de TTS. Crea una nueva clase de Java y asígnale el nombre Speaker.java. Esta clase se usa para evitar invocar a la API TTS directamente desde la Activity.

Esta clase implementa la interfaz OnInitListener para que sepa cuando el motor de TTS esté listo. Almacenamos este estado en una variable booleana llamada ready. Usamos otra variable booleana llamada allowed cuyo valor es true solamente si el usuario ha permitido que el motor de TTS hable. También añadimos métodos para obtener y establecer los valores de esta variable. En este punto, Speaker.java debe tener el siguiente contenido:

La interfaz OnInitListener solamente tiene un método, onInit. Este método es invocado cuando el motor de TTS ha sido inicializado. El parámetro status nos permite saber si la inicialización tuvo éxito. Una vez que sabemos que la inicialización fue exitosa, establecemos el lenguaje del motor de TTS. Esto es importante paras que sea comprensible. Agrega el siguiente código:

A continuación vamos a añadir un método llamado speak, que usa el motor para leer cualquier texto que se le envíe. Antes de hacer eso, verifica si los valores allowed y ready tienen el valor true. La voz que genera se coloca en el flujo de notificaciones.

Después añadimos un método que reproduce silencio durante un lapso específico. Usando este método, podemos añadir pausas en la voz para que suene un poco más clara. Agrega el siguiente código a la implementación:

Finalmente agrega un método para liberar recursos cuando el motor de TTS ya no sea necesario.

6. Edita la clase Activity

Edita MainActivity.java y declara todas las vistas que mencionamos en el diseño. Declara dos enteros, LONG_DURATION y SHORT_DURATION. Estos son solamente valores que se envían al método pause de Speaker.

También declara un entero CHECK_CODE. Su valor no es importante. Este se envía al método startActivityforResult y luego es usado para identificar el resultado.

Por último, declara un objeto Speaker y un objeto BroadcastReceiver.

En este momento, tu clase debe verse de esta manera:

Agrega un método para verificar si hay algún motor de TTS instalado en el dispositivo. La verificación se lleva a cabo haciendo uso del resultado de otra Activity.

Cuando el resultado de startActivityForResult llega, se invoca el método onActivityResult. Por lo tanto necesitamos sobrescribirlo. En este método, si el resultado es positivo inicializamos el objeto Speaker. Si no hay ningún motor de TTS instalado, entonces redireccionamos al usuario para que lo instale.

Ahora es momento de crear nuestro BroadcastReceiver para gestionar los mensajes que el dispositivo esté recibiendo. Cada vez que haya nuevos mensajes se invocará el método onReceive. Analizamos los mensajes, que llegan como arreglos de tipo byte, usando la clase SmsMessage. Una vez que el mensaje haya sido analizado, usamos métodos como getDisplayMessageBody y getOriginatingAddress para extraer información útil de él.

Con esta información generamos el texto que el motor de TTS debe leer en voz alta. Pausamos durante el valor de LONG_DURATION antes de leer un nuevo SMS y durante el valor de SHORT_DURATION entre el momento en el que se dice el nombre del remitente del SMS y el momento en el que se dice el cuerpo del SMS.

Agrega el siguiente código a la implementación:

Solamente podemos extraer el número telefónico del remitente usando el mensaje. Para relacionar este número con el nombre de un contacto, tenemos que usar los contactos del usuario. El siguiente método hace una consulta en los datos de los contactos. Si el número telefónico no está disponible en los contactos del usuario, entonces simplemente devuelve la cadena unknown number:

Antes de poder usar el BroadcastReceiver, este tiene que ser registrado. En el siguiente método creamos un IntentFilter para mensajes de texto entrantes y luego registramos nuestro smsReceiver para él:

A continuación creamos el método onCreate. Aquí es donde vamos a inicializar todos los objetos que declaramos. Inicializamos el toggleListener para establecer el valor de allowed en la clase Speaker.

Después de estas inicializaciones, invocamos a los métodos checkTTSinitializeSMSReceiver y registerSMSReceiver.

Finalmente, en el método onDestroy de la activity eliminamos el registro de nuestro receptor y desconectamos el motor de TTS para liberar recursos.

7. Ejecuta y prueba

La aplicación ahora está lista para ser probada. Compila y ejecútala en un dispositivo Android físico. Pulsa el botón para activar la voz y envíate un SMS desde otro teléfono, o pide a alguno de tus amigos que lo haga. Pronto deberás poder escuchar tu teléfono leyendo el SMS por ti.

Este es un ejemplo de la voz generada por el motor de TTS:

Conclusión

En este tutorial has aprendido no solamente a usar la API de texto a voz, sino también a usar receptores de difusión y a entender los datos sin procesar de los SMS. Ahora puedes continuar y personalizar esta aplicación de acuerdo a tus necesidades.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.