브레인 스토리
뉴스를 읽어주는 음성합성 엔진 딥보이스, 제작 비하인드 스토리
2019/12/02 by 이수경, 소형준

스피커와 마이크만 있다면 어디서나 정보를 쉽게 주고받을 수 있다는 점에서 음성은 가장 익숙하면서도 보편적인 HRI(Human-Robot-Interaction)로 자리하고 있습니다. 이는 음성 관련 기술에 대한 시장 수요가 충분하다는 방증이기도 합니다. 하지만 아직은 사용자에게 충분한 가치와 만족을 주는 수준에는 이르지 못했죠.

이에 카카오브레인은 음성 합성(TTS)이 딥러닝과 잘 접목된다면 그 기술 완성도를 한층 더 높일 수 있을 거라 판단하고, 카카오와 함께 딥러닝 기반 TTS 모델인 딥 보이스(DeepVoice)를 공동 개발했습니다. 이 기술은 카카오의 인공지능 비서 플랫폼인 카카오 i를 탑재한 ‘헤이카카오’ 앱과 인공지능 스피커인 카카오미니를 비롯해 다양한 기기에서의 뉴스 읽기 서비스에 활용되고 있습니다. [그림 1]의 오른쪽 열 명령어처럼 섹션별 또는 테마별 주요 뉴스를 읽어달라고 요청하면 딥보이스가 관련 뉴스 텍스트를 읽어줍니다.

[ 그림 1 ] 카카오 i가 탑재된 제품 또는 서비스에서 분야별 또는 테마별 뉴스 읽기를 명령하면 딥러닝으로 만든 TTS가 해당 뉴스를 읽어준다.

이번 글에서는 딥러닝 TTS 기술을 카카오 i의 뉴스 읽기 서비스 탑재하기까지의 과정을 상세히 다뤄보고자 합니다. 딥보이스 개발 프로젝트를 이끈 VoK(Voice of Kakao) TF팀 구성원의 대표로 나선 소형준 카카오브레인 연구원을 만나 자세한 이야기를 들어봤습니다.


VoK TF는 이렇게 탄생했습니다

카카오브레인은 현존하는 딥러닝 TTS 기술 수준이 서비스에 안정적으로 도입할 단계에 도달했다고 판단했습니다. 스펙트로그램(spectrogram)[1]을 소리로 변환하는 보코더(vocoder) 모델 웨이브넷(WaveNet)과 텍스트를 스펙트로그램으로 변환하는 인코더(encoder)-디코더(decoder) 모델 타코트론 2(Tacotron 2)이 그 단적인 예입니다. 카카오브레인 또한 상용화가 가능한 고품질의 딥러닝 TTS 모델을 개발하고자 지난 2018년 9월 kab-tts 프로젝트를 발족했습니다.

[ 동영상 1 ] 지난해 12월 카카오브레인은 사내 컨퍼런스에서 모든 발표를 TTS로 진행하며 자사가 자신 기술 경쟁력을 어필했다.

소형준 연구원은 “WaveNet 이전의 딥러닝 기술로는 수십 년부터 이미 존재한 음편 조합(unit selection)[2] 수준에도 훨씬 못 미치는 합성음을 생성했다”며 “제품화가 가능한 수준의 합성음을 만드는 딥러닝 기술이 뒷받침됨에 따라 최근 들어 관련 기술을 서비스에 도입하려는 기업의 움직임이 부쩍 눈에 띄고 있다”고 부연했습니다.

프로젝트 초기에는 카카오와의 협업 또는 독자적으로 대외 협력사 탐색 등 기술 개발 방식 및 활용처에 대한 구체적인 계획은 세우지 않았습니다. 그러다 비슷한 시기에 카카오 음성합성개발팀 내 딥러닝 TTS 개발을 위해 조직된 스피너 TF팀과 자연스럽게 교류하면서 기술을 공동 개발키로 했습니다.

이로써 딥러닝과 음편 조합 각각의 방식에 기반해 TTS 엔진을 만드는 개발자, 빠르고 안정적인 환경에서 TTS 엔진을 돌릴 서버 시스템을 만드는 개발자, 서버로 들어온 텍스트 쿼리를 처리하는 개발자, 텍스트 쿼리를 유의미한 문장으로 변환하는 자연어처리 엔진을 만드는 개발자, 서비스의 개발 방향을 정립하는 기획자 등 다양한 분야의 전문가로 구성된 VoK TF팀이 탄생하게 됐습니다.

[ 그림 2 ] 판교에서 근무하는 VoK TF팀 멤버가 기념사진을 촬영하고 있다(왼쪽부터 윤재삼, 소형준, 추교정, 김현학, 표정훈, 성영제, 김보미)

VoK TF팀은 범용 TTS 개발을 목적으로 가장 먼저 오디오북 시장을 살펴봤습니다. 하지만 상용화 단계에 이르기 위해서는 극복해야 할 난관이 있었습니다.

소설을 읽는 오디오북 서비스를 위해 TTS는 다양한 말투와 감정을 반영해야 합니다. 목소리가 책 분위기에 영향을 미치는 만큼 적절한 목소리의 색채와 느낌도 담아야 하죠. 그러나 한가지 톤으로 구성된 데이터로 학습하는 현재의 TTS 모델은 국어책을 읽는 듯한 톤을 생성할 가능성이 매우 큽니다. 아울러 음성을 실시간으로 합성하는 방식은 서버에 큰 부담을 줄 수 있습니다. 사용자가 호출할 때마다 음성을 새로 합성해야 하기 때문이죠. 음성합성 데이터를 미리 만드는 방법은 서버에 큰 부담을 주지는 않지만, 책(원저작물)과는 명백히 독립된 저작 매체이므로 저작권 문제를 먼저 해결해야 합니다.

소 연구원은 “현재 딥러닝 TTS의 수준은 인간 성우처럼 풍부한 감정을 정교하게 표현하지 못한다”며 “텍스트를 또박또박 읽고 명확하게 메시지를 전달하는 기술 개발이 우선 이뤄져야 그 이후의 단계를 생각해볼 수 있을 것으로 판단해 프로젝트 방향을 선회했다”고 말했습니다.

그 대신 VoK TF팀은 카카오 i 음성 서비스 중 정확한 정보 전달이 중요한 ‘뉴스 읽기’에 주목했습니다. 지금까지는 인간 성우가 읽은 뉴스 녹음본을 활용했는데, 시간과 비용 문제로 성우가 모든 뉴스를 읽어주지 못합니다. 이처럼 획득할 수 있는 하루 녹음 분량이 많지 않기에 “오늘의 뉴스 들려줘” 또는 “주요 뉴스 들려줘”처럼 간추린 뉴스 서비스에만 성우 녹음본을 틀었죠. VoK TF팀은 딥러닝 TTS가 있다면 거의 모든 뉴스에 대한 실시간 뉴스 낭독 서비스가 가능하겠다고 내다보고, 발음이 또렷하고 단어를 정확하게 띄어 읽는 딥러닝 TTS 모델 개발에 집중했습니다.

여러 차례 협의 끝에 카카오브레인과 카카오는 딥보이스 개발을 크게 두 파트로 나누고, 각자의 역할을 분배했습니다. 텍스트를 특징 벡터(feature vector)[3], 그리고 이를 다시 스펙트로그램으로 변환하는 인코더-디코더 모델은 카카오브레인이, 특징 벡터를 소리로 변환하는 보코더 모델을 개발하고 딥보이스를 서비스에 적용하는 부분은 카카오가 담당했습니다.

[ 그림 3 ] 텍스트가 음성 파일(wav)로 변환하는 과정을 도식화했다.


딥러닝 TTS는 이렇게 만들었습니다

데이터 수집과 데이터 전처리, 모델 선택 및 훈련 및 미세조정 방식에 따라 생성된 음성의 품질이 천차만별로 달라질 수 있습니다. VoK TF팀은 인코더-디코더 모델을 개발하는 데 있어서 각 단계 결과물의 완성도를 높이는 데 집중했습니다. 그 과정은 다음과 같습니다.

[ 그림 4 ] 딥러닝 TTS 모델을 만드는 과정을 도식화했다.

1) 데이터 수집

한국인 성우가 녹음한 발화[4] 데이터 자체가 많지 않습니다. 스튜디오 녹음 비용이 클 뿐만 아니라, 한 사람의 성우가 하루 동안 생산할 수 있는 양질의 데이터는 1~2시간 정도 남짓이기 때문입니다. VoK TF팀은 녹음 분량이 적은 상황에서도 충분한 합성 품질 달성을 목표로 했습니다.

하지만 ‘적은 녹음 분량으로 최대한 사람과 비슷한 목소리를 흉내 내는 기술’과 ‘최대한 사람과 비슷한 합성음을 만들기 위한 방대한 데이터 확보’처럼 상충하는 두 목표를 동시에 달성하기는 쉬운 일이 아닙니다. 상용화가 가능한 TTS 모델 훈련에 필요한 최소한의 데이터 분량 기준을 잡는 게 중요하다고 판단했습니다.

VoK TF팀은 국립국어원 표준 서울말 발화 말뭉치와 카카오 내부 데이터를 활용해 실험을 진행했습니다. 특정 발음이 뭉개지거나 생략된다면 녹음 분량이 부족하다고 판단, 훈련 데이터양을 점차 늘렸습니다. 그 결과, 최소 2시간 분량의 훈련 데이터는 있어야 실제 사람처럼 말하는 결과물을 얻을 수 있다는 기준을 세웠습니다.

소형준 연구원은 “데이터가 많을수록 성능이 좋아하는 딥러닝 모델의 특성상 현실을 충분히 잘 반영할 정도로 다양하고 많은 데이터셋을 확보하는 데 주력했다”며 “다만 데이터셋마다 라벨링 방식이나 화자별 발화 패턴, 녹음 환경이 달라 학습 데이터를 구성하는 분량 균형이 심하게 깨지면 규모의 장점을 가질 수 없다. 이에 데이터셋별 동일 분량의 데이터로 훈련 데이터셋을 구성하는 데 특히 주의를 기울였다”고 설명했습니다.

2) 데이터 전처리

이렇게 총 12시간의 녹음 데이터를 확보한 VoK TF팀은 오류 데이터를 솎아냈습니다. 띄어쓰기와 쉼표가 띄어읽기에 많은 영향을 미치는 점을 고려해 띄어쓰기가 잘못 표기된 일부 대본 내용을 수정하고, 문장 내 적절한 곳에 쉼표를 표시했습니다. 발화 속도가 지나치게 빠르거나 느린 부분 등 통계적 특이점이 존재하는 데이터는 학습에서 제외했습니다. 녹음 앞뒤의 공백을 제거해 더 효율적인 학습을 유도했습니다.

한편, VoK TF팀은 한글 맞춤법 규정에 따른 텍스트 표기법(예:능막염, 금융)과 표준 발음법 규정에 따른 텍스트 표기법(예:[능망념], [그뮹]) 중 모델 훈련에 사용할 텍스트를 어떻게 표기해야 할지를 고민했습니다.

영어에서 ‘enough’의 gh[f], woman의 o[i], motion의 ti[sh]에서처럼 표기와 발음 사이의 괴리가 매우 큰 언어가 많습니다. 한국어도 여기에 포함되죠. 이에 기존 음성합성 모델은 G2P(grapheme to phoneme) 프로그램을 사용해 입력 텍스트를 표준발음 형태로 변경했습니다.

하지만 GP2 활용 방식에는 한계가 있습니다. 시스템에 규칙이 등록돼 있을 때만 온전한 결과를 얻을 수 있기 때문입니다. 달리 말해, 사람이 등록하지 않은 발음 규칙이 입력되면 의도치 않은 출력이 나올 수 있다는 의미입니다. 예를 들어, 같은 '고기’더라도 '불고기’는 [불고기], '물고기’는 [물꼬기]로 발음됩니다. 그런데 G2P에 [꼬기]라는 발음이 등재돼 있지 않으면 '물고기’는 [물고기]로 합성되는 거죠.

소 연구원은 "사실상 글자 그대로를 쓰는 방식과 표준 발음으로 변환하는 방식의 오류율에 큰 차이가 없었고, 표준발음으로는 단어의 언어 정보(품사, 문장 내 중요도 등)를 추가 확보하는 데 어려움이 있을 거라 판단했다”며 “또한 사전규칙 기반의 G2P 활용은 '스스로 규칙을 터득하는' 딥러닝 기본 사상과 위배되기에 여타 다른 딥러닝 모델에서처럼 입력 글자 그대로를 활용했다"고 말했습니다.

3) 모델 선택과 훈련

본래 어텐션(attention)[5]은 기계번역과 같은 자연어처리 문제를 보다 효과적으로 해결하기 위해 고안된 기법입니다. 나는 학교에 갑니다’와 ‘I go to school’에서 보듯이 원문과 결과문의 단어 순서가 1:1로 대응하지 않습니다. 이에 어텐션을 통해 번역하려는 특정 단어에 영향을 미치는 원문의 단어 정보를 활용하게 됨에 따라 기계 번역 모델의 성능이 높아졌죠.

현재 다양한 언어의 음성을 합성했을 때 그 성능이 가장 좋다고 알려진 타코트론 2 모델 또한 어텐션 기법을 통해 특정 음편을 합성하는 데 영향을 미치는 텍스트 구간 정보를 활용합니다. 문제는 어텐션 기법을 활용한 모델은 입력된 데이터 순서와는 무관하게 정보를 생성한다는 데 있습니다. a-b-c-d를 입력하면 a-c-b-d가 출력되는 식인 거죠. 음편열을 순차적으로 생성하지 못하게 된 모델은 학습 그 자체에 실패하거나 학습 데이터에는 없는 오류를 만들어버립니다.

이에 VoK TF팀은 합성 시 어텐션이 합성 순차를 무시하지 않도록 강제하는 기법을 적용했습니다. 이 방법은 순차 역전 문제뿐만 아니라, 반복되는 음편열에 대한 합성 안정성을 확보하는 데 큰 도움이 됩니다. ‘수학학원 원장’이라는 단어를 예로 들어보겠습니다. 통계적으로 ‘수학학원’과 ‘수학원’의 빈도수가 비슷할 경우, 때에 따라서는 ‘수학원’으로 음성이 합성돼 버립니다. 순서 강제 기법은 두번째와 세번째 글자에 대해서도 음편이 순차 합성될 수 있게 합니다.

한편, VoK TF팀은 다화자 음성 데이터를 학습에 원활하게 활용하고자 스타일 임베딩(embedding)을 두었습니다. 이 임베딩은 모델의 입력 부분에서 조건 역할을 하며 화자에 따라 서로 다른 말하기 특징을 더 잘 추출할 수 있게 해줍니다. 소 연구원은 “두 데이터는 공통적으로 같은 글자 정보를 담고 있다. 그렇다면 그 외 정보는 글자를 표현하는 화법을 나타낸다고 할 수 있을 것”이라며 “데이터에서 어떤 부분이 글자인지 그리고 말하기 스타일인지는 딥러닝이 스스로 구분해낸다”고 답했습니다.

아울러 타코트론2와는 다른 방식으로 발화의 종결(EOS[6])을 감지하도록 했습니다. 타코트론 2가 EOS를 감지하는 모델을 별도로 뒀다면, 4 프레임 연속으로 EOS가 추정되면 모델 스스로 음성 합성을 끝내는 방식으로 말이죠. 소 연구원은 “어텐션 훈련이 불안하면 쓰기 어려운 방법이지만 우리 모델에서는 충분히 잘 동작함을 확인할 수 있었다”고 부연했습니다.

VoK TF팀은 디코더의 학습 빈도를 1/4로 줄여 모델의 훈련 및 합성 시간과 모델의 크기를 줄였습니다. 이는 연속한 음성 프레임의 스펙트로그램은 같은 정보를 담고 있기 때문에 가능한 일입니다. VoK TF팀은 디코더 한 스텝에서 4프레임 뒤의 프레임을 학습∙추론하고 빈 곳은 내삽[7]해주는 별도의 모델(postnet)로 매끄럽게 연결될 수 있도록 보완하는 방식으로 음성합성이 성공적으로 이루어짐을 확인했습니다.

4) 성능 테스트

띄어읽기 오류와 같은 치명적인 부분을 제외한다면 모델이 생성한 음성의 발음이 뭉개지거나 텍스트를 읽는 속도가 실제 사람과 확연히 다른 사례는 매우 드물게 일어납니다. 다만 이런 오류를 판단할 수 있는 객관적인 척도는 없습니다. 사람이 이를 직접 듣고 점수로 평가하는 실험(MOS, mean opinion score)으로 성공적인 합성 여부를 가늠할 뿐입니다.

이에 VoK TF팀은 동일한 문장을 합성한 결과를 듣고 어느 쪽이 나은지 선택하는 내부 테스트와 전문가 자문을 거쳐 모델의 성능 평가를 진행했습니다. 그 결과, 자체 개발한 음성합성 모델의 경쟁력이 충분히 있다는 평가를 받았습니다.

5) 서비스 도입

실제 기업 현장에서는 음편 조합과 딥러닝 방식을 합쳐 TTS 엔진을 만들고 있습니다. 각 방식이 주는 이점을 합친다면 고객에게 더욱 완성도 높은 서비스가 가능해지기 때문입니다.

말하는 스타일이 일정하거나(예 : 설명문 어미의 ‘~니다.’, 군대 경례의 ‘충성!’ 등) 발화에 자주 등장하는 데이터는 음편 조합 방식이 더 적합할 수 있습니다. “가즈아아~”, “히트다 히트”와 같은 유행어처럼 텍스트만으로는 발화 규칙을 도출하지 못하는 상황에서도 문구 자체를 하나의 음편으로 취급하는 게 더 나을 수 있죠. 하지만 사람이 모든 음편 규칙을 만들어내기 쉽지 않습니다. 이에 수많은 데이터를 통해 한 번도 보지 못한 패턴을 스스로 찾는 딥러닝을 통해 음성을 합성하는 거죠.

[ 동영상 2 ] 음편 조합 방식으로 만든 예제를 확인해볼 수 있다.

데이터 전처리에서 한글 맞춤법 규정에 따라 입력된 텍스트를 모델에 입력한다고 설명했습니다. 여기서 주의할 점은 앞뒤 문맥에 따라 표준발음이 달라지는 단어입니다. 예를 들어, ‘3.1’은 문맥에 따라 숫자(삼점일[삼쩌밀]), 날짜(삼월일일[사뭐리릴]), 명사(삼일[사밀]) 모두를 뜻할 수 있죠.

이 혼합 TTS 엔진은 데이터에 자주 등장하는 일부 단어의 의미를 스스로 추론합니다. 예를 들어, 단가(짧은 노래)와 단가(가격), 잠자리(곤충)와 잠자리(이부자리) 등을 말이죠. 소 연구원은 “자리’를’ 잡았다, 자리’에’ 들었다는 예시에서 보듯이 단어에 붙는 조사를 보고 모델 스스로 단어의 의미에 따른 발음을 구분하는 것 같다”고 설명합니다.

하지만 모든 단어의 의미를 유추할 정도의 언어 정보 처리 능력을 갖춘 것은 아닙니다. 그래서 자연어처리 모듈에서 모든 텍스트에 대한 한글화를 진행합니다. “119 불러줘”라는 텍스트가 입력되면 “일일구(숫자) 불러줘”처럼 말이죠. 이 자연어처리 모듈은 또한 텍스트 쿼리에 몇 가지 정보를 더 심기도 합니다. 띄어 읽지 않고 읽거나 음량과 속도에 변화를 주는 태그를 추가하는 거죠.


딥러닝 TTS 개발에서 어떤 점이 어려웠나

보통 딥러닝 모델은 해석력(interpretability)을 갖추지 못하고 있습니다. 어디서 오류가 발생한 건지, 왜 오류가 발생했는지를 알기가 매우 어렵기 때문입니다. 이런 이유로 사람들은 딥러닝 모델을 블랙박스(blackbox)에 비유하기도 합니다. 여기서도 어떤 요소로 인해 음성이 제대로 합성되지 못했는지 그 원인을 파악하기가 쉽지 않았습니다.

첫번째, 띄어 읽기 기술 구현이 어려웠습니다. 발화에서 '띄어 읽기’는 구절[8]을 분리하는 기능을 합니다. 통상적으로는 데이터의 쉼표(,)가 구절을 분리하는 표식으로 사용됩니다. “아, 주머니가 없어요!”와 “아주머니가 없어요!”에서 보듯이 쉼표에서의 띄어 읽기 여부에 따라 그 의미가 완전히 달라짐을 볼 수 있습니다.

하지만 훈련 데이터에서는 쉼표가 제대로 표시되지 않았습니다. 다른 문장 부호와는 달리 글을 쓰는 사람이 쉼표를 쓸지 말지를 주관적으로 결정해서죠. 이로 인해 쉼표가 과도하게 많거나 적은 문장에서의 쉼표는 제 역할을 제대로 하지 못합니다. 쉼표가 제대로 표시되지 않은 텍스트를 본 기계는 사람이 규칙도 없이 제멋대로 문장을 읽는다고 생각한 거죠. 그 대신 공백이 휴지의 지표가 됨에 따라 단순한 띄어쓰기 부분에서 띄어 읽는 문제가 발생했습니다.

두번째, 합성 안정성을 확보하기가 어려웠습니다. 타코트론 2처럼 어텐션을 쓰는 음성합성 모델에서는 공통적으로 음절 길이 예측에 실패하는 문제가 발생합니다. 예를 들어 ‘긴 문장’이라는 구 자체가 주어라면 공백을 짧게, ‘긴’이 ‘문장’을 수식한다면 공백을 길게 끌어야 합니다. 그런데 타코트론 2과 같은 모델에서는 앞 문장의 공백을 길게 끄는 거죠. 소형준 연구원은 “앞, 뒤 글자를 보고 공백을 길게 끌지, 짧게 끌지가 결정되는데 모델 자체에서는 이런 언어 정보는 처리하지 못하고 있다”고 설명했습니다.

세번째, 실제 생활에서 습득한 정제되지 않은 텍스트 쿼리를 다루기가 어려웠습니다. 특히 카카오브레인 연구팀은 실제 연구 환경에서는 쉽게 접하지 못하는 상황을 마주했습니다. 모델 훈련에 학습하는 텍스트는 매우 정제된 형태를 갖추지만, 일상생활에서 사용되는 텍스트는 그렇지 않을 때가 많았기 때문입니다. 운세 정보나 뉴스는 상대적으로 정제된 형태를 띠기는 하는데, 사용 빈도가 낮은 고유명사가 입력되거나 보통 문장 길이의 3~4배나 되는 긴 문장이 쿼리로 입력되고 했습니다.

"TTS 모델은 글자 수가 상대적으로 긴 고유명사가 나오면 읽는 속도 또는 끊어서 읽어야 할 부분을 유추하기가 어렵습니다. ‘남남수수학학원원장장기기기증서’나 ‘유상무상무상무상수리무상보상상가’처럼 사람조차 읽기 힘든 형태의 극단적인 예시를 한 번 봅시다. 그런데 기계는 오죽하겠어요."

“한 번은 쉼표 하나 없는 긴 문장이 입력돼 합성에 실패했다는 오류 리포트가 떴습니다. 누가 일부러 이상한 걸 입력했나 싶어서 해당 문장을 함께 검토했어요 확인해본 결과, 사람이 두세 번은 읽어야 그 구조를 파악할 수 있을 정도로, 실로 복잡한 문장이었습니다.([그림 5]). 사람이 그 의미를 명확하게 인식하지 못한 문장은 기계도 잘 읽지 못하더라고요.”

[ 그림 5 ] 사람조차 그 의미를 명확하게 인식할 수 없는 문장은 기계도 잘 읽지 못한다. 딥보이스 역시 위 예제 문장을 어색하게 읽는다.

세가지 문제의 원인을 면밀히 보면, 모델에 입력되는 문장에 쉼표가 제대로 표시돼 있지 않거나 문장 구조를 단번에 파악하기 어려울 정도의 긴 문장일 때 발생하는 것으로 판단됐습니다. 제아무리 고품질의 음성 파일을 생성할 수 있더라도 띄어 읽지 말아야 하는 곳에서 띄어 읽거나 또는 길게 끌지 않아야 할 곳에서 길게 끈다면 사용자에게 충분한 만족을 줄 수 없겠죠. 또한 이런 긴 문장은 어텐션을 계산할 때 필요한 메모리가 기하급수적으로 늘어나면서 생성 속도 저하에도 영향을 줍니다. 이는 실시간 서비스를 어렵게 만드는 요소가 되죠.

VoK TF팀은 문장의 의미를 구분하기 쉽도록 쉼표나 구분자와 같은 문장 부호를 새로 입력하는 방식으로 이들 문제를 우회했습니다.

모델 훈련에는 배운 건 잘 아는 딥러닝 모델의 특성을 고려해 TTS 엔진이 처리할 텍스트와 유사한 형태의 문장을 활용했습니다. 그리고 데이터 전처리 단계에서 자연어처리부가 쉼표나 구분자를 추가할 수 있도록 했습니다. 긴 문장에서 독립적으로 쓰일 수 있는 구절을 분리하는 데에는 구분자(//)를, 좀 더 명확하게 의미를 전달하고자 쉬어서 읽어야 할 부분에는 쉼표를 추가했죠. 음성을 합성하는 단계에서는 띄어읽기 오류가 난 문장을 언어적으로 분석해 쉼표나 구분자를 붙여 합성하는 등 핫픽스(hotfix)[9]를 도입했습니다.

소 연구원은 “현재의 언어 모델은 발화를 생성하는 부분으로 연결되지 못하고 있고, TTS 모델의 텍스트 인코더는 언어를 제대로 이해하지 못하는 과도기적 상태에 놓여 있다”며 “TTS 모델 훈련 단계에서도 자연어처리를 부분적으로 활용함으로써 더 높은 성능을 기대해볼 수 있다”고 말했습니다.

[ 동영상 3 ] 한눈에 그 구조를 파악하기 어려운 문장에 구분자(//)와 쉼표를 넣어주면 그 의미를 더 쉽게 파악할 수 있게 된다.


딥러닝 TTS 성능 개선을 위한 차기 계획은?

소형준 연구원은 딥러닝 TTS의 성능을 높이는 방안으로 크게 5가지를 꼽았습니다. 소 연구원은 "많은 음성 기술은 이 중 하나에 집중하고 있으나, 사실은 완벽한 음성 모델로 발전하는 과정에서 필연적으로 밟아야 하는 모든 ‘단계’를 투영하는 것으로 보인다”고 평가했습니다.

첫번째, 모델 경량화입니다. 모델의 만들어내는 음성의 품질이 서로 비슷하다면 모델 구조는 간단할수록 좋습니다. 모델 학습 및 추론에 상대적으로 더 적은 시간이 걸려 실시간으로 음성을 합성해낼 수 있기 때문입니다. 여기서 더 나아가, 핸드폰에 탑재된 AP(핸드폰의 중앙연산장치)로도 음성을 합성하는 모델을 구현할 수 있다면 언제 어디서나 음성합성 기능을 이용할 수 있는 등의 장점도 갖출 수 있습니다.

두번째 방안은 품질의 정교화입니다. ‘틀리지 않기’에 집중하겠다는 의미로도 볼 수 있습니다. 지금의 TTS 모델은 많이 본 문장은 좀 더 쉽게 합성합니다. 이를 다르게 말하면, 처음 보는 문장 또는 상대적으로 덜 본 문장은 잘 읽지 못한다는 거죠. 이런 수준으로는 사용자에게 충분한 만족감을 주기 어려울 것입니다. 그래서 언어 정보를 활용해 띄어읽기가 필요한 부분을 좀 더 쉽게 유추하는 등 기술적으로 보완해나가야 하는 거죠. 이에 유독 기계에 취약한 부분을 집중적으로 가르쳐서 사람처럼 발화하는 모델 개발을 목표로 합니다.

[ 동영상 4 ] 현재 많은 딥러닝 TTS는 처음보거나 상대적으로 덜 본 문장을 잘 읽지 못한다.

세번째, 발화 스타일의 다양화입니다. 발화는 텍스트만으로는 표현되지 않은 정보를 담고 있습니다. ‘감정’이 대표적인 예입니다. 화가 나거나 기쁠 때의 발화는 그 스타일이 서로 다르죠. 이처럼 그 발화를 어떤 감정 상태로 읽으면 좋을지에 관한 정보도 함께 입력해 음성을 합성할 수 있다면 문장의 의미를 보다 효과적으로 전달하는 데 도움이 될 것입니다. 또는 문장을 구성하는 단어를 보는 것만으로도 발화 스타일을 추측하는 것도 방법이 될 수 있겠습니다.

[ 동영상 5 ] 현재 많은 딥러닝 TTS는 감정을 담아 문장을 읽는 데 서툴다.

네번째, 소량의 데이터 활용입니다. 한 명의 화자로부터 정제된 음성 데이터를 대량 확보하기는 쉽지 않습니다. 앞서 말한 대로 경제적으로 비용이 많이 들거니와, 이를 획득하는 데 시간이 오래 걸리기 때문이죠. 이런 이유로 한 명으로부터 획득한 최소한 분량의 음성 데이터로도 이 화자의 말하기 특징 정보를 충분히 추출하는 모델 개발을 골자로 합니다.

다섯번째 방안은 저품질 데이터의 활용입니다. 저품질 데이터란 스튜디오에서 녹음하지 않은, 지구상에 존재하는 거의 모든 발화 데이터를 가리킵니다. 그 분량은 대단히 많으나 음성합성에서의 활용 빈도는 지극히 낮습니다. 하지만 이런 데이터도 활용할 수 있다면 데이터 획득 비용을 낮추면서도 모델 성능을 높이는 데 도움이 될 것입니다. 텍스트나 잡음을 알아서 인지해 저품질 데이터로도 음성 정보를 생성하는 모델 또한 연구 방향 중 하나입니다.

VoK TF팀은 두번째와 네번째 방안을 집중적으로 공략하고자 합니다. 카카오 자연어처리팀이 보유한 카카오 한국어 형태소 분석기인 dha2(Daum Hangul Analyzer 2)와 khaiii(Kakao Hangul Analyzer 3)를 활용해서 만든 언어 모델[10]을 바탕으로, 글자뿐만 아니라 단어가 담고 있는 의미를 활용해 한층 더 정교한 음성합성 모델 개발이 핵심입니다. 아울러 2시간보다 훨씬 더 적은 녹음 분량으로도 학습이 가능한 모델 개발을 목표로 하고 있습니다. 실시간 뉴스 읽기 외 다른 카카오 공동체 서비스로 딥보이스 적용을 확대한다는 계획입니다.

카카오브레인 TTS 연구팀 자체적으로는 정제되지 않은 발화 데이터로도 충분한 성능을 내는 모델을 연구를 펼칠 계획입니다. 소 연구원은 “다양한 상황에서 취득한 데이터를 학습에 잘 활용할 수 있도록 소리 데이터에서 음성만 분리・정제하는 기술을 고도화하는 연구를 지속해나갈 것”이라고 말했습니다.




참고
[1] 음성을 숫자로 표현하는 여러가지 방법 중 하나
[2] 음편은 좌우 문맥에 따른 음의 물리적 실체를 반영한 최소한의 단위다. 음편 조합은 입력 텍스트에 맞게 음편 배열을 골라 합성음을 출력한다. 같은 음편이라도 단어 내 위치나 문장 형태에 따라 높낮이나 강세, 길이가 다르기에 데이터가 모든 상황을 커버하지 못할 가능성이 크다. 국내외 연구진은 이를 대처하는 방을 오랫동안 연구해 왔다.
[3] 차원을 가진 벡터로 특징을 표현하는 것
[4] 입을 열어서 말을 하는 언어 행위 또는 이 행위로 생산된 음의 형체
[5] 인코더-디코더 구조의 모델이 특정 시퀀스를 디코딩할 때 관련된 인코딩 결과값을 참조한다.
[6] end of sentence의 약자. 문장이 끝났다는 사실을 알려준다.
[7] 주변에 있는 데이터를 보고 그 사이의 있는 점을 미루어 짐작하는 기법을 가리킨다. 또는 ‘보간’이라는 단어가 쓰일 수 있다.
[8] 한 토막의 말이나 글
[9] 모델의 전체 구조를 바꾸지 않고 입력 데이터나 내부 매개변수를 살짝 바꿔서 오류를 고치는 방법
[10] 수많은 텍스트를 학습해 주어진 문맥상에서 다음에 나올 적절한 글자 단어 또는 문장을 예측하는 모델
이 글을 쓴 사람들
samantha.lee
이수경 | 글,정리
지난 2016년 3월 알파고와 이세돌 9단이 펼치는 세기의 대결을 취재한 것을 계기로 인공지능 세계에 큰 매력을 느꼈습니다. 인공지능을 알고 싶어하는 사람들을 위한 콘텐츠를 쓰고자 카카오브레인에 합류했습니다. 현재는 분야별 인공지능 전문가와 함께 기술 콘텐츠를 생산하는 재미에 푹 빠져 있습니다. 인공지능을 만드는 사람들의 이야기와 인공지능이 바꿀 미래 사회에 대한 글은 누구보다 쉽고, 재미있게 쓰는 사람이 되고 싶습니다.
jay.mini
소형준 | 인터뷰이
사람처럼 인식하고 생각하는 인공지능을 통해 복잡한 현상을 해석하고자 카카오브레인에 합류했습니다.