Xamarin.Essentials:文字到語音轉換
TextToSpeech 類別可讓應用程式利用內建的文字轉換語音引擎將裝置的文字說出來,也可以查詢引擎可支援的可用語言。
開始使用
若要開始使用此 API,請閱讀 入門指南Xamarin.Essentials,以確保連結庫已正確安裝並設定在您的專案中。
若要存取 TextToSpeech 功能,需要下列平臺特定設定。
如果您的項目目標 Android 版本設定為 Android 11(R API 30), 您必須使用與新 套件可見度需求搭配使用的查詢來更新 Android 指令清單。
開啟 [Properties] 資料夾下的 AndroidManifest.xml 檔案並在 [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);
}
限制
- 如果跨多執行緒呼叫,則不保證會排入語句佇列。
- 尚未正式支援背景音訊播放。