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 RecognizerIntent
s, 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 Intent
modá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.ExtraMaxResults
v ). 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
TextToSpeech
může trvat až 3 parametry, první dva jsou požadovány s třetí volitelnou (AppContext
, , IOnInitListener
engine
). 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 SpeechRate
Pitch
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 Intent
funkci RecognizerIntent jako PutExtra
parametr), je Action
testování a načítání Intent
založené na:
TextToSpeech.Engine.ActionCheckTtsData – spustí aktivitu z modulu platformy
TextToSpeech
, která ověří správnou instalaci a dostupnost jazykových prostředků na 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í 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í:
Například uživatel může vybrat francouzštinu a kliknutím na ikonu pro stažení stáhnout francouzská hlasová 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 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í.