'Small Devices'에 해당되는 글 125건

  1. 2018.08.28 [Tinker Board S] AI 스피커 만들어보기 #3 : 음성합성 해보기
반응형

본 체험 제품은 아이씨뱅큐(주)에서 진행하는 무상 체험단 활동으로 작성한 것입니다.


 이전 포스팅에서는 Hot-Word Detection과 음성인식에 대해서 알아보았습니다. 이번에는 Text를 음성으로 바꾸어주는 음성 합성(TTS:Text-To-Speech)에 대해서 알아보도록 하겠습니다. 한국어 TTS의 경우 구글, 네이버, KT 등에서 제공합니다. 


[구글 TTS 이용하기]

구글 TTS를 이용하기 위해서는 다음의 quick-guide를 따르면 됩니다. 이전 포스팅에서 credential json 을 받은 상태면, Cloud Text-to-Speech API를 enable하면 이 credential을 그대로 이용할수 있습니다.


https://cloud.google.com/text-to-speech/docs/quickstart-protocol


여기에서 "Enable The API"에 들어가서 Enable 해주면 기존 credential json을 그대로 이용할 수 있습니다. Cloud TTS의 경우 다음의 가격 정책을 따라갑니다. 아래에서 WaveNet 음성은 합성 품질이 더 좋은 것이라고 하네요.

 STT와 같이 node.js 환경에서 GRPC를 이용한 TTS 이용에 대해서 설명드리도록 하겠습니다. google tts의 경우 여러 언어를 지원합니다. 다음의 사이트에서 지원하는 언어를 조회할 수 있습니다.


https://cloud.google.com/text-to-speech/docs/voices


한국어의 경우 표준음성과 WaveNet의 Female 목소리를 지원합니다. node.js 에서 GRPC API를 이용하기 위해서는 다음과 같은 모듈을 설치해 줘여 합니다.


npm install --save @google-cloud/text-to-speech


다음은 google tts를 이용해서 음성합성하는 예제 입니다.

const fs = require('fs');
const projectId='project_id_in_json';
const keyfile='./grpckey.json'; //---1) 
const textToSpeech = require('@google-cloud/text-to-speech');//---2)

const client = new textToSpeech.TextToSpeechClient({
        projectId:projectId,
        keyFilename:keyfile
}); //---3)

const text = '안녕하세요. 반갑습니다. 저는 팅커보드입니다.';

const request = {
  input: {text: text},
  voice: {languageCode: 'ko-KR', ssmlGender: 'FEMALE'},
  audioConfig: {audioEncoding: 'MP3'},
}; //---4)

client.synthesizeSpeech(request, (err, response) => {
  if (err) {
    console.error('ERROR:', err);
    return;
  }
  fs.writeFile('output.mp3', response.audioContent, 'binary', err => {
    if (err) {
      console.error('ERROR:', err);
      return;
    }
    console.log('Audio content written to file: output.mp3');
  });
}); //---5)

코드 설명은 다음과 같습니다.

1) credential json 경로를 설정합니다.

2) textToSpeech 모듈을 로드합니다.

3) textToSpeechClient를 생성합니다. 이때 project_id, json 경로를 설정합니다.

4) request 를 설정합니다.

5) 음성을 합성합니다. synthesizeSpeech를 호출하면 결과 값으로 err, response가 넘어 옵니다. err에 특이 사항이 없다면 response의 audioContent가 요청한 audioEncoding에 해당하는 데이터가 됩니다. 이 예제에서는 이 데이터를 output.mp3에 저장합니다.


4) request는 input, voice, audioConfig로 옵션값을 설정해 줄 수 있습니다. input은 다음과 같은 필드가 설정 됩니다. (아래에서 Union Field 라는 의미는 둘중 하나를 설정한다는 의미 입니다. 즉 {text:---} 또는 {ssml:---} 형태로 설정해야 된다는 것입니다.


voice는 다음의 파라미터를 가집니다.

language_code는 한국어의 경우 ko-KR를 설정하면 됩니다. 그리고 ssml_gender는 한국어의 경우 ko-KR에서 지원하는 FEMALE을 설정할 수 있습니다.


audioConfig는 다음의 값을 가집니다. 

이 부분은 구글 답다라는 생각이 들 정도로 원하는 형태로 음성합성을 할수 있도록 해줍니다. 


audioEncoding 은 다음을 지원합니다.


실행하면 output.mp3 가 생성됩니다. 이 파일을 cvlc output.mp3 와 같이 플레이 하면 합성된 음성이 출력됩니다.


[네이버 TTS 이용하기]

네이버 TTS는 Clova Speech Synthesis API로 제공합니다. 다음의 사이트에서 이용 신청 가능합니다.


https://www.ncloud.com/product/aiService/css


네이버 클로바 API는 기본적으로 결제 수단을 등록해야 하고, TTS의 경우 무료 구간이 없습니다. 다음과 같이 과금 됩니다.


사용하려면 Naver API를 신청해야 합니다.

신청하고 Application을 등록하고 선택 "Application Key"관리를 클릭하면 client_id와 client_key를 조회할 수 있습니다.


API 이용 설명은 다음의 사이트에서 확인할 수 있습니다.


http://docs.ncloud.com/ko/naveropenapi_v2/naveropenapi-4-2.html


헤더에 client_id, client_key를 X-NCP-APIGW-API-KEY_ID 와 X-NCP-APIGW-API-KEY로 설정하고 speaker 와 speed, text를 form parameter로 POST 하게 되면 HTTP 응답과 함께, mp3 형식의 Binary가 Body로 전달 됩니다.


다음은 node.js 로 tts를 로컬에 저장하는 코드 입니다. (http request를 위해서 npm install request 로 request 모듈을 설치해야 실행 됩니다.)

const client_id='YOUR_CLIENT_ID';

const client_secret='YOUR_CLIENT_KEY';

const api_url='https://naveropenapi.apigw.ntruss.com/voice/v1/tts';

const request=require('request');

const fs=require('fs');

const options={

        url:api_url,

        form:{'speaker':'mijin',speed:0,text:'안녕하세요. 반갑습니다. 저는 팅커보드입니다.'},

        headers:{

                'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',

                'X-NCP-APIGW-API-KEY-ID':client_id,

                'X-NCP-APIGW-API-KEY':client_secret

        }

}//--1)

const fileWrite=fs.openSync('./output_naver.mp3','w');

const req=request.post(options).on('response',(response)=>{

        console.log('Naver TTS Response:'+JSON.stringify(response));

}).on('data',(data)=>{

        console.log('Data Received');

        fs.writeSync(fileWrite,data); //--2)

}).on('end',()=>{

        console.log('stream end');

}); 


1)에서 HTTP Post 옵션을 설정합니다. speaker와 speed, text를 설정합니다. 옵션 설정은 다음과 같습니다.

2)에서 data 스트림에 대해서 파일에 write 합니다.


실행 후 cvlc output_naver.mp3 하게 되면 해당 음성 합성이 출력됩니다.


[KT TTS 이용하기]

KT에서 최근 ai makers kit이라는 개발자를 위한 음성인식/음성합성/대화 API를 공개하였습니다. 하루에 약 500건의 TTS를 이용할 수 있습니다. ai makers kit 가입은 다음의 사이트에서 가능합니다.


https://gigagenie.ai/


회원 가입 후 Console -> Dashboard에서 서비스 신청으로 들어갑니다. 여기에서 3rd Party 단말을 클릭합니다.


다음 화면에서 AI Makers Kit 을 신청하고 서비스명을 넣고 신청을 클릭합니다.


My Service에 들어가면 나의 서비스를 조회할수 있습니다. 여기에서 AI Makers Kit 부분에 Key 보기를 클릭하면 key를 조회하거나 json 파일을 다운로드 할 수 있습니다.

JSON을 다운로드 하고 tinker board에 저장합니다. (clientKey.json으로 저장됩니다.) KT에서는 샘플 코드를 제공합니다. 다음의 사이트에서 예제를 다운로드 할 수 있습니다.


https://github.com/gigagenie/ai-makers-kit


data 폴더를 보면 gigagenieRPC.proto 에 I/F가 정의된 것을 보아 GRPC 를 이용하는 것 같습니다. 샘플 코드는 node.js와 python 언어에 대해서 제공하고 있습니다. node.js 샘플 코드는 nodejs 폴더에 있습니다. KT에서 제공하는 TTS 샘플 코드(ex4_getText2VoiceStream.js)를 일부 변경해서 호출 결과를 저장해 보도록 하겠습니다. 다음은 그 코드 입니다.

 const fs=require('fs');

const aikit=require('./aimakerskitutil');

const client_id='';

const client_key='';

const client_secret='';

const json_path='./clientKey.json'; //--1)

const cert_path='../data/ca-bundle.pem';

const proto_path='../data/gigagenieRPC.proto';


//aikit.initialize(client_id,client_key,client_secret,cert_path,proto_path);

aikit.initializeJson(json_path,cert_path,proto_path);

const fileWrite=fs.openSync('./output_kt.wav','w');//--2) 

kttts=aikit.getText2VoiceStream({text:'안녕하세요. 반갑습니다. 저는 팅커보드입니다.',lang:0,mode:0}); //--3) 

kttts.on('error',(error)=>{

                console.log('Error:'+error);

});

kttts.on('data',(data)=>{

                if(data.streamingResponse==='resOptions' && data.resOptions.resultCd===200) console.log('Stream send. format:'+data.resOptions.format);

                if(data.streamingResponse==='audioContent') {

                        fs.writeSync(fileWrite,data.audioContent); //--4)

                } else console.log('msg received:'+JSON.stringify(data));

});

kttts.on('end',()=>{

        console.log('pcm end');

});

function finish(){

        console.log('tts played');

};

setTimeout(finish,5000);


1) 에서 다운로드한 json 파일을 설정합니다. 2)에서 저장할 파일 이름으로 파일을 오픈합니다. 3)은 API 호출 코드 입니다. API 파라미터는 lang와 mode를 제공하는데 현재는 0만 제공하는듯 합니다. 4)에서 받은 데이터를 파일에 기록합니다.


KT는 wav 파일을 전달합니다. wav 파일도 동일하게 cvlc output_kt.wav 로 플레이 가능합니다.


[TTS 합성 비교]

음성합성은 설정사항과 취향(?)에 따라 호불호가 갈릴수 있을듯 합니다. 직접 테스트 해보고 자기 취향에 맞는 TTS 를 선택하시면 될것 같습니다. 본 포스팅에서 실험한 음성합성(google, naver, kt) 결과를 Youtube에 비교 영상으로 올렸습니다.  특별한 설정 없이 default로 생성한 것입니다. 비교에 참고하시면 될듯 합니다.



다음은 텍스트 해석(Assistant? 또는 NLP/NLU?)에 대해서 설명하도록 하겠습니다.




- ASUS 팅커보드 S 공식 구입처: 아이씨뱅큐 http://www.icbanq.com/

- 아이씨뱅큐 공식 카페: http://cafe.naver.com/icbanq

- 아이씨뱅큐 공식 블로그: http://blog.naver.com/icbanq








반응형
Posted by alias
,