2016-07-07 10 views
2

Ich bin ein Anfänger und das ist meine erste App. Ich kann tts nicht dazu bringen, in verschiedenen Sprachen zu sprechen, auch nachdem ich setLanguage() benutzt habe. Es spricht immer auf Englisch. Jede Hilfe wäre willkommen. Hier ist meine MainActivity:Wie kann ich TTS in einer App in verschiedenen Sprachen sprechen lassen?

package com.example.android.sayhi; 

import android.os.Build; 
import android.os.Bundle; 
import android.speech.tts.TextToSpeech; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TextView; 

import java.util.Locale; 

public class MainActivity extends AppCompatActivity { 

    TextToSpeech t; 
    String option; 
    Locale language; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Spinner dropdown = (Spinner)findViewById(R.id.spinner); 
     String[] items = new String[]{Locale.FRENCH.getDisplayLanguage(),Locale.UK.getDisplayLanguage(), Locale.US.getDisplayLanguage()}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, items); 
     dropdown.setAdapter(adapter); 

     dropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
       option = adapterView.getItemAtPosition(i).toString(); 


      } 

      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 
option = adapterView.getItemAtPosition(0).toString(); 
      } 


     }); 
     language = new Locale(option); 
     t = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
      @Override 
      public void onInit(int status) { 
       if (status != TextToSpeech.ERROR) { 
        t.setLanguage(language); 
        t.setSpeechRate((float)0.8); 


       } 
      } 
     }); 




    } 


    public void show(View view) { 
     EditText textField = (EditText) findViewById(R.id.text); 
     String field = textField.getText().toString(); 


     TextView viewField = (TextView) findViewById(R.id.textView); 
     viewField.setText(field); 

     if (Build.VERSION.RELEASE.startsWith("5")) { 
      t.speak(field, TextToSpeech.QUEUE_FLUSH, null, null); 
     } 
     else { 
      t.speak(field, TextToSpeech.QUEUE_FLUSH, null); 
     } 

    } 

    public void onPause() { 
     if (t != null) { 
      t.stop(); 

     } 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

    } 

Hier ist meine XML-Datei:

<?xml version="1.0" encoding="utf-8"?> 

<ScrollView 

    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.android.sayhi.MainActivity"> 


    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/text" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="40dp" 
     android:width="300dp"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Say it!" 
     android:id="@+id/button" 
     android:layout_below="@+id/text" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="38dp" 
     android:onClick="show"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Write it up!" 
     android:id="@+id/textView" 
     android:layout_below="@+id/button" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="105dp" 
     android:gravity="center_horizontal" /> 

    <Spinner 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/spinner" 
     android:layout_below="@+id/button" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:background="@android:drawable/btn_dropdown"/> 

</RelativeLayout> 
</ScrollView> 

Jede mögliche Hilfe würde geschätzt! Vielen Dank.

Antwort

0

Sie instanziieren das Text to Speech-Objekt in Ihrer onCreate()-Methode und versuchen, die Sprache innerhalb onInit() festzulegen.

Ihre Variable option ist zu diesem Zeitpunkt NULL (da noch nichts ausgewählt wurde). Daher wird das Erstellen der Ländereinstellung mit einem Nullwert fehlschlagen, daher wird die Sprache nicht festgelegt.

Wenn Elemente aus Ihrer Dropdown-Liste ausgewählt sind, wird option ausgefüllt, aber es passiert nichts weiter. Es geht nicht "außerhalb" des Zuhörers zurück in die onCreate() Methode.

In Ihrem Drop-down-Hörer, fügen Sie die folgenden Schritte aus:

option = adapterView.getItemAtPosition(xxx).toString(); 
    language = new Locale(option); 

    if (t != null) { 
     int result = t.setLanguage(language) 
     // Check the result to see if it was successful 
    } else { 
     // the tts object was null? 
    } 

, die das Problem beheben sollte.

Alternativ, wie Sie den obigen Code zweimal verwenden werden, ist es eine gute Übung, Ihre eigene Methode dafür zu erstellen.

Dann könnten Sie rufen Sie einfach an:

setLanguage(adapterView.getItemAtPosition(xxx).toString()); 

Jedes Mal, wenn Sie Variablen erstellen und Werte zuweisen, als Anfänger, immer den Wert einzuloggen, so dass Sie es für sich selbst sehen. Es wird Ihnen einen frühen Hinweis geben, dass etwas falsch ist, wenn es null ist oder nicht den Wert, den Sie beabsichtigten.

+0

Funktioniert gut. Danke. Aber TTS ist ein wenig langsam zu initialisieren, vielleicht hat es etwas mit Ressourcenverbrauch auf meinem Gerät zu tun. – SuperHaker

+1

@AmritSingh überprüfen Sie diese Frage http://StackOverflow.com/q/36013611/1256219 – brandall