Xamarin.Essentials: Texto a voz
La clase TextToSpeech permite que una aplicación utilice los motores de texto a voz para responder a texto del dispositivo y también para consultar los idiomas disponibles que el motor puede admitir.
Primeros pasos
Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.
Para acceder a la función de TextToSpeech, se requiere la siguiente configuración específica para la plataforma.
Si la versión de Android de destino del proyecto se establece en Android 11 (R API 30) , debe actualizar el manifiesto de Android con las consultas que se usan con los nuevos requisitos de visibilidad de los paquetes.
Abra el archivo AndroidManifest.xml de la carpeta Propiedades y agregue lo siguiente dentro del nodo manifest:
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
Uso de Text-to-Speech
Agregue una referencia a Xamarin.Essentials en la clase:
using Xamarin.Essentials;
Text-to-Speech funciona mediante una llamada al método SpeakAsync
con parámetros opcionales y de texto y se devuelve una vez que finaliza la declaración.
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());
}
Este método toma un elemento CancellationToken
opcional para detener la declaración una vez que se inicia.
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();
}
Text-to-Speech pondrá automáticamente en la cola las solicitudes de voz del mismo subproceso.
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());
}
Configuración de voz
Para más información sobre cómo se responde el audio, SpeechOptions
permite ajustar el volumen, el tono y la configuración regional.
public async Task SpeakNow()
{
var settings = new SpeechOptions()
{
Volume = .75f,
Pitch = 1.0f
};
await TextToSpeech.SpeakAsync("Hello World", settings);
}
Los siguientes son los valores compatibles para estos parámetros:
Parámetro | Mínima | Máximo |
---|---|---|
Tono | 0 | 2.0 |
Volumen | 0 | 1.0 |
Configuraciones regionales de voz
Cada plataforma admite distintas configuraciones regionales para responder texto en distintos idiomas y acentos. Las plataformas tienen distintos códigos y formas de especificar la configuración regional, que es la razón por la que Xamarin.Essentials proporciona una clase Locale
multiplataforma y una manera de hacer consultas 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);
}
Limitaciones
- No se garantiza la cola de declaraciones si se llama a través de varios subprocesos.
- La reproducción de audio en segundo plano no se admite de manera oficial.