Gemini TTS로 음성 생성

Gemini 텍스트 음성 변환 (TTS) 모델은 텍스트를 단일 화자 또는 다중 화자 오디오로 변환합니다. 구조화된 차례 메타데이터 (speech_metadata)와 인라인 보컬 태그를 사용하여 오디오의 스타일, 억양, 속도, 어조를 제어할 수 있습니다.

이 페이지에서는 Gemini Enterprise API의 generateContent 및 streamGenerateContent 메서드를 사용하여 다음 모델로 음성을 생성하는 방법을 보여줍니다.

TTS 모델은 내레이션, 오디오북, 음성 에이전트 응답과 같은 스타일과 사운드를 세부적으로 제어하여 정확한 텍스트 낭독에 맞게 조정됩니다. 오디오 입력 및 출력을 사용하는 대화형 실시간 대화의 경우 대신 Live API를 사용하세요.

gemini-3.1-flash-tts-preview와 같은 이전 Gemini TTS 모델을 사용하는 경우 이전 가이드를 참조하세요.

지원되는 모델

모델 단일 화자 다중 화자 스트리밍 음성 디자인 음성 복제
Gemini 3.8 Flash TTS (gemini-3.8-flash-tts)
Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts)
Gemini 3.1 Flash TTS 프리뷰 (gemini-3.1-flash-tts-preview)
Gemini 2.5 Pro TTS (gemini-2.5-pro-tts)
Gemini 2.5 Flash TTS (gemini-2.5-flash-tts)

이 페이지의 샘플과 기능은 Gemini 3.8 TTS 모델에 적용됩니다. 이전 모델의 경우Google Cloud 텍스트 음성 변환 문서의 Gemini-TTS를 참고하세요.

모델 사용 시기

두 Gemini 3.8 TTS 모델은 동일한 요청 스키마와 프롬프팅 형식을 공유하므로 모델 ID를 변경하여 모델 간에 전환할 수 있습니다.

  • 음향 충실도, 미묘한 연기, 표현력 제어가 최우선인 경우 Gemini 3.8 Flash TTS (gemini-3.8-flash-tts)를 사용합니다. 스튜디오급 창작 작업, 복잡한 다중 화자 대화, 빈번한 보컬 버스트 태그, 어려운 발음, 지역 또는 소수 방언, 안정적인 음성과 실내 톤이 필요한 긴 형식의 내레이션에 적합합니다.
  • 빠르고 비용 효율적인 프로덕션 워크로드에는 Gemini 3.8 Flash-Lite TTS (gemini-3.8-flash-lite-tts)를 사용하세요. gemini-3.1-flash-tts-preview의 권장 대체 모델이며 대량 일괄 프로덕션, 대화형 음성 에이전트 캐스케이드, 소리 내어 읽어주기 기능, 음성 복제, 주요 언어의 일상적인 단일 화자 음성에 적합합니다.

시작하기 전에

  1. 프로젝트를 설정하고 Gemini Enterprise API를 사용 설정합니다.
  2. 개발 환경에 애플리케이션 기본 사용자 인증 정보 구성
  3. Python 샘플을 사용하려면 Google 생성형 AI SDK 버전 2.25.0 이상을 설치하세요.

    pip install --upgrade "google-genai>=2.25.0"
    

Gemini 3.8 TTS 모델은 global 위치에서 사용할 수 있습니다. aiplatform.googleapis.com 엔드포인트에 요청을 보냅니다.

단일 화자 TTS

텍스트를 단일 화자 오디오로 변환하려면 parts[].text에 축어적 스크립트를 전달하고, parts[].speech_metadata에 선택적 발화 수준 스타일을 추가하고, speechConfig.voiceConfig.voice에 음성을 설정합니다. voice 필드는 사전 빌드된 음성 이름, 확장된 음성 라이브러리 음성 ID 또는 설계된 또는 복제된 음성의 ID (voice_...)를 허용합니다 (선택적 스테이트리스 voicekey_... 키).

기본적으로 단항 요청은 완전한 WAV 파일 (16비트 PCM, 24kHz, 모노)을 반환하므로 오디오 바이트를 .wav 파일에 직접 쓸 수 있습니다. 스트리밍 요청은 대신 원시 PCM 청크를 반환합니다. 자세한 내용과 기타 인코딩은 오디오 출력 형식을 참고하세요.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
    },
)

# The SDK has already decoded the base64 audio, so inline_data.data is a
# complete WAV file by default.
with open("out.wav", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [{
        "text": "Have a wonderful day!",
        "speechMetadata": {"style": "cheerful and friendly"}
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > out.wav

단일 화자 스트리밍 TTS

모델이 오디오를 합성하는 동안 오디오를 수신하려면 streamGenerateContent 메서드를 사용합니다. 스트리밍 응답은 헤더가 없는 원시 16비트 PCM 청크 (24kHz, 모노)를 반환하므로 각 청크가 도착하는 대로 플레이어, 소켓 또는 다른 오디오 파이프라인에 전달할 수 있습니다. 다음 Python 샘플에서 emit_audio 함수는 해당 대상을 나타냅니다.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

def emit_audio(pcm: bytes) -> None:
    """Sends a chunk of raw 16-bit PCM audio (24 kHz, mono) downstream."""
    # Replace with your audio destination, such as a player, a WebSocket,
    # or a telephony stream.
    print(f"Received {len(pcm)} bytes of audio")

response_stream = client.models.generate_content_stream(
    model="gemini-3.8-flash-lite-tts",
    contents=[{
        "role": "user",
        "parts": [{
            "text": "Have a wonderful day!",
            "speech_metadata": {"style": "cheerful and friendly"},
        }],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
    },
)

for chunk in response_stream:
    if not chunk.candidates or not chunk.candidates[0].content:
        continue
    for part in chunk.candidates[0].content.parts or []:
        if part.inline_data and part.inline_data.data:
            emit_audio(part.inline_data.data)

REST

curl -N -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-lite-tts:streamGenerateContent?alt=sse" \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [{
        "text": "Have a wonderful day!",
        "speechMetadata": {"style": "cheerful and friendly"}
      }]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | sed -n 's/^data: //p' \
    | jq -r '.candidates[0].content.parts[0].inlineData.data // empty' \
    | while read -r chunk; do echo "$chunk" | base64 --decode; done > streamed.pcm

streamed.pcm 파일에는 24kHz, 모노의 원시 16비트 PCM 오디오가 포함되어 있습니다.

다중 화자 TTS

두 화자 간의 대화의 경우 speechConfig.multiSpeakerVoiceConfig.speakerVoiceConfigs에서 두 화자를 모두 구성합니다. 그런 다음 각 턴을 별도의 part로 전달하고, 모든 턴에서 speech_metadata.speaker을 구성된 스피커 이름 중 하나로 설정하고, 선택적 턴 수준 style를 추가합니다.

여러 스피커 요청에는 스피커가 정확히 두 개 필요합니다.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [
            {
                "text": "How's it going today, Jane?",
                "speech_metadata": {"speaker": "Joe", "style": "cheerful and friendly"},
            },
            {
                "text": "Not too bad, how about you? Ready to test these new voices?",
                "speech_metadata": {"speaker": "Jane", "style": "calm and relaxed"},
            },
        ],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "multi_speaker_voice_config": {
                "speaker_voice_configs": [
                    {"speaker": "Joe", "voice_config": {"voice": "Puck"}},
                    {"speaker": "Jane", "voice_config": {"voice": "Kore"}},
                ]
            }
        },
    },
)

with open("dialogue.wav", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [
        {
          "text": "How'\''s it going today, Jane?",
          "speechMetadata": {"speaker": "Joe", "style": "cheerful and friendly"}
        },
        {
          "text": "Not too bad, how about you? Ready to test these new voices?",
          "speechMetadata": {"speaker": "Jane", "style": "calm and relaxed"}
        }
      ]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "multiSpeakerVoiceConfig": {
          "speakerVoiceConfigs": [
            {"speaker": "Joe", "voiceConfig": {"voice": "Puck"}},
            {"speaker": "Jane", "voiceConfig": {"voice": "Kore"}}
          ]
        }
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > dialogue.wav

다중 화자 스트리밍 TTS

다중 스피커 요청도 스트리밍을 지원합니다. streamGenerateContent 메서드와 함께 다중 화자 TTS에서와 동일한 요청을 사용합니다.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

def emit_audio(pcm: bytes) -> None:
    """Sends a chunk of raw 16-bit PCM audio (24 kHz, mono) downstream."""
    # Replace with your audio destination, such as a player, a WebSocket,
    # or a telephony stream.
    print(f"Received {len(pcm)} bytes of audio")

response_stream = client.models.generate_content_stream(
    model="gemini-3.8-flash-tts",
    contents=[{
        "role": "user",
        "parts": [
            {
                "text": "How's it going today, Jane?",
                "speech_metadata": {"speaker": "Joe", "style": "cheerful and friendly"},
            },
            {
                "text": "Not too bad, how about you? Ready to test these new voices?",
                "speech_metadata": {"speaker": "Jane", "style": "calm and relaxed"},
            },
        ],
    }],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {
            "multi_speaker_voice_config": {
                "speaker_voice_configs": [
                    {"speaker": "Joe", "voice_config": {"voice": "Puck"}},
                    {"speaker": "Jane", "voice_config": {"voice": "Kore"}},
                ]
            }
        },
    },
)

for chunk in response_stream:
    if not chunk.candidates or not chunk.candidates[0].content:
        continue
    for part in chunk.candidates[0].content.parts or []:
        if part.inline_data and part.inline_data.data:
            emit_audio(part.inline_data.data)

REST

curl -N -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:streamGenerateContent?alt=sse" \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [
        {
          "text": "How'\''s it going today, Jane?",
          "speechMetadata": {"speaker": "Joe", "style": "cheerful and friendly"}
        },
        {
          "text": "Not too bad, how about you? Ready to test these new voices?",
          "speechMetadata": {"speaker": "Jane", "style": "calm and relaxed"}
        }
      ]
    }],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "multiSpeakerVoiceConfig": {
          "speakerVoiceConfigs": [
            {"speaker": "Joe", "voiceConfig": {"voice": "Puck"}},
            {"speaker": "Jane", "voiceConfig": {"voice": "Kore"}}
          ]
        }
      }
    }
  }' | sed -n 's/^data: //p' \
    | jq -r '.candidates[0].content.parts[0].inlineData.data // empty' \
    | while read -r chunk; do echo "$chunk" | base64 --decode; done > dialogue_streamed.pcm

dialogue_streamed.pcm 파일에는 24kHz, 모노의 원시 16비트 PCM 오디오가 포함되어 있습니다.

메타데이터 및 태그를 사용하여 음성 스타일 제어

Gemini 3.8 TTS 모델은 text 필드를 축어적 스크립트로 처리합니다. "Say cheerfully: Hello!" 또는 "Speaker 1: Hello!"와 같이 텍스트에 작성된 안내가 음성으로 읽힐 수 있습니다. 전달을 관리하려면 범위를 기준으로 지침을 분할하세요.

  • 지속적인 발화 수준 전달 (speech_metadata.style): 전체 발화에 적용되는 감정, 전달 스타일, 운율, 속도, 볼륨을 speech_metadata.style에 넣습니다. 예를 들면 "style": "whispered urgently", "style": "out of breath", "style": "warm and enthusiastic"입니다.
  • 특정 시점 이벤트 (인라인 태그): 순간적인 비음성 발성 및 일시중지를 스크립트 내에 꺾쇠괄호로 표시합니다. 예를 들면 "Wait... <short pause> did you hear that? <sigh>" 또는 "Excuse me <cough> as I was saying..."입니다.

자세한 내용은 프롬프팅 가이드를 참조하세요.

음성 옵션

Gemini 3.8 TTS 모델은 음성을 선택하거나 만드는 네 가지 방법을 지원합니다.

  1. 사전 제작 음성: 선별된 음성 30개
  2. 확장된 음성 라이브러리: 언어,지역별 억양, 캐릭터 페르소나에 걸쳐 2, 000개가 넘는 선별된 사전 설정 음성
  3. 음성 디자인: Voices API create 메서드 (Google 생성형 AI SDK의 경우 client.voices.create() 또는 POST https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/voices)를 사용하여 자연어 설명에서 맞춤 음성을 만듭니다. type을 VOICE_TYPE_PROMPTED로, store을 true로 설정합니다. 응답은 저장된 voice_... ID와 음성 샘플을 반환합니다.
  4. 음성 복제: 동일한 create 메서드를 사용하여 참조 및 동의 오디오에서 화자의 음성을 복제합니다. type을 VOICE_TYPE_REPLICATED로 설정합니다. store: true를 사용하면 응답에서 저장된 voice_... ID를 반환합니다. store: false를 사용하면 스테이트리스 voicekey_... 키가 반환됩니다.

커스텀 음성 한도 및 TTL

음성 유형 저장 모드 관리 만료
저장된 음성 (voice_..., 설계 또는 복제됨) store: true Voices API list, get, delete 메서드 마지막 사용 후 1년
음성 복제 키 (voicekey_...) store: false 애플리케이션에서 관리합니다. Google은 키를 보관하지 않습니다. 생성 후 7일

저장된 음성으로 음성을 생성하면 1년 보관 기간이 다시 시작되므로 정기적으로 사용하는 음성은 만료되지 않습니다. 음성 생성 요청에는 프로젝트별, 분당 할당량이 적용됩니다. 이 한도를 초과하면 create 메서드가 RESOURCE_EXHAUSTED 오류를 반환합니다. 자세한 내용은 할당량 및 시스템 한도를 참조하세요.

데이터 스토리지 및 보관

Google은 저장된 음성을 만들 때 제공하는 입력과 이로부터 파생된 음성 아티팩트를 음성을 만든Google Cloud 프로젝트와 연결하여 저장합니다.

화자의 녹음에서 복제된 음성을 만들면 다음이 저장됩니다.

  • 참조 오디오: 음성이 복제되는 화자의 샘플입니다.
  • 동의 오디오: 필수 동의 고지를 읽는 화자입니다.

프롬프트에서 음성의 텍스트 설명을 사용하여 설계된 음성을 만들면 다음이 저장됩니다.

  • 음성을 설명하기 위해 작성한 텍스트 프롬프트입니다.
  • 해당 프롬프트에서 생성된 음성 오디오로, 모델이 음성의 참조로 사용합니다.

설계된 음성은 사람의 녹음이 아닌 설명에서 생성되므로 동의 오디오가 없습니다.

모델 업데이트 전반에서 음성이 계속 작동하도록 음성 입력이 저장됩니다. 기본 모델이 업데이트되면 저장된 입력에서 음성 아티팩트가 재생성됩니다. 음성에 저장된 입력이 없으면 아티팩트를 다시 생성할 수 없으며 모델 업데이트 후 음성이 작동하지 않습니다. 그런 다음 음성을 다시 만들어야 합니다.

저장된 입력은 모델이 업데이트될 때 음성을 재생성하는 데만 사용됩니다. 저장 데이터 암호화가 적용되며 음성을 만든 프로젝트로 격리됩니다.

보관 기간

음성 및 모든 관련 저장 데이터는 음성을 사용하여 음성을 합성한 마지막 시점으로부터 최대 1년 (365일) 동안 보관됩니다. 이 기간은 음성을 만들 때 시작되며 음성을 사용하는 합성 요청을 보낼 때마다 재설정됩니다. 음성이 365일 동안 사용되지 않으면 음성, 저장된 입력, 파생된 아티팩트가 삭제됩니다.

고객에 의한 삭제

Voices API delete 메서드를 사용하여 언제든지 음성을 삭제할 수 있습니다. 음성을 삭제하면 저장된 입력과 파생된 아티팩트가 삭제됩니다. 음성을 소유한 Google Cloud 프로젝트를 삭제하면 표준 프로젝트 삭제 프로세스에 따라 음성도 삭제됩니다.

기본 제공 음성

다음 목록에는 각 사전 빌드된 음성 이름과 특성이 나와 있습니다.

  • Achernar: 부드러움
  • 아키르드: 친근함
  • 알게니브: 걸걸함
  • Algieba: 부드러움
  • Alnilam: 단호함
  • 아오에데: 쾌활함
  • 아우토노에: 밝음
  • Callirrhoe: 느긋함
  • 카론: 유익함
  • 데스피나: 매끄러움
  • 엔셀라두스: 거칢
  • Erinome: Clear(맑음)
  • Fenrir: 흥분함
  • Gacrux: 의젓함
  • 이아페투스: 맑음
  • Kore: 단단함
  • 라오메데이아: 경쾌함
  • Leda: 장난스러운
  • Orus: 회사
  • 퍽: 경쾌함
  • 풀케리마: 직설적임
  • Rasalgethi: 유익함
  • Sadachbia: Lively
  • 사달타게르: 총명함
  • Schedar: Even
  • 술라파트: 따뜻함
  • Umbriel: 편안함
  • Vindemiatrix: 온화함
  • Zephyr: 밝음
  • 주벤엘게누비: 편안함

확장 음성 라이브러리

30개의 사전 빌드된 음성 외에도 확장 음성 라이브러리에서는 언어, 지역별 억양, 캐릭터 페르소나, 오디오북, 대화형 에이전트, 뉴스 등의 사용 사례에 걸쳐 선별된 2,000개 이상의 사전 설정 음성을 제공합니다. 라이브러리 음성을 사용하려면 미리 빌드된 음성 이름을 전달하는 것과 같은 방식으로 speechConfig.voiceConfig.voice에 ID를 전달합니다.

라이브러리를 탐색하려면 Voices API list 메서드 (ListVoices)를 호출합니다. 그러면 프로젝트에 저장된 커스텀 음성이 반환되고, 이어서 사전 빌드된 음성과 확장 음성 라이브러리 음성이 반환됩니다. 각 라이브러리 음성에는 id 및 메타데이터(예: language_code, accent, gender, pitch, persona, description)가 포함됩니다. 결과를 좁히려면 다음 필터를 사용하세요.

  • type: 음성 소스입니다. prebuilt은 사전 빌드된 음성 및 라이브러리 음성, prompted은 설계된 음성, replicated은 복제된 음성을 나타냅니다. 값을 두 개 이상 전달하면 메서드는 이 중 하나와 일치하는 음성을 반환합니다.
  • search: 각 음성의 표시 이름 및 설명과 대소문자를 구분하지 않고 일치시킬 텍스트입니다.

다음 예시에서는 라이브러리에서 내레이터 음성을 검색합니다.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.voices.list(type_=["prebuilt"], search="narrator", page_size=50)
for voice in response.voices or []:
    print(voice.id, voice.language_code, voice.gender, voice.description)

REST

curl -G \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  https://aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/global/voices \
  --data-urlencode "type=prebuilt" \
  --data-urlencode "search=narrator" \
  --data-urlencode "pageSize=50"

list 메서드는 페이지당 최대 50개의 음성을 반환합니다. 다음 페이지를 가져오려면 응답의 next_page_token 값을 page_token 매개변수로 전달합니다.

오디오 출력 형식

기본 오디오 인코딩은 메서드에 따라 다릅니다.

  • 단항 요청 (generateContent)은 RIFF 헤더가 있는 완전한 WAV 파일(audio/wav)을 반환합니다. 16비트 PCM, 24kHz, 모노입니다.
  • 스트리밍 요청 (streamGenerateContent)은 헤더가 없는 원시 16비트 부호 리틀 엔디안 PCM 청크 (audio/l16)를 24kHz, 모노로 반환합니다.

다른 인코딩을 요청하려면 generationConfig.responseFormat를 오디오 형식으로 설정합니다. Gemini 3.8 TTS 모델은 다음 mimeType 값을 지원합니다.

mimeType 값 형식 설명
AUDIO_WAV (단항 기본값) WAV (audio/wav) RIFF 헤더가 있는 완전한 WAV 파일 (16비트 PCM, 24kHz, 모노)
AUDIO_L16 (스트리밍 기본값) 선형 PCM (audio/l16) 헤더 없는 원시 16비트 부호 리틀 엔디안 PCM 스트리밍, 맞춤 오디오 파이프라인 또는 다중 턴 클립 연결에 사용합니다.
AUDIO_MULAW μ-law (audio/mulaw) G.711 μ 법칙 압축 오디오 (8kHz, 모노)로, 북미 및 일본 전화 통신에서 흔히 사용됩니다.
AUDIO_ALAW A-law (audio/alaw) G.711 A-law 컴팬딩 오디오 (8kHz, 모노)로, 유럽 및 국제 전화 통신에서 일반적으로 사용됩니다.

모델은 sampleRate 필드를 무시합니다. 선형 PCM 및 WAV 출력은 24kHz이고 μ-law 및 A-law 출력은 응답 mimeType의 속도와 관계없이 8kHz입니다. 파이프라인에 다른 샘플링 레이트가 필요한 경우 클라이언트에서 출력을 리샘플링합니다.

다음 예시에서는 전화 통신 파이프라인에 대한 μ-law 출력을 요청합니다. Python용 Google 생성형 AI SDK는 GenerateContentConfig에서 responseFormat를 노출하지 않으므로 Python 샘플은 http_options.extra_body를 사용하여 요청 본문에 이를 전달합니다.

Python

from google import genai

client = genai.Client(enterprise=True, project="PROJECT_ID", location="global")

response = client.models.generate_content(
    model="gemini-3.8-flash-tts",
    contents=[{"role": "user", "parts": [{"text": "Have a wonderful day!"}]}],
    config={
        "response_modalities": ["AUDIO"],
        "speech_config": {"voice_config": {"voice": "Kore"}},
        "http_options": {
            "extra_body": {
                "generationConfig": {
                    "responseFormat": [{"audio": {"mimeType": "AUDIO_MULAW"}}]
                }
            }
        },
    },
)

# The response is headerless μ-law audio at 8 kHz, mono.
with open("out.mulaw", "wb") as f:
    f.write(response.candidates[0].content.parts[0].inline_data.data)

REST

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash-tts:generateContent \
  -d '{
    "contents": [{"role": "user", "parts": [{"text": "Have a wonderful day!"}]}],
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "responseFormat": [{"audio": {"mimeType": "AUDIO_MULAW"}}],
      "speechConfig": {
        "voiceConfig": {"voice": "Kore"}
      }
    }
  }' | jq -r '.candidates[0].content.parts[0].inlineData.data' | base64 --decode > out.mulaw

지원 언어

Gemini 3.8 TTS 모델은 입력 언어를 자동으로 감지합니다. Gemini 3.8 Flash TTS는 130개 언어를 지원하고 Gemini 3.8 Flash-Lite TTS는 101개 언어를 지원합니다.

제한사항

  • TTS 모델은 텍스트 전용 입력을 허용하고 오디오 전용 출력을 반환합니다.
  • 다중 화자 요청에는 정확히 두 명의 화자가 필요합니다. 여러 캐릭터가 등장하는 대화에서 설계된(voice_...) 음성 또는 복제된 (voice_... 또는 voicekey_...) 음성을 결합하거나 2명 이상의 화자를 사용하려면 각 화자의 차례를 개별적으로 합성하고 오디오를 연결합니다. 각 턴에 대해 AUDIO_L16 출력을 요청하거나 클립을 연결하기 전에 각 클립에서 WAV 헤더를 삭제합니다.
  • 모델은 global 위치에서만 사용할 수 있습니다.
  • 시스템 요청 사항은 지원되지 않습니다.
  • 출력 샘플링 레이트는 설정할 수 없습니다. MP3 및 Ogg Opus 출력은 지원되지 않습니다.

다음 단계