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的任何文字作為指示的方法。 在此代碼段中, VOICEreadonly 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 必須提供 方法。

在下列範例中, textBoxTextBox 用來輸出已指定的內容。 它同樣可以用來將文字傳遞至某種形式的解釋器,然後從該處,應用程式可以將文字和分支與應用程式的另一個部分進行比較。

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, , IOnInitListenerengine)。 接聽程式用來系結至服務,並測試失敗,引擎是任意數目的可用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為基礎:

下列程式代碼範例說明如何使用這些動作來測試語言資源,並下載新語言:

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 動作以啟動活動,讓使用者下載必要的語言。 請注意,此實作不會檢查程式OnActivityResultResult代碼,因為在這個簡化的範例中,已判斷需要下載語言套件。

TextToSpeech.Engine.ActionInstallTtsData 動作會導致 Google TTS 語音資料 活動呈現給使用者,以選擇要下載的語言:

Google TTS Voice Data Activity

例如,使用者可能會挑選法文,然後按下下載圖示以下載法文語音資料:

Example of downloading French language

下載完成之後,會自動安裝此數據。

步驟 5 - IOnInitListener

若要讓活動能夠將文字轉換成語音,必須實作 介面方法 OnInit (這是為 類別具 TextToSpeech 現化指定的第二個參數)。 這會初始化接聽程式並測試結果。

接聽程式至少應該同時測試 OperationResult.SuccessOperationResult.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);
}

摘要

在本指南中,我們已探討如何將文字轉換成語音和語音轉換文字的基本概念,以及如何將文字包含在您自己的應用程式中的可能方法。 雖然它們並未涵蓋每個特定案例,但您現在應該對語音解譯方式、如何安裝新語言,以及如何增加應用程式的包容性有基本瞭解。