Xamarin.Essentials:Sintesi vocale

La classe TextToSpeech consente a un'applicazione di usare i motori di sintesi vocale predefiniti pronunciare il testo dal dispositivo, nonché per recuperare le lingue disponibili supportate dal motore.

Operazioni preliminari

Per iniziare a usare questa API, leggere la guida introduttiva per Xamarin.Essentials assicurarsi che la libreria sia installata e configurata correttamente nei progetti.

Per accedere alla funzionalità TextToSpeech è necessaria la configurazione specifica della piattaforma seguente.

Se la versione di Android di destinazione del progetto è impostata su Android 11 (API R 30) è necessario aggiornare il manifesto Android con query usate con i nuovi requisiti di visibilità del pacchetto.

Aprire il file AndroidManifest.xml nella cartella Proprietà e aggiungere quanto segue all'interno del nodo manifest:

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

Uso della sintesi vocale

Aggiungere un riferimento a Xamarin.Essentials nella classe :

using Xamarin.Essentials;

La sintesi vocale funziona chiamando il metodo SpeakAsync con testo e parametri facoltativi e restituisce il controllo al termine della riproduzione vocale.

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());
}

Questo metodo accetta un CancellationToken facoltativo per arrestare la riproduzione vocale dopo l'avvio.

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 sintesi vocale accoda automaticamente le richieste vocali dallo stesso 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());
}

Impostazioni della sintesi vocale

Per un maggiore controllo sul modo in cui l'audio viene pronunciato, usare in combinazione con SpeechOptions che consente di impostare il volume, la tonalità e le impostazioni locali.

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

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

Di seguito sono riportati i valori supportati per questi parametri:

Parametro Minimo Massimo
Pitch 0 2.0
Volume 0 1.0

Impostazioni locali per la voce

Ogni piattaforma supporta impostazioni locali diverse, per pronunciare il testo in lingue e con accenti diversi. Le piattaforme hanno codici e modi diversi per specificare le impostazioni locali, motivo per cui Xamarin.Essentials fornisce una classe multipiattaforma Locale e un modo per eseguire query con 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);
}

Limiti

  • L'accodamento delle riproduzioni vocali non è garantito in caso di chiamata su più thread.
  • La riproduzione di audio in background non è ufficialmente supportata.

API

Altri video di Xamarin sono disponibili su Channel 9 e YouTube.