brunch

You can make anything
by writing

C.S.Lewis

by 티맵모빌리티 Nov 02. 2022

내비 안내 음성은 어떻게 자동으로 만들어질까?

16편 - 서버 기반 TTS 개발하기

Chap1. 서버 기반 TTS란?


1-1. TTS란?

TTS는 ‘Text to Speech’의 약자로 오디오 표현을 위해 텍스트 단위를 음성 단위로 변경하는 자연스러운 언어 모델링 프로세스입니다. 쉽게 말해 문자를 사람 음성으로 변환해 주는 기술이죠. 사람 목소리를 녹음하여 일정한 음성 단위로 쪼갠 후, 텍스트가 입력되면 DB의 문장과 일치한 목소리 조각을 합성해 제공하는 방식으로 동작됩니다. 


1-2. Stand Alone TTS

기존 티맵에서 사용하던 방식으로 TTS 변환 엔진(NUGU/GOOGLE TTS ENGINE)과 음성 DB, 그리고 내부 예외처리 사전을 가지고 있습니다.


내부 예외처리 사전이란 특정 문자열을 정해진 문자로 치환하도록 가이드하는 문서인데요. 예를 들어 TTS변환 시 “8.15 광장”이라는 text가 들어왔을 때 “팔.십오광장”이 아닌 “팔.일오광장”으로 변환되도록 유도하는 문서를 뜻합니다.


언급된 엔진과 DB, 그리고 사전 이 세 가지를 조합하여 앱 내부에서 필요한 음성을 자체적으로 합성하고 서비스합니다.


1-3. 서버 기반 TTS

티맵에서는 사용자에게 길안내 정보를 전달하는 방법으로 음성안내 서비스를 제공합니다. 음성안내를 통해 사용자에게 보다 명확하고 정확한 정보를 전달할 수 있는데요.


서버 기반 TTS란 1) 길안내에 필요한 음성 TTS를 클라이언트에서 텍스트로 요청하고, 2) 서버에서 해당 텍스트를 추출하고, 3) 내부 저장된 사람의 음성 DB를 통한 음성 합성을 통해 가이드할 수 있도록 다시 전달하는 방식으로, 텍스트를 음성으로 변환하는 일체를 서버에 위임하는 형태를 말합니다. 


Chap2. 서버 기반 TTS 개발기


2-1. 개발 배경

기존에는 티맵 앱 내부에 static 하게 링크된 TTS Engine Library를 사용하였습니다. 이러한 형태로 길안내 가이드에 필요한 음성파일을 직접 앱단에서 변환하여 사용했을 때는 다음과 같은 문제가 있었습니다.


라이브러리 자체가 가지고 있는 파일 사이즈로 인해 앱 용량이 커지는 문제

음성파일이 추가로 많이 필요해지는 문제로 인해 여러 사람의 목소리를 지원하기 어려움

구동에 필요한 사전과 기본 음성을 초기에 다운로드하지 않으면 음성안내가 되지 않는 단점

TTS로 변환하는 음성이 POI명칭(point of interest)만 변환되는데, 해당 음성과 기본 음성을 조합하면 음성이 매끄럽게 이어지지 않음. 이로 인해 POI를 제외한 별도의 문장 음성에 대한 서비스를 앱 버전 업그레이드 시에만 추가 가능한 제한이 있음


2-2. 목표 수립 및 분석

서비스에 필요한 요구사항으로는 끊김 없이 안정적으로 음성안내가 제공되어야 했고, 음성 스크립트 또한 주기적으로 운영(멘트 변경)이 가능해야 했습니다.


또한 개발 배경에서 언급된 단점을 개선하기 위해 매끄러운 문장의 음성을 지원하기 위한 방법을 고민했으나 원활한 음성 지원을 위해서는 네트워크 사용량이 커질 수 있다는 이슈가 발생했습니다.


티맵 내비게이션 수행 시 발성되는 음성의 길이와 종류에 대해 분석이 필요했고, 이를 위해 티맵에 음성분석을 위한 로그를 삽입해 발성되는 음성의 종류와 평균 음성의 길이를 추출할 수 있었습니다. 

발성 음성 종류
평균 발성 시간

평균 Play time: 3.7초 

사용자당 이벤트: 232

최근 30분(4/28 8:15 ~ 8:45): 2,991,067 회

30분간 네트워크 사용량 계산(1초당 10kb로 계산)

- 3초 * 300만 * 10 kb => 90 TB


발성 건 별 평균 플레이 시간과 동일한 음성이 발성되는 HIT율이 높은 음성이 별도로 존재함을 파악할 수 있었습니다. 이를 통해 위 2-1. 개발 배경에서 언급된 ‘단점 개선을 위한 목표 수립과정’에서 언급된 방식은 아래와 같이 도출 가능했습니다.


1. 발성에 필요한 문장 전체에 대해 TTS 변환 요청을 하는 방법

- 장점: 문장이 자연스럽게 발성. 인터페이스가 간결하고 관리 요소가 적음

- 단점: 네트워크 사용량이 많아지고, 길이로 인해 응답에 대한 신뢰성 확보가 어려움


2. 기존에 사용하던 기본 음성과 POI명칭 형태로 단어별로 요청하는 방법

- 장점: 요청 음성 별 캐싱을 통한 네트워크 사용량이 줄어들고, 응답 지연에 대한 대응이 가능

- 단점: 1번의 장점과 대비됨 


2-3. 서버 기반 TTS 환경 구성

서버 기반 TTS를 구성하는 과정에서 도출된 방식들이 각기 단점이 명확하여 언급된 방식을 조합한 형태로 개발을 진행하게 되었습니다. 단어별로 요청을 하되 요청 헤더에 전체 문장의 정보를 전달하는 형태로 말이죠.


이를 통해 얻을 수 있는 장점은 명확했습니다. 캐시 HIT율이 높아 네트워크 사용량이 작아지고, 구현에 필요한 개발 공수가 적었으며, 문장에 대한 자연스러운 발성 또한 가능해지게 된 것입니다.

헤더의 전체 문장 정보를 통해 서버에서는 각 단어에 대한 음성의 강약을 조정해서 매끄럽게 발성할 수 있는 음성 단어 조합 리스트를 단말에 내려줄 수 있게 되었습니다.


요구사항에 맞게 끊김 없이 안정적인 음성안내를 위하여 요청한 단어의 응답이 오지 않았을 때, 해당 단어가 문장에 문맥상 꼭 필요하지 않은 경우에 대한 판별을 추가하여 해당 단어를 누락하고 기존 캐시HIT된 음성파일과 조합하여 음성안내가 될 수 있도록 예외처리를 추가했습니다.


또한 트래픽이 몰릴 수 있는 요청 텍스트에 대해서는 미리 캐싱 처리를 할 수 있도록 추가하여 서버 부하 또한 예방할 수 있게 처리했습니다(peak 타임 시보 알림으로 인한 예외사항).

초당 발성 시간
2-4. 장점 및 마치며

앞서 개발 배경에서 언급했던 용량 문제는 서버 기반으로 합성음을 요청, static 하게 링크했던 TTS라이브러리를 단말에서 서버로 이전해 앱 사이즈를 줄임으로써 해결했습니다.


필수 기본 음성 파일 또한 앱 초기화 시에 필요 없게 되어, 앱 초기 로딩 시 리소스를 받기 위한 시간과 데이터 사용량 또한 없어졌습니다.


POI TTS 음성이 매끄럽지 않을 경우 서버에서 즉각 수정 처리가 가능해졌고, 단말에서 작업해 줘야 하는 사항이 사라져 유지보수 또한 간결해졌습니다.


또한 가장 큰 특장점 중 하나는 단어별 요청을 진행하기 때문에 셀럽이나 다른 성우가 추가되더라도 단말 수정 없이 여러 보이스를 처리할 수 있다는 것입니다. 서버에 존재하는 매핑 테이블을 통해 특정 셀럽의 멘트 치환 또한 가능하여 특색 있는 티맵만의 셀럽 음성으로 안내가 가능한 것이죠.

셀럽 타입

이를 통해 현재 티맵에서 서비스 중인 길안내 목소리에서 다양한 성우와 셀럽의 목소리를 경험할 수 있게 되었습니다. 

오늘은 티맵 내비게이션 안내 음성을 자동으로 만드는 서버 기반 TTS 개발기에 대해서 소개해보았습니다. 끝까지 읽어주셔서 감사합니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari