반응형


http://bit.ly/naver_android_tts_engine


이전에 안드로이드의 TTS엔진을 네이버의 음성 합성 Api를 사용해서 만든 적이 있었는데

얼마전에 AWS의 Polly에서 한국어를 지원한다고 해서 Polly버젼을 만들어 봄




https://android.googlesource.com/platform/development/+/master/samples/TtsEngine/src/com/example/android/ttsengine/RobotSpeakTtsService.java

코드는 전과 마찬가디로 구글의 샘플코드를 기반으로 Polly를 더할 예정




https://github.com/awslabs/aws-sdk-android-samples/tree/master/PollyDemo

aws의 샘플 앱도 있고 구조도 간단해서 이해하기 편함






간단히 구현에 대해 정리하자면



1. aws Cognito에서 자격 증명 풀을 만들고(자격 증명 풀 ID 메모)


2. 그 풀의 IAM 룰에서 Polly관련 정책을 넣어주고


3. gradle에 polly를 넣어주고



4. Demo앱에 있던 코드를 그대로 가져와서 풀 ID와 리전을 설정해주고



5. onCreate에서 인증을 해 두면 기본 준비는 끝




6. 사용할 수 있는 음성은 동적으로 호출이 가능

JSON형태로 리턴되는데 나중에 필요한건 Id값만(이름)



7. getPresignedSynthesizeSpeechUrl로 합성된 음성의 Url주소를 받아 오는 것으로 끝

(한국어 테스트를 위해 서연을 하드코딩중...)




8. 네이버 TTS Engine만들기에서는 mp3로만 출력이 되어서 안드로이드 안에서 디코딩을 하는 작업이 필요했는데

aws polly는 PCM으로 바로 출력이 가능함


하지만 16000Hz만 지원해서 음질이 조금 나빠지고

mp3 22050과 pcm의 16000의 용량 차이를 비교해 보진 않았지만

스마트폰의 데이터 용량에 미치는 영향도 생각해 봐야 할듯

(사실 네이버 엔진 만들때 이미 디코딩을 구현해놔서 사실 PCM으로 받을 필요는 없음...)









Polly의 음성

(web에서 테스트 출력한 파일)


안녕하세요. 만나서 반가워요. 감사합니다.


왠지 다 '~'가 붙는 느낌...

개인적으로 목소리 톤은 참 마음에 들음






하지만 문제점

(2017-11-26일 기준)




500m 부분이 그냥 생략 되어 버림...




영어를 못함...








하지만 장점

어휘나 SSML태그를 사용해서 커스텀 마이징이 가능

예를 들어 음성 합성을 하는 일본인 캐릭터가 있는데 정작 자기의 한자 이름을 못말한다던지의 문제점이 발생할때

저런 어휘를 지정하는 기능은 필수적일듯


SSML태그는 문장 중간중간에 속도를 조정한다던지의 커스텀이 가능한데

노력이 좀 필요해 보이지만 E-Book같은곳에서 사용되면 정말 좋아 보임




엄청나게 많은(상대적으로) 무료 제공량...

(물론 넘어가면 바로 결제되는 aws시스템... CloudWatch로 그나마 과금을 최소화 한다던지...)










결론

무료 글자수 제한도 넉넉하고

실제로 이용하려고 할때 제휴신청보다 그냥 결제하면 되니 편하고


네이버는 규리의 음성은 비공개 중이니

음성이 가장 좋다고 할 수 있는데


영단어만 좀...

 






반응형
반응형

쭉 사용하면서 발생한 문제들을 정리와 해결(땜빵...)






===== 2017-05-27 확인 =====

괄호 생략 문제



(테스트)

입력을 했더니

responseCode:500 {"errorMessage":"Internal server errors","errorCode":"VS99"}

서버 에러가 발생

네이버 번역기에서도 마찬가지로 에러 발생



1(테스트)2

로 테스트를 했더니 중간은 무시하고 십이 로만 결과가 나옴


1. 네이버 TTS는 괄호 안에 들어있는 내용은 음성 출력을 안함


(테스트)의 경우 괄호를 무시했더니 아무것도 출력 할 내용이 없어서 서버 에러로 출력한 것으로 보임



해결(땜빵)

replace("(", "");


...


괄호를 부수어서 출력이 되도록 변경


알라딘 ebook앱에도 괄호 안 내용은 생략하기 기능이 있는데

개인적으로는 생략할 이유가 없기에 무조건 다 출력하는 방법으로 충분함

만약 생략을 하고 싶으면 TTS서버에 전송하기 전에 괄호를 빼면 내용이 남는게 있는지 검증을 한 후에

서버에 요청을 하면 될것으로 생각









===== 2017-05-27 확인 =====

일본어 장음 히라+가타카나 조합 문제



膝がァァァ

라는 소설의 구절에서 서버 에러가 발생

네이버 번역기에서도 마찬가지로 에러 발생



膝が

ァァァ

두개를 분리해 보니 ァァァ에서 에러가 발생



がぁぁぁ

ガァァァ

둘다 정상적으로 출력



ァ이 붙으면 앞의 글자에 따라

サァ - 사아-

タァ - 타아-

カァ - 카아-

ハァ - 하아-


같이 길게 발음이 되어야 하는데


膝がァァァ의 상황에서

형태소 보고 ァ의 앞글자가 히라가나인걸 보고 膝が와 ァァァ를 별도로 보고

부모 없이 ァァァ --- 장음 소리를 만들어야 해서 에러가 나온것으로 추정


일단은 이번 땜빵은 좀 애매한데 

1.가타카나를 전부 히라가나로 바꾸거나...

예문 내용은 '무릎ㅇㅣㅣㅣ!' 같은 소리지르는 부분인데

일본어로 히자ㄱㅏㅏㅏ  가 되어야 정상


전부 히라가나로 바꾸면 히자가 가 되어버리고

전부 가타카나로 바꾸면 저 문장은 히자ㄱㅏㅏㅏ 같이 잘 나오지만

다른 문장에서의 부작용이 너무 큼

사실 가타카나->히라가나도 부작용이 있음



1.장음 앞을 변경


아직 테스트해보지 않고 지금 글로 정리하면서 떠오른 거지만

replace("がァ", "ガァ"); 같이 바꾸어 주는것도 방법일것 같다.

물론 아카사타 등등 * 아이우에오로 가짓수가 꽤 많을것 같지만...








부족한 쿼리 제한

사실 문제는 아니지만 원래 TTS 엔진으로 만들려고 한

개인적인 이유는 소설책을 읽기 위함이였는데

소설을 읽기에는 쿼리량이 너무 적어서 한 챕터를 다 못 읽고 제한이 걸려버린다...ㅠㅠ


그렇다고 개인에게는 제휴로 쿼리 제한이 풀리지도 않을것 같고...



반응형
반응형


English

Hello. Nice to meet you

Japanese

初めまして。どうぞよろしく。

Chinese

您好,见到您很高兴。

Korean

안녕하세요. 만나서 반가워요



어느게 더 좋다는 취향의 차이도 있겠지만

네이버의 소리가 훨씬 자연스럽다.

대신 구글쪽 소리는 각이 진? 느낌의 소리지만 명확히 들려 잘 알아듣는게 많은 것 같다.(일본어 기준)


무엇보다의 차이는 구글의 안드로이드 TTS는 오프라인으로의 재생이 가능해

네이버보다 빠를 수 밖에 없다. 데이터 요금도 걱정되고...

그리고 네이버 Clova api에서는 웨일 브라우저에서 제공하는 kyuri의 음성을 제공하지 않는게 가장 아쉬운점




Google TTS from Android

https://play.google.com/store/apps/details?id=com.google.android.tts


Naver Clova

https://developers.naver.com/docs/labs/tts/

반응형
반응형

네이버 TTS api에는 한국어, 영어, 일본어, 중국어를 지원



CheckVoiceData클래스와

onIsLanguageAvailable(String lang, String country, String variant) 에서 지원 언어를 추가해 준 후




request에 있는 언어 정보로 speaker를 변경

(남자는 무시한다.)





이제 정말로 끝! 이라고 생각했는데

이때까지는 yuri로 일본어만을 테스트 하였는데

한국어로 변경하니 고음이 발생하였다.


...


분명 저음이 나오는 경우가 있었는데...





일본어와 영어는 24000Hz로 출력이 되는데

한국어와 중국어는 16000Hz로 출력이 됨



역시 간단히 분기해서 별도로 초기화 하도록 변경하고 끝




******

솔직히 네이버 TTS api의 영어, 일본어는 정말 좋은데

한국어는 좀... 별로다

음질도 좀 아쉽고 발음이 꼭 수능의 국어 듣기 시간처럼 너무 정확하지만 재미가 없다

(네이버 TTS가 처음 나왔을 때 사전 발음 듣기로 나왔던 걸로 기억으로하는데 아무래도 정확한 발음에 초점을 맞춘듯 하다)


한국어 중국어는 버젼1 같은 느낌이고

일본어 영어는 더 발젼된 형태로 개발된 느낌이다


추가로 네이버의 웨일 브라우저의 내장 TTS의 음성은 mijin의 음성이 아니라

훨씬 발전된 형태의 음성이 나온다.



지금 다시 확인해보니 중국어도 24000Hz였다.... 그사이 업데이트 된건가?

******


반응형
반응형



애써 눈을 돌렸지만 네이버 TTS api의 mp3를 디코딩을 해야 하므로




mp3spi(LGPL)을 사용해서 디코딩 하기로





네이버 TTS api에서 데이터를 받아 오는건 정말 예제 그대로 사용



그리고 디코딩...



끝!


역시나 삽질을 좀 했지만 생각보다 빨리 끝났다.






반응형
반응형


먼저 네이버api로 데이터를 받아서 바로 콜백으로 적어주면 될 줄 알았는데

api에서 제공해주는 데이터는 mp3로밖에 출력이 안되는걸 발견

mp3는 암축되어있기에 바로 사용하지 못하고 디코딩 하는 과정이 필요함


...


일단 출력이 정말 제대로 되는지를 먼저 테스트하기로 하고

컴퓨터에서 수동으로 wav로 변환하고 raw에 넣고 그 파일로 음성을 출력 해 보기로




(이전 코드를 정확히 복원하지 못해서 이런 형태로...)

(callback.audioAvailable()에 write함)




...



사운드가 나오고 확실히 뭔가의 단어를 말하고는 있는데

괴상한 사운드가 나온다.


일단 하나씩 문제를 해결하기 위해

테스트에 사용한 음성 파일부터 다시 살펴보았다.




16bit 24000Hz mono인데




16000hz로 초기화를 하고 있었음


낮은 음정으로 재생되는 문제 해결





생각해보니 wav파일을 그대로 사용하고 있었음


파일의 헤더부분을 스킵하고 출력함


재생 초기에 탓 하고 이상한 소리가 들리는 문제 해결




마지막으로 큰 문제는 음성이 중간중간 끊어지는 문제가 발생

ㅌ'ㅔ'ㅅ'ㅡ'ㅌ'ㅡ 같은 느낌으로 음이 끊겨서 들림


다행히 스택오버 플로우에 같은 현상에 대한 답변이 있었고

24000hz이하면 *2 mono면 *2로 건너 띄면서 파일을 읽어야만 했다.



음성 재생중에 툭툭 끊기는 문제 해결





일단 출력 부분은 이걸로 형태를 다 잡았다.







반응형
반응형

안드로이드 TTS에 대해 검색해도 보통 앱에서 글자를 읽어주는걸 설명하지 엔진 만드는거에 대한 자료는 적었다.


https://android.googlesource.com/platform/development/+/master/samples/TtsEngine/src/com/example/android/ttsengine/RobotSpeakTtsService.java



그러다 구글 샘플을 발견!

sdk14버젼의 샘플이지만 개인적으로 충분하기에 바로 코드를 살펴보기로



지원 언어에 대한 반환을 하고...



사실상 이 함수 하나가 핵심이고 끝 (앱의 99%)


콜백으로 텍스트가 오면 이 샘플이 글자마자 주파수로 버퍼에 적어주기만 하고 있는,

실제로 돌려보지 않아도 정말 로봇같은... 아니 r2d2보다 수준 낮아보이는 사운드가 나올 거라는 상상이 들게하는 샘플이지만

그만큼 정말 단순하고 알기 쉬운 샘플!






다음은 네이버쪽을 조사



그냥 복사해서 붙여넣기만 해도 바로 되는 정말 친절한 샘플 코드와

몇가지 변수에 대한 rest api정보 설명


api이름이 Clova로 변경되어서 TTS api가 어디있지? 하고 찾았던게 가장 어려웠던 일이였을 정도





너무 쉽게 일이 풀려서 오히려 당활할 정도...

그리고...


3편에?





반응형
반응형

개인적으로 눈이 불편하다보니 핸드폰으로 글을 읽을 때에는 TTS기능을 사용하길 좋아합니다.




일본의 웹소설도 즐겨 보기에 인코딩이나 언어설정을 좀 편하게 앱을 만들기도 하고

https://play.google.com/store/apps/details?id=com.limecolor.ttstxtreader&hl=ko

(개인적으로 사용하기 위해 만들다 보니 메모리와 버그들이 많지만...)


알X딘에서 구입한 책도 거의 TTS로만 읽고 있습니다.




 안드로이드의 구글 TTS의 발음은 정말 좋습니다.

하지만 네이버의 일본어 발음은 정말 좋았습니다.

http://limecolor.tistory.com/entry/%EA%B5%AC%EA%B8%80-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%84%A4%EC%9D%B4%EB%B2%84-Clova-TTS-%EB%B9%84%EA%B5%90


인터넷이 안되면 사용을 못한다는 약점이 있지만

네이버의 api를 사용해서 텍스트를 들을 수 있도록 TTS엔진으로 만들려고 합니다.



(유진님 수진님 민준님에게는 죄송하지만 구글의 발음을 선호합니다.)


반응형

+ Recent posts