Condividi tramite


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 RecognizerIntentelementi 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 Intentfinestra 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 StartActivityForResultoggetto , è 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 SpeechRatePitch (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 ), Intenti test e il caricamento Intentdi sono Actionbasati su:

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:

Attività dati di Google TTS Voice

Ad esempio, l'utente potrebbe scegliere francese e fare clic sull'icona di download per scaricare i dati vocali francesi:

Esempio di download della lingua francese

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.