본문 바로가기

Robotics/Software Tech.

한글의 종성에 따른 TTS 문장변화



외국도 그렇겠지만 본인이 보기에 우리나라에서 만든 엔터테인먼트로봇의 70%이상이 TTS를 채택하여 사용하고 있다. 로봇에서 TTS(Text To Speech)를 쓰는것은 상황에 따라 로봇이 음성으로 표현을 하기위한것이다. 뭐, TTS가 억양이나 말뜻을 강조하기 위한 엑센트에 약한것이 사실이기때문에, 예쁜 목소리를 가진 사람이 녹음하여 플레이하는 경우도 있다. 사실 로봇이 더욱더 사람같아 진다고 느끼는 사람이 있는 반면에, 사람처럼 생기지도 않은 로봇이 사람처럼 자연스러운 목소리를 낸다는 것에 더 부자연스러움을 느끼는 사람도 적지않다.
즉, 오히려 로봇은 로봇 다워야 한다는 사람도 많이 봤다.

TTS와 더불어 음성인식도 많이 사용한다. 단어나 문장을 인식하여 적절한 대답을 찾아 TTS로 알려주는 것이 이제는 로봇이 당연히 가져야할 기능처럼 되어버렸다. 그런데, 음성인식을 통해 DB로 적절한 답을 찾았다고 생각해보자. 인공지능을 가져서 적절한 문장을 만들어 낼 수 있다면 좋겠지만, 그게 어디 쉬운일인가...

예를들어볼까?

사람 : "(영등포역에서) 여기서 가까운 화장실이 어디야?"

이런 물음에 다양한 대답이 나올 수 있겠다. 일단 로봇은 지하철역에서 안내하는 기능을 가졌다고 하자.

로봇 : "1번 출구, 롯데백화점으로 가십시오."
로봇 : "3번 출구, 영등포세무서 가십시오."


이렇게 말이다.. (그냥 예이다. 세무서까지 갈바에 딴데로 가는게 더 빠르다..라는 딴지는 걸지마라..)

자.. 위에서 로봇은 출구 번호와, 지명은 잘 알고 있다. 그리고 대략적인 문장형식도 이미 입력되어 있다. 그런데... 출구번호야 그렇다쳐도.. 지명이 달라지면서, 바꿔줘야 하는게 있다.(밑줄부분을 보라.)
어떤데는 '으로', 어떤데는 '로'라 되겠지..

자.. 우리가 TTS를 이용해서 코딩을 하는것만이 다가 아니다라는게 나온다. 이럴때는 적절히 국어 문법을 적용해야 할 때도 있다. 뭐 막떠오르는 다른예가 있다면, '~로서'와 '~로써'와 같은것도..(이건 쉽게 구별할 수 있을까?-_-; 어쨋든..)

저럴때 TTS는 어떻게 해야할까.. 모든 지명에대해서 이럴경우는 '으로', 저럴경우는 '로' case by case로 다 달아줄텐가??
이럴땐 한글의 종성을 판단하여 '으로'로 날려줄껀지, '로'로 날려줄껀지를 정할 수 있다.

위의 예에서 지명의 맨 마지막 글자의 종성이 없거나, 'ㄹ'로 끝난다면 '로'로 날려주고 나머지의 경우는 '으로'로 날려주면 된다.

이것을 간단하게 코드로 구현해 보자.
여러가지 방법이 있을수 있겠지만, 이것은 본인이 사용한 방법이다.(정석이 아닐수 있다.-_-a)

#define CODE -44032
void JS_TTS(const char* dest)
{
//종성 테이블
 char *JSTable[] = {"", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ",
  "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ",
  "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ",
  "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"};
 int JS = 0;
 int Code = 0;

 WCHAR Buffer[20];
 MultiByteToWideChar(CP_ACP, 0, dest, strlen(dest), Buffer, 20);
 WCHAR lastWord = Buffer[strlen(dest)/2-1];

 Code = (int)lastWord+CODE;
 if(Code<0) return;

 JS = (int)Code%28;
 CString tts;
 if(JS==8 || JS==0) tts.Format("%s로 가십시오.",dest);
 else tts.Format("%s으로 가십시오.",dest);
  
//TTS엔진으로 문장을 넘겨주는 함수
 TextToSpeech (tts);
}

(1) 인자의 const char* dest는 지명을 가리키는 문자열이다.

간단하다. 위 코드를 적절히 이용한다면, 일정한 문장패턴이 있는 상태에서 중간중간에 들어가는 단어를 교체하는 것으로 문장이 올바르게 만들어 진다.

한글 조합형 코드 테이블은 아래 사이트에서 확인하라.
URL : http://wiki.kldp.org/wiki.php/%C1%B6%C7%D5%C7%FC

간단한 예로 설명을 해봤지만, 이밖에도 로봇에 적용하기 위해 많은 논리와 법칙이 필요할 것이다.
"로봇에 들어가는 코드가 간결해 지기를 원한다면 많은 고민이 필요하다."