Mowa w systemie Android
W tym artykule omówiono podstawy korzystania z bardzo wydajnej przestrzeni nazw Android.Speech. Od momentu powstania system Android był w stanie rozpoznawać mowę i wyświetlać ją jako tekst. Jest to stosunkowo prosty proces. Jednak w przypadku zamiany tekstu na mowę proces jest bardziej zaangażowany, ponieważ nie tylko aparat mowy musi być uwzględniony, ale także języki dostępne i zainstalowane w systemie zamiany tekstu na mowę (TTS).
Omówienie mowy
Posiadanie systemu, który "rozumie" ludzką mowę i ujednoli, co jest wpisywane — zamiana mowy na tekst i zamiana tekstu na mowę — jest coraz większym obszarem w rozwoju urządzeń mobilnych, ponieważ zapotrzebowanie na naturalną komunikację z naszymi urządzeniami rośnie. Istnieje wiele wystąpień, w których funkcja, która konwertuje tekst na mowę lub na odwrót, jest bardzo przydatnym narzędziem do uwzględnienia w aplikacji systemu Android.
Na przykład za pomocą zacisku na telefonie komórkowym podczas jazdy użytkownicy chcą wolnego sposobu obsługi swoich urządzeń. Mnóstwo różnych czynników form systemu Android — takich jak Android Wear — i coraz szersze włączenie tych, którzy mogą korzystać z urządzeń z systemem Android (takich jak tablety i notatniki), stworzyło większy nacisk na wspaniałe aplikacje TTS.
Firma Google dostarcza deweloperowi bogaty zestaw interfejsów API w przestrzeni nazw Android.Speech, aby uwzględnić większość wystąpień tworzenia "rozpoznawania mowy" urządzenia (takiego jak oprogramowanie przeznaczone dla niewidomych). Przestrzeń nazw obejmuje obiekt umożliwiający tłumaczenie tekstu na mowę za pomocą Android.Speech.Tts
funkcji , kontrolę nad aparatem używanym do wykonywania tłumaczenia, a także liczbę RecognizerIntent
s, które umożliwiają konwertowanie mowy na tekst.
Chociaż obiekty są dostępne do zrozumienia mowy, istnieją ograniczenia oparte na używanym sprzęcie. Jest mało prawdopodobne, że urządzenie z powodzeniem zinterpretuje wszystko, co mówi do niego w każdym dostępnym języku.
Wymagania
W tym przewodniku nie ma żadnych specjalnych wymagań innych niż urządzenie z mikrofonem i głośnikiem.
Rdzeniem mowy interpretowanej przez urządzenie z systemem Android jest użycie elementu Intent
z odpowiadającym elementem OnActivityResult
.
Należy jednak pamiętać, że mowa nie jest zrozumiała— ale interpretowana jako tekst. Różnica jest ważna.
Różnica między zrozumieniem a interpretacją
Prosta definicja zrozumienia polega na tym, że jesteś w stanie określić ton i kontekst prawdziwe znaczenie tego, co mówi się. Aby zinterpretować tylko oznacza, aby wziąć wyrazy i wyświetlić je w innej formie.
Rozważmy następujący prosty przykład, który jest używany w codziennej konwersacji:
Witaj jak się masz?
Bez przegięcia (nacisk na konkretne słowa lub części wyrazów) jest to proste pytanie. Jeśli jednak do linii zastosowano powolne tempo, osoba słuchająca wykryje, że asker nie jest zbyt szczęśliwy i być może potrzebuje dopingować lub że asker jest źle. Jeśli nacisk zostanie umieszczony na "are", osoba pytająca jest zwykle bardziej zainteresowana odpowiedzią.
Bez dość zaawansowanego przetwarzania dźwięku do korzystania z przegięcia i stopnia sztucznej inteligencji (AI) do zrozumienia kontekstu, oprogramowanie nie może nawet zacząć rozumieć, co zostało powiedziane — najlepszym, co można zrobić, jest przekonwertowanie mowy na tekst.
Konfigurowanie
Przed użyciem systemu mowy zawsze warto sprawdzić, czy urządzenie ma mikrofon. Nie byłoby sensu próbuje uruchomić aplikację na urządzeniu Kindle lub Google Notatnik bez zainstalowanego mikrofonu.
Poniższy przykładowy kod przedstawia wykonywanie zapytań, jeśli mikrofon jest dostępny, a jeśli nie, w celu utworzenia alertu. Jeśli w tym momencie nie jest dostępny mikrofon, należy zamknąć działanie lub wyłączyć możliwość rejestrowania mowy.
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();
}
Tworzenie intencji
Intencja systemu mowy używa określonego typu intencji o nazwie RecognizerIntent
. Ta intencja kontroluje dużą liczbę parametrów, w tym czas oczekiwania z milczeniem, aż nagranie zostanie uwzględnione, wszelkie dodatkowe języki do rozpoznawania i wyprowadzenia oraz dowolny tekst do uwzględnienia w Intent
modalnym oknie dialogowym jako środek instrukcji. W tym fragmencie VOICE
kodu jest readonly int
używany do rozpoznawania w pliku 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);
Konwersja mowy
Tekst interpretowany z mowy zostanie dostarczony w obiekcie Intent
, który jest zwracany po zakończeniu działania i jest dostępny za pośrednictwem metody GetStringArrayListExtra(RecognizerIntent.ExtraResults)
. Spowoduje to zwrócenie IList<string>
elementu , z którego można użyć i wyświetlić indeks w zależności od liczby języków żądanych w intencji obiektu wywołującego (i określonego w obiekcie RecognizerIntent.ExtraMaxResults
). Tak jak w przypadku każdej listy, warto jednak sprawdzić, czy istnieją dane do wyświetlenia.
Podczas nasłuchiwania wartości zwracanej elementu należy podać metodę StartActivityForResult
OnActivityResult
.
W poniższym textBox
przykładzie jest używany TextBox
do wyprowadzania danych wyjściowych, które zostały podyktowane. Można go również użyć do przekazania tekstu do jakiejś formy interpretera i stamtąd, aplikacja może porównać tekst i gałąź z inną częścią aplikacji.
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);
}
}
Zamiana tekstu na mowę
Zamiana tekstu na mowę nie jest odwrotna niż zamiana mowy na tekst i opiera się na dwóch kluczowych składnikach; aparat zamiany tekstu na mowę instalowany na urządzeniu i instalowany język.
W dużej mierze urządzenia z systemem Android mają zainstalowaną domyślną usługę Google TTS i co najmniej jeden język. Jest to określane, gdy urządzenie jest najpierw skonfigurowane i będzie oparte na tym, gdzie znajduje się urządzenie w tym czasie (na przykład telefon skonfigurowany w Niemczech zainstaluje język niemiecki, podczas gdy jeden w Ameryce będzie miał amerykański angielski).
Krok 1. Tworzenie wystąpień tekstuToSpeech
TextToSpeech
może potrwać do 3 parametrów. Pierwsze dwa są wymagane, a trzecia jest opcjonalna (AppContext
, IOnInitListener
, engine
). Odbiornik jest używany do powiązania z usługą i testowania pod kątem awarii z aparatem jest dowolną liczbą dostępnych tekstów systemu Android dla aparatów mowy. Co najmniej urządzenie będzie mieć własny aparat Google.
Krok 2. Znajdowanie dostępnych języków
Klasa Java.Util.Locale
zawiera pomocną metodę o nazwie GetAvailableLocales()
. Ta lista języków obsługiwanych przez aparat mowy może być następnie przetestowana pod kątem zainstalowanych języków.
Jest to banalna kwestia generowania listy "zrozumiałych" języków. Zawsze będzie dostępny język domyślny (język, który użytkownik ustawi podczas pierwszego konfigurowania urządzenia), więc w tym przykładzie parametr List<string>
ma wartość "Domyślna" jako pierwszy parametr, pozostała część listy zostanie wypełniona w zależności od wyniku 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();
Ten kod wywołuje metodę TextToSpeech.IsLanguageAvailable , aby sprawdzić, czy pakiet językowy dla danego ustawienia regionalnego jest już obecny na urządzeniu.
Ta metoda zwraca wartość LanguageAvailableResult, która wskazuje, czy język przekazanych ustawień regionalnych jest dostępny. Jeśli LanguageAvailableResult
wskazuje, że język to NotSupported
, nie ma dostępnego pakietu głosowego (nawet do pobrania) dla tego języka. Jeśli LanguageAvailableResult
jest ustawiona wartość MissingData
, można pobrać nowy pakiet językowy, jak wyjaśniono poniżej w kroku 4.
Krok 3. Ustawianie prędkości i skoku
System Android umożliwia użytkownikowi zmianę dźwięku mowy przez zmianę SpeechRate
wartości i Pitch
(szybkość i ton mowy). To idzie od 0 do 1, z "normalną" mową jest 1 dla obu.
Krok 4. Testowanie i ładowanie nowych języków
Pobieranie nowego języka odbywa się przy użyciu elementu Intent
. Wynik tej intencji powoduje wywołanie metody OnActivityResult . W przeciwieństwie do przykładu zamiany mowy na tekst (który używał klasy RecognizerIntent jako PutExtra
parametru do parametru Intent
), testy i ładowanie Intent
s są Action
oparte na:
TextToSpeech.Engine.ActionCheckTtsData — uruchamia działanie aparatu platformy
TextToSpeech
w celu zweryfikowania prawidłowej instalacji i dostępności zasobów językowych na urządzeniu.TextToSpeech.Engine.ActionInstallTtsData — uruchamia działanie, które monituje użytkownika o pobranie niezbędnych języków.
W poniższym przykładzie kodu pokazano, jak używać tych akcji do testowania zasobów językowych i pobierania nowego języka:
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 dostępność zasobów językowych. OnActivityResult
jest wywoływany po zakończeniu tego testu. Jeśli zasoby językowe należy pobrać, uruchamia TextToSpeech.Engine.ActionInstallTtsData
akcję w celu rozpoczęcia działania, OnActivityResult
które umożliwia użytkownikowi pobranie niezbędnych języków. Należy pamiętać, że ta OnActivityResult
implementacja nie sprawdza Result
kodu, ponieważ w tym uproszczonym przykładzie została już podjęta determinacja, że pakiet językowy musi zostać pobrany.
Akcja TextToSpeech.Engine.ActionInstallTtsData
powoduje, że działanie danych głosowych usługi Google TTS zostanie wyświetlone użytkownikowi w celu wybrania języków do pobrania:
Na przykład użytkownik może wybrać język francuski i kliknąć ikonę pobierania, aby pobrać dane głosu francuskiego:
Instalacja tych danych odbywa się automatycznie po zakończeniu pobierania.
Krok 5 . IOninitListener
Aby działanie mogło przekonwertować tekst na mowę, należy zaimplementować metodę OnInit
interfejsu TextToSpeech
(jest to drugi parametr określony dla wystąpienia klasy). Spowoduje to zainicjowanie odbiornika i przetestowanie wyniku.
Odbiornik powinien być testowy dla obu OperationResult.Success
i OperationResult.Failure
co najmniej.
W poniższym przykładzie pokazano tylko to:
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);
}
Podsumowanie
W tym przewodniku omówiliśmy podstawy konwertowania tekstu na mowę i mowę na tekst oraz możliwe metody dołączania ich do własnych aplikacji. Chociaż nie obejmują one każdego konkretnego przypadku, należy teraz mieć podstawową wiedzę na temat sposobu interpretowania mowy, instalowania nowych języków i zwiększania inkluzywności aplikacji.