Android Uygulamalarda Text to Speech Kullanımı

Text to Speech, Android uygulamalar için kullanıcı deneyimini artırmaya yönelik en önemli kütüphanelerdendir. Kullanıcıların deneyimini artırmak dışında geliştiricilerinde uygulamalarda daha farklı fikirler ortaya koymasına da birçok kapı açmıştır. Örneğin, yüksek kullanıcı kitlesine sahip Google Translate uygulamasında yapılan çevirinin seçili dile göre okutulması kullanıcı deneyimini yüksek miktarda artırmaktadır.

Bu makalemizde text to speech özelliğine ait bir örnek proje oluşturup, kütüphanenin sunduğu fonksiyonlara bağlı olarak dil değişikliği, okuma hızı ve vurgu seviyesine göre denemeler gerçekleştireceğiz.

Örnek Android TTS Projesi Oluşturulması

Hazırlayacağımız örnekte basit bir editText alanı ile kullanıcının dinamik olarak içerik girebilmesi ve sonrasında girilen içeriğin eklenecek butona tıklanıldığında okunabilmesi hedeflenmektedir.

1. File => New Project seçeneğine tıklayalım. Sonrasında açılan ekranda Empty Activity seçeneğini seçip Next butonuna tıklayalım. 
2. Bir sonraki ekranda uygulamanın ismini, paket adını ve kayıt edileceği dizini belirleyelim. İsterseniz uygulamanın adını SampleTTS, paket ismi olarak ise info.yazilimdersi.sampletts olarak belirleyelim.
3. Bu işlemler sonrasında oluşan MainActivity dosyasına TextToSpeech.OnInitListener interface'ni aşağıdaki şekilde implement edelim.
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
4.Interface implementasyonundan sonra zaten uygulama bize onInit(int) metodunu implement etmemize yönelik uyarı vermektedir. Aşağıda bulunan kodlamayı MainActivity sınıfına yapıştıralım.
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
    private TextToSpeech textToSpeech;
    private Button speakButton;
    private EditText textEditText;

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

        textToSpeech = new TextToSpeech(getApplicationContext(), this, "com.google.android.tts");

        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        speakButton = (Button) findViewById(R.id.speakButton);

        textEditText = (EditText) findViewById(R.id.textEditText);

        speakButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                speakOut();
            }

        });
    }

    @Override
    public void onDestroy() {
        // Don't forget to shutdown tts!
        if (textToSpeech != null) {
            textToSpeech.stop();
            textToSpeech.shutdown();
        }
        super.onDestroy();
    }

    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {

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

            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS", "Bu dil desteklenmemektedir");
            } else {
                speakButton.setEnabled(true);
                speakOut();
            }

        } else {
            Log.e("TTS", "Initilizationda sorunla karşılaşıldı!");
        }
    }

    private void speakOut() {

        String text = textEditText.getText().toString();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Bundle bundle = new Bundle();
            bundle.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_MUSIC);
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, bundle, null);
        } else {
            HashMap param = new HashMap<>();
            param.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, param);
        }

    }
}

Kodlamada eklenen kodları dilerseniz adım adım inceleyelim.

textToSpeech = new TextToSpeech(getApplicationContext(), this, "com.google.android.tts");
kullanılacak olan TTS objesinin tanımlanması gerçekleştirilmektedir. Interface kullanılarak sınıfta onInit() metodu ilmeplement edildiği için this parametresi kullanılmıştır.
setVolumeControlStream(AudioManager.STREAM_MUSIC);
metodu ile uygulamanın audio kontrolunu alması sağlanmaktadır.
int result = textToSpeech.setLanguage(Locale.US);
metodu ile de seslendirmede kullanılacak olan dili setlememiz sağlanmaktadır. Şu anda ne yazıkki Türkçe dil desteği henüz default olarak TTS kütüphanesine eklenmemiştir. Ancak Almanca, Fransızca, Çince, Korece gibi farklı dilleri setleyebilirsiniz.
private void speakOut() {

        String text = textEditText.getText().toString();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Bundle bundle = new Bundle();
            bundle.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_MUSIC);
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, bundle, null);
        } else {
            HashMap<String, String> param = new HashMap<>();
            param.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, param);
        }

}
speakOut() metodunda gördüğünüz üzere iki farklı Android SDK versiyonuna göre seslendirme çalışmaktadır. Android Lollipop ve üzeri versiyonarda Bundle uzerinden textlerin iletimi sağlanmaktadır. 5. Uygulamanın arayüz dosyası olan activity_main.xml dosyasına aşağıdaki kodlamayı yapıştıralım.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/icon_app_logo" />

        <EditText
            android:id="@+id/textEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World!" />

        <Button
            android:id="@+id/speakButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/speak" />

    </LinearLayout>


</androidx.constraintlayout.widget.ConstraintLayout>
Böylelikle uygulamamızı tamamlamış olduk. Burada söz etmemiz gereken iki önemli fonksiyon bulunmaktadır.
  • setPitch: Bu metod ile konuşma sırasındaki vurgu seviyesini ayarlayabilirsiniz.
  • setSpeechRate: Bu method kullanılarak konuşma hızını ayarlayabilirsiniz. Default olarak 1 seviyesindedir. Ancak konuşmanın daha hızlı olmasını isterseniz bunu 2 veya 3 olarak setlemeniz yeterli olacaktır.
Son olarak uygulamaya ait arayüz aşağıdaki şekildedir;

comments powered by Disqus