文本转语音
本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) ITextToSpeech 接口。 此接口支持应用程序利用内置的文本语音转换引擎从设备回讲文本。 还可以使用它来查询可用语言。
ITextToSpeech
接口的默认实现通过 TextToSpeech.Default 属性提供。 ITextToSpeech
接口和 TextToSpeech
类都包含在 Microsoft.Maui.Media
命名空间中。
开始使用
若要访问文本语音转换功能,需执行以下特定于平台的设置。
如果项目的目标 Android 版本设置为 Android 11 (R API 30) 或更高版本,则必须使用文本语音转换 (TTS) 引擎的意向筛选器更新 Android 清单 。 有关意向的详细信息,请参阅 Android 有关意向和意向筛选器的文档。
在 Platforms/Android/AndroidManifest.xml 文件中,将以下 queries/intent
节点添加到 manifest
节点:
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
使用文本语音转换
文本语音转换的工作原理是使用要朗读的文本调用 SpeakAsync 方法,如以下代码示例所示:
public async void Speak() =>
await TextToSpeech.Default.SpeakAsync("Hello World");
此方法采用可选的 CancellationToken
,以便在语音样本启动时将其停止。
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();
}
文本语音转换会自动将同一线程中的语音请求加入队列。
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());
}
设置
要控制语音的音量、音调和区域设置,请使用 SpeechOptions 类。 将该类的实例传递给 SpeakAsync(String, SpeechOptions, CancellationToken) 方法。 GetLocalesAsync() 方法检索操作系统提供的区域设置的集合。
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);
}
下面是这些参数的支持值:
参数 | 最低 | 最大值 |
---|---|---|
Pitch |
0 | 2.0 |
Volume |
0 | 1.0 |
限制
- 如果跨多个线程调用,则无法保证语句队列。
- 官方不支持后台音频播放。