文本转语音

Browse sample.浏览示例。 浏览示例

本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) <界面> 接口。 此接口允许应用程序利用内置的文本转语音引擎从设备中朗读文本。 还可以使用它来查询可用语言。

ITextToSpeech 接口的默认实现可通过 TextToSpeech.Default 属性获得。 ITextToSpeech 接口和 TextToSpeech 类都包含在 Microsoft.Maui.Media 命名空间中。

开始

若要访问文本语音转换功能,需执行以下特定于平台的设置。

如果项目的目标 Android 版本设置为 <strong>Android 11 (R API 30)</strong> 或更高版本,则必须使用文本到语音转换引擎 TTS 的意图过滤器更新 <em>Android Manifest</em>。 有关意向的详细信息,请参阅 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

限制

  • 如果跨多个线程调用,则无法保证语句队列。
  • 官方不支持后台音频播放。