Inhaltsverzeichnis

Text zu Sprache in Android

1- Overview

Die Umsetzung einer Text zu einer Aussage ist eine Funktion, die im Android ab API 21 eingeführt, damit Sie einen Text zu einer Aussage umsetzen dürfen. Die Funktion unterstützt viele unterschiedlichen Sprache. Um diese Funktion durchzuführen sollen Sie die Klasse android.speech.tts.TextToSpeech.benutzen
Bis zum Android API Level 23 werden die folgenden locale unterstützt
  • en_US
  • de_DE
  • fr
  • es_ES
  • de
  • en
  • it_IT
  • it
  • en_GB
  • es
  • fr_FR

2- Text To Speech example

Erstellen Sie ein Projekt mit dem Name von  TextToSpeechDemo:
Die Interface bauen
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 fordert  Android API Level >= 21 deshalb sollen Sie in die File build.gradle (Module:app).konfigurieren

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()  {
       // Supported Languages
       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;
       }
       // Text to Speak
       String toSpeak = editText_text.getText().toString();
       Toast.makeText(this, toSpeak, Toast.LENGTH_SHORT).show();
       // A random String (Unique ID).
       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();
       }
   }


}
Die Applikation durchführen