Compartilhar via


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 , é necessária a seguinte configuração específica da plataforma.

Se a versão do Android de destino do projeto estiver definida como Android 11 (API R 30), você deverá atualizar o manifesto do Android com consultas 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
Inclinação 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, e é por isso Xamarin.Essentials que o fornece uma classe multiplataforma Locale e uma maneira de consultá-los 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.