Android 語音
本文涵蓋使用非常強大的 Android.Speech 命名空間的基本概念。 自成立以來,Android 能夠辨識語音並將其輸出為文字。 這是一個相對簡單的程式。 不過,對於文字到語音轉換,程式會更加相關,因為語音引擎不僅必須考慮語音引擎,而且必須考慮從文字轉換語音系統取得和安裝的語言。
語音概觀
擁有一個系統,「瞭解」人類語音,並列舉正在鍵入的內容-語音轉換文字和文字到語音轉換-是移動開發中不斷增長的領域,因為與我們的設備自然通訊的需求增加。 有許多實例具有將文字轉換成語音的功能,反之亦然,是一個非常實用的工具,可納入您的 Android 應用程式。
例如,隨著在駕駛時對手機的使用進行取締,使用者想要自由操作其裝置的方式。 各種不同的 Android 尺寸,例如 Android Wear,以及能夠使用 Android 裝置(如平板電腦和記事板)的日益擴大的包含,已針對絕佳的 TTS 應用程式建立更大的焦點。
Google 在 Android.Speech 命名空間中提供一組豐富的 API,以涵蓋讓裝置成為「語音感知」的大部分實例(例如專為盲人設計的軟體)。 命名空間包含可讓您透過 將文字轉譯成語音 Android.Speech.Tts
的功能、控制用來執行翻譯的引擎,以及允許語音轉換成文字的 RecognizerIntent
一些 。
雖然設備可供了解語音,但會根據所使用的硬體來限制。 裝置不太可能成功解譯每個語言中所說的所有內容。
需求
本指南沒有特殊需求,除了您的裝置具有麥克風和喇叭以外。
Android 裝置解譯語音的核心是搭配對應的 OnActivityResult
使用 Intent
。
不過,請務必辨識語音無法理解,但會解譯為文字。 差異很重要。
瞭解和解譯之間的差異
理解的簡單定義是,您可以藉由語氣和內容來判斷所說內容的真正意義。 若要解譯只是表示要接受單字,並以另一種形式輸出它們。
請考慮在日常交談中使用的下列簡單範例:
喂,你好嗎?
沒有轉折(強調特定單字或部分單字),這是一個簡單的問題。 然而,如果速度緩慢套用到這一行,聽的人會偵測到詢問者不太快樂,也許需要加油或詢問者不適。 如果強調「是」,詢問的人通常會對回應更感興趣。
如果沒有相當強大的音訊處理來利用轉折,以及一定程度的人工智慧(AI)來瞭解內容,軟體甚至無法開始瞭解所說的內容,最簡單的手機可以做的最好的就是將語音轉換成文字。
設定
使用語音系統之前,請務必檢查裝置具有麥克風。 嘗試在沒有安裝麥克風的情況下,在 Kindle 或 Google 記事臺上執行您的應用程式幾乎沒有什麼意義。
下列程式代碼範例示範如何查詢麥克風是否可用,如果無法使用,則為建立警示。 如果此時沒有可用的麥克風,您可以結束活動或停用錄製語音的能力。
string rec = Android.Content.PM.PackageManager.FeatureMicrophone;
if (rec != "android.hardware.microphone")
{
var alert = new AlertDialog.Builder(recButton.Context);
alert.SetTitle("You don't seem to have a microphone to record with");
alert.SetPositiveButton("OK", (sender, e) =>
{
return;
});
alert.Show();
}
建立意圖
語音系統的意圖會使用稱為 RecognizerIntent
的特定意圖類型。 此意圖會控制大量的參數,包括等候無聲等候多久,直到錄製被考慮結束、要辨識和輸出的任何其他語言,以及要包含在強制回應對話上 Intent
的任何文字作為指示的方法。 在此代碼段中, VOICE
是 readonly int
用於中的 OnActivityResult
辨識。
var voiceIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech);
voiceIntent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm);
voiceIntent.PutExtra(RecognizerIntent.ExtraPrompt, Application.Context.GetString(Resource.String.messageSpeakNow));
voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputCompleteSilenceLengthMillis, 1500);
voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputPossiblyCompleteSilenceLengthMillis, 1500);
voiceIntent.PutExtra(RecognizerIntent.ExtraSpeechInputMinimumLengthMillis, 15000);
voiceIntent.PutExtra(RecognizerIntent.ExtraMaxResults, 1);
voiceIntent.PutExtra(RecognizerIntent.ExtraLanguage, Java.Util.Locale.Default);
StartActivityForResult(voiceIntent, VOICE);
語音轉換
從語音解譯的文字將會在 內 Intent
傳遞,此文字會在 活動完成且透過 GetStringArrayListExtra(RecognizerIntent.ExtraResults)
存取時傳回。 這會傳回 IList<string>
,根據呼叫端意圖中所要求的語言數目(並在 中 RecognizerIntent.ExtraMaxResults
指定),可以使用和顯示索引。 不過,與任何清單一樣,請務必檢查以確保有要顯示的數據。
接聽 的 StartActivityForResult
傳回值時, OnActivityResult
必須提供 方法。
在下列範例中, textBox
是 TextBox
用來輸出已指定的內容。 它同樣可以用來將文字傳遞至某種形式的解釋器,然後從該處,應用程式可以將文字和分支與應用程式的另一個部分進行比較。
protected override void OnActivityResult(int requestCode, Result resultVal, Intent data)
{
if (requestCode == VOICE)
{
if (resultVal == Result.Ok)
{
var matches = data.GetStringArrayListExtra(RecognizerIntent.ExtraResults);
if (matches.Count != 0)
{
string textInput = textBox.Text + matches[0];
textBox.Text = textInput;
switch (matches[0].Substring(0, 5).ToLower())
{
case "north":
MovePlayer(0);
break;
case "south":
MovePlayer(1);
break;
}
}
else
{
textBox.Text = "No speech was recognised";
}
}
base.OnActivityResult(requestCode, resultVal, data);
}
}
文字轉換語音
文字到語音轉換不是完全相反的語音轉換文字,而且依賴兩個關鍵元件:安裝在裝置上的文字到語音轉換引擎,以及所安裝的語言。
基本上,Android 裝置隨附已安裝預設的 Google TTS 服務,且至少有一種語言。 這是在裝置第一次設定時建立的,並將根據裝置當時的位置(例如,在德國設定的手機會安裝德文,而美國的手機將會有美式英文)。
步驟 1 - 具現化 TextToSpeech
TextToSpeech
最多可能需要 3 個參數,第三個參數是選擇性的 ,前兩個是選擇性的 (AppContext
, , IOnInitListener
engine
)。 接聽程式用來系結至服務,並測試失敗,引擎是任意數目的可用Android文字到語音引擎。 裝置至少會有谷歌自己的引擎。
步驟 2 - 尋找可用的語言
類別 Java.Util.Locale
包含稱為 GetAvailableLocales()
的實用方法。 語音引擎所支援的語言清單接著可以針對已安裝的語言進行測試。
產生「理解」語言清單是件微不足道的事情。 一律會有默認語言(使用者第一次設定其裝置時所設定的語言),因此在此範例 List<string>
中,具有 “Default” 作為第一個參數,清單的其餘部分會根據 的結果 textToSpeech.IsLanguageAvailable(locale)
填滿。
var langAvailable = new List<string>{ "Default" };
var localesAvailable = Java.Util.Locale.GetAvailableLocales().ToList();
foreach (var locale in localesAvailable)
{
var res = textToSpeech.IsLanguageAvailable(locale);
switch (res)
{
case LanguageAvailableResult.Available:
langAvailable.Add(locale.DisplayLanguage);
break;
case LanguageAvailableResult.CountryAvailable:
langAvailable.Add(locale.DisplayLanguage);
break;
case LanguageAvailableResult.CountryVarAvailable:
langAvailable.Add(locale.DisplayLanguage);
break;
}
}
langAvailable = langAvailable.OrderBy(t => t).Distinct().ToList();
此程式代碼會呼叫 TextToSpeech.IsLanguageAvailable 來測試指定地區設定的語言套件是否已存在於裝置上。
這個方法會傳 回 LanguageAvailableResult,指出傳遞的地區設定語言是否可用。 如果 LanguageAvailableResult
表示該語言為 NotSupported
,則該語言沒有可用的語音套件(甚至可供下載)。 如果 LanguageAvailableResult
設定為 MissingData
,則可以下載新的語言套件,如步驟 4 中所述。
步驟 3 - 設定速度和音調
Android 可讓用戶改變 和 Pitch
(速度和語音的音調) 來改變SpeechRate
語音的聲音。 這從 0 到 1,兩者的“正常”語音都是 1。
步驟 4 - 測試和載入新語言
使用 Intent
執行下載新語言。 此意圖的結果會導致 叫用 OnActivityResult 方法。 不同於語音轉換文字範例(使用 RecognizerIntent 做為 PutExtra
參數的 Intent
),測試及載入 Intent
是以 Action
為基礎:
TextToSpeech.Engine.ActionCheckTtsData – 從平臺
TextToSpeech
引擎啟動活動,以驗證裝置上語言資源的適當安裝和可用性。TextToSpeech.Engine.ActionInstallTtsData – 啟動活動,提示使用者下載必要的語言。
下列程式代碼範例說明如何使用這些動作來測試語言資源,並下載新語言:
var checkTTSIntent = new Intent();
checkTTSIntent.SetAction(TextToSpeech.Engine.ActionCheckTtsData);
StartActivityForResult(checkTTSIntent, NeedLang);
//
protected override void OnActivityResult(int req, Result res, Intent data)
{
if (req == NeedLang)
{
var installTTS = new Intent();
installTTS.SetAction(TextToSpeech.Engine.ActionInstallTtsData);
StartActivity(installTTS);
}
}
TextToSpeech.Engine.ActionCheckTtsData
測試語言資源的可用性。 OnActivityResult
會在此測試完成時叫用。 如果需要下載語言資源, OnActivityResult
請啟動 TextToSpeech.Engine.ActionInstallTtsData
動作以啟動活動,讓使用者下載必要的語言。 請注意,此實作不會檢查程式OnActivityResult
Result
代碼,因為在這個簡化的範例中,已判斷需要下載語言套件。
此 TextToSpeech.Engine.ActionInstallTtsData
動作會導致 Google TTS 語音資料 活動呈現給使用者,以選擇要下載的語言:
例如,使用者可能會挑選法文,然後按下下載圖示以下載法文語音資料:
下載完成之後,會自動安裝此數據。
步驟 5 - IOnInitListener
若要讓活動能夠將文字轉換成語音,必須實作 介面方法 OnInit
(這是為 類別具 TextToSpeech
現化指定的第二個參數)。 這會初始化接聽程式並測試結果。
接聽程式至少應該同時測試 OperationResult.Success
和 OperationResult.Failure
。
下列範例只會顯示:
void TextToSpeech.IOnInitListener.OnInit(OperationResult status)
{
// if we get an error, default to the default language
if (status == OperationResult.Error)
textToSpeech.SetLanguage(Java.Util.Locale.Default);
// if the listener is ok, set the lang
if (status == OperationResult.Success)
textToSpeech.SetLanguage(lang);
}
摘要
在本指南中,我們已探討如何將文字轉換成語音和語音轉換文字的基本概念,以及如何將文字包含在您自己的應用程式中的可能方法。 雖然它們並未涵蓋每個特定案例,但您現在應該對語音解譯方式、如何安裝新語言,以及如何增加應用程式的包容性有基本瞭解。