Android nach TTS

Noki99

Mitglied
Mhm und wie genau geb ich den Weckdienst die Möglichkeit mein Telefon laut zu schalten? (Sorry wenn ich dich nerv min 13 Jähriger Anfänger).

Die LogCat wirft mir dazu keinen Fehler aus. :/
 

saftmeister

Nutze den Saft!
Überhaupt keinen?

Normalerweise würde ich es so machen:

Java:
    public void setGoVisible(boolean visibility)
    {
       this.runOnUiThread(new Runnable()
       {
         @Override
         public void run()
         {
            MainActivity.this.btn_go.setVisibility( visibility ? View.VISIBLE : View.INVISIBLE );
         }
        });
    }

Steht denn im LogCat überhaupt nichts auffälliges? Alles was nen Level > Error hat, ist auffällig. Exceptions bzw. Stacktraces sind immer am hilfreichsten.

Wenn es gar nicht anders geht, kannst du ja ein Test-Modul schreiben, dass auch im Emu läuft, für die Text-Ausgabe brauchst du ja kein Mikro.
 

Noki99

Mitglied
Habs jetzt so gemacht,

In der LogCat steht nur dass er irgendwelche Sounds nicht laden kann.
Habs auch im Emulator einfach ohne die Erkennung (mit einem Testwort) laufen lassen, nix in der LogCat, wieder nur Sounds nicht ladbar.

Hast du noch ne Idee?
 

saftmeister

Nutze den Saft!
Wie lautet die genaue Meldung bzw. kannst du das Eclipse-Projekt mal gezippt anhängen? Will mir das nicht selbst einrichten ;-)
 

Noki99

Mitglied
Projekt ist im Anhang. Jetzt wo ich ein Screenshot machen wollte, kommen gar keine Fehler mehr.
 

Anhänge

  • Sprachhilfe.zip
    1,4 MB · Aufrufe: 12

saftmeister

Nutze den Saft!
Ok, ich denke ich hab die Lösung:

Beim Debuggen (durch Breakpoints in den Methoden de.vollkanone.sprachhilfe.MyUtteranceProgressListener.onStart(String) und de.vollkanone.sprachhilfe.MyUtteranceProgressListener.onDone(String) habe ich feststellen müssen, dass der Debugger dort nicht anhält, in de.vollkanone.sprachhilfe.MainActivity.onInit(int) dagegen schon.

Also Google gefragt und das hier gefunden: http://stackoverflow.com/questions/20296792/tts-utteranceprogresslistener-not-being-called

Da heißt es, dass es am dritten Parameter von android.speech.tts.TextToSpeech.speak(String, int, HashMap<String, String>) liegen muss. Also eine Klassenfeld-Variable vom Typ HashMap<String, String> erstellt und vor dem TextToSpeech.speak()-Aufruf folgenden Code eingefügt:

Java:
ttsIdentifier.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString());

Dann noch den Aufruf von speak() angepasst:

Java:
tts.speak("11111111", TextToSpeech.QUEUE_FLUSH, ttsIdentifier);

Und schon verschwindet der Button beim Klick und taucht nach dem Ende des Sprechens wieder auf. Bekommst du die Änderungen hin? Und noch was: du nervst nicht, wenn es so wäre, würde ich nicht mehr antworten ;-)

Ich sehe es nur gern, wenn man etwas Eigeninitiative zeigt, um seinem Problem auf die Schliche zu kommen. Dir fehlen dafür aber die Grundlagen. Du hast dir hier ein anspruchsvolles Feld (Android-Entwicklung) ausgesucht, um mit dem Programmieren anzufangen. Grundsätzlich ist dagegen nichts einzuwenden, aber lege dir ein Buch über Grundlagen zu, arbeite das durch (auch wenn es anfangs langweilig ist), denn ohne die wirds dir nicht lange Spaß machen, an der Sache zu bleiben.
 

Noki99

Mitglied
Wie gesagt, dass Buch für die Grundlagen hohl ich mir.

Hab jetzt die HashMap erstellt.
Code:
HashMap<String, String> ttsIdentifier = new HashMap<String, String>();

Alles wie du gesagt hast angepasst. nur leider passiert immernoch nix.
 

saftmeister

Nutze den Saft!
Ich verstehe nicht, bei mir funktioniert es einwandfrei. Kann es sein, dass dein AVD (Android Virtual Device) kaputt ist? Erzähl mal die einzelnen Schritte, damit ich evtl. nachvollziehen kann, wo es hakt.
 

Noki99

Mitglied
Mhm, dass versteh ich jetzt nicht.

Meine MainActivity.java:
Code:
package de.vollkanone.sprachhilfe;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.UUID;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnInitListener{

    Button btn_go;
    TextView tw;
   
    private TextToSpeech tts;
   
    HashMap<String, String> ttsIdentifier = new HashMap<String, String>();
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        tts = new TextToSpeech(this, this);
       
       
        btn_go = (Button) findViewById(R.id.btn_go);
       
        btn_go.setVisibility(View.INVISIBLE);
       
        tw = (TextView) findViewById(R.id.textView1);
       
       
        btn_go.setOnClickListener(new View.OnClickListener() {
           
            @Override
            public void onClick(View v) {
                //button("btn_go");
                tw.setText("111111111");
                tts.speak("11111111", TextToSpeech.QUEUE_FLUSH, null);
            }
        });
       
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
   
    public void button(String btn) {
        if(btn.equalsIgnoreCase("btn_go")) {
            erkennen(this);
        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == SPEECH_RECOGNIZED) {
            if(data != null) {
               
                ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
               
                if(!result.isEmpty()) {
                    tw.setText(result.get(0));
                    ttsIdentifier.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString());
                    tts.speak("11111111", TextToSpeech.QUEUE_FLUSH, ttsIdentifier);
                }
            }
        }
    }
   
    static public final int SPEECH_RECOGNIZED = 1;
   
    static public void erkennen(Activity activity) {
        Intent intent = new Intent();
        intent.setAction(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        activity.startActivityForResult(intent, SPEECH_RECOGNIZED);
    }

    @Override
    public void onInit(int status) {
       
        tts.setLanguage(Locale.GERMAN);
        tts.setSpeechRate((float) 1.5);
       
        //btn_go.setVisibility(View.VISIBLE);
        MainActivity.this.btn_go.setVisibility(View.VISIBLE);
       
       
       
        tts.setOnUtteranceProgressListener(new MyUtteranceProgressListener(this));
       
    }
   
    public void setGoVisible(final boolean visibility)
    {
        this.runOnUiThread(new Runnable()
          {
            @Override
            public void run()
            {
               MainActivity.this.btn_go.setVisibility( visibility ? View.VISIBLE : View.INVISIBLE );
            }
           });
    }
     
}

Auf AVD und echtem Handy getestet, beide machen den Button nicht unsichtbar.

Hab aber alle 3 Sachen was du gesagt hast gemacht, oder nicht??
 

saftmeister

Nutze den Saft!
Ich habe den Button-Listener angepasst:

Java:
        btn_go.setOnClickListener(new View.OnClickListener() {
           
            @Override
            public void onClick(View v) {
                //button("btn_go");
                tw.setText("111111111");
                ttsIdentifier.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString());
                tts.speak("11111111", TextToSpeech.QUEUE_FLUSH, ttsIdentifier);
            }
        });
 

Neue Beiträge