Riconoscimento vocale Android
Questo articolo illustra le nozioni di base sull'uso dello spazio dei nomi Android.Speech molto potente. Sin dall'inizio, Android è stato in grado di riconoscere il parlato e di restituirlo come testo. È un processo relativamente semplice. Per il riconoscimento vocale, tuttavia, il processo è più coinvolto, poiché non solo il motore di riconoscimento vocale deve essere preso in considerazione, ma anche le lingue disponibili e installate dal sistema Di sintesi vocale (TTS).
Cenni preliminari sul riconoscimento vocale
Avere un sistema, che "comprende" il parlato umano e pronuncia ciò che viene digitato, speech to Text e Text to Speech, è un'area in continua crescita all'interno dello sviluppo mobile man mano che aumenta la richiesta di comunicazione naturale con i nostri dispositivi. Esistono molte istanze in cui una funzionalità converte il testo in parlato, o viceversa, è uno strumento molto utile per incorporare nell'applicazione Android.
Ad esempio, con la necessità di bloccare l'uso del telefono cellulare durante la guida, gli utenti vogliono un modo pratico per operare i propri dispositivi. La pletora di diversi fattori di forma Android, ad esempio Android Wear, e l'inclusione sempre più ampia di quelli in grado di usare dispositivi Android (ad esempio tablet e riquadri note), ha creato un maggiore focus sulle grandi applicazioni TTS.
Google fornisce allo sviluppatore un set completo di API nello spazio dei nomi Android.Speech per coprire la maggior parte delle istanze di rendere un dispositivo "riconoscimento vocale" (ad esempio il software progettato per i non vedenti). Lo spazio dei nomi include la funzionalità per consentire la traduzione vocale tramite Android.Speech.Tts
, il controllo sul motore usato per eseguire la traduzione, nonché un certo numero di RecognizerIntent
elementi che consentono la conversione del parlato in testo.
Anche se le strutture sono disponibili per il riconoscimento vocale, esistono limitazioni in base all'hardware usato. È improbabile che il dispositivo interpreti correttamente tutto ciò che parla in ogni lingua disponibile.
Requisiti
Non ci sono requisiti speciali per questa guida, ad eccezione del dispositivo con un microfono e un altoparlante.
Il nucleo di un dispositivo Android che interpreta il parlato è l'uso di un Intent
oggetto con un oggetto corrispondente OnActivityResult
.
È tuttavia importante riconoscere che il discorso non è compreso, ma interpretato in testo. La differenza è importante.
Differenza tra comprensione e interpretazione
Una semplice definizione di comprensione è che si è in grado di determinare in base al tono e al contesto il vero significato di ciò che viene detto. Per interpretare solo significa prendere le parole e restituirle in un'altra forma.
Si consideri l'esempio semplice seguente usato nella conversazione quotidiana:
Ciao come stai?
Senza flesso (enfasi posta su parole o parti specifiche di parole), è una domanda semplice. Tuttavia, se un ritmo lento viene applicato alla linea, la persona che ascolta rileverà che l'asker non è troppo felice e forse ha bisogno di salutare o che l'asker è inwellso. Se l'enfasi viene posta su "are", la persona che chiede è in genere più interessata alla risposta.
Senza un'elaborazione audio abbastanza potente per usare l'inflessione e un grado di intelligenza artificiale (IA) per comprendere il contesto, il software non può nemmeno iniziare a capire cosa è stato detto, il meglio che un semplice telefono può fare è convertire il parlato in testo.
Configurazione
Prima di usare il sistema di riconoscimento vocale, è sempre consigliabile verificare che il dispositivo abbia un microfono. Ci sarebbe poco punto di provare a eseguire la tua app in un riquadro note Kindle o Google senza un microfono installato.
L'esempio di codice seguente illustra l'esecuzione di query se è disponibile un microfono e, in caso contrario, per creare un avviso. Se a questo punto non è disponibile alcun microfono, chiudere l'attività o disabilitare la possibilità di registrare il parlato.
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();
}
Creazione della finalità
La finalità per il sistema di riconoscimento vocale usa un particolare tipo di finalità denominato RecognizerIntent
. Questa finalità controlla un numero elevato di parametri, tra cui il tempo di attesa con silenzio fino a quando la registrazione non viene considerata oltre, eventuali lingue aggiuntive da riconoscere e output e qualsiasi testo da includere nella Intent
finestra di dialogo modale come mezzo di istruzione. In questo frammento di codice VOICE
viene readonly int
usato per il riconoscimento in 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);
Conversione del parlato
Il testo interpretato dal parlato verrà recapitato all'interno di Intent
, che viene restituito quando l'attività è stata completata ed è accessibile tramite GetStringArrayListExtra(RecognizerIntent.ExtraResults)
. Verrà restituito un IList<string>
oggetto , di cui è possibile usare e visualizzare l'indice, a seconda del numero di lingue richieste nella finalità del chiamante (e specificato in RecognizerIntent.ExtraMaxResults
). Come per qualsiasi elenco, tuttavia, vale la pena verificare che siano presenti dati da visualizzare.
Quando si è in ascolto del valore restituito di un StartActivityForResult
oggetto , è necessario fornire il OnActivityResult
metodo .
Nell'esempio seguente textBox
viene TextBox
usato per l'output di ciò che è stato determinato. Può essere usato allo stesso modo per passare il testo a una forma di interprete e da lì, l'applicazione può confrontare il testo e il ramo con un'altra parte dell'applicazione.
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);
}
}
Sintesi vocale
Il riconoscimento vocale non è proprio il contrario del parlato al testo e si basa su due componenti chiave; un motore di sintesi vocale installato nel dispositivo e una lingua in fase di installazione.
In gran parte, i dispositivi Android sono dotati del servizio Google TTS predefinito installato e almeno una lingua. Questo viene stabilito quando il dispositivo viene configurato per la prima volta e sarà basato sulla posizione in cui si trova il dispositivo (ad esempio, un telefono configurato in Germania installerà la lingua tedesca, mentre una in America avrà l'inglese americano).
Passaggio 1 - Creazione di un'istanza di TextToSpeech
TextToSpeech
può accettare fino a 3 parametri, i primi due sono necessari con il terzo come facoltativo (AppContext
, IOnInitListener
, engine
). Il listener viene usato per eseguire l'associazione al servizio e verificare se il motore ha un numero qualsiasi di motori di sintesi vocale Android disponibili. Almeno, il dispositivo avrà il proprio motore di Google.
Passaggio 2- Ricerca delle lingue disponibili
La Java.Util.Locale
classe contiene un metodo utile denominato GetAvailableLocales()
. Questo elenco di lingue supportate dal motore di riconoscimento vocale può quindi essere testato in base alle lingue installate.
È una questione semplice generare l'elenco delle lingue "comprese". Sarà sempre presente una lingua predefinita (la lingua impostata dall'utente al primo impostazione del dispositivo), quindi in questo esempio ha List<string>
"Default" come primo parametro, il resto dell'elenco verrà compilato in base al risultato dell'oggetto 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();
Questo codice chiama TextToSpeech.IsLanguageAvailable per verificare se il pacchetto linguistico per una determinata impostazione locale è già presente nel dispositivo.
Questo metodo restituisce un LanguageAvailableResult, che indica se la lingua per le impostazioni locali passate è disponibile. Se LanguageAvailableResult
indica che la lingua è NotSupported
, non è disponibile alcun pacchetto vocale (anche per il download) per tale lingua. Se LanguageAvailableResult
è impostato su MissingData
, è possibile scaricare un nuovo pacchetto linguistico come illustrato di seguito nel passaggio 4.
Passaggio 3 - Impostazione della velocità e dell'inclinazione
Android consente all'utente di modificare il suono del parlato modificando e SpeechRate
Pitch
(la velocità e il tono del parlato). Questo va da 0 a 1, con il parlato "normale" che è 1 per entrambi.
Passaggio 4: Test e caricamento di nuove lingue
Il download di una nuova lingua viene eseguito usando un oggetto Intent
. Il risultato di questa finalità fa sì che venga richiamato il metodo OnActivityResult . A differenza dell'esempio di riconoscimento vocale (che ha usato RecognizerIntentcome PutExtra
parametro per ), Intent
i test e il caricamento Intent
di sono Action
basati su:
TextToSpeech.Engine.ActionCheckTtsData : avvia un'attività dal motore della piattaforma
TextToSpeech
per verificare l'installazione e la disponibilità appropriate delle risorse linguistiche nel dispositivo.TextToSpeech.Engine.ActionInstallTtsData : avvia un'attività che richiede all'utente di scaricare le lingue necessarie.
L'esempio di codice seguente illustra come usare queste azioni per testare le risorse della lingua e scaricare una nuova lingua:
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
verifica la disponibilità delle risorse linguistiche. OnActivityResult
viene richiamato al termine del test. Se è necessario scaricare le risorse della lingua, OnActivityResult
viene attivata l'azione TextToSpeech.Engine.ActionInstallTtsData
per avviare un'attività che consente all'utente di scaricare le lingue necessarie. Si noti che questa OnActivityResult
implementazione non controlla il Result
codice perché, in questo esempio semplificato, è già stata effettuata la determinazione che il pacchetto linguistico deve essere scaricato.
L'azione TextToSpeech.Engine.ActionInstallTtsData
fa sì che l'attività dei dati vocali di Google TTS venga presentata all'utente per la scelta delle lingue da scaricare:
Ad esempio, l'utente potrebbe scegliere francese e fare clic sull'icona di download per scaricare i dati vocali francesi:
L'installazione di questi dati viene eseguita automaticamente al termine del download.
Passaggio 5 - IOnInitListener
Affinché un'attività possa convertire il testo in parlato, è necessario implementare il metodo OnInit
di interfaccia (questo è il secondo parametro specificato per la creazione di istanze della TextToSpeech
classe). Inizializza il listener e testa il risultato.
Il listener deve eseguire il test per entrambi OperationResult.Success
e OperationResult.Failure
almeno.
L'esempio seguente mostra solo che:
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);
}
Riepilogo
In questa guida sono state esaminate le nozioni di base sulla conversione del testo in sintesi vocale e vocale e sui possibili metodi di inclusione all'interno delle proprie app. Anche se non riguardano ogni caso specifico, è ora necessario avere una conoscenza di base del modo in cui viene interpretato il parlato, come installare nuove lingue e come aumentare l'inclusione delle app.