상세 컨텐츠

본문 제목

[안드로이드 코틀린] TextToSpeech 텍스트(Text)를 음성으로 전환시켜주는 방법

안드로이드

by aries574 2022. 7. 8. 11:07

본문


이번 시간에는 입력한 텍스트를 입력하면 음성으로 전환하는 방법에 대하여 알아보겠습니다.


목차

1. 실행 화면
2. 메인 화면 구현 activity_main.xml
3. 메인 코드 구현 MainActivity.kt


1. 실행 화면


2. 메인 화면 구현 activity_main.xml

- 설명 -

1. 음성으로 전환할 메시지 입력 EditText

2. 음성으로 전환하는 기능 Button

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <EditText
        android:id="@+id/speech_text"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:hint="메시지를 입력하세요" />

    <Button
        android:id="@+id/speech_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/speech_text"
        android:layout_centerHorizontal="true"
        android:text="음성 전환" />

</RelativeLayout>

 


3. 메인 코드 구현 MainActivity.kt

- 설명 -

1. ACTION_CHECK_TTS_DATA

  언어 데이터 체크

2. TextToSpeech

  음성전환 초기화

3. LANG_MISSING_DATA 

  언어 데이터 누락

4. LANG_NOT_SUPPORTED

  지원되지 않는 언어

class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener{//MainActivity

    lateinit var speechText: EditText
    lateinit var textToSpeech: TextToSpeech

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //입력창
        speechText = findViewById(R.id.speech_text)

        //음성전환 버튼 이벤트
        val speechBtn: Button = findViewById(R.id.speech_btn)
        speechBtn.setOnClickListener {

            val intent:Intent = Intent()
            intent.action = TextToSpeech.Engine.ACTION_CHECK_TTS_DATA
            activityResult.launch(intent)
        }

    }//onCreate

    private val activityResult: ActivityResultLauncher<Intent> = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()){

            //보이스가 있다면
            if(it.resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){

                //음성전환 준비
                textToSpeech = TextToSpeech(this, this)

            }else{ //없다면 다운로드
                //데이터 다운로드
                val installIntent: Intent = Intent()
                installIntent.action = TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA
                startActivity(installIntent)
            }
        }

    //TextToSpeech 엔진 초기화시 호출되는 함수
    override fun onInit(status: Int) {

        if(status == TextToSpeech.SUCCESS){

            //언어값
            val languageStatus: Int = textToSpeech.setLanguage(Locale.KOREAN)

            //데이터 문제(데이터가 없거나 언어를 지원할 수 없다면)
            if(languageStatus == TextToSpeech.LANG_MISSING_DATA ||
                languageStatus == TextToSpeech.LANG_NOT_SUPPORTED){
                Toast.makeText(this, "언어를 지원할 수 없습니다.",
                    Toast.LENGTH_SHORT).show()
            }else{ //데이터 성공
                //입력값 변수에 담기
                val data: String = speechText.text.toString()

                var speechStatus: Int = 0

                //안드로이드 버전에 따른 조건(롤리팝보다 같거나 높다면
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    speechStatus = textToSpeech.speak(data, TextToSpeech.QUEUE_FLUSH,
                        null, null)
                } else {
                    speechStatus = textToSpeech.speak(data, TextToSpeech.QUEUE_FLUSH,
                        null)
                }


                if(speechStatus == TextToSpeech.ERROR){
                    Toast.makeText(this, "음성전환 에러입니다.",
                        Toast.LENGTH_SHORT).show()
                }
            }
        }else{ //실패
            Toast.makeText(this, "음성전환 엔진 에러입니다.",
                Toast.LENGTH_SHORT).show()
        }
    }
}

2022.07.01 - [안드로이드] - [안드로이드 코틀린] DrawerLayout Navigation 만드는 방법 part1 - 화면 만들기

 

[안드로이드 코틀린] DrawerLayout Navigation 만드는 방법 part1 - 화면 만들기

이번에는 옆으로 밀면 숨겨져 있는 메뉴를 보여주는 DrawerLayout 화면 만드는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. 테마 설정 4. 툴바 화면 만들기 toolbar_layout.xml

aries574.tistory.com

2022.06.14 - [안드로이드] - [안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

 

[안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

앞으로 TabLayout을 직접 만들어 애니메이션 기능까지 넣어보도록 하겠습니다. 이번 시간에는 화면 구성 및 설정을 만들어 보겠습니다. 목차 1. 실행 화면 2. dataBinding 설정 build.gradle 3. 테마 변경 t

aries574.tistory.com

2022.06.03 - [안드로이드] - [안드로이드 코틀린] ViewModel - 화면 회전 시 데이터 초기화 막는 방법

 

[안드로이드 코틀린] ViewModel - 화면 회전 시 데이터 초기화 막는 방법

 이번 시간에는 이전 포스팅에 이어서 화면 전환 시 데이터가 초기화되는 현상을 막는 방법에 대하여 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.06.02 - [안드로이드] -

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역