Other/Unity

[Unity] REST API를 활용하여 Google Text to Speech 사용하기

개발왕 금골드 2020. 3. 25. 13:29
반응형

안녕하세요 골드입니다.

오늘은 Unity에서 Google Text To Speech를 사용하는 방법에 대해서 글을 쓰도록 하겠습니다.

Google에서 공식적으로 Unity에서 사용할 수 있도록 Text To Speech를 지원하고 있지는 않습니다.

다만 HTTP request POST방식을 활용하면 TTS를 사용할 수 있습니다.

모든 곳에 지원하기는 어려우니 REST API를 사용하는 방법으로 만들었다고 생각됩니다.

 

Text To Speech는 text 자료를 읽어주는 기능입니다.

Twitch 방송에서 도네이션을 하면 왠 여성분이 글을 읽어주는 것이나

사전에서 text를 입력하고 사운드 버튼을 누르면 발음을 들을 수 있는 기능이 Text To Speech입니다.

https://cloud.google.com/text-to-speech?hl=ko

 

Cloud Text-to-Speech - 음성 합성  |  Cloud Text-to-Speech API  |  Google Cloud

Cloud Text-to-Speech는 다양한 언어의 텍스트를 18가지가 넘는 자연스러운 목소리로 변환합니다.

cloud.google.com

사이트에 들어가면 직접 TTS를 사용할 수 있습니다. 

저는 Google을 사용했지만 Google 이외에도 AWS나 IBM의 Watson등이 있습니다.

1. Google Cloud 시작하기 

https://cloud.google.com/

 

클라우드 컴퓨팅 서비스  |  Google Cloud

Google Cloud를 통해 비즈니스를 혁신하세요. Google Cloud Platform으로 빌드하고 혁신하고 확장하세요. G Suite로 공동작업하고 생산성을 높이세요.

cloud.google.com

먼저 Google Cloud 서비스를 사용할 수 있는 아이디를 하나 만듭니다.

무료로 시작하기를 누르고 개인정보를 입력하면 Google Cloud 서비스를 사용할 수 있게 됩니다.

처음 1년은 무료로 대부분에 서비스를 이용할 수 있습니다.

 

그러나 금전전인 부분이 있으니 잘 읽어보고 사용하길 바랍니다.

 

완료되었다면 Google Cloud Service Console이 나타납니다.

복잡하게 뭐가 많습니다.

거기서 API 및 서비스 -> 사용자 인증 정보 -> API 키 생성을 클릭합니다.

키까지 생성하였다면 다음 단계로 넘어갑니다.

 

2. Unity에서 HttpWebRequest를 사용하여 REST API사용하기

HttpWebRequest는 유니티에서 HTTP 프로토콜을 사용할 수 있는 모듈식 시스템을 제공합니다.

과거에 WWW를 대신해서 HttpWebRequest는 웹 브라우저 백 엔드와 상호작용할 수 있도록 도와줍니다. 

https://kumgo1d.tistory.com/8?category=793448

 

[Unity] HttpWebRequest와 JsonUtility를 사용하여 웹 서버와 통신하고 POST 방식으로 json 데이터 가져오기

안녕하세요 골드입니다. 오늘은 Unity에서 웹 서버와 통신하여 json 데이터를 POST 방식으로 불러오는 방법에 대해서 글을 쓰도록 하겠습니다. 1. JSON 데이터 - JSON(JavaScript Object Nation)은 경량의 데이터..

kumgo1d.tistory.com

이미 포스팅한 적이 있습니다.

HttpWebRequest를 사용하여 JSON 데이터를 교환하는 방법으로 TTS를 사용할 예정입니다.

 

그럼 이제 Script를 하나 생성합니다.

이름은 TextToSpeech라고 짓겠습니다.

 


구글 클라우드 서비스를 사용하기 위해서는 인증이 반드시 필요합니다.

위에 작성한 1. Google Cloud 시작하기에 API 인증을 위해 access_token을 생성하는 방법을 참고해주세요.

https://blog.naver.com/PostView.nhn?blogId=lyw94k&logNo=221291115827&categoryNo=23&parentCategoryNo=0&viewDate=¤tPage=1&postListTopC

 

먼저 url 주소를 담는 string 변수를 선언합니다.

[YOUR_API_KEY]부분에 아까 만든 API 키를 복사 붙여넣기해서 넣어줍니다.

 

예를 들면

 

private string apiURL =

"https://texttospeech.googleapis.com/v1beta1/text:synthesize?key=[YOUR_API_KEY]";

 

입니다.

 


 

메서드를 생성해야 합니다만 그 전에

script 맨 위에

using System.IO;

using System.Net;

을 import합니다.

둘을 선언해야 JsonUtility, HttpWebRequest, StreamReader 등을 사용할 수 있습니다.

 

다음으로 메서드를 하나 만듭니다. POST 방식으로 웹과 통신하기 위한 메서드입니다.

//설명은 주석으로 작성하였습니다. 

먼저 JSON 형식에 맞춰서 작성한 Object 데이터를 http 프로토콜을 사용하여 통신해야 합니다.

해당 Object 데이터를 JsonUtility를 사용하여 string 데이터로 변환합니다.

이후 byte [] 형식으로 한번 더 인코딩합니다.

그 이유는 stream 형식으로 보내기 위해서는 byte여야 하기 때문입니다.

 

다음은 요청 보낼 주소에 대해서 정의합니다.

먼저 HttpWebRequest를 사용하여 우리가 통신할 주소값을 지정합니다.

지정된 HttpWebRequest 변수에 통신 방식, 형식, 길이 등을 추가합니다.

 

이후 stream 데이터를 보냅니다.

byte [] 형식의 데이터를 stream으로 통신 위치에 전송합니다.

길이를 정확히 명시해야 잘못된 값을 보내거나 남기지 않습니다.

Flush()를 하는 이유는 혹시라도 뭐가 남아있으면

다음에 사용할 때 그 값이 같이 나오기 때문입니다.

그렇기 때문에 Flush() 한 후 Close()를 해줍니다.

 

데이터를 요청했으면 응답 데이터를 받아야 합니다.

응답 데이터 역시 stream 형식이기 때문에 StreamReader로 읽어옵니다.

읽어온 stream 데이터는 다시 string값으로 변환한 후 리턴합니다.

 

 

다음으로 JSON데이터 형식에 맞춰서 요청을 보내야하기 때문에 

Google TTS 요청을 보내기 위해 JSON데이터에 대응하는 변수들을 선언합니다.

그 형식은 이렇게 생겼습니다.

 

이 형식에 맞춰서 변수를 선언하면 됩니다. 

스펠링에 주의하세요.

 

(저는 사용하지 않는 것들을 주석처리 했습니다.)

input 필드에서 text와 ssml을 사용할 수 있습니다. 둘 중 하나만 사용해야 하며, 한 가지는 반드시 사용해야 합니다.

SSML은 음성 합성 마크업 언어로 (사용하지 않는다면 주석처리 하세요.)

오디오 형식이나 끊어 읽기에 관한 세부정보를 입력할 수 있습니다.

 

voice 필드는 목소리에 관한 부분입니다. 

languageCode는 언어에 대한 설정입니다. 영어나 한국어 등 언어 설정을 "en-US", "ko-KR"과 같이 지정할 수 있습니다.

name은 목소리 이름?입니다. 사람마다 목소리와 말하는 방식이 다르듯이 구글에서도 네 가지 버전?이 있습니다.

https://cloud.google.com/text-to-speech?hl=ko 여기서 확인할 수 있습니다.

ssmlGender는 성별입니다.

 

audioConfig필드는 오디오 형식에 관한 부분입니다.

audioEncoding 오디오 인코딩 방식, speakingRate 말하는 속도, pitch 높낮이, volumeGainDb 크기 등이 있습니다.

 

마지막으로 통신이 제대로 이루어졌다면 string형식의 audioContent로 받게 됩니다.

audioContent는 base64로 인코딩된 string 값입니다.

audioContent를 사용하기 위해서 다시 base64로 디코딩해줘야 합니다.

 

이제 요청보낼 데이터 값을 입력합니다. 

틀에 맞게 원하는 값을 입력하면 됩니다.

해당 값에 대한 정보는 Google APIs 문서를 확인해주세요.

 

다음은 string 값을 byte array -> float array로 변환

base64로 디코딩한 바이너리 파일을 이용해서 audioClip을 만드는 부분입니다.

 

참고자료 : https://stackoverflow.com/questions/35228767/noisy-audio-clip-after-decoding-from-base64?noredirect=1&lq=1

 

이제 Start메서드 안에 작성한 Init()메서드와

CreateAudio() 메서드를 입력한 후 

Script 파일을 게임 오브젝트에 추가한 후 플레이합니다.

그 분의 목소리가 들립니다.

 

추가로 Unity AudioSource에서 Pitch를 0.6 정도로 해주셔야 익숙한 그 분 목소리가 들릴 것입니다.

안 그러면 너무 하이톤

 

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : https://cloud.google.com/text-to-speech/docs/reference/rest/v1/text/synthesize

 

Method: text.synthesize  |  Cloud Text-to-Speech API  |  Google Cloud

audioContent string (bytes format) The audio data bytes encoded as specified in the request, including the header for encodings that are wrapped in containers (e.g. MP3, OGG_OPUS). For LINEAR16 audio, we include the WAV header. Note: as with all bytes fiel

cloud.google.com

 

반응형