Android Speech

Tento článek popisuje základy používání velmi výkonného oboru názvů Android.Speech. Od jejího vzniku android dokáže rozpoznat řeč a výstup jako text. Jedná se o relativně jednoduchý proces. Pro převod textu na řeč se ale tento proces více podílí, protože je potřeba vzít v úvahu nejen řečový modul, ale také jazyky, které jsou k dispozici a nainstalovány ze systému převodu textu na řeč (TTS).

Přehled řeči

Systém, který "rozumí" lidské řeči a vyčísluje, co se píše – řeč na text a řeč – je stále rostoucí oblastí v rámci vývoje mobilních zařízení, protože poptávka po přirozené komunikaci s našimi zařízeními roste. Existuje mnoho případů, kdy funkce, která převádí text na řeč nebo naopak, je velmi užitečný nástroj pro začlenění do aplikace pro Android.

Například s upnutím na mobilním telefonu při jízdě chtějí uživatelé používat hands free způsob obsluhy svých zařízení. Řadu různých faktorů ve formě Androidu, jako je Android Wear, a stále se rozšiřující zahrnutí těch, kteří mohou používat zařízení s Androidem (například tablety a poznámkové bloky), vytvořila větší zaměření na skvělé aplikace TTS.

Google dodává vývojáře s bohatou sadou rozhraní API v oboru názvů Android.Speech, aby pokrývala většinu instancí zařízení s "rozpoznáváním řeči" (jako je software navržený pro nevidomé). Obor názvů zahrnuje zařízení, které umožňuje převod textu na řeč prostřednictvím Android.Speech.Tts, kontrolu nad modulem použitým k provádění překladu a také řadu RecognizerIntents, které umožňují převod řeči na text.

I když existují zařízení pro rozpoznávání řeči, existují omezení založená na použitém hardwaru. Je nepravděpodobné, že zařízení úspěšně interpretuje vše, co s ním mluví, v každém dostupném jazyce.

Požadavky

Pro tuto příručku nejsou žádné zvláštní požadavky, kromě toho, že vaše zařízení má mikrofon a reproduktor.

Jádrem zařízení s Androidem, který interpretuje řeč, je použití Intent s odpovídajícím OnActivityResult. Je ale důležité si uvědomit, že řeč není srozumitelná – ale interpretovaná na text. Rozdíl je důležitý.

Rozdíl mezi porozuměním a interpretací

Jednoduchá definice porozumění spočívá v tom, že dokážete určit tón a kontext skutečného významu toho, co se říká. Interpretovat jen znamená vzít slova a výstup je v jiné podobě.

Podívejte se na následující jednoduchý příklad, který se používá v každodenní konverzaci:

Ahoj, jak se máš?

Bez inflexní (zdůraznění konkrétních slov nebo částí slov) je to jednoduchá otázka. Pokud se však na čáru použije pomalé tempo, osoba, která naslouchá, zjistí, že asker není příliš šťastný a možná potřebuje povzbuzovat nebo že asker není dobře. Pokud je důraz kladen na "are", osoba, která se ptá, je obvykle více zájem o odpověď.

Bez poměrně výkonného zpracování zvuku pro použití inflexní a stupeň umělé inteligence (AI) pochopit kontext, software nemůže ani začít pochopit, co bylo řečeno – nejlepší jednoduchý telefon dokáže převést řeč na text.

Nastavení

Před použitím hlasového systému je vždy vhodné zkontrolovat, že zařízení má mikrofon. Při pokusu o spuštění aplikace na panelu poznámek Kindle nebo Google bez nainstalovaného mikrofonu by bylo málo.

Následující ukázka kódu ukazuje dotazování, jestli je mikrofon dostupný a pokud ne, k vytvoření výstrahy. Pokud v tomto okamžiku není k dispozici žádný mikrofon, buď ukončíte aktivitu, nebo zakážete možnost zaznamenávat řeč.

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();
}

Vytvoření záměru

Záměr pro řečový systém používá konkrétní typ záměru označovaného jako RecognizerIntent. Tento záměr řídí velký počet parametrů, včetně toho, jak dlouho čekat s tichou, dokud se záznam nepovažuje za konec, všechny další jazyky k rozpoznávání a výstupu a jakýkoli text, který se má zahrnout do Intentmodálního dialogového okna jako instrukce. V tomto fragmentu readonly int kódu VOICE se používá k rozpoznávání v 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);

Převod řeči

Text interpretovaný z řeči se doručí v rámci Intent, který se vrátí po dokončení aktivity a je přístupný prostřednictvím GetStringArrayListExtra(RecognizerIntent.ExtraResults). Tím se vrátí index IList<string>, z něhož lze index použít a zobrazit v závislosti na počtu jazyků požadovaných v záměru volajícího (a zadaném RecognizerIntent.ExtraMaxResultsv ). Stejně jako u všech seznamů stojí za to zkontrolovat, že se mají zobrazit data.

Při naslouchání návratové hodnotě StartActivityForResult, OnActivityResult musí být metoda zadána.

V následujícím příkladu TextBox se používá k výstupu toho, textBox co bylo diktováno. Dá se použít i k předání textu nějaké formě interpreta a odtud může aplikace porovnat text a větev s jinou částí aplikace.

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);
    }
}

Převod textu na řeč

Převod textu na řeč není úplně obrácený na text a spoléhá na dvě klíčové komponenty; modul pro převod textu na řeč nainstalovaný na zařízení a jazyk, který se instaluje.

Zařízení s Androidem mají z velké části nainstalovanou výchozí službu Google TTS a alespoň jeden jazyk. To se vytvoří, když je zařízení poprvé nastavené a bude založené na tom, kde je zařízení v době (například telefon nastavený v Německu nainstaluje německý jazyk, zatímco jeden v Americe bude mít americkou angličtinu).

Krok 1 – vytvoření instance objektu TextToSpeech

TextToSpeechmůže trvat až 3 parametry, první dva jsou požadovány s třetí volitelnou (AppContext, , IOnInitListenerengine). Naslouchací proces se používá k vytvoření vazby ke službě a testování selhání s modulem, který je k dispozici pro řečové moduly, který je k dispozici pro androidový text. Zařízení bude mít minimálně vlastní motor Google.

Krok 2 : Vyhledání dostupných jazyků

Třída Java.Util.Locale obsahuje užitečnou metodu nazvanou GetAvailableLocales(). Tento seznam jazyků podporovaných modulem pro řeč je pak možné otestovat na nainstalovaných jazycích.

Je to triviální záležitost, která vygeneruje seznam "srozumitelných" jazyků. Vždy bude existovat výchozí jazyk (jazyk, který uživatel nastavil při prvním nastavení zařízení), takže v tomto příkladu List<string> má jako první parametr výchozí hodnotu, zbytek seznamu se vyplní v závislosti na výsledku 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();

Tento kód volá TextToSpeech.IsLanguageAvailable k otestování, zda je jazykový balíček pro dané národní prostředí již v zařízení. Tato metoda vrátí LanguageAvailableResult, který označuje, zda jazyk pro předaný národní prostředí je k dispozici. Pokud LanguageAvailableResult to znamená, že jazyk je NotSupported, pak pro tento jazyk není k dispozici žádný hlasový balíček (ani ke stažení). Pokud LanguageAvailableResult je nastavená hodnota MissingData, je možné stáhnout nový jazykový balíček, jak je vysvětleno níže v kroku 4.

Krok 3 – nastavení rychlosti a sklonu

Android umožňuje uživateli změnit zvuk řeči změnou SpeechRatePitch rychlosti a tónu řeči. To je od 0 do 1, přičemž "normální" řeč je 1 pro oba.

Krok 4 : Testování a načítání nových jazyků

Stahování nového jazyka se provádí pomocí .Intent Výsledek tohoto záměru způsobí vyvolání onActivityResult metody. Na rozdíl od příkladu převodu řeči na text (který jako parametr použil Intentfunkci RecognizerIntent jako PutExtra parametr), je Actiontestování a načítání Intentzaložené na:

Následující příklad kódu ukazuje, jak pomocí těchto akcí otestovat jazykové prostředky a stáhnout nový jazyk:

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 testy dostupnosti jazykových prostředků. OnActivityResult je vyvolána při dokončení tohoto testu. Pokud je potřeba stáhnout jazykové prostředky, OnActivityResult aktivuje TextToSpeech.Engine.ActionInstallTtsData se akce, aby se spustila aktivita, která uživateli umožní stáhnout potřebné jazyky. Všimněte si, že tato OnActivityResult implementace nekontroluje Result kód, protože v tomto zjednodušeném příkladu bylo již provedeno určení, že je nutné stáhnout jazykový balíček.

Akce TextToSpeech.Engine.ActionInstallTtsData způsobí , že se uživateli zobrazí aktivita hlasových dat Google TTS, aby si vybral jazyky ke stažení:

Aktivita hlasových dat Google TTS

Například uživatel může vybrat francouzštinu a kliknutím na ikonu pro stažení stáhnout francouzská hlasová data:

Příklad stažení francouzského jazyka

Instalace těchto dat probíhá automaticky po dokončení stahování.

Krok 5 – IOninitListener

Aby aktivita mohla převést text na řeč, musí být implementovaná metoda OnInit rozhraní (toto je druhý parametr určený pro vytvoření TextToSpeech instance třídy). Tím se inicializuje naslouchací proces a otestuje výsledek.

Naslouchací proces by měl testovat minimálně OperationResult.Success na obou i OperationResult.Failure minimálně. Následující příklad ukazuje, že:

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);
}

Shrnutí

V této příručce jsme se podívali na základy převodu textu na řeč a řeč na text a možné metody jejich zahrnutí do vlastních aplikací. I když se netýkají každého konkrétního případu, měli byste teď mít základní znalosti o tom, jak se řeč interpretuje, jak nainstalovat nové jazyky a jak zvýšit inkluzi vašich aplikací.