本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) <界面> 接口。 此接口允许应用程序利用内置的文本转语音引擎从设备中朗读文本。 还可以使用它来查询可用语言。
ITextToSpeech
接口的默认实现可通过 TextToSpeech.Default 属性获得。 ITextToSpeech
接口和 TextToSpeech
类都包含在 Microsoft.Maui.Media
命名空间中。
开始
若要访问文本语音转换功能,需执行以下特定于平台的设置。
如果项目的目标 Android 版本设置为
在 Platforms/Android/AndroidManifest.xml 文件中,将以下节点添加到 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 |
若要控制语音的音量、音调、速率和区域设置,请使用 SpeechOptions 类。 将该类的实例传递给方法。 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
Rate = 1.5f, // 0.1 - 2.0
Locale = locales.FirstOrDefault()
};
await TextToSpeech.Default.SpeakAsync("How nice to meet you!", options);
}
下面是这些参数的支持值:
参数 | 最低 | 最大值 |
---|---|---|
Pitch |
0 | 2.0 |
Volume |
0 | 1.0 |
Rate |
0.1 | 2.0 |
限制
- 如果跨多个线程调用,则无法保证语句队列。
- 官方不支持后台音频播放。