Xamarin Forms - Parla Xamarin Parla...


 Neste artigo veremos como podemos converter texto em fala em aplicações Xamarin Forms usando a classe TextToSpeech do plugin Xamarin Essentials.

Se você não conhesse o Xamarin Essentials leia o meu artigo:  Introdução ao Xamarin Essentials e veja também as referências em: Get Start with Xamarin Essentials

O template de projeto padrão da versão atual Visual Studio 2019 (16.4.5) já inclui o pacote do Xamarin Essentials(1.3.1) instalado e a versão atual do Xamarin Forms (v4.3.0908765) não necessita nenhum ajuste para a plataforma Android.

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, consultar os idiomas disponíveis, compatíveis com o mecanismo.

Para poder fazer a conversão do texto em fala basta referenciar o Xamarin.Essentials no projeto e usar o método SpeakAsync da classe TextToSpeech.

Exemplo:

public async Task TesteFala()
{
    await TextToSpeech.SpeakAsync("Hello World");
    //O método será bloqueado até o enunciado terminar
}

Podemos usar o recurso opcional CancellationToken para interromper o enunciado após ele ser iniciado:

CancellationTokenSource cts;

public async Task TesteFala()
{
    cts = new CancellationTokenSource();
    await TextToSpeech.SpeakAsync("Hello World", cancelToken: cts.Token);
    //O método será bloqueado até o enunciado terminar
}
// Cancela a fala se o token de cancelamento 
// existir e ainda não foi invocado
public void CancelaFala()
{
    if (cts?.IsCancellationRequested ?? true)
        return;
    cts.Cancel();
}

Podemos definir o volume, o tom e a localidade usando a enumeração SpeechOptions:

public async Task FalarAgora()
{
           var locales = await TextToSpeech.GetLocalesAsync();
          // Pega o primeiro local
         var locale = locales.FirstOrDefault();
 
        var settings = new SpeechOptions()
       {
            Volume = .75f,
            Pitch = 1.0f
            Locale = locale
        };
      await TextToSpeech.SpeakAsync("Hello World", settings);
}

Os valores suportados por Volume e Pitch são:

Parâmetro Mínimo Máximo
Pitch 0 2.0
Volume 0 1.0

É muito importante destacar que o recurso Text-to-Speech enfileira automaticamente as requisições de fala do mesmo segmento.

As limitações API:

Agora vamos ao exemplo...

Recursos usados:

Criando o projeto no VS 2019

Abra o  VS 2019 Community e clique em Create New Project e a seguir escolha:

Clique em Next e informe o nome XF_Parla1;

A seguir clique no botão Create :

A seguir selecione o template Blank e a plataforma Android (eu não tenho ambiente para o projeto iOS) e clique no botão OK:

Pronto, nosso projeto já esta criado.

No projeto Android na pasta Resource/drawable vamos incluir a imagem que iremos usar no projeto:

Definindo o código da MainPage

Agora abra o arquivo MainPage.xaml e inclua o código abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="XF_Parla1.MainPage">
    <StackLayout>
        <StackLayout HorizontalOptions="Center" VerticalOptions="Start">

            <Image Margin="0,50,0,0" x:Name="imgBanner" Source="maco1b.jpg" ></Image>
            <Label Margin="0,0,0,10" FontAttributes="Bold" FontSize="Large" TextColor="#CA6F1E" HorizontalTextAlignment="Center" Text="Text To Speech"></Label>
            <Entry x:Name="txtTexto" Placeholder="Digite o que deseja ouvir"></Entry>
            <Button x:Name="btnFala" Text="Falar" Clicked="btnFala_Clicked" />
        </StackLayout>
    </StackLayout>

</ContentPage>

Abra o arquivo MainPage.xaml.cs e defina o código para o evento do botão :

using System;
using System.ComponentModel;
using System.Linq;
using Xamarin.Essentials;
using Xamarin.Forms;
namespace XF_Parla1
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        private async void btnFala_Clicked(object sender, EventArgs e)
        {
            var locales = await TextToSpeech.GetLocalesAsync();
            var locale = locales.FirstOrDefault();
            var settings = new SpeechOptions()
            {
                Volume = .50f,
                Pitch = 2.0f,
                Locale = locale
            };
            if (string.IsNullOrWhiteSpace(txtTexto.Text))
            {
                await DisplayAlert("Alerta", "Digite o texto", "OK");
            }
            else
            {
                await TextToSpeech.SpeakAsync(txtTexto.Text, settings);
            }
        }
    }
}

Executando o projeto teremos o seguinte resultado:

Estou testando usando o emulador Genymotion.

Simples assim...

Pegue o código do projeto compartilhado aqui : XF_Parla1.zip  (somente o projeto compartilhado)

"Sede, pois, imitadores de Deus, como filhos amados;
E andai em amor, como também Cristo vos amou, e se entregou a si mesmo por nós, em oferta e sacrifício a Deus, em cheiro suave."
Efésios 5:1,2

Referências:


José Carlos Macoratti