Offline Spracherkennung - Aber wie?

  • 1 Antworten
  • Letztes Antwortdatum
J

Jorgan

Neues Mitglied
0
Guten Abend,

ich bin dabei eine Sprachsteuerung zu basteln und versuche mich ein wenig an der Android Programmierung. Ich komme aus der C-Welt und deshalb bewege ich mich immernoch auf relativ dünnem "Java-Fundament".

Dennoch habe ich mit biegen und brechen eine funktionsfähige App erstellt, die die erkannten Sprachbefehle mit einer vordefinierten Liste vergleicht und abhängig davon, welcher Befehl erkannt wurde, eine Sprachausgabe (TTS) mit einer vordefinierten Aussage tätigt und ein gewünschtes Bild einblendet.

Knackpunkt an der ganzen Geschichte... es wird eine Internetverbindung benötigt!

Seit Jelly Bean gibt es aber auch eine offline Spracherkennung bzw. "Voice dictation" wird es ja genannt.

Ist es irgendwie möglich diese für meinen Fall zu nutzen?
Kann ich diese Art App auf irgendeine Art und Weise realisieren?

Zum besseren Verständnis möchte ich hier den Quellcode posten in der Hoffnung, dass mir eventuell jemand helfen kann.

Vielen Dank schonmal für jeden hilfreichen Tipp und schönen Abend noch!


Code:
package com.check.sprachsteuerung;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.speech.RecognizerIntent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

/**
 * Spracheingabe mit Erkennung und Listenvergleich + (TTS) Text-to-Speech
 * Antwort
 */
public class CheckSprachsteuerung extends Activity implements OnInitListener {

    private static final int REQUEST_CODE = 1234;
    private static final int MY_DATA_CHECK_CODE = 12;
    private ListView wordsList;
    private ArrayList<String> commands = new ArrayList<String>();
    private ArrayList<String> commands_ret = new ArrayList<String>();
    private TextToSpeech sprachausgabe;

    /**
     * Wird mit erster Activity aufgerufen
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.voice_recog);

        // 1
        commands.add("programm starten");
        // 2
        commands.add("bitte programm starten");
        // 3
        commands.add("programme starten");
        

        commands_ret.add("Programm wurde gestartet");
        commands_ret.add("Programm wurde gestartet");
        commands_ret.add("Programm wurde gestartet");
        

        Button speakButton = (Button) findViewById(R.id.speakButton);
        wordsList = (ListView) findViewById(R.id.list);

        // TTS Engine prüfen, falls nicht vorhanden Prompt zum nachladen aus
        // Store
        Intent checkIntent = new Intent();
        checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
        startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

        // Button deaktivieren wenn kein Sprach Recognizer vorhanden
        PackageManager pm = getPackageManager();
        List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
                RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
        if (activities.size() == 0) {
            speakButton.setEnabled(false);
            speakButton.setText("Keine Spracherkennung!");
        }
    }

    @Override
    public void onInit(int status) {
        // Platzhalter für onInit Funktion;
    }

    /**
     * Startet Spracherkennung nach Button-Klick
     */
    public void speakButtonClicked(View v) {
        startVoiceRecognitionActivity();
    }

    /**
     * Intent für Spracherkennung anlegen; Modus "freie Sprache" (FREE_FORM)
     */
    private void startVoiceRecognitionActivity() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Sprachkommando nennen...");
        startActivityForResult(intent, REQUEST_CODE);
    }

    /**
     * Ergebnisse der Spracherkennungs-Activity verarbeiten
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == MY_DATA_CHECK_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                // wenn erfolgreich, dann TTS Engine anlegen
                sprachausgabe = new TextToSpeech(this, this);
            } else {
                // wenn keine TTS-Engine, Prompt zum nachinstallieren
                Intent installIntent = new Intent();
                installIntent
                        .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installIntent);
            }
        }

        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            // WordsList wird mit den Strings gefüllt, die die Spracherkennung
            // glaubt gehört zu haben
            ArrayList<String> matches = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            wordsList.setAdapter(new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, matches));

            // command Liste mit den Rückgabewerten der Sprachsuche vergleichen
            // und den erkannten Befehl merken
            int ii = 0;
            int cmd_id = -1;
            int numResults = matches.size();
            String cmd = "unbekannt";
            String antwort = "Test";
            while ((ii < numResults) & (cmd_id == -1)) {
                cmd_id = commands.indexOf(matches.get(ii));
                if (cmd_id != -1) {
                    cmd = matches.get(ii);
                }
                ii++;
            }
            // Button speakButton = (Button) findViewById(R.id.speakButton);
            // speakButton.setText(cmd);
            // Button gibt Ausgabe des erkannten Befehls aus, dann oben
            // auskommentieren
            String sprachantwort = "Befehl wurde nicht erkannt bitte wiederholen";
            ImageView image = (ImageView) findViewById(R.id.anzeige);
            if (cmd_id > -1) {
                antwort = "Test";
                if (commands_ret.get(cmd_id).contains("<ANTWORT>")) {
                    sprachantwort = commands_ret.get(cmd_id).replace(
                            "<ANTWORT>", antwort);
                } else {
                    sprachantwort = commands_ret.get(cmd_id);
                }
                if (cmd_id == 0) {
                    image.setImageResource(R.drawable.programm_starten_png);
                }
                if (cmd_id == 1) {
                    image.setImageResource(R.drawable.programm_starten1_png);
                }
                if (cmd_id == 2) {
                    image.setImageResource(R.drawable.programm_starten2_png);
                }


            }
            if (cmd_id == -1) {
                image.setImageResource(R.drawable.unbekannter_befehl);
            }
            sprachausgabe.speak(sprachantwort, TextToSpeech.QUEUE_FLUSH, null);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}
 
Zurück
Oben Unten