본문 바로가기

AI Development

Gemini 3.1 Flash TTS 완전 가이드 — 자연어로 AI 목소리를 연출하는 법

반응형

"긴장감 있게 읽어줘", "여기서 잠깐 멈춰", "속삭이듯이". 이제 이 말 한 마디로 AI 목소리를 연출할 수 있습니다.

[핵심 요약]
→ 출시: 2026년 4월 15일 (Google, 프리뷰)
→ 핵심: SSML 없이 자연어로 음성 스타일 제어
→ 오디오 태그: 200개+ ([excitement], [whispers], [slow] 등)
→ 멀티 스피커: 단일 API 호출로 여러 화자 동시 생성
→ 언어: 70개+ 지원
→ 벤치마크: Artificial Analysis TTS Elo 1,211 — 공개 TTS 최고점
→ 가격: 입력 $1/1M 토큰, 출력 $20/1M 토큰 / AI Studio 무료 체험 가능
→ 모델 ID: gemini-3.1-flash-tts-preview

기존 TTS와 뭐가 다른가

TTS는 오랫동안 "텍스트 넣으면 그냥 읽어주는 것"이었습니다. 강조나 감정이 필요하면 SSML이라는 XML 마크업을 써야 했습니다.

<!-- 기존 SSML 방식 — 장황하고 배우기 어려움 -->
<speak>
  <prosody rate="slow" pitch="-2st">
    이것은 중요한 내용입니다.
  </prosody>
  <break time="500ms"/>
  <emphasis level="strong">절대 잊지 마세요.</emphasis>
  <prosody volume="soft">그리고 이건 비밀인데요...</prosody>
</speak>
# Gemini 3.1 Flash TTS 방식 — 자연어로 그냥 말하면 됨
text = """
[slow] 이것은 중요한 내용입니다. [long pause]
[strong emphasis] 절대 잊지 마세요.
[whispers] 그리고 이건 비밀인데요...
"""
[핵심 변화]
→ 기존: SSML XML 태그 학습 필요, 개발자만 가능
→ 신규: 자연어 태그 또는 문장으로 지시, 누구나 가능
→ 예시: "speak with quiet urgency" → 모델이 알아서 해석
→ 예시: [nervous] 태그 → 긴장한 목소리 자동 적용
→ 비개발자도 음성 퀄리티 직접 튜닝 가능

실전 1 — 기본 설치 및 API 호출

pip install google-generativeai
import google.generativeai as genai
import wave
import struct

# API 키 설정
genai.configure(api_key="YOUR_GOOGLE_API_KEY")

# 기본 TTS 호출
def text_to_speech(text: str, output_file: str = "output.wav"):
    client = genai.Client()
    
    response = client.models.generate_content(
        model="gemini-3.1-flash-tts-preview",
        contents=text,
        config=genai.types.GenerateContentConfig(
            response_modalities=["AUDIO"],
            speech_config=genai.types.SpeechConfig(
                voice_config=genai.types.VoiceConfig(
                    prebuilt_voice_config=genai.types.PrebuiltVoiceConfig(
                        voice_name="Kore"  # 30개 프리셋 중 선택
                    )
                )
            )
        )
    )
    
    # WAV 파일로 저장
    audio_data = response.candidates[0].content.parts[0].inline_data.data
    
    with open(output_file, "wb") as f:
        f.write(audio_data)
    
    print(f"저장 완료: {output_file}")

# 사용
text_to_speech("안녕하세요, Gemini TTS 테스트입니다.")
[사용 가능한 프리셋 보이스 (일부)]
→ Kore: 권위 있고 차분한 여성 목소리
→ Charon: 깊고 안정적인 남성 목소리
→ Fenrir: 활기차고 젊은 남성 목소리
→ Aoede: 부드럽고 따뜻한 여성 목소리
→ Puck: 밝고 경쾌한 중성 목소리
→ 총 30개 프리셋 제공

실전 2 — 오디오 태그로 감정/페이싱 제어

Gemini 3.1 Flash TTS의 핵심 기능입니다. 200개+ 태그를 텍스트 안에 직접 삽입합니다.

# 팟캐스트 인트로 — 감정 태그 활용
podcast_intro = """
[excitement] 안녕하세요, 여러분! 오늘 에피소드에 오신 걸 환영합니다!
[slow] 오늘은... 정말 특별한 이야기를 가져왔어요.
[long pause]
[whispers] 사실 이건 업계에서 아직 공개되지 않은 내용인데요.
[normal] 자, 바로 시작해 보겠습니다!
"""

text_to_speech(podcast_intro, "podcast_intro.wav")

# 오디오북 내러티브 — 극적 연출
audiobook_scene = """
[cautious] 그녀는 천천히 문을 열었다.
[tension] 방 안은 조용했다. 너무 조용했다.
[anxiety] 무언가 잘못됐다는 느낌이 들었다.
[long pause]
[alarm] 그때였다. 전화기가 울렸다.
[panic] 그녀는 뛰기 시작했다!
"""

text_to_speech(audiobook_scene, "audiobook.wav")
[자주 쓰는 200+ 태그 분류]

감정 태그:
→ [excitement] 흥분     → [nervousness] 긴장
→ [enthusiasm] 열정     → [frustration] 답답함
→ [curiosity] 호기심    → [amusement] 재미있음
→ [awe] 경이로움        → [anger] 분노
→ [hope] 희망          → [confusion] 혼란
→ [determination] 결의  → [relief] 안도

페이싱 태그:
→ [slow] 천천히         → [fast] 빠르게
→ [short pause] 짧은 멈춤 → [long pause] 긴 멈춤

비언어적 태그:
→ [whispers] 속삭임     → [laughs] 웃음
→ [sighs] 한숨          → [clears throat] 헛기침

실전 3 — 멀티 스피커 대화 생성

단일 API 호출로 여러 화자가 자연스럽게 대화하는 오디오를 만들 수 있습니다.

# 두 화자 대화 생성
def multi_speaker_dialogue(script: str, output_file: str):
    client = genai.Client()
    
    response = client.models.generate_content(
        model="gemini-3.1-flash-tts-preview",
        contents=script,
        config=genai.types.GenerateContentConfig(
            response_modalities=["AUDIO"],
            speech_config=genai.types.SpeechConfig(
                multi_speaker_voice_config=genai.types.MultiSpeakerVoiceConfig(
                    speaker_voice_configs=[
                        genai.types.SpeakerVoiceConfig(
                            speaker="Host",
                            voice_config=genai.types.VoiceConfig(
                                prebuilt_voice_config=genai.types.PrebuiltVoiceConfig(
                                    voice_name="Kore"
                                )
                            )
                        ),
                        genai.types.SpeakerVoiceConfig(
                            speaker="Guest",
                            voice_config=genai.types.VoiceConfig(
                                prebuilt_voice_config=genai.types.PrebuiltVoiceConfig(
                                    voice_name="Charon"
                                )
                            )
                        )
                    ]
                )
            )
        )
    )
    
    audio_data = response.candidates[0].content.parts[0].inline_data.data
    with open(output_file, "wb") as f:
        f.write(audio_data)

# 팟캐스트 대화 스크립트
dialogue = """
Host: [enthusiasm] 오늘 게스트로 AI 연구자 김박사님을 모셨습니다!
Guest: [warm] 초대해 주셔서 감사합니다. 만나서 반갑습니다.
Host: [curiosity] 요즘 LLM 연구에서 가장 핫한 주제가 뭔가요?
Guest: [slow] 음... [determination] 저는 에이전트 메모리 아키텍처가 
       다음 큰 돌파구가 될 거라고 생각합니다.
Host: [excitement] 오, 그거 저도 정말 궁금했는데요!
"""

multi_speaker_dialogue(dialogue, "podcast.wav")
[멀티 스피커 핵심 포인트]
→ 화자마다 다른 프리셋 보이스 배정 가능
→ 화자 전환이 자연스럽게 처리됨 (별도 파일 합치기 불필요)
→ 각 화자에 독립적으로 감정 태그 적용 가능
→ 현재 2명 화자 공식 지원 (3명 이상은 실험적)

실전 4 — 팟캐스트/오디오북 자동 생성 파이프라인

블로그 글을 오디오북으로 자동 변환하는 전체 파이프라인입니다.

import google.generativeai as genai
import anthropic
import os

genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
anthropic_client = anthropic.Anthropic()
gemini_client = genai.Client()

def blog_to_audiobook(blog_text: str, output_file: str = "audiobook.wav"):
    """
    블로그 글 → 오디오북 자동 변환 파이프라인
    1단계: Claude로 TTS용 스크립트 변환 (감정 태그 추가)
    2단계: Gemini TTS로 음성 생성
    """
    
    # 1단계: Claude로 오디오북 스크립트 변환
    print("1단계: 스크립트 변환 중...")
    
    script_response = anthropic_client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=4000,
        messages=[{
            "role": "user",
            "content": f"""
다음 블로그 글을 오디오북용 스크립트로 변환해주세요.

규칙:
1. 자연스러운 구어체로 변환
2. 감정 태그를 적절히 삽입: [excitement], [slow], [pause], [curiosity] 등
3. 핵심 포인트 앞에 [emphasis] 태그 추가
4. 복잡한 개념 설명 시 [slow] 태그로 페이싱 조절
5. 섹션 전환 시 [long pause] 추가

블로그 글:
{blog_text}

감정 태그만 삽입하고 내용은 충실히 유지해주세요.
"""
        }]
    )
    
    tts_script = script_response.content[0].text
    print(f"스크립트 변환 완료 ({len(tts_script)}자)")
    
    # 2단계: Gemini TTS로 음성 생성
    print("2단계: 음성 생성 중...")
    
    response = gemini_client.models.generate_content(
        model="gemini-3.1-flash-tts-preview",
        contents=tts_script,
        config=genai.types.GenerateContentConfig(
            response_modalities=["AUDIO"],
            speech_config=genai.types.SpeechConfig(
                voice_config=genai.types.VoiceConfig(
                    prebuilt_voice_config=genai.types.PrebuiltVoiceConfig(
                        voice_name="Kore"
                    )
                )
            )
        )
    )
    
    audio_data = response.candidates[0].content.parts[0].inline_data.data
    with open(output_file, "wb") as f:
        f.write(audio_data)
    
    print(f"완료: {output_file}")
    return output_file

# 사용 예시
blog_post = """
# LLM 추론 최적화 — 비용 80% 줄이는 법

LLM API 비용이 부담스럽다면 추론 최적화부터 시작해야 합니다.
가장 효과적인 방법은 세 가지입니다.

첫째, 캐싱을 활용하세요. 동일한 시스템 프롬프트가 반복된다면
프롬프트 캐싱으로 비용을 최대 90% 줄일 수 있습니다.

둘째, 모델 라우팅을 적용하세요. 단순한 태스크에는 저렴한 모델을,
복잡한 태스크에만 프론티어 모델을 사용합니다.

셋째, 배치 처리를 사용하세요. 실시간이 아닌 작업은
배치 API를 통해 50% 할인된 가격으로 처리할 수 있습니다.
"""

audiobook = blog_to_audiobook(blog_post, "llm_optimization.wav")
[파이프라인 포인트]
→ Claude: 블로그 글 → 감정 태그 포함 스크립트 자동 변환
→ Gemini TTS: 스크립트 → 자연스러운 음성
→ 결과: 수동 녹음 없이 오디오북 자동 생성
→ 응용: 블로그 글 자동 팟캐스트화, 교육 콘텐츠 오디오 버전

실전 5 — 가격 및 경쟁사 비교

# 비용 계산 예시 (블로그 글 1편 → 오디오북)
cost_calculator = {
    "블로그_글_길이": "3,000자 (약 1,500 토큰)",
    "오디오_출력": "약 5분 분량 (약 15,000 토큰)",

    "Gemini_3.1_Flash_TTS": {
        "입력": "$1/1M 토큰 × 1,500 = $0.0015",
        "출력": "$20/1M 토큰 × 15,000 = $0.30",
        "총계": "약 $0.30 / 편"
    },
    "ElevenLabs": {
        "가격": "글자 수 기준 / 월 $22부터",
        "총계": "약 $0.80~1.50 / 편"
    },
    "OpenAI_TTS": {
        "가격": "$15/1M 토큰",
        "총계": "약 $0.45 / 편"
    }
}
[경쟁사 비교]
                    Gemini TTS    ElevenLabs    OpenAI TTS
자연어 태그:         ✅ 200개+     ❌            ❌
멀티스피커:          ✅ 네이티브   ✅            ❌
음성 클로닝:         ❌            ✅ (강점)     △ 제한적
언어 지원:           70개+        30개+         57개+
가격 (1M토큰):       $20 출력      $0.18/1K자    $15
AI 벤치마크 Elo:     1,211         ~1,180        ~1,050
SynthID 워터마크:    ✅            ❌            ❌
[선택 기준]
→ 자연어 제어 + 팟캐스트/오디오북 → Gemini 3.1 Flash TTS
→ 목소리 클로닝 + 브랜드 보이스 → ElevenLabs
→ 기존 OpenAI 스택 통합 → OpenAI TTS
→ 실시간 음성 대화 에이전트 → Gemini Live API

마무리

✅ 써야 할 때
→ 블로그/뉴스레터를 팟캐스트로 자동 변환
→ 오디오북 제작 (감정 태그로 연출)
→ 다국어 콘텐츠 성우 비용 절감
→ AI 에이전트에 자연스러운 음성 응답 추가
→ 게임/인터랙티브 스토리 캐릭터 음성
→ 교육 콘텐츠 자동 오디오 버전 생성

❌ 아직 기다려야 할 때
→ 특정 사람 목소리 클로닝 (ElevenLabs 권장)
→ 한국어 감정 표현 정확도 (영어 대비 낮음)
→ 150ms 이하 초저지연 필요 (ElevenLabs Scribe v2 권장)
→ 3명 이상 멀티스피커 (현재 2명 공식 지원)

 

반응형