Hướng dẫn chuyển văn bản thành lời nói trong Android
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Tổng quan

Chuyển văn bản thành lời nói là một tính năng được đưa vào Android từ API 21, nó cho phép bạn chuyển một đoạn text thành lời nói, chức năng này hỗ trợ nhiều ngôn ngữ khác nhau. Để thực hiện chức năng này bạn cần sử dụng class android.speech.tts.TextToSpeech.
Cho tới Android API Level 23 các địa phương (locale) sau được hỗ trợ:
  • en_US
  • de_DE
  • fr
  • es_ES
  • de
  • en
  • it_IT
  • it
  • en_GB
  • es
  • fr_FR

2- Ví dụ Text To Speech

Tạo một project có tên TextToSpeechDemo:
Thiết kế giao diện:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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="org.o7planning.texttospeechdemo.MainActivity">

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/radioGroup">

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="English"
            android:id="@+id/radio_en"
            android:checked="true" />

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="France"
            android:id="@+id/radio_fr"
            android:checked="false" />
    </RadioGroup>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_below="@+id/radioGroup"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignRight="@+id/radioGroup"
        android:layout_alignEnd="@+id/radioGroup" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Speak"
        android:id="@+id/button"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="58dp" />

</RelativeLayout>

Min SDK Level

Text To Speech yêu cầu Android API Level >= 21 vì vậy bạn cần phải cấu hình trong file build.gradle (Module:app).

minSdkVersion 21
 
MainActivity.java
package org.o7planning.texttospeechdemo;

import android.app.Activity;
import android.os.Bundle;

import android.speech.tts.TextToSpeech;

import android.util.Log;
import android.view.View;

import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;

import java.util.Locale;
import java.util.Set;
import java.util.UUID;

import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends Activity {
  private TextToSpeech textToSpeech;
  private EditText editText_text;
  private Button button;
  private RadioButton radio_en;
  private RadioButton radio_fr;
  RadioGroup radioGroup;

  private boolean ready;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      editText_text = (EditText) findViewById(R.id.editText);
      button = (Button) findViewById(R.id.button);
      radio_en = (RadioButton) findViewById(R.id.radio_en);
      radio_fr = (RadioButton) findViewById(R.id.radio_fr);
      radioGroup = (RadioGroup) findViewById(R.id.radioGroup);


      textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
          @Override
          public void onInit(int status) {
              Log.e("TTS", "TextToSpeech.OnInitListener.onInit...");
              printOutSupportedLanguages();
              setTextToSpeechLanguage();
          }
      });
      radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

          @Override
          public void onCheckedChanged(RadioGroup group, int checkedId) {
              setTextToSpeechLanguage();
          }
      });
      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              speakOut();
          }
      });
  }

  private void printOutSupportedLanguages()  {
      // Các ngôn ngữ được Android hỗ trợ.
      Set<Locale> supportedLanguages = textToSpeech.getAvailableLanguages();
      if(supportedLanguages!= null) {
          for (Locale lang : supportedLanguages) {
              Log.e("TTS", "Supported Language: " + lang);
          }
      }
  }


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

  private void speakOut() {
      if (!ready) {
          Toast.makeText(this, "Text to Speech not ready", Toast.LENGTH_LONG).show();
          return;
      }

      // Văn bản cần đọc.
      String toSpeak = editText_text.getText().toString();
      Toast.makeText(this, toSpeak, Toast.LENGTH_SHORT).show();

      // Một String ngẫu nhiên (ID duy nhất).
      String utteranceId = UUID.randomUUID().toString();
      textToSpeech.speak(toSpeak, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
  }

  private Locale getUserSelectedLanguage() {
      int checkedRadioId = this.radioGroup.getCheckedRadioButtonId();
      if (checkedRadioId == R.id.radio_en) {
          return Locale.ENGLISH;
      } else if (checkedRadioId == R.id.radio_fr) {
          return Locale.FRANCE;
      }
      return null;
  }


  private void setTextToSpeechLanguage() {
      Locale language = this.getUserSelectedLanguage();
      if (language == null) {
          this.ready = false;
          Toast.makeText(this, "Not language selected", Toast.LENGTH_SHORT).show();
          return;
      }
      int result = textToSpeech.setLanguage(language);
      if (result == TextToSpeech.LANG_MISSING_DATA) {
          this.ready = false;
          Toast.makeText(this, "Missing language data", Toast.LENGTH_SHORT).show();
          return;
      } else if (result == TextToSpeech.LANG_NOT_SUPPORTED) {
          this.ready = false;
          Toast.makeText(this, "Language not supported", Toast.LENGTH_SHORT).show();
          return;
      } else {
          this.ready = true;
          Locale currentLanguage = textToSpeech.getVoice().getLocale();
          Toast.makeText(this, "Language " + currentLanguage, Toast.LENGTH_SHORT).show();
      }
  }


}
Chạy ứng dụng: