안드로이드 스튜디오에서 구글 tts로 쉽게
원하는 텍스트를 소리로 변환하는 방법을 알아보겠습니다.
<?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">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TTS로 변환할 Text를 입력하세요"
android:layout_marginTop="200dp"
app:layout_constraintBottom_toTopOf="@id/etTTS"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/etTTS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:minWidth="300dp"
app:layout_constraintTop_toBottomOf="@id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<Button
android:id="@+id/btnExecute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="변환"
app:layout_constraintTop_toBottomOf="@id/etTTS"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="50dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

실제로 원하는 텍스트를 변환하기 위한 입력 양식을 생성합니다.
package com.zynar.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText etTTS;
private Button btnExecute;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etTTS = findViewById(R.id.etTTS);
btnExecute = findViewById(R.id.btnExecute); // binding을 사용해도 되고 지금은 아주 간단하게 설명만 할거라서 pass
}
}
주요 활동의 기본 화면 프레임은 다음과 같이 생성되었습니다.
https://developer.android.com/reference/android/speech/tts/TextToSpeech
음성 출력 | 안드로이드 개발자
developer.android.com
먼저 매니페스트에 코드를 작성합니다.

<action android:name="android.intent.action.TTS_SERVICE" />
그리고 tts 클래스를 만들어 봅시다

코드를 입력하는 곳에 TextTo만 입력하면 이렇게 사용할 수 있는 클래스가 보입니다.
나는 그것을 상속하고 중복 코드를 최소화하려고합니다.
package com.zynar.myapplication;
import android.content.Context;
import android.speech.tts.TextToSpeech;
import java.util.Locale;
public class MyTTS extends TextToSpeech {
public MyTTS(Context context, OnInitListener listener) {
super(context, listener);
this.setPitch(1.0f); // 음성의 높낮이 설정
this.setSpeechRate(1.0f); // 음성의 속도 설정
this.setLanguage(Locale.KOREA);
}
public void speak(CharSequence text) {
this.speak(text, TextToSpeech.QUEUE_FLUSH, null, "id1");
}
public void destroy() {
this.stop();
this.shutdown();
}
}
TextToSpeech 클래스를 상속받아 MyTTS 클래스를 만들었습니다.
리스너는 꼭 필요한 것은 아니지만 상속받을 때 사용해야 한다고 해서 포함시켰습니다.
package com.zynar.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.widget.Button;
import android.widget.EditText;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private EditText etTTS;
private Button btnExecute;
private MyTTS tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etTTS = findViewById(R.id.etTTS);
btnExecute = findViewById(R.id.btnExecute); // binding을 사용해도 되고 지금은 아주 간단하게 설명만 할거라서 pass
tts = new MyTTS(this, null); // tts 클래스 생성
btnExecute.setOnClickListener(v -> tts.speak(etTTS.getText().toString())); // tts 실행 버튼 리스너
}
@Override
protected void onDestroy() {
super.onDestroy();
tts.destroy();
}
}
메인 액티비티 코드에서 내가 만든 MyTTS 클래스 선언
버튼 클릭 리스너의 EditText에서 텍스트를 호출하고 새로 생성된 speak 메소드에 붙여넣어 소리로 변환합니다.
종료되면 tts도 종료됩니다.
