[Python] 파이썬으로 TTS 구현하기: gTTS (Google Text-to-Speech)

2025. 11. 13. 14:28·개발

 

최근 프로젝트를 진행하다가 텍스트를 음성으로 변환해 주는 TTS(Text-to-Speech) 기능이 필요하게 되었다.

여러 가지 라이브러리를 찾아보다가,가장 사용법이 간편하고 강력해 보이는 gTTS 라이브러리를 발견하여 적용해 보았다. 공부한 내용을 정리하고 공유할 겸, gTTS의 설치부터 공식 문서의 상세 내용까지 자세하게 포스팅한다.

 

1. gTTS 란?

gTTS(Google Text-to-Speech)는 Google 번역의 TTS API를 사용하기 쉽게 만들어 놓은 파이썬 라이브러리이다. 간단한 코드로 텍스트를 mp3 오디오 파일로 쉽게 변환할 수 있다.

 

2. gTTS를 선택한 이유

프로젝트에 TTS를 도입하기로 하고 여러 가지 옵션을 검토했다.

나의 주된 고려 사항은 1) 기본적으로 무료여야 하고, 2) 별도 GPU 없이 CPU만으로도 잘 동작해야 하며, 3) 이 조건 안에서 최대한 자연스러운 음성 품질을 제공하는 것이었다.

여러 라이브러리와 서비스를 비교해 본 결과, gTTS가 이 조건에 가장 잘 맞는다고 판단했다.

표에서 볼 수 있듯, 클라우드 서비스(ElevenLabs, Naver)나 최신 오픈소스 모델(CoquiTTS 등)들은 품질은 매우 좋지만 유료이거나, 로컬에서 사용하려면 GPU 등 높은 하드웨어 사양을 요구했다.

gTTS는 무료이면서도 간편하게 (인터넷 연결만으로) 준수한 품질의 한국어 음성을 얻을 수 있어, 내 프로젝트에 사용하기에 가장 합리적인 선택이었다.

 

3. 설치 (Installation)

설치는 pip를 통해 간단하게 진행할 수 있다.

pip install gTTS

 

 

4. 간단한 사용법 (Basic Usage)

공식 문서를 살펴보기 전에, 가장 기본적인 "Hello World" 예제부터 실행해 본다. 한국어 "안녕하세요"를 hello_ko.mp3 파일로 저장하는 코드이다.

from gtts import gTTS
import os

# 변환할 텍스트
text = "안녕하세요. gTTS 테스트입니다."

# gTTS 객체 생성 (언어를 'ko'로 설정)
tts = gTTS(text=text, lang='ko')

# mp3 파일로 저장
filename = "hello_ko.mp3"
tts.save(filename)

# (선택) 저장된 mp3 파일 실행 (Windows)
# os.system(f"start {filename}")

# (선택) 저장된 mp3 파일 실행 (macOS)
# os.system(f"afplay {filename}")

위 코드를 실행하면 같은 폴더에 hello_ko.mp3 파일이 생성된 것을 확인할 수 있다.

 

5. gTTS 공식 문서 파헤치기 (Modules)

이제 gTTS의 세부 기능들을 공식 문서 내용을 바탕으로 자세히 살펴본다.

gTTS (gtts.gTTS) 

class gtts.tts.gTTS(text, tld='com', lang='en', slow=False, lang_check=True, pre_processor_funcs=[...], tokenizer_func=<...>, timeout=None)

gTTS – Google Text-to-Speech. Google 번역의 Text-to-Speech API에 대한 인터페이스이다.

 

주요 파라미터:

  • text (str): 읽을 텍스트.
  • tld (str): Google 번역 호스트의 최상위 도메인 (예: https://translate.google.<tld>). (기본값: com)
  • lang (str, optional): 텍스트를 읽을 언어 (IETF 언어 태그). (기본값: en)
  • slow (bool, optional): 텍스트를 더 느리게 읽는다. (기본값: False)
  • lang_check (bool, optional): lang이 유효한지 엄격하게 확인한다. (기본값: True)
  • pre_processor_funcs (list): 텍스트를 토큰화하기 전에 변환(전처리)하는 데 사용되는 0개 이상의 함수 리스트.
  • tokenizer_func (callable): 문자열을 입력받아 문자열 리스트(토큰)를 반환하는 함수.
  • timeout (float or tuple, optional): 서버가 데이터를 보낼 때까지 기다리는 시간(초). (기본값: None)

 

주요 메소드 (Methods)

  • get_bodies(): TTS API로 전송될 요청 본문(들)을 가져온다.
  • save(savefile): TTS API 요청을 수행하고 결과를 파일에 쓴다.
  • stream(): TTS API 요청(들)을 수행하고 바이트를 스트리밍한다.
  • write_to_fp(fp): TTS API 요청(들)을 수행하고 바이트를 파일과 유사한 객체에 쓴다.

 

Languages (gtts.lang) 

참고: 사용 가능한 언어 목록을 얻는 가장 쉬운 방법은 터미널에서 gtts-cli --all을 실행하는 것이다.

[이미지: gtts-cli --all을 실행한 터미널 화면 스크린샷]

  • gtts.lang.tts_langs(): Google Text-to-Speech가 지원하는 언어 사전을 반환한다. ({ '<lang>': '<name>'} 형식)

 

Localized ‘accents’ (지역화된 '악센트') 

 

tld 파라미터를 조절하여 동일 언어(예: en)라도 다른 악센트(영국, 미국, 호주 등)로 음성을 생성할 수 있다.

참고: 기본 tld는 com이며, 사용자의 네트워크 위치에 따라 현지 악센트를 사용한다.

Local accent Language code (lang) Top-level domain (tld)
English (Australia) en com.au
English (United Kingdom) en co.uk
English (United States) en us
French (Canada) fr ca
Spanish (Mexico) es com.mx
Spanish (Spain) es es

 

Examples (예제) 

1. 'hello'를 영어로 hello.mp3에 쓰기:

from gtts import gTTS
tts = gTTS('hello', lang='en')
tts.save('hello.mp3')

 

2. 'hello'를 호주 영어로 hello.mp3에 쓰기 (tld 활용):

from gtts import gTTS
tts = gTTS('hello', lang='en', tld='com.au')
tts.save('hello.mp3')

 

3. 여러 언어 텍스트를 한 파일에 쓰기:

from gtts import gTTS

tts_en = gTTS('hello', lang='en')
tts_fr = gTTS('bonjour', lang='fr')

with open('hello_bonjour.mp3', 'wb') as f:
    tts_en.write_to_fp(f)
    tts_fr.write_to_fp(f)

 

 

Playing sound directly (사운드 직접 재생하기) 

BytesIO를 사용하여 파일에 저장하지 않고 메모리상에서 바로 오디오 데이터를 다룰 수 있다.

from gtts import gTTS
from io import BytesIO

mp3_fp = BytesIO()
tts = gTTS('hello', lang='en')
tts.write_to_fp(mp3_fp)

# mp3_fp.seek(0) # 커서 초기화
# 이제 오디오 라이브러리(pygame 등)에서 mp3_fp를 로드하여 사용

 

 

6. 전처리(Pre-processing)와 토큰화(Tokenizing)

gTTS의 매우 중요한 기능이다. Google TTS API는 한 번에 최대 100자의 텍스트만 처리할 수 있다. 100자가 넘는 긴 텍스트를 입력하면 gTTS는 이를 여러 개의 '토큰(token)'으로 분할하여 API 요청을 보낸다.

이때, 문장 중간(예: "U.S.A."의 'S'와 'A' 사이)에서 잘리면 음성이 부자연스러워진다. '전처리'와 '토큰화'는 이렇게 긴 텍스트를 최대한 자연스럽게 분할하기 위한 과정이다.

전처리 (Pre-processing)

토큰화(분할)를 하기 전에 텍스트를 미리 수정하는 단계이다. gTTS 생성자의 pre_processor_funcs 인자를 통해 함수 리스트를 받는다.

기본적으로 4가지 전처리기가 순서대로 적용된다.

  1. pre_processors.tone_marks: 톤 수정 구두점(?, !) 뒤에 공백을 추가하여 분할이 잘 되도록 준비한다.
  2. pre_processors.end_of_line: 줄 끝의 하이픈(-)으로 잘린 단어를 다시 붙인다.
  3. pre_processors.abbreviations: 'Mr.', 'Mrs.', 'Dr.' 등 알려진 약어 뒤의 마침표를 제거한다. 이는 토크나이저가 이 마침표를 문장의 끝으로 오인하지 않게 하기 위함이다.
  4. pre_processors.word_sub: 'Esq.'를 'Esquire'로 바꾸는 등 특정 단어를 치환한다.

전처리기 커스텀하기

gtts.tokenizer.symbols.SUB_PAIRS 리스트에 치환할 단어 쌍을 추가하여 간단하게 커스텀할 수 있다.

from gtts.tokenizer import pre_processors
import gtts.tokenizer.symbols

# 'sub.'를 'submarine'으로 치환하도록 추가
gtts.tokenizer.symbols.SUB_PAIRS.append(
    ('sub.', 'submarine'))

test_text = "Have you seen the Queen's new sub.?"
processed_text = pre_processors.word_sub(test_text)
# 결과: "Have you seen the Queen's new submarine?"

토큰화 (Tokenizing)

전처리가 끝난 텍스트를 100자 미만의 청크(토큰 리스트)로 분할하는 단계이다. tokenizer_func 인자를 통해 분할 함수를 지정한다.

기본 토크나이저는 음성이 잠시 멈추는 지점(예: 마침표, 쉼표 등)을 기준으로 텍스트를 분할한다.

기본 토크나이저 케이스(분할 규칙):

  1. tokenizer_cases.tone_marks: 톤 수정 구두점(?, !)을 기준으로 분할한다.
  2. tokenizer_cases.period_comma: 마침표(.)나 쉼표(,)를 기준으로 분할한다.
    • 중요: '10.5'나 'U.S.A.'처럼 숫자나 약어 중간의 마침표는 분할하지 않도록 처리되어 있다.
  3. tokenizer_cases.other_punctuation: 콜론(:), 세미콜론(;) 등 자연스럽게 끊어 읽는 다른 구두점을 기준으로 분할한다.

NLTK와 같은 외부 라이브러리를 tokenizer_func로 전달하여 사용할 수도 있다.

 

100자 제한 처리 (Minimizing)

토큰화가 완료된 후에도, 만약 어떤 토큰이 100자를 초과하면 gTTS는 다음 규칙에 따라 해당 토큰을 다시 분할한다.

  1. 100번째 글자 직전의 가장 가까운 공백에서 분할한다.
  2. 만약 공백이 없다면, 100번째와 101번째 글자 사이에서 강제로 분할한다.

'개발' 카테고리의 다른 글

REST, REST API, 그리고 RESTful API  (0) 2025.11.21
[Spring]서블릿(Servlet)과 Spring MVC  (0) 2025.11.17
[Celery] 파이썬 비동기 태스크 큐 Celery란 무엇인가  (0) 2025.11.11
[Spring] STOMP, JWT 그리고 동작하지 않는 @AuthenticationPrincipal  (1) 2025.10.22
'개발' 카테고리의 다른 글
  • REST, REST API, 그리고 RESTful API
  • [Spring]서블릿(Servlet)과 Spring MVC
  • [Celery] 파이썬 비동기 태스크 큐 Celery란 무엇인가
  • [Spring] STOMP, JWT 그리고 동작하지 않는 @AuthenticationPrincipal
gepetton
gepetton
공부하며 얻은것들을 공유합니다!
  • gepetton
    gepetton의 블로그
    gepetton
  • 전체
    오늘
    어제
    • 분류 전체보기 (8)
      • JAVA (1)
      • 개발 (5)
      • 자격증 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    spring boot
    트러블슈팅
    58회 SQLD
    리눅스마스터 1급 후기
    리눅스마스터1급 2502
    Celery
    Spring MVC
    sqld
    리눅스마스터1급
    Python
    리눅스마스터 후기
    SQL개발자
    jwt
    Spring Security
    자격증
    WebSocket 인증
    STOMP
    amqp
    비동기처리
    @AuthenticationPrincipal
    text-to-speech
    태크스큐
    STT
    Websocket
    sqld 후기
    Servlet Container
    리눅스마스터 2502
    GTTS
    파이썬 TTS
    SQLD 2025
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
gepetton
[Python] 파이썬으로 TTS 구현하기: gTTS (Google Text-to-Speech)
상단으로

티스토리툴바