Utiliser la synthèse vocale sur Android pour lire les messages entrants

Les applications avec des interfaces qui utilisent la voix ont un attrait unique. Ils ont tendance à donner l'impression à leurs utilisateurs d'utiliser quelque chose de futuriste. Depuis ses débuts, Android dispose d'une fonctionnalité de synthèse vocale (TTS) très robuste. Cette année, Google a ajouté de nombreuses voix de haute qualité à son moteur TTS, ce qui est une raison de plus pour les développeurs de l'utiliser dans leurs applications..

Dans ce tutoriel, vous allez apprendre à créer une application simple avec une interface utilisateur minimaliste, capable de recevoir des messages texte et de les lire à l'utilisateur..

Conditions préalables

Assurez-vous que l’ensemble Eclipse ADT est configuré. Vous pouvez le télécharger sur le site Web Android Developer. Pour de meilleurs résultats, vous aurez également besoin d’un véritable appareil Android et de quelques amis pouvant vous envoyer des messages texte..

1. Créer un nouveau projet

Lancez Eclipse et créez une nouvelle application Android. Appelez cette application SMSReader. Si vous pensez publier cette application sur Google Play pour la partager avec vos amis, veillez à utiliser un nom de package unique. Met le SDK minimum requis à Android 2.2 et mettre le SDK cible à Android 4.4.

Cette application aura un Activité. Sélectionner Créer une activité et choisir Activité vide.

Nomme le Activité principale et cliquez terminer.

2. Modifier le manifeste

Cette application nécessite trois autorisations:

  • RECEIVE_SMS savoir que l'appareil a reçu un SMS
  • READ_SMS lire ce SMS
  • READ_CONTACTS pour mapper le numéro de téléphone de l'expéditeur à un nom (si possible)

Ajoutez les lignes suivantes à votre AndroidManifest.xml.

  

Cette application va avoir une seule orientation de l'écran, portrait. Par conséquent, éditez le activité tag et ajoutez-y l'attribut suivant:

android: screenOrientation = "portrait"

Le manifeste est maintenant complet.

3. Editez strings.xml

Il n'est pas absolument nécessaire, mais stocker toutes les chaînes que l'application utilise dans le res / values ​​/ strings.xml le fichier est une bonne pratique. Editez ce fichier pour qu'il ait le contenu suivant:

  SMSReader Dernier SMS Aucun COMMENCEZ À PARLER ARRÊTE DE PARLER D'accord! Je vais lire vos messages à haute voix pour vous maintenant. D'accord! Je vais rester silencieux maintenant. 

La plupart de ces chaînes sont utilisées dans l'étape suivante.

4. Modifier la mise en page

modifier res / layout / activity_main.xml d'ajouter ce qui suit:

  • une Affichage pour afficher le nom de la personne qui a envoyé le dernier SMS
  • une Affichage pour afficher le contenu du dernier SMS
  • une Bouton à bascule activer / désactiver la sortie vocale

Après avoir ajouté du code pour le positionnement et le style de ces éléments, votre fichier doit avoir le contenu suivant:

    

La mise en page de notre application est maintenant terminée.

5. Créer une classe d'assistance

Nous allons maintenant créer une classe d'assistance pour le moteur TTS. Créez une nouvelle classe Java et appelez-la Speaker.java. Cette classe est utilisée pour éviter d’appeler l’API TTS directement à partir du Activité.

Cette classe implémente le OnInitListener interface pour qu'il sache quand le moteur TTS est prêt. Nous stockons cet état prêt dans une variable booléenne nommée prêt. Nous utilisons une autre variable booléenne nommée permis dont la valeur est vrai uniquement si l'utilisateur a autorisé le moteur TTS à parler. Nous ajoutons également des méthodes pour obtenir et définir la valeur de cette variable. À ce point, Speaker.java devrait avoir le contenu suivant:

public class Speaker implémente OnInitListener private TextToSpeech tts; booléen privé ready = false; booléen privé autorisé = faux; public Speaker (contexte de contexte) tts = new TextToSpeech (context, this);  public boolean isAllowed () retour autorisé;  public void allow (booléen autorisé) this.allowed = autorisé; 

le OnInitListener l'interface n'a qu'une méthode, onInit. Cette méthode est appelée lorsque le moteur TTS a été initialisé. le statut Ce paramètre nous permet de savoir si l’initialisation a réussi. Une fois que nous savons que l'initialisation a réussi, nous définissons le langage du moteur TTS. Ceci est important pour produire un discours qui soit compréhensible. Ajoutez le code suivant:

@Override public void onInit (int status) if (status == TextToSpeech.SUCCESS) // Modifiez cela pour qu'il corresponde à votre // locale locale tts.setLanguage (Locale.US); prêt = vrai;  else ready = false; 

Ensuite, nous ajoutons une méthode nommée parler, qui utilise le moteur pour lire le texte qui lui est transmis. Auparavant, il vérifie si les deux permis et le prêt les valeurs sont vrai. Le discours qu'il génère est placé dans le flux de notification.

public void speak (String text) // Ne parle que si le TTS est prêt // et que l'utilisateur a autorisé la parole si (prêt && autorisé) HashMap hash = new HashMap(); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (text, TextToSpeech.QUEUE_ADD, hash); 

Nous ajoutons ensuite une méthode qui joue le silence pendant une durée spécifiée. En utilisant cette méthode, nous pouvons ajouter des pauses au discours pour le rendre un peu plus clair. Ajoutez le code suivant à l'implémentation:

pause publique vide (int duration) tts.playSilence (duration, TextToSpeech.QUEUE_ADD, null); 

Enfin, ajoutez une méthode pour libérer des ressources lorsque le moteur TTS n’est plus nécessaire..

// Libérer des ressources public void destroy () tts.shutdown (); 

6. Modifier la classe d'activité

modifier MainActivity.java et déclarer toutes les vues que nous avons mentionnées dans la mise en page. Déclarer deux entiers, LONGUE DURÉE et COURTE DURÉE. Ce ne sont que des valeurs qui sont transmises à la Orateurde pause méthode.

Aussi déclarer un CHECK_CODE entier. Sa valeur n'est pas importante. Il est passé à la startActivityforResult méthode et ensuite utilisé pour identifier le résultat.

Enfin, déclarez un Orateur objet et un BroadcastReceiver objet.

À ce stade, votre classe devrait ressembler à ceci:

La classe publique MainActivity étend Activity private final int CHECK_CODE = 0x1; int finale finale LONG_DURATION = 5000; finale privée int SHORT_DURATION = 1200; orateur privé; private ToggleButton bascule; private OnCheckedChangeListener toggleListener; TextView privé smsText; SMS privé TextView SMS; diffuseur privé smsReceiver; 

Ajoutez une méthode pour vérifier si un moteur TTS est installé sur le périphérique. Le contrôle est effectué en utilisant le résultat d'un autre Activité.

check vide privéTTS () Vérification de l'intention = nouvelle intention (); check.setAction (TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult (cochez CHECK_CODE); 

Quand le résultat de startActivityForResult arrive, le onActivityResult méthode est appelée. Par conséquent, nous devons le remplacer. Dans cette méthode, si le résultat est positif, on initialise le Orateur objet. Si aucun moteur TTS n'est installé, nous redirigeons l'utilisateur pour l'installer..

@Override protected void onActivityResult (int requestCode, int resultCode, données d'intention) if (requestCode == CHECK_CODE) if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) speaker = new Speaker (this);  else Intention install = new Intent (); install.setAction (TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity (installer); 

Il est maintenant temps de créer notre BroadcastReceiver traiter les messages que le périphérique reçoit. Chaque fois qu'il y a de nouveaux messages, ses onReceive méthode est appelée. Nous analysons les messages, qui arrivent sous forme de tableaux d'octets, en utilisant le SmsMessage classe. Une fois le message analysé, nous utilisons des méthodes telles que getDisplayMessageBody et getOriginatingAddress extraire des informations utiles.

Avec cette information, nous générons le texte que le moteur TTS doit lire. Nous nous arrêtons pour LONGUE DURÉE avant de lire un nouveau SMS et pour COURTE DURÉE entre les énoncés du nom de l'expéditeur du SMS et le corps du SMS.

Ajoutez le code suivant à l'implémentation:

private void initializeSMSReceiver () smsReceiver = new BroadcastReceiver () @Override public void onReceive (contexte de contexte, intention d'intention) bundle bundle = intent.getExtras (); if (bundle! = null) Object [] pdus = (Object []) bundle.get ("pdus"); pour (int i = 0; i

Nous pouvons uniquement extraire le numéro de téléphone de l'expéditeur du message. Pour mapper ce numéro sur le nom d'un contact, nous devons utiliser les contacts de l'utilisateur. La méthode suivante interroge les données de contacts. Si le numéro de téléphone n'est pas disponible dans les contacts de l'utilisateur, il renvoie simplement la chaîne. numéro inconnu:

private String getContactName (Téléphone de chaîne) Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (téléphone)); Projection de chaîne [] = new String [] ContactsContract.Data.DISPLAY_NAME; Curseur curseur = getContentResolver (). Query (uri, projection, null, null, null); if (cursor.moveToFirst ()) return cursor.getString (0);  else retourne "nombre inconnu"; 

Avant le BroadcastReceiver peut être utilisé, il doit être enregistré. Dans la méthode suivante, nous créons un IntentionFilter pour les messages texte entrants, puis enregistrez notre smsReceiver pour ça:

private void registerSMSReceiver () IntentFilter intentFilter = new IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter); 

Ensuite, nous créons le onCreate méthode. Voici où nous initialisons tous les objets déclarés. Nous initialisons le toggleListener pour définir la valeur de permis dans le Orateur classe.

Après ces initialisations, nous appelons le chèques, initializeSMSReceiver, et enregistrerSMSReceiver les méthodes.

@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); toggle = (ToggleButton) findViewById (R.id.speechToggle); smsText = (TextView) findViewById (R.id.sms_text); smsSender = (TextView) findViewById (R.id.sms_sender); toggleListener = new OnCheckedChangeListener () @Override public void onCheckedChanged (vue CompoundButton, boolean isChecked) if (isChecked) speaker.allow (true); speaker.speak (getString (R.string.start_speaking));  else speaker.speak (getString (R.string.stop_speaking)); speaker.allow (false); ; toggle.setOnCheckedChangeListener (toggleListener); checkTTS (); initializeSMSReceiver (); registerSMSReceiver ();  

Enfin, dans le onDestroy méthode d’activité, nous annulons l’enregistrement de notre récepteur et éteignons le moteur TTS pour libérer des ressources.

@Override protected void onDestroy () super.onDestroy (); unregisterReceiver (smsReceiver); speaker.destroy (); 

7. Exécuter et tester

L'application est maintenant prête à être testée. Compilez-le et exécutez-le sur un périphérique Android physique. Appuyez sur le bouton pour activer la voix et envoyez-vous un SMS depuis un autre téléphone ou demandez à un de vos amis de le faire. Vous devriez bientôt pouvoir entendre votre téléphone lire le SMS pour vous.

Voici un exemple du discours généré par le moteur TTS:

Conclusion

Dans ce didacticiel, vous avez appris non seulement à utiliser l'API text-to-speech, mais également à utiliser des récepteurs de diffusion et à donner un sens aux données SMS brutes. Vous pouvez maintenant continuer à personnaliser davantage cette application selon vos besoins..