Text-to-Speech
En este artículo se describe cómo puedes usar la interfaz ITextToSpeech de .NET Multi-platform App UI (.NET MAUI). Esta interfaz permite a una aplicación usar los motores integrados de texto a voz para devolver texto desde el dispositivo. También puede usarlo para consultar los idiomas disponibles.
La implementación predeterminada de la interfaz ITextToSpeech
está disponible a través de la propiedad TextToSpeech.Default. Tanto la interfaz ITextToSpeech
como la clase TextToSpeech
están contenidas en el espacio de nombres Microsoft.Maui.Media
.
Introducción
Para acceder a la función de texto a voz, se requiere la siguiente configuración específica para la plataforma.
Si la versión de Android de destino del proyecto está establecida en Android 11 (R API 30) o una versión superior, debes actualizar tu Manifiesto de Android con un filtro de intención para el motor de texto a voz (TTS). Para obtener más información sobre las intenciones, consulta la documentación sobre Intents y filtros de intents de Android.
En el archivo Platforms/Android/AndroidManifest.xml, agrega los siguientes nodos queries/intent
al nodo manifest
:
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
Uso de texto a voz
El texto a voz funciona llamando al método SpeakAsync con el texto que se va a hablar, como se muestra en el ejemplo de código siguiente:
public async void Speak() =>
await TextToSpeech.Default.SpeakAsync("Hello World");
Este método toma un elemento CancellationToken
opcional para detener la declaración una vez que se inicia.
CancellationTokenSource cts;
public async Task SpeakNowDefaultSettingsAsync()
{
cts = new CancellationTokenSource();
await TextToSpeech.Default.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 función texto a voz pondrá automáticamente en la cola las solicitudes de voz del mismo subproceso.
bool isBusy = false;
public void SpeakMultiple()
{
isBusy = true;
Task.WhenAll(
TextToSpeech.Default.SpeakAsync("Hello World 1"),
TextToSpeech.Default.SpeakAsync("Hello World 2"),
TextToSpeech.Default.SpeakAsync("Hello World 3"))
.ContinueWith((t) => { isBusy = false; }, TaskScheduler.FromCurrentSynchronizationContext());
}
Configuración
Para controlar el volumen, el tono y la configuración regional de la voz, usa la clase SpeechOptions. Pasa una instancia de la clase al método SpeakAsync(String, SpeechOptions, CancellationToken). El método GetLocalesAsync() recupera una colección de las configuraciones regionales proporcionadas por el sistema operativo.
public async void SpeakSettings()
{
IEnumerable<Locale> locales = await TextToSpeech.Default.GetLocalesAsync();
SpeechOptions options = new SpeechOptions()
{
Pitch = 1.5f, // 0.0 - 2.0
Volume = 0.75f, // 0.0 - 1.0
Locale = locales.FirstOrDefault()
};
await TextToSpeech.Default.SpeakAsync("How nice to meet you!", options);
}
Los siguientes son los valores compatibles para estos parámetros:
Parámetro | Mínima | Máximo |
---|---|---|
Pitch |
0 | 2.0 |
Volume |
0 | 1.0 |
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.