본문 바로가기

BLOG/오픈소스 리뷰기

[오픈소스 리뷰기] TTS(Text-to-Speech) 음성합성기술 API 이용하기

오픈소스 리뷰 : 슬기로운 오픈소스 사용법 리뷰해드립니다!
#13 TTS(Text-to-Speech) 음성합성기술 API 이용하기

 

 

 

안녕하세요. 디노랩스입니다!

오늘 리뷰해드릴 오픈소스는 바로 TTS라는 기술을 이용해볼건데요.

TTS는 Text to Speech의 약자로 한국어로 '음성합성'이라고 하는데요, 말소리의 음파를 기계가 자동으로 만들어 내는 기술입니다.

간단히 말하면 모델로 선정된 한 사람의 말소리를 녹음하여 일정한 음성 단위로 분할한 다음, 부호를 붙여 합성기에 입력하였다가 지시에 따라 필요한 음성 단위만을 다시 합쳐 말소리를 인위로 만들어내는 기술이죠!

 

우리 주변에서도 쉽게 볼 수 있는 음성합성기술! API 함께 사용해 볼까요?ㅎㅎ

 

 

 

01_Google gTTS

 

가장 먼저 gTTS 모듈을 통해 구글 TTS 기능을 사용할 수 있는 방법을 알아보겠습니다.
gTTS (Google Text-to-Speech)는 Google 번역 텍스트 음성 변환 API와 상호 작용하는 Python 라이브러리 및 CLI 도구로 설치 후 누구나 손쉽게 사용할 수 있습니다.

 

<gTTS 공식문서>
https://gtts.readthedocs.io/en/latest/index.html

 

gTTS — gTTS documentation

© Copyright 2014-2021 Pierre Nicolas Durette. Revision 4ac1eafa.

gtts.readthedocs.io

 

 

# gTTS 모듈을 설치합니다.
!pip install gTTS

 

# gTTS와 notebook 환경에서 audio 파일을 재생하기 위한 모듈을 불러옵니다.
from gtts import gTTS
from IPython.display import Audio
from IPython.display import display

 

이제 원하는 텍스트를 입력한 뒤 TTS를 통해 오디오파일을 저장해보겠습니다.

 

text = "안녕하세요. 구글 TTS API 테스트 중입니다. 파이썬을 활용하면 무엇이든 해낼 수 있어요."
tts = gTTS(text, lang="ko")
tts.save("hi.mp3")
# 현재 작업중인 디렉토리에 저장된 hi.mp3 파일을 재생해보겠습니다.
wn = Audio('hi.mp3', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

gTTS 는 아래와 같은 다양한 언어들을 지원합니다.

from gtts import lang
lang.tts_langs()

 

 

또 gTTS 는 영어, 프랑스어, 중국어, 스페인어, 포르투갈어의 경우 지역별로 다른 억양을 적용할 수 있습니다.
참고 : https://gtts.readthedocs.io/en/latest/module.html#localized-accents

 

Module (gtts) — gTTS documentation

Where is an IETF language tag such as en or zh-TW, and is the full English name of the language, such as English or Chinese (Mandarin/Taiwan).

gtts.readthedocs.io

 

wn = Audio('hello.mp3', autoplay=True)
display(wn)
# 먼저 영어 억양의 default인 미국 억양을 적용해보겠습니다.
text = 'Good afternoon. You can do anything with python'
tts = gTTS(text, lang='en')
tts.save('hello.mp3')
wn = Audio('hello.mp3', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

# 이번에는 tld 파라미터를 다르게 적용하여 영국 억양을 적용해보겠습니다.
text = 'Good afternoon. You can do anything with python'
tts = gTTS(text, lang='en', tld='co.uk')
tts.save('hello.mp3')
wn = Audio('hello.mp3', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

 

 

02_Kakao

 

다음으로는 카카오에서 개발한 음성합성 API 활용법을 알아보겠습니다.

아래 링크에서 시작하기 버튼을 클릭, 애플리케이션 추가하기 버튼을 클릭하여 앱 이름, 사업자명을 입력하여 생성을 완료합니다.

https://developers.kakao.com/product/voice

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

앱 생성을 완료하면 앱 설정에서 생성된 REST API 키값을 확인할 수 있습니다.
다음으로는 카카오 음성 API를 활용하기 위해 왼쪽 메뉴 버튼 중 '음성'을 클릭하여, 아래와 같이 음성 API를 활성화해야 합니다.
on 버튼을 클릭 후 사용목적을 입력하여 활성화를 완료해주세요.

 

 

 

이제 직접 코드를 작성하여 카카오 TTS api 를 활용해보겠습니다.

 

import os, requests, json, wave

url = "https://kakaoi-newtone-openapi.kakao.com/v1/synthesize"
key = '발급받은 키를 입력해주세요.'
headers = {
	"Content-Type": "application/xml",
    "Authorization": "KakaoAK " + key,
}

 

카카오 api에서는 기본적으로 모든 음성은 <speak> 태그로 감싸야 합니다.
아래와 같이 음성으로 변환하고자 하는 텍스트를 입력합니다.

 

 

# 텍스트를 입력합니다.
text = "안녕하세요. 제 이름은 카카오 음성합성 API 입니다. 만나서 반가워요. ㅋㅋㅋ"

# 입력한 텍스트를 변환하여 api를 호출합니다.
data = f"<speak>{text}</speak>".encode('utf-8').decode('latin1')
res = requests.post(url, headers=headers, data=data)

# 호출하여 불러온 결과값을 저장합니다.
with open('hello_kakao.wav', 'wb') as f:
    f.write(res.content)

 

wn = Audio('hello_kakao.wav', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

이번에는 카카오 TTS api에서 제공하는 다양한 옵션들을 몇가지 알아보도록 하겠습니다.
참고 : https://developers.kakao.com/assets/guide/kakao_ssml_guide.pdf

 

 

<voice> 태그를 활용하면 다른 목소리를 적용할 수 있습니다.

  • WOMAN_READ_CALM : 여성 차분한 낭독체 (default)
  • MAN_READ_CALM : 남성 차분한 낭독체
  • WOMAN_DIALOG_BRIGHT : 여성 밝은 대화체
  • MAN_DIALOG_BRIGHT : 남성 밝은 대화체

 

data = '''
<speak>
 <voice name="WOMAN_READ_CALM"> 지금은 여성 차분한 낭독체입니다.</voice>
 <voice name="MAN_READ_CALM"> 지금은 남성 차분한 낭독체입니다.</voice>
 <voice name="WOMAN_DIALOG_BRIGHT"> 안녕하세요. 여성 밝은 대화체예요.</voice>
 <voice name="MAN_DIALOG_BRIGHT"> 안녕하세요. 남성 밝은 대화체예요.</voice>
 </speak>
'''.encode('utf-8').decode('latin1')
res = requests.post(url, headers=headers, data=data)

with open('voice.wav', 'wb') as f:
    f.write(res.content)

 

wn = Audio('voice.wav', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

prosody 태그를 활용하면 음성의 속도와 볼륨을 변경할 수 있습니다.

  • rate
    • slow : 0.9
    • medium : 1.0 (default)
    • fast : 1.1
  • volume
    • soft : 0.7
    • medium : 1.0 (default)
    • loud : 1.4

 

data = '''
<speak>
 <prosody rate="fast" volume="loud">안녕하세요. 반가워요.</prosody>
 <prosody rate="slow" volume="soft">안녕하세요. 반가워요.</prosody>
 </speak>
'''.encode('utf-8').decode('latin1')
res = requests.post(url, headers=headers, data=data)

with open('prosody.wav', 'wb') as f:
    f.write(res.content)

 

wn = Audio('prosody.wav', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

break 태그를 활용하면 의도적으로 문장과 문장 사이에 "쉼"을 줄 수 있습니다.

  • time : 150(0.15초) ~ 1500(1.5초)까지 지원, default는 150

 

data = '''
<speak>
 첫 번째 문장입니다.
 <break/> 두 번째 문장입니다 옵션을 안준 경우 기본 셋팅 150입니다.
 세 번째 문장입니다
 <break time="150ms"/> 네 번째 문장입니다. 앞이랑 똑같죠?
 <break time="1500ms"/> 다섯 번째 문장입니다. 길게 쉬죠?
 ㄹㅁㅌㄷㅊㄹ
 <break time="1500ms"/> 여섯 번째 문장입니다. 앞에 문장이 실패해서 쉬지 않습니다.
 </speak>
'''.encode('utf-8').decode('latin1')
res = requests.post(url, headers=headers, data=data)

with open('break.wav', 'wb') as f:
    f.write(res.content)

 

wn = Audio('break.wav', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

kakao:effect 태그를 활용하면 존대말을 반말로 변경할 수도 있습니다.

  • tone
    • default : 기본 말투, 변경 없음
    • friendly : 친구같은 말투

 

 

data = '''
<speak>
 <kakao:effect tone="friendly"> 안녕하세요. 반가워요. 원래는 존댓말인데 반말로 바꿔보겠습니다.
 <kakao:effect tone="default"> 잘 지내요? 여긴 존댓말 구역이에요.</kakao:effect>
 <prosody> 저도 잘 지내요. </prosody>
 </kakao:effect>
 </speak>
'''.encode('utf-8').decode('latin1')
res = requests.post(url, headers=headers, data=data)

with open('friendly.wav', 'wb') as f:
    f.write(res.content)

 

wn = Audio('friendly.wav', autoplay=True)
display(wn)
 

'디노랩스'에서 업로드한 동영상

 

www.dinolabs.ai

 

 

여기까지입니다. 잘 따라오셨나요? :)

이렇게 오늘 구글과 카카오의 TTS API를 활용하는 법을 알려드렸는데요. 

우리 주변에서의 여러 오픈소스들을 이렇게 쉽게, 다양하게 활용할 수 있답니다!