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!
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);
}
}