Xamarin.Essentials: Synthèse vocale

La classe Synthèse vocale permet à une application d’utiliser les moteurs de synthèse vocale intégrés pour énoncer le texte à partir de l’appareil et également pour interroger les langages disponibles pris en charge par le moteur.

Bien démarrer

Pour commencer à utiliser cette API, lisez le guide de prise en main pour Xamarin.Essentials vous assurer que la bibliothèque est correctement installée et configurée dans vos projets.

Pour accéder à la fonctionnalité TextToSpeech , la configuration spécifique à la plateforme suivante est requise.

Si la version Android cible de votre projet est définie sur Android 11 (API R 30), vous devez mettre à jour votre manifeste Android avec les requêtes utilisées avec les nouvelles exigences de visibilité des packages.

Ouvrez le fichier AndroidManifest.xml sous le dossier Propriétés, puis ajoutez ce qui suit dans le nœud manifeste :

<queries>
  <intent>
    <action android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

Utilisation de Synthèse vocale

Ajoutez une référence à Xamarin.Essentials dans votre classe :

using Xamarin.Essentials;

La Synthèse vocale fonctionne en appelant la méthode SpeakAsync avec du texte et des paramètres facultatifs, et retourne à la fin de l’énoncé.

public async Task SpeakNowDefaultSettings()
{
    await TextToSpeech.SpeakAsync("Hello World");

    // This method will block until utterance finishes.
}

public void SpeakNowDefaultSettings2()
{
    TextToSpeech.SpeakAsync("Hello World").ContinueWith((t) =>
    {
        // Logic that will run after utterance finishes.

    }, TaskScheduler.FromCurrentSynchronizationContext());
}

Cette méthode prend un CancellationToken facultatif pour arrêter l’énoncé lors de son démarrage.

CancellationTokenSource cts;
public async Task SpeakNowDefaultSettings()
{
    cts = new CancellationTokenSource();
    await TextToSpeech.SpeakAsync("Hello World", cancelToken: cts.Token);

    // This method will block until utterance finishes.
}

// Cancel speech if a cancellation token exists & hasn't been already requested.
public void CancelSpeech()
{
    if (cts?.IsCancellationRequested ?? true)
        return;

    cts.Cancel();
}

La Synthèse vocale met automatiquement en file d’attente les requêtes de parole à partir du même thread.

bool isBusy = false;
public void SpeakMultiple()
{
    isBusy = true;
    Task.Run(async () =>
    {
        await TextToSpeech.SpeakAsync("Hello World 1");
        await TextToSpeech.SpeakAsync("Hello World 2");
        await TextToSpeech.SpeakAsync("Hello World 3");
        isBusy = false;
    });

    // or you can query multiple without a Task:
    Task.WhenAll(
        TextToSpeech.SpeakAsync("Hello World 1"),
        TextToSpeech.SpeakAsync("Hello World 2"),
        TextToSpeech.SpeakAsync("Hello World 3"))
        .ContinueWith((t) => { isBusy = false; }, TaskScheduler.FromCurrentSynchronizationContext());
}

Paramètres de la parole

Pour mieux contrôler la façon dont l’audio est prononcé avec SpeechOptions qui permet de définir le volume, la tonalité et les paramètres régionaux.

public async Task SpeakNow()
{
    var settings = new SpeechOptions()
        {
            Volume = .75f,
            Pitch = 1.0f
        };

    await TextToSpeech.SpeakAsync("Hello World", settings);
}

Les valeurs prises en charge pour ces paramètres sont les suivantes :

Paramètre Minimum Maximale
Inclinaison 0 2.0
Volume 0 1.0

Paramètres régionaux de la parole

Chaque plateforme prend en charge des paramètres régionaux différents, pour énoncer du texte dans différentes langues et avec différents accents. Les plateformes ont des codes et des méthodes différents pour spécifier les paramètres régionaux, c’est pourquoi Xamarin.Essentials fournit une classe multiplateforme Locale et un moyen de les interroger avec GetLocalesAsync.

public async Task SpeakNow()
{
    var locales = await TextToSpeech.GetLocalesAsync();

    // Grab the first locale
    var locale = locales.FirstOrDefault();

    var settings = new SpeechOptions()
        {
            Volume = .75f,
            Pitch = 1.0f,
            Locale = locale
        };

    await TextToSpeech.SpeakAsync("Hello World", settings);
}

Limites

  • La file d’attente de l’énoncé n’est pas garantie si elle est appelée sur plusieurs threads.
  • La lecture audio en arrière-plan n’est pas officiellement prise en charge.

API

Retrouvez d’autres vidéos Xamarin sur Channel 9 et YouTube.