Android Speech
Tento článek se věnuje základům používání velmi výkonného oboru názvů Android.Speech. Od svého vzniku dokáže Android rozpoznat řeč a jejím výstupem je text. Je to poměrně jednoduchý proces. U převodu textu na řeč je ale proces více zapojený, protože je třeba vzít v úvahu nejen hlasový modul, ale také jazyky dostupné a nainstalované ze systému převodu textu na řeč (TTS).
Přehled služby Speech
Mít systém, který "rozumí" lidské řeči a zostat, co se typuje – Převod řeči na text a Převod textu na řeč – je v rámci vývoje mobilních zařízení stále rostoucí oblastí s rostoucí poptávkou po přirozené komunikaci s našimi zařízeními. Existuje mnoho příkladů, kdy funkce, která převádí text na řeč nebo naopak, je velmi užitečným nástrojem pro začlenění do aplikace pro Android.
Například když uživatelé při řízení používají mobilní telefon, chtějí mít k dispozici hands free způsob, jak zařízení používat. Velké množství různých provedení Androidu, například Android Wear, a stále se rozšiřující zahrnutí zařízení s Androidem (například tabletů a panelů poznámek) vytyčují větší zaměření na skvělé aplikace TTS.
Google poskytuje vývojářům bohatou sadu rozhraní API v oboru názvů Android.Speech, která pokryje většinu instancí vytváření zařízení s rozpoznáváním řeči (například softwaru navrženého pro nevidomé). Obor názvů zahrnuje zařízení, které umožňuje překlad textu na řeč prostřednictvím , kontrolu nad strojem použitým k provedení překladu a řadu s, které umožňují převod řeči na Android.Speech.TtsRecognizerIntent text.
I když jsou k dispozici funkce pro rozpoznávání řeči, existují omezení založená na použitém hardwaru. Je nepravděpodobné, že by zařízení úspěšně interpretuje vše, co se s ním mluví, v každém dostupném jazyce.
Požadavky
Pro tohoto průvodce neexistují žádné zvláštní požadavky kromě toho, že vaše zařízení má mikrofon a mluvčí.
Jádrem zařízení s Androidem, které interpretuje řeč, je použití s Intent 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í je, že dokážete určit podle tónu a kontextu skutečný význam toho, co se říká. Interpretace pouze znamená vzít slova a zobrazit je v jiné formě.
Představte si následující jednoduchý příklad, který se používá v každodenní konverzaci:
Ahoj, jak se máš?
Bez inflexe (důrazu na konkrétní slova nebo části slov) se jedná o jednoduchou otázku. Pokud se ale na čáru použije pomalé tempo, naslouchající osoba zjistí, že není příliš spokojená a možná potřebuje se zvětšovat nebo zdatný. Pokud se klade důraz na "jsou", je o odpověď obvykle větší zájem osoba, která se ptá.
Bez poměrně výkonného zpracování zvuku, aby se inflexní funkce a stupeň umělé inteligence (AI) porozuměl kontextu, software nemůže ani začít rozumět tomu, co bylo řečeno – nejlepší, když jednoduchý telefon dokáže převést řeč na text.
Nastavení
Před použitím hlasového systému je vždy dobré zkontrolovat, že zařízení má mikrofon. Při pokusu o spuštění aplikace na poznámkovém bloku Kindle nebo Google bez nainstalovaného mikrofonu by to mělo jen malý smysl.
Následující ukázka kódu ukazuje dotazování, jestli je k dispozici mikrofon, a pokud ne, vytvoření výstrahy. Pokud v tuto chvíli není k dispozici žádný mikrofon, ukončíte aktivitu nebo zakážete možnost záznamu řeči.
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 systém řeči používá konkrétní typ záměru s názvem RecognizerIntent . Tento záměr řídí velký počet parametrů, včetně doby čekání s tichem, dokud se záznam neuvažuje, jakýchkoli dalších jazyků pro rozpoznávání a výstup a veškerého textu, který se má zahrnout do modálního dialogového okna jako způsobu Intent instrukce. V tomto fragmentu VOICE kódu se používá k rozpoznávání v readonly intOnActivityResult .
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 , který se vrátí po dokončení aktivity a je Intent přístupný prostřednictvím GetStringArrayListExtra(RecognizerIntent.ExtraResults) . Vrátí se hodnota , ze které 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 IList<string> v RecognizerIntent.ExtraMaxResults ). Stejně jako u jakéhokoliv seznamu je vhodné zkontrolovat, jestli se mají zobrazit nějaká data.
Při naslouchání návratové hodnotě StartActivityForResult musí OnActivityResult být zadána metoda .
V následujícím příkladu textBox se používá pro výstup TextBox toho, co bylo diktováno. Stejně tak by se mohl použít 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ě opačný než převod řeči na text a spoléhá se na dvě klíčové komponenty. Nainstalovaný modul pro převod textu na řeč na zařízení a nainstalovaný jazyk.
Do značné míry mají zařízení s Androidem nainstalovanou výchozí službu Google TTS a alespoň jeden jazyk. Tato možnost se vytvoří při prvním nastavení zařízení a bude založená na tom, kde se zařízení v tu dobu nachází (například telefon nastavený v Německu nainstaluje německý jazyk, zatímco v Americe bude mít americkou angličtinu).
Krok 1 – vytvoření instance TextToSpeech
TextToSpeech může mít až 3 parametry, první dva se vyžaduje a třetí parametr je volitelný ( AppContextIOnInitListener , , engine ). Naslouchací proces se používá k navázání na službu a otestování selhání, kdy modul je libovolný počet dostupných textových modulů Androidu s hlasovými moduly. Zařízení bude mít minimálně vlastní motor Googlu.
Krok 2 – vyhledání dostupných jazyků
Třída Java.Util.Locale obsahuje užitečnou metodu s názvem GetAvailableLocales() . Tento seznam jazyků podporovaných hlasovým strojem je pak možné testovat na nainstalovaných jazycích.
Je triviální vygenerovat seznam "srozumitelných" jazyků. Vždy bude k dispozici výchozí jazyk (jazyk, který uživatel nastavil při prvním nastavení zařízení), takže v tomto příkladu má jako první parametr výchozí hodnotu, zbývající část seznamu se vyplní v závislosti na výsledku List<string>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 a otestuje, jestli se na zařízení už nachází jazykový balíček pro dané národní prostředí.
Tato metoda vrátí hodnotu LanguageAvailableResult,která určuje, jestli je jazyk pro předané národní prostředí dostupný. Pokud je jazyk , znamená to, že pro tento jazyk není k dispozici hlasový balíček (ani ke LanguageAvailableResultNotSupported stažení). Pokud je nastavená na , je možné stáhnout nový jazykový balíček, jak LanguageAvailableResultMissingData je vysvětleno níže v kroku 4.
Krok 3 – nastavení rychlosti a výšky
Android umožňuje uživateli změnit zvuk řeči změnou a (rychlost a tón SpeechRatePitch řeči). To je od 0 do 1, kdy "normální" řeč je 1 pro obě.
Krok 4 – Testování a načítání nových jazyků
Stažení nového jazyka se provádí pomocí Intent . Výsledek tohoto záměru způsobí vyvolání metody OnActivityResult. Na rozdíl od příkladu převodu řeči na text (který jako parametr pro používal RecognizerIntent) jsou testovací a Intent načítající Intent se hodnoty Action založené na:
TextToSpeech.Engine.ActionCheckTtsData – Spustí aktivitu z modulu platformy za účelem ověření správné instalace a dostupnosti prostředků jazyka v zařízení.
TextToSpeech.Engine.ActionInstallTtsData – Spustí aktivitu, která uživatele vyzve ke stažení potřebných jazyků.
Následující příklad kódu ukazuje, jak pomocí těchto akcí testovat 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 testuje dostupnost prostředků jazyka. OnActivityResult se vyvolá po dokončení tohoto testu. Pokud je potřeba stáhnout jazykové prostředky, spustí se akce, která spustí aktivitu, která uživateli umožní stáhnout OnActivityResultTextToSpeech.Engine.ActionInstallTtsData potřebné jazyky. Všimněte si, že tato implementace neschová kód, protože v tomto zjednodušeném příkladu už bylo rozhod rozhodné, že je potřeba stáhnout OnActivityResultResult jazykový balíček.
Tato akce způsobí, že se uživateli zobrazí aktivita hlasových dat TextToSpeech.Engine.ActionInstallTtsDataTextToSpeech.Engine.ActionInstallTtsData pro výběr jazyků ke stažení:

Uživatel může například vybrat francouzštinu a kliknout na ikonu pro stažení a stáhnout si uživatelská data:

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 implementována metoda rozhraní (jedná se o druhý parametr zadaný pro vytvoření instance OnInitTextToSpeech třídy). Tím se inicializuje naslouchací proces a testuje výsledek.
Naslouchací proces by měl OperationResult.Success testovat OperationResult.Failure minimálně i .
Následující příklad ukazuje právě toto:
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);
}
Souhrn
V této příručce jsme se podívali na základy převodu textu na řeč a řeč na text a na možné metody jejich zahrnutí do vlastních aplikací. I když nepokrýují všechny konkrétní případy, měli byste teď mít základní znalosti o tom, jak se interpretuje řeč, jak nainstalovat nové jazyky a jak zvýšit inkluzi vašich aplikací.