본문 바로가기

Robotics/Software Tech.

C/C++/MFC 구글 TTS 연동


음성합성 소프트웨어의 경우 AT&T에서 개발한 엔진과 한국어 목소리를 구입하면 대략 이것저것해서 60$정도다. 국내에서 개발한 한글 TTS의 경우는 저 가격의 100배정도 된다. 수백만원이나 하는 음성합성 프로그램을 사용해야 한다. 이래저래 간단하게 합성 프로그램을 사용하려고 해도.. 싸거나 무료로 공개하는 프로그램의 경우, 음질과 목소리는 불쾌감을 일으키기 충분할 만큼 질이 좋지않다.

하지만, 몇가지 제약조건이 있긴하지만, 목소리나 음질이 상당히 괜찮으면서도 다양한 언어음성을 제공하는 구글 TTS. 안드로이드 플랫폼의 경우 API가 제공된다. 아래사이트를 보면 된다.



http://googlekoreablog.blogspot.com/2010/06/blog-post_1227.html

안드로이드 플랫폼이나 Web기반말고, 일반 윈도우 프로그램에서는 연동할 수는 없을까.. 있다. 간단하다. 이 google TTS는 HTTP 프로토콜로 GET방식으로 데이터를 주고 받는다. 따라서, URL에 맞는 Query만 던져주면 음성을 들을 수 있다. 위에 링크를 걸어둔 사이트를 가면 설명이 되어있다.

아래 링크를 클릭해보시라.

http://translate.google.com/translate_tts?hl=ko&q=구글음성합성 또는

http://translate.google.com/translate_tts?tl=ko&q=구글음성합성 (2011.12.17일 확인)

 "구글음성합성"이라고 들린다. (네트워크 상태에 따라 지연될 수 있음, 그리고, 구글 크롬브라우저는 바로 들리지만, 익스플로어라면 MP3파일을 다운로드 받으라고 창이 뜰것이다.)

자 이것을 어떻게 윈도우 프로그램과 연동을 할까.. 방법은 두가지 라이브러리를 사용하기만 하면 된다. http 프로토콜로 데이터를 주고 받을 수 있게 하기위한 chilkat이라는 라이브러리와 MP3파일을 재생할 수 있는 FMOD 라이브러리이다.

 다운로드는 아래 사이트를 방문하면 된다.

 http://www.chilkatsoft.com/downloads_vcpp.asp

MFC를 이용한 예제 샘플은

http://www.example-code.com/mfc/http.asp 

 에서 확인하면 된다.

그리고, FMOD 라이브러리는

http://www.fmod.org/index.php/download 에서 다운로드 받으면 된다. FMOD Ex programmer API이다.

이 두 라이브러리를 쓰면 대략 FMOD의 초기화 과정같은걸 다 포함해도 20줄 내외로 저 기능을 추가할 수 있다.


 
bool googleTTS::speak(const char* text)
{
	CkHttp http;
	bool success = http.UnlockComponent("Anything for 30-day trial");

	if(success!=true)
		return false;

	http.put_UserAgent("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; CIBA; MS-RTC LM 8)");

 	char query[512] = {'\0',}; 
 	sprintf_s(query, "http://translate.google.com/translate_tts?tl=ko&q=%s",text);

	success = http.Download(query, _path.c_str());

	if(_player->open(_path.c_str()))
		_player->play();

	return true;
}

bool mp3Player::open(const char* filepath)
{
	FMOD_RESULT result = FMOD_System_CreateSound(_system, filepath, FMOD_HARDWARE, 0, &_sound);

	return (result==FMOD_OK) ? true : false;
}

bool mp3Player::play()
{
	FMOD_RESULT result = FMOD_System_PlaySound(_system, FMOD_CHANNEL_FREE, _sound, false, &_channel);

	return (result==FMOD_OK) ? true : false;
}
코드는 대략 위와 같이 짰습니다. FMOD 라이브러리 초기화 부분이나 라이브러리 설정은 생략하였습니다. 추후에 좀더 자세한 코드를 올려보겠습니다.