Spracherkennung - so halb stabil

Moin,

da ich gerade mal intensiver mit meinen Tablet rumspiele

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;

import java.util.Locale;

public class MrSpeaker implements RecognitionListener {

    public interface MrSpeakerListener {
        void OnWordsRecognized(String word);
    }

    private final String LOGTAG = "MrSPEAKER";
    private SpeechRecognizer speechRecon;
    private Intent speechIntent;
    private boolean enabled = false;
    private MrSpeakerListener listener;

    public MrSpeaker(Context context) {
        speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.GERMANY);

        if (SpeechRecognizer.isOnDeviceRecognitionAvailable(context)) {
            log("Spracherkennung erfolgt auf dem Gerät");
            speechRecon = SpeechRecognizer.createOnDeviceSpeechRecognizer(context);
        } else {
            log("Google (Samsung?) kümmert sich um die Übersetzung");
            speechRecon = SpeechRecognizer.createSpeechRecognizer(context);
        }
        speechRecon.setRecognitionListener(this);
    }

    public void setListener(MrSpeakerListener listener) {
        this.listener = listener;
    }

    public void setEnable(boolean enabled) {
        this.enabled = enabled;
        if (enabled) {
            speechRecon.startListening(speechIntent);
        } else {
            speechRecon.stopListening();
        }
    }

    public void destroy() {
        speechRecon.stopListening();
        speechRecon.destroy();
    }

    private void log(String msg) {
//        Log.i(LOGTAG, "TTS -> " + msg);
    }

    @Override
    public void onReadyForSpeech(Bundle params) {
        log("onReadyForSpeech");
    }

    @Override
    public void onBeginningOfSpeech() {
        log("onBeginningOfSpeech");
    }

    @Override public void onRmsChanged(float rmsdB) { }

    @Override
    public void onBufferReceived(byte[] buffer) {
        log("onBufferReceived");
    }

    @Override
    public void onEndOfSpeech() {
        log("onEndOfSpeech");
        //cleanUpAndRestart();
    }

    @Override
    public void onError(int error) {
        log("onError -> " + error);
        //cleanUpAndRestart();
        if (error == SpeechRecognizer.ERROR_NO_MATCH) {
            log("nichts gefunden");
            if (listener != null) listener.OnWordsRecognized("nicht erkannt");
            if (enabled) speechRecon.startListening(speechIntent);
        }
    }

    @Override
    public void onResults(Bundle results) {
        for(String word : results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)) {
            if (listener != null) listener.OnWordsRecognized(word);
            log("onResults -> " + word);
        }
        if (enabled) speechRecon.startListening(speechIntent);
    }

    @Override
    public void onPartialResults(Bundle partialResults) {
//        for(String word : partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)) {
//            log("onPartialResults -> " + word);
//            if (listener != null) listener.OnWordsRecognized(word);
//        }
    }

    @Override
    public void onEvent(int eventType, Bundle params) {
        log("onEvent");
    }

}

es kann sinnvoll sein, die erkannten Wörter durch Levenshtein laufen zu lassen und etwas Ungenauigkeit zu zulassen.

hand, mogel

a) Macht das nicht schon der RecognitionListener? Ist dieser auf die Benutzer-/Systemsprache eingestellt? Dann wäre die Wahrscheinlichkeit „hoch“, dass dieser auch ein Wörterbuch hat.

b) Kommen komische Wörter raus? Also welche, die Rechtschreibfehler enthalten?

Gruß

also keine Rechtschreibfehler - das passt alles. Aber manchmal kommt statt „Licht“ eben „nicht“ raus. Über Levenshtein lässt sich das relativ leicht rausfiltern bzw. korrigieren. Solange man es als Befehlseingabe benutzt (Licht, Fahrwerk, …) ist das recht brauchbar.

Ach so meintest du das … ja, da ist Levenshtein sehr gut.

Ich glaube, @Marco13 hat damit auch mal etwas gemacht. (winkmitdemzaunpfahl)

Ich sehe da aber noch ein zweites Problem. Du bräuchtest eine Liste mit sich phonetisch gut voneinander unterscheidenden Commands … das wird schwer.

Ich mache selber recht wenig mit Spracheingaben, weil ich doch sehr nuschle (hoffnungslos). Deshalb schreibe ich lieber.

Denke auch nicht, dass das trainiert werden kann… Glaube, habe eine Nasennebenhöhlenverengung oder so (nicht unfallbedingt)

Was passiert, wenn man die Worte „nicht erkannt“ sagt? :smiley:
(Ja, es ist nur ein proof-of-concept - sieht wie ein KSKB für die „SpeechRecognizer“-Klasse aus. Und wenn man’s schwer machen wollte, würde man den „brainstorm-vs-green-needle-test machen“ :smiling_imp: )

Für die „Nachverarbeitung“, wenn es erstmal ein String ist, kann man sich tausend Sachen überlegen. Eine kleine Fehlertoleranz wie mit Levenshtein wäre recht einfach. Wenn man wirklich Aussagen verstehen wollte, würde es beliebig kompliziert werden…

verdammt, jetzt ist meine Software abgestürzt - Du bist ja wie ich - ich am Umziehen, syntetischer Mensch bei EON und EMB Gas - ich habe beide übers Telefon zum Absturz gebracht - der eine reagierte über 2min nicht mehr und hat dann beendet, der andere wiederholte immer nur „ich habe ihre Nummer nicht erkannt“

prinzipiell ja - ich habe erst viele Beispiele für die alte API gefunden - das zweite „Problem“ war dann die dauernde Spracherkennung, da die Erkennung im Normalfall automatisch stoppt (daher public void setEnable(boolean enabled))

nee - mir reichen die einzelnen Worte - im Moment bastel ich mir für Elite eine weitere Oberfläche, um einige Funktionen aufs Tablett zu legen (dann Netzwerk und KeyEvent über Qt) - und da dachte ich mir „eine Spracherkennung wäre auch ganz cool“ - „Fahrwerk“ → „Fahrwerk ausgefahren“ - oder „volle Kraft“ / „halbe Kraft“ - evt. sollte ich mein Schiff Titanic nennen :crazy_face:

Ein Command, um den Fighter + Co-Pilot automatisch abzusetzen, oder um den supercruise assist zu aktivieren, wäre super. :grin:

Ich habe schon einmal mit AutoIt versucht, etwas zu machen, aber das hat leider nicht funktioniert.

Aktueller Stand: es funktioniert

man merkt aber, das es für Ego-Shooter nicht wirklich zu gebrauchen ist. Zumindest was die Umschaltung und Reaktionszeit der Waffen angeht. Granaten könnte funktionieren, aber da muss ich erstmal die Oberfläche anpassen und ins Gefecht ziehen. Im Moment bin ein bischen draußen und suche Bio-Daten.

1 „Gefällt mir“

Ich hab 'ne Frage. Wie kommt die Verbindung zwischen Tablet/Java und Computer/Elite zustande? Danke.

:face_with_raised_eyebrow:

aber gerne doch → TCP

1 „Gefällt mir“

Aber dann muss „dort“ auf dem Computer doch eine REST-artige Schnittstelle lauschen, die Befehle an Elite weitergeben kann … AUCH Java?

BTW. Jetzt kenne ich deine Stimme und kann ein Deep-Fake erstellen. :grin: (Nur Spaß.)

BTW #2 bayrischer Dialekt?