본문 바로가기

프로그래밍/안드로이드

안드로이드 스튜디오 자바 구글 tts 사용하기

728x90
반응형

간단하게 안드로이드 스튜디오에서 구글 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

 

TextToSpeech  |  Android Developers

 

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도 같이 종료시켜줍니다

 

 

728x90
반응형