如何让TTS在应用中以不同语言说出来?

时间:2016-07-07 20:09:29

标签: java android android-studio locale text-to-speech

我是初学者,这是我的第一个应用。即使在使用setLanguage()之后,我也无法用不同的语言说话。它总是用英语说话。任何帮助,将不胜感激。这是我的MainActivity:

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();

    }

这是我的XML文件:

<?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>

任何帮助将不胜感激!感谢。

1 个答案:

答案 0 :(得分:0)

您正在onCreate()方法中实例化文字转语音对象,并尝试在onInit()内设置语言。

此时变量option将为空(因为尚未选择任何内容),因此创建具有空值的语言环境将失败,因此将不会设置语言。

从下拉列表中选择项目时,会填充option,但不会再发生任何事情。它不会继续在外面&#39;侦听器重新进入onCreate()方法。

在您的下拉监听器中,添加以下内容:

    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?
    }

这应解决问题。

或者,由于您将使用上述代码两次,因此为其创建自己的方法是一种很好的做法。

private void setLanguage(final String option) {

    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?
    }

}

然后你可以简单地打电话:

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

每当您创建变量并分配值时,作为初学者,始终记录该值,以便您自己查看。如果它是空的或不是你想要的值,它会给你一个早期线索,表明出了问题。