Android文字转语音(TTS)

时间:2020-02-23 14:29:20  来源:igfitidea点击:

在本教程中,我们将在Android应用程序中讨论和实现"文字转语音"功能。
我们将创建一个Android应用程序,说出在EditText中输入的文本。
Android文字转语音也称为Android TTS。

Android文字转语音

顾名思义,TextToSpeech用于从文本字符串中合成语音。

您可以设置自己选择的语言。
您可以从自定义文件中设置音高,速度以及自己的语音。

首先需要初始化TextToSpeech。
为此,您需要实现TextToSpeech.OnInitListener接口并覆盖方法onInit。
例:

TextToSpeech tts = new TextToSpeech(this, this);

完成此操作后,将触发onInit。

使用这种方法,我们检查功能是否在我们的设备上可用。

@Override
  public void onInit(int status) {

      if (status == TextToSpeech.SUCCESS) {

          int result = tts.setLanguage(Locale.US);

          if (result == TextToSpeech.LANG_MISSING_DATA
                  || result == TextToSpeech.LANG_NOT_SUPPORTED) {
              Toast.makeText(getApplicationContext(), "Language 不支持", Toast.LENGTH_SHORT).show();
          } else {
               //Disable the button if any.
          }

      } else {
          Toast.makeText(getApplicationContext(), "Init failed", Toast.LENGTH_SHORT).show();
      }
  }

文字怎么说?

tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);

第一个参数是要说的文字。

第二个参数定义刷新先前的输入,以便开始清理。
或者,我们可以使用QUEUE_ADD将当前文本添加到语音中。

第三个参数是传递的包。

第四是"发话ID"字符串。

OnUtteranceProgressListener用于侦听tts事件:开始,完成,错误。

在这种情况下,我们可以检索已传递的语音包发声字符串。

必须在调用语音方法之前定义OnUtteranceProgressListener。

要更改音调和速度,我们可以执行以下操作:

tts.setPitch(2f);
tts.setSpeechRate(2f);

" addSpeech"方法用于添加自定义语音,而不是使用Android的默认语音。

演讲结束后,您需要停止TTS实例,以便使用tts.shutdown()方法释放资源。

让我们进入在应用程序中实现TextToSpeech的业务端。

文字转语音Android代码

下面给出了activity_main.xml布局的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:app="https://schemas.android.com/apk/res-auto"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

  <EditText
      android:id="@+id/enterYouText"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_margin="8dp"
      android:text="Welcome to theitroad.local"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" 

  <Button
      android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="8dp"
      android:text="SPEAK TEXT"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/enterYouText" 

  <Button
      android:id="@+id/btnChangePitch"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginEnd="8dp"
      android:layout_marginStart="8dp"
      android:layout_marginTop="8dp"
      android:text="Change Pitch"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/btnChangeSpeed" 

  <Button
      android:id="@+id/btnChangeSpeed"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginEnd="8dp"
      android:layout_marginStart="8dp"
      android:layout_marginTop="8dp"
      android:text="Change Speed"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/button" 

</android.support.constraint.ConstraintLayout>

MainActivity.java的代码如下:

package com.theitroad.androidtexttospeech;

import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Locale;

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {

  Button button, btnChangePitch, btnChangeSpeed;
  EditText editText;
  private TextToSpeech tts;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      tts = new TextToSpeech(this, this);

      button = findViewById(R.id.button);
      btnChangePitch = findViewById(R.id.btnChangePitch);
      btnChangeSpeed = findViewById(R.id.btnChangeSpeed);
      editText = findViewById(R.id.enterYouText);

      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              speakOut();
          }
      });

      btnChangePitch.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              tts.setPitch(0.2f);
          }
      });

      btnChangeSpeed.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              tts.setSpeechRate(2f);
          }
      });
  }

  @Override
  public void onInit(int status) {

      if (status == TextToSpeech.SUCCESS) {
          int result = tts.setLanguage(Locale.US);

          if (result == TextToSpeech.LANG_MISSING_DATA
                  || result == TextToSpeech.LANG_NOT_SUPPORTED) {
              Toast.makeText(getApplicationContext(), "Language 不支持", Toast.LENGTH_SHORT).show();
          } else {
              button.setEnabled(true);
          }

      } else {
          Toast.makeText(getApplicationContext(), "Init failed", Toast.LENGTH_SHORT).show();
      }
  }

  private void speakOut() {

      tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
          @Override
          public void onStart(String s) {

              final String keyword = s;
              runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                      Toast.makeText(getApplicationContext(), "Started" + keyword, Toast.LENGTH_SHORT).show();
                  }
              });
          }

          @Override
          public void onDone(String s) {

              runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                      Toast.makeText(getApplicationContext(), "Done ", Toast.LENGTH_SHORT).show();
                  }
              });
          }

          @Override
          public void onError(String s) {

              runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                      Toast.makeText(getApplicationContext(), "Error ", Toast.LENGTH_SHORT).show();
                  }
              });
          }
      });

      Bundle params = new Bundle();
      params.putString(TextToSpeech.Engine.KEY_PA内存_UTTERANCE_ID, "");

      String text = editText.getText().toString();
      tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "Dummy String");
  }

  @Override
  public void onDestroy() {
      if (tts != null) {
          tts.stop();
          tts.shutdown();
      }
      super.onDestroy();
  }
}

tts侦听器在单独的线程上运行。
因此,要从它们执行任何UI动作,我们需要使用runOnUiThread函数。