Xamarin.Essentials: conversão de texto em fala

A classe TextToSpeech permite que um aplicativo utilize os mecanismos internos de conversão de texto em fala para repetir o texto do dispositivo e, também, consulte os idiomas disponíveis, compatíveis com o mecanismo.

Introdução

Para começar a usar essa API, leia o guia de introdução para Xamarin.Essentials garantir que a biblioteca esteja instalada e configurada corretamente em seus projetos.

Para acessar a funcionalidade TextToSpeech , a configuração específica da plataforma a seguir é necessária.

Se a versão do Android de destino do projeto estiver definida como Android 11 (R API 30), você deverá atualizar seu Manifesto do Android com consultas que são usadas com os novos requisitos de visibilidade do pacote.

Abra o arquivo AndroidManifest.xml na pasta Propriedades e adicione o seguinte dentro do nó do manifesto:

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

Uso da Conversão de Texto em Fala

Adicione uma referência a Xamarin.Essentials em sua classe:

using Xamarin.Essentials;

A Conversão de Texto em Fala funciona chamando o método SpeakAsync com texto e parâmetros opcionais e retorna depois que a expressão é concluída.

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

Esse método usa um recurso opcional CancellationToken para interromper a expressão após ela ser iniciada.

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

A Conversão de Texto em Fala automaticamente enfileirará as solicitações de voz do mesmo 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());
}

Configurações de fala

Para obter mais controle sobre como o áudio é falado com SpeechOptions, que permite definir o volume, o tom e a localidade.

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

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

Veja a seguir os valores com suporte para esses parâmetros:

Parâmetro Mínimo Máximo
Densidade 0 2,0
Volume 0 1.0

Localidades de fala

Cada plataforma suporta diferentes localidades, para responder em diferentes idiomas e sotaques. As plataformas têm diferentes códigos e maneiras de especificar a localidade, razão pela Xamarin.Essentials qual fornece uma classe multiplataforma Locale e uma maneira de consultá-las com 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);
}

Limitações

  • A fila de expressão não terá garantia se for chamada através de múltiplos threads.
  • Oficialmente, não há suporte para a reprodução de áudio em segundo plano.

API

Encontre mais vídeos sobre o Xamarin no Channel 9 e no YouTube.