tts와 안드로이드 스튜디오 자바 구글

안드로이드 스튜디오에서 구글 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도 종료됩니다.