Tistory View

Android Develop/tts

tts 사용

God Dangchy What should I do? 2017. 10. 6. 09:14

TTS 설정에 관한 내용은 다음의 링크를 참고하세요.

https://jamssoft.tistory.com/45

 

TTS 사용 / TTS 설정 #1

TTS(Text to speech)를 필자가 처음 본 것은 1989년도 였습니다. 영어만 되기 했지만, 지금 사용하는 TTS와 비교해보면, 어떻게, 그 옛날에 "어떻게 이 걸 만들어 낸 사람이 있으며, 어떻게 이 걸 만들 생각을 했..

jamssoft.tistory.com

 

안드로이드 TTS 프로그래밍

변경사항 : 너무 대충정리한 거라.. 올바르지 않는 부분이 많을 수 있다.

  API 4(DONUT)

  TTS지원시작

API 8(FROYO)

areDefaultsEnforced : 사용자 설정을 변경하는 기능이 있었던 건 같은데..

API 13 

NDK에서 지원시작..

API 14(ICS)

Engine설정가능...?

API 15

progress interface추가

API 18

최대길이 추가됨

API 21

Voice 객체방식으로 변경

File 객체를 이용한 처리가능(이전에는 실제 파일을 작성해야 했지만.. 이제 File에서 상송받는 객체등을 사용가능.. 즉, 메모리맵도 이용가능하짐)

 

 

 

 

 

필자가 프로그램을 짜는 과정에서 때로는 굳이 스마트장치의 화면을 보지않고 말로만으로도 앱의 상황을 알려주면 좋겠다는 생각을 많이 했었다.

예를 들어 RSS를 이용하여 최신 뉴스를 제목만이라도 읽어주면, 사용자는 그냥 귀만 열고 있으면, 최신 뉴스를 인지 할 수 있다.

굳이, 최신뉴스를 찾아 읽어볼 필요가 없게 된다. 마치 라디오를 틀어 놓는 효과[다른 일은 계속 할 수 있다]를 누려보자는 것이다.

 

 

또 하나, 사용자가 스마트장치의 화면을 볼 수없는 경우, 대표적으로 시각장애인이 있겠지만, 만원 지하철에서 휴대폰을 주머니에서 꺼내지 않고도 내용을 알 수 있다.

실제 필자가 특정사이트에서 RSS를 이용하여 최신글을 TTS로 읽는 application를 만들어 사용하기도 했다.(특히 선착순 이벤트 있을 때.. 좋다..)

 

 

안드로이드 장치에서는 이미 예전(2009년)부터 TTS기능을 지원하고 있어서 그냥 사용하기만 하면 된다는 좋은 점이 있다.

TTS를 직접만든다는 것은 정말 많은 시간이 필요한 작업인 데, 이 기능을 즉시 사용할 수 있다는 것은 정말 좋으면서 다행인 점이다.

 

 

API4의 TTS를 직접 사용해 보지는 않았지만..(이 걸로 된 장치를 구할 수나 있을 지 모르겠다), API4의 기능만으로도 상당히 만족할 만한 결과를 얻을 수 있다.

TTS가 아닌 다른 기능들은, 쓰려고 해도 아직 충분치 않는 부분이 많아 그냥 포기하거나, 낑낑대면서 프로그램을 작성하는 경우가 많았지만, 실제 충분히 사용할 만한 수준이 이미 API4에 되어있으니, 이제 쓰기만 하면 된다. 게다가 LOLLIPOP(API21)까지 버전이 올라갔지만 API4와 비교하여 획기적인 변화가 없을 정도(있기는 있다)로 초기버전이 잘 만들어져 있어서 참 다행이다.

 

 

NDK가 API13(2011년)에서 부터 지원하는 점은 좀 많이 아쉽기는 하다. 하지만 이전버전의 경우 NDK에서 Java call로 처리가 가능하므로 문제는 없다.

 

 

 

 

TTS 프로그래밍 순서.

 

1. TextToSpeech instance를 생성한다.

이 때 Callback interface를 꼭 지정해야 한다.

생성시 TTS엔진이 초기화가 되며, 초기화가 실패든 성공이든 완료되면 지정한 Callbak함수가 실행된다.

이 Callback함수를 통해 실제 TTS를 사용가능한지 불가능 한지를 판단할 수 있으므로, 실제 TTS의 기능은 이 함수가 호출된 이후에 사용하여야 한다.

객체 만들어 졌다고, 막 사용하면 안된다. 실패하는 이유중에 하나가 다른 앱에서 사용중일 경우가 많으므로 꼭 정확한 처리를 위해 명확히 구현되어야 한다.

 

Callback함수는 비동기로 처리된다.

TTS를 초기화하는 것에는 시간이 좀 걸리는 작업인 듯하다. google측에서 이 부분을 MainThread가 멈추는 것을 방지하기 위해 이렇게 만들어 두었으니, 어쩔 수 없이 따를 수 밖에 없다.

 

 

2. TTS를 이용하여 소리를 출력한다.(또는 파일로 음성파일을 생성한다.)

 

옵션사항을 설정한다.(기본값을 그대로 사용할 경우 넘어가면 된다.)

-. 일단 어떤 언어를 사용할 것인지, 지정

-. 남성, 여성목소리 지정

-. 속도와 음 높이(이거 안되는 게 꽤 있다)지정

 

 

위의 언어설정이나 목소리, 속도등은 특별할 상황이 아닌 경우 기본값을 그대로 사용하는 것이 좋다. 이는 사용자가 자기가 가장 듣기 좋게 만들어 둔 것이니, 개발자 맘대로 바꾸는 것은 그리 좋은 생각이 아니다.

 

speak함수와 synthesizeToFile함수를 사용하여 실제 소리를 내거나, 음성파일로 출력한다.

 

소리를 만들어 내는 것(이후 synthesize)도 상당한 시간이 걸리는 작업으로 speak함수와 synthesizeToFile함수 또한 비동기로 처리된다.

따라서 끝나는 시점을 알아내기위해서는 setOnUtteranceCompletedListener함수(API4)나 setOnUtteranceProgressListener함수(API15)를 이용하여야 한다.

 

text를 분할하여 처리해야 하는 경우가 대부분 발생하는 데, 이는 speak, synthesizeToFile함수의 queueMode파라미터로 처리한다.

 

queueMode의 값은 QUEUE_ADD와 QUEUE_FLUSH로 두가지 값이 있다.

 

QUEUE_ADD는 현재 처리되고 있는 것에 이어서 추가되는 것이며,

QUEUE_FLUSH는 현재처리되는 것을 없애 버리고 처리되는 것이다.

 

이 2번의 작업을 필요한 만큼 계속하면 된다..

 

 

3. 사용이 끝나면 shutdown함수를 이용하여 TTS instance를 제거한다.

 

꼭 제거해야 한다. "다른 앱에서 얼마나 쓴다고 내가 독점할래~"하는 생각은 절대 하지 말아야 한다.

TTS는 매우 한정된 자원이라, 빨리 쓰고 최대한 빨리 자원을 반환 해야 한다.+1

 

 

Activity의  종료시점(onDestory)에 처리하는 경우가 많은 데, 제작하는 앱이 TTS를 주력으로 하는 앱이 아니라면, 

필요시 instance를 만들고 작업 후 즉시 자원을 반납하도록 작성하는 것이 좋다.

계속 쥐고 있는 것은 다른 앱에서 TTS를 사용하지 못하게 될 수 있다.

 

 

 

 

이 게 끝이다. 정말 쉽게 되어있다.

 

 

예제는 다음 글에서 상세히 다루도록 하겠다.

 

 

 

 

기타 알아 둘 사항

 

1. TTS엔진 선택

장치에 여러개의 TTS엔진이 있을 경우 필요한 것을 선택하여 쓸 수 있게 하는 것은

API14(ICS)이전에는 어려운 작업이었다.(안될 수도 있다.)

그냥 포기하고 기본 엔진쓰기를 권장한다.

 

 

2. speak, synthesizeToFile함수의 변경사항

LOLLIPOP에서 synthesizeToFile함수는 File instance를 넘길 수 있다.(기존함수는 Deprecated되었다.)

 

File을 memory로 지정해서 사용할 경우 보다 빠른 처리가 가능해졌다.(테스트는 안해봐서..;;)

이전에는 파일이름을 직접주는 것이었는 데, 이는 느린 파일로 꼭 저장이 되어 다시 불러와 사용해야만 했다.

 

또한 speak함수를 사용해도 progress기능을 이용하여 음성데이터를 바로 추출할 수도 있다.(이것도..테스트는 안해봐서..;;)

 

 

이 기능이 너무 늦게 추가된 것은 좀 아쉬운 부분이다.

 

 

FAQ

Q : 태블릿을 하나 싸게 샀는 데.. picoTTS만 깔려 있어여~ 한글이 않나와요ㅠㅠ

A : playstore에서 google TTS를 설치하고 필요한 언어를 깔아 설정하면 된다. 왠만하면 다 된다. 땡큐 구글~

만약에 샘슝장치를 사용하고 있다면 샘슝에서 제공하는 고품질의 TTS데이터를 사용할 수 있다.(용량대따 크다, 소리가 더 부드럽다.)

또한 사용자에게도 설치하다록 유도해야한다.

 

Q : 책한권을 다 때려 넣었더니 소리가 않나요.

A : TTS의 최대길이를 확인하는 것이 좋다.

최대길이는 getMaxSpeechInputLength함수로 알 수 있는 데.. 이게 API18[JELLYBEAN_MR2]부터 지원되는 거라..

소스를 확인해 본결과 4000자(글자수 인듯 하다)로 되어있다. 필자가 확인한 소스가 4000자 일뿐, 

안전을 위해(?) 500자 미만으로 사용하기를 권장한다.

 

Q : 텍스트 소스가 여러언어로 되어있어요. 소리가 아예 안나거나, 안나오는 부분이 있어요.

A : 사용자에게 추가 음성파일을 설치하도록 유도하는 것이 제일 좋다.

Web에서 TTS처리를 해주는 서비스가 있기는 한데..(젠장 구글이 그냥 닫아 버리는 바람에..)

트래픽발생이 일어나니.. 그냥 사용자에게 설치하도록 하는 게 제일 좋을 듯 하다.

 

Q : 영어로된 문서를 넣었더니 한국사람이 영어발음 하는 것처럼 들려요.

A : setLanguage함수를 이용하여 영어로 바꾸면 된다. 영어인 부분과 한글인 부분을 나누어 setLanguage로 바꿔가면서 처리하는 것도...

 

 

 

 

TTS API Reference

https://developer.android.com/reference/android/speech/tts/TextToSpeech.htm

 

Android Developers Blog

https://android-developers.googleblog.com/2009/09/introduction-to-text-to-speech-in.html

- TTS데이터가 없는 경우 설치유도용 코드가 있다.

- Locale설정에 대한 부분이 있다..

 

 

 

 

+1 : TTS는 매우 제한된 자원이다. 버전이 올라가면서 좋아 지겠지만, 상당히 오래 걸리는 작업이며, 특히, 늘 TTS기능을 켜고 사용하는 시각장애인의 경우 장치를 아예 사용 못하게 하는 경우까지 발생할 수 있다. 

 

 

 

 

'Android Develop > tts' 카테고리의 다른 글

tts를 static함수로 만드는 데 실패했다.  (0) 2017.10.07
tts 사용  (0) 2017.10.06
Replies
Reply Write