Xamarin.Essentials: преобразование текста в речь
Класс TextToSpeech позволяет приложению использовать встроенные механизмы преобразования текста в речь, чтобы озвучивать текст на устройстве, а также запрашивать доступные языки, которые может поддерживать подсистема.
Начало работы
Чтобы начать использовать этот API, ознакомьтесь с руководством по началу работы с Xamarin.Essentials, чтобы правильно настроить и установить библиотеку в проектах.
Для доступа к функции TextToSpeech нужно создать описанную ниже конфигурацию для конкретной платформы.
Если целевой версией Android для проекта является Android 11 (API R 30), необходимо обновить манифест Android с помощью запросов, которые используются с новыми требованиями к видимости пакета.
Откройте файл AndroidManifest.xml в папке Properties и добавьте приведенный ниже код в узел manifest:
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
Использование преобразования текста в речь
Добавьте ссылку на Xamarin.Essentials в своем классе:
using Xamarin.Essentials;
При преобразовании текста в речь вызывается метод SpeakAsync
с текстом и дополнительными параметрами и выполняется возврат после завершения фрагмента речи.
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());
}
Этот метод принимает необязательный параметр CancellationToken
, чтобы остановить высказывание после его запуска.
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();
}
Функция преобразования текста в речь автоматически ставит в очередь запросы на озвучивание речи из одного и того же потока.
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());
}
Параметры речи
Для более высокого уровня контроля над воспроизведением звука применяется параметр SpeechOptions
, который позволяет установить громкость, высоту тона и языковой стандарт.
public async Task SpeakNow()
{
var settings = new SpeechOptions()
{
Volume = .75f,
Pitch = 1.0f
};
await TextToSpeech.SpeakAsync("Hello World", settings);
}
Ниже приведены поддерживаемые значения этих параметров.
Параметр | Минимум | Максимум |
---|---|---|
Тон | 0 | 2.0 |
Громкость | 0 | 1.0 |
Языковой стандарт
Каждая платформа поддерживает разные языковые стандарты, чтобы применять разные языки и акценты. Платформы используют разные коды и способы указания языкового стандарта. Поэтому Xamarin.Essentials предоставляет кроссплатформенный класс Locale
и способ запросить их с помощью 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);
}
Ограничения
- Порядок очереди запросов на озвучивание не гарантируется при вызове нескольких потоков.
- Воспроизведение фонового звука официально не поддерживается.