🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

A

AI Generated

2026. 2. 2. · 27 Views

Custom Voice Generation 기본 완벽 가이드

다양한 음색의 AI 음성을 생성하는 Custom Voice Generation의 기초부터 실전까지 다룹니다. 9가지 프리미엄 스피커 활용법과 언어 감지, 배치 처리 등 핵심 기능을 초급자 눈높이에서 설명합니다.


목차

  1. 다양한_음색의_필요성
  2. 9가지_프리미엄_스피커_소개
  3. generate_custom_voice_함수_사용법
  4. 언어_자동_감지와_명시적_지정
  5. 단일_추론과_배치_추론_비교
  6. 실전_첫_음성_파일_생성하기

1. 다양한 음색의 필요성

김개발 씨는 회사에서 교육용 콘텐츠를 만드는 프로젝트를 담당하게 되었습니다. 처음에는 하나의 AI 음성으로 모든 내용을 녹음하면 될 거라 생각했습니다.

그런데 막상 결과물을 들어보니, 마치 기계가 읽어주는 것처럼 단조롭고 지루했습니다.

Custom Voice Generation은 다양한 음색과 톤을 가진 AI 음성을 생성하는 기술입니다. 마치 성우 여러 명을 고용한 것처럼 상황에 맞는 목소리를 선택할 수 있습니다.

이를 활용하면 콘텐츠의 몰입감과 전달력을 크게 높일 수 있습니다.

다음 코드를 살펴봅시다.

# 단조로운 단일 음성 vs 다양한 음색 활용 비교
from custom_voice import VoiceGenerator

# 기존 방식: 하나의 목소리로 모든 콘텐츠
single_voice = VoiceGenerator(speaker="default")
single_voice.generate("안녕하세요, 오늘의 강의를 시작합니다.")
single_voice.generate("중요한 포인트입니다!")  # 똑같은 톤

# 개선된 방식: 상황에 맞는 다양한 음색
narrator = VoiceGenerator(speaker="tara")      # 차분한 내레이션
emphasis = VoiceGenerator(speaker="dan")       # 강조할 때
friendly = VoiceGenerator(speaker="maya")      # 친근한 설명

narrator.generate("안녕하세요, 오늘의 강의를 시작합니다.")
emphasis.generate("중요한 포인트입니다!")  # 힘 있는 톤으로 강조

김개발 씨는 입사 2년 차 개발자입니다. 이번에 회사에서 새로운 프로젝트를 맡게 되었습니다.

바로 신입 사원 교육용 e-러닝 콘텐츠를 제작하는 일이었습니다. 처음에는 간단할 거라 생각했습니다.

AI 음성 합성 기술을 사용해서 텍스트만 입력하면 자동으로 음성이 나오니까요. 김개발 씨는 열심히 스크립트를 작성하고, 기본 TTS 엔진으로 음성을 생성했습니다.

그런데 결과물을 들어본 팀장님의 반응은 차가웠습니다. "김 개발자, 이거 너무 졸리지 않아요?

마치 지하철 안내 방송 같아요." 팀장님의 말이 맞았습니다. 30분짜리 교육 영상을 같은 목소리, 같은 톤으로 계속 듣다 보니 집중력이 떨어졌습니다.

중요한 부분도 그냥 스쳐 지나가고, 강조점이 전혀 느껴지지 않았습니다. 이런 문제를 해결하기 위해 등장한 것이 바로 Custom Voice Generation입니다.

쉽게 비유하자면, 이것은 마치 라디오 드라마를 제작하는 것과 같습니다. 라디오 드라마에서는 한 명의 성우가 모든 역할을 하지 않습니다.

내레이터, 주인공, 조연 등 각 역할에 맞는 성우가 따로 있습니다. 이처럼 Custom Voice Generation도 상황과 목적에 맞는 다양한 음색을 제공합니다.

왜 다양한 음색이 필요할까요? 첫 번째 이유는 청취자의 집중력 유지입니다.

인간의 뇌는 변화에 민감하게 반응합니다. 같은 자극이 계속되면 무뎌지지만, 새로운 자극이 오면 다시 집중하게 됩니다.

목소리가 바뀌면 청취자는 자연스럽게 귀를 기울이게 됩니다. 두 번째 이유는 감정 전달입니다.

차분한 설명에는 부드러운 목소리가, 중요한 경고에는 힘 있는 목소리가 어울립니다. 적절한 음색 선택은 내용의 의도를 더 명확하게 전달합니다.

세 번째 이유는 캐릭터 구분입니다. 대화형 콘텐츠나 스토리텔링에서는 화자가 누구인지 구분해야 합니다.

서로 다른 음색을 사용하면 별도의 설명 없이도 화자를 구분할 수 있습니다. 위 코드를 살펴보면, 기존 방식에서는 default 스피커 하나로 모든 문장을 처리했습니다.

반면 개선된 방식에서는 tara, dan, maya 등 서로 다른 스피커를 상황에 맞게 선택합니다. 실제 현업에서는 이 기술이 다양하게 활용됩니다.

유튜브 콘텐츠 제작자들은 해설과 강조를 다른 목소리로 구분합니다. 오디오북 제작사는 등장인물마다 다른 음색을 부여합니다.

기업 교육 플랫폼은 난이도에 따라 음성 톤을 조절합니다. 김개발 씨도 이제 이 원리를 이해했습니다.

다음 날, 그는 콘텐츠를 다시 제작하기로 마음먹었습니다. 이번에는 다양한 음색을 활용해서요.

실전 팁

💡 - 콘텐츠의 성격에 따라 메인 음색을 먼저 정하고, 강조용 음색을 별도로 선택하세요

  • 너무 많은 음색을 섞으면 오히려 산만해집니다. 2-3개가 적당합니다

2. 9가지 프리미엄 스피커 소개

김개발 씨는 Custom Voice Generation을 도입하기로 결심했습니다. 그런데 문서를 열어보니 스피커 종류가 무려 9가지나 되었습니다.

"이걸 다 언제 들어보고 선택하지?" 막막한 마음이 들었습니다.

Custom Voice Generation은 9가지 프리미엄 스피커를 제공합니다. 각 스피커는 고유한 음색, 톤, 그리고 적합한 사용 상황을 가지고 있습니다.

마치 성우 오디션에서 역할에 맞는 배우를 캐스팅하듯, 콘텐츠에 맞는 스피커를 선택하면 됩니다.

다음 코드를 살펴봅시다.

# 9가지 프리미엄 스피커 목록과 특징
PREMIUM_SPEAKERS = {
    "tara": "차분하고 전문적인 여성 음성 - 뉴스, 다큐멘터리",
    "leah": "밝고 친근한 여성 음성 - 교육, 튜토리얼",
    "jess": "젊고 활기찬 여성 음성 - 광고, 프로모션",
    "leo": "따뜻하고 신뢰감 있는 남성 음성 - 내레이션",
    "dan": "힘 있고 명확한 남성 음성 - 프레젠테이션",
    "mia": "부드럽고 감성적인 여성 음성 - 오디오북",
    "zac": "젊고 캐주얼한 남성 음성 - 팟캐스트",
    "zoe": "또렷하고 명료한 여성 음성 - 안내, 가이드",
    "maya": "따뜻하고 편안한 여성 음성 - 명상, 힐링"
}

# 스피커 선택 예시
from custom_voice import VoiceGenerator

# 기업 프레젠테이션에는 dan
presenter = VoiceGenerator(speaker="dan")
presenter.generate("이번 분기 매출이 30% 성장했습니다.")

# 명상 앱에는 maya
meditation = VoiceGenerator(speaker="maya")
meditation.generate("천천히 숨을 들이쉬세요...")

선배 개발자 박시니어 씨가 김개발 씨의 모니터를 힐끗 봤습니다. "아, 스피커 선택하려고?

내가 팁 좀 줄까?" 박시니어 씨는 이미 여러 프로젝트에서 Custom Voice Generation을 사용해본 경험이 있었습니다. 그는 노트북을 가져와 9가지 스피커의 특징을 하나씩 설명하기 시작했습니다.

"먼저 Tara는 뉴스 앵커 같은 느낌이야. 차분하고 전문적이지.

기업 리포트나 다큐멘터리 내레이션에 딱이야." 김개발 씨가 고개를 끄덕이며 메모했습니다. "Leah는 학교 선생님처럼 친근해.

뭔가를 가르쳐줄 때 좋아. 우리 교육 콘텐츠에 메인으로 쓰면 좋겠다." 박시니어 씨는 계속 설명을 이어갔습니다.

"Jess는 에너지가 넘쳐. 광고나 프로모션 영상에 쓰면 활기차 보여.

다만 진지한 내용에는 안 맞아." "Leo는 믿음직한 형 같은 느낌이야. 따뜻하면서도 신뢰감이 있어서 브랜드 내레이션에 많이 써." "Dan은 CEO가 발표하는 것 같은 느낌이지.

힘 있고 명확해서 중요한 메시지를 전달할 때 좋아." 김개발 씨가 질문했습니다. "감성적인 콘텐츠에는 뭐가 좋을까요?" "그럴 땐 Mia야.

오디오북 낭독 느낌이라 이야기를 들려줄 때 몰입감이 좋아." 박시니어 씨는 나머지도 빠르게 설명했습니다. "Zac은 유튜버 느낌이야.

친구랑 수다 떠는 것 같아서 팟캐스트에 잘 맞아. Zoe는 안내원 같아.

명료해서 가이드나 튜토리얼에 좋고." "마지막으로 Maya는 명상 앱에서 많이 들어봤을 거야. 포근하고 편안해서 힐링 콘텐츠에 딱이야." 김개발 씨는 각 스피커를 사용 목적별로 정리했습니다.

정보 전달에는 Tara, Zoe가 적합합니다. 교육에는 Leah, Leo가 좋습니다.

마케팅에는 Jess, Dan이 효과적입니다. 감성 콘텐츠에는 Mia, Maya가 어울립니다.

캐주얼한 대화에는 Zac이 제격입니다. 실제로 스피커를 선택할 때는 먼저 샘플 문장으로 테스트해보는 것이 좋습니다.

같은 스피커라도 문장의 길이나 어투에 따라 느낌이 달라질 수 있기 때문입니다. 위 코드에서 보듯이, 스피커 변경은 speaker 파라미터만 바꾸면 됩니다.

복잡한 설정 없이 이름만 지정하면 해당 음색으로 음성이 생성됩니다. 김개발 씨는 교육 콘텐츠의 메인 내레이션에는 Leah를, 중요 포인트 강조에는 Dan을 사용하기로 결정했습니다.

이제 실제로 코드를 작성할 차례입니다.

실전 팁

💡 - 새로운 프로젝트 시작 전에 모든 스피커로 대표 문장을 생성해보고 비교하세요

  • 스피커별 특성 문서를 팀 내 공유 드라이브에 정리해두면 협업이 편해집니다

3. generate custom voice 함수 사용법

스피커를 선택했으니 이제 실제로 음성을 생성할 차례입니다. 김개발 씨는 API 문서를 펼쳐 들었습니다.

핵심 함수는 generate_custom_voice였습니다. 이 함수 하나만 제대로 이해하면 대부분의 작업을 할 수 있다고 적혀 있었습니다.

generate_custom_voice 함수는 Custom Voice Generation의 핵심 함수입니다. 텍스트와 스피커를 입력하면 음성 파일을 생성합니다.

마치 성우에게 대본을 건네주면 녹음 파일을 돌려받는 것과 같습니다. 다양한 옵션을 통해 출력 형식, 품질, 속도 등을 조절할 수 있습니다.

다음 코드를 살펴봅시다.

from custom_voice import generate_custom_voice

# 기본 사용법: 텍스트와 스피커만 지정
audio = generate_custom_voice(
    text="안녕하세요, Custom Voice Generation을 시작합니다.",
    speaker="leah"
)

# 고급 옵션 활용
audio = generate_custom_voice(
    text="이것은 중요한 공지사항입니다.",
    speaker="dan",
    output_format="mp3",       # 출력 형식: wav, mp3, ogg
    sample_rate=24000,         # 샘플레이트: 16000, 22050, 24000, 44100
    speed=1.0,                 # 속도: 0.5 ~ 2.0
    pitch=0,                   # 피치 조절: -10 ~ 10
    output_path="output.mp3"   # 저장 경로 (선택)
)

# 반환값 활용
print(f"생성된 오디오 길이: {audio.duration}초")
audio.save("my_audio.mp3")     # 파일로 저장
audio.play()                   # 바로 재생 (개발 환경)

김개발 씨는 함수 시그니처를 꼼꼼히 살펴보았습니다. 필수 파라미터는 단 두 개뿐이었습니다.

textspeaker. 나머지는 모두 선택 옵션이었습니다.

먼저 text 파라미터를 살펴보겠습니다. 이것은 음성으로 변환할 텍스트입니다.

한글, 영어, 숫자, 특수문자 모두 지원합니다. 다만 너무 긴 텍스트는 여러 번 나눠서 처리하는 것이 좋습니다.

일반적으로 한 번에 500자 이내를 권장합니다. speaker 파라미터는 앞서 배운 9가지 스피커 중 하나를 지정합니다.

오타가 나면 에러가 발생하니 주의해야 합니다. 자동 완성 기능을 활용하면 실수를 줄일 수 있습니다.

이제 선택 옵션들을 하나씩 살펴보겠습니다. output_format은 출력 파일 형식을 결정합니다.

기본값은 wav입니다. wav는 무손실이라 품질이 좋지만 파일이 큽니다.

mp3는 적당한 압축률로 웹 배포에 적합합니다. ogg는 오픈소스 포맷으로 게임 개발에서 많이 사용합니다.

sample_rate는 음질을 결정합니다. 숫자가 높을수록 고음질이지만 파일 크기도 커집니다.

일반적인 용도에는 24000이 좋은 균형점입니다. 음악이나 고품질 콘텐츠에는 44100을 사용합니다.

speed 옵션은 말하는 속도를 조절합니다. 1.0이 기본 속도입니다.

0.5는 절반 속도로 천천히, 2.0은 두 배 속도로 빠르게 재생됩니다. 교육 콘텐츠에서는 0.9 정도로 약간 느리게 설정하면 이해하기 쉽습니다.

pitch는 목소리 높낮이를 조절합니다. 0이 기본값이고, 양수는 높은 목소리, 음수는 낮은 목소리가 됩니다.

이 옵션은 신중하게 사용해야 합니다. 너무 극단적인 값은 부자연스러운 소리를 만들 수 있습니다.

output_path를 지정하면 생성된 음성이 바로 파일로 저장됩니다. 지정하지 않으면 메모리에만 존재하고, 나중에 save() 메서드로 저장할 수 있습니다.

함수의 반환값도 중요합니다. 반환되는 audio 객체는 여러 유용한 속성과 메서드를 가지고 있습니다.

duration 속성으로 생성된 음성의 길이를 알 수 있고, save() 메서드로 원하는 경로에 저장할 수 있습니다. 개발 중에는 play() 메서드로 바로 들어볼 수도 있습니다.

실무에서는 에러 처리도 중요합니다. 네트워크 문제나 잘못된 파라미터로 인해 실패할 수 있기 때문입니다.

try-except 블록으로 감싸서 예외 상황에 대비하는 것이 좋습니다. 김개발 씨는 기본 사용법을 익힌 후, 자신의 프로젝트에 맞는 옵션을 설정하기 시작했습니다.

교육 콘텐츠니까 mp3 형식에 24000 샘플레이트, 속도는 0.95로 살짝 느리게 설정했습니다.

실전 팁

💡 - 개발 단계에서는 wav로 작업하고, 배포 시 mp3로 변환하면 디버깅이 쉽습니다

  • speed 옵션을 활용해 긴 콘텐츠는 조금 빠르게, 중요한 부분은 천천히 처리하세요

4. 언어 자동 감지와 명시적 지정

김개발 씨가 테스트 음성을 생성하던 중 이상한 점을 발견했습니다. 영어 문장을 넣었더니 발음이 어색했습니다.

분명 영어인데 한국어 억양으로 읽히는 것 같았습니다. "언어 설정을 따로 해줘야 하나?"

Custom Voice Generation은 기본적으로 언어 자동 감지 기능을 제공합니다. 입력된 텍스트를 분석하여 언어를 판별하고 적절한 발음으로 처리합니다.

하지만 혼합 언어나 특수한 경우에는 명시적 언어 지정이 더 정확한 결과를 만들어냅니다.

다음 코드를 살펴봅시다.

from custom_voice import generate_custom_voice

# 언어 자동 감지 (기본 동작)
audio_auto = generate_custom_voice(
    text="Hello, 안녕하세요!",
    speaker="leah"
    # language 미지정 시 자동 감지
)

# 명시적 언어 지정
audio_ko = generate_custom_voice(
    text="오늘 날씨가 좋습니다.",
    speaker="leah",
    language="ko"  # 한국어 명시
)

audio_en = generate_custom_voice(
    text="The weather is nice today.",
    speaker="leah",
    language="en"  # 영어 명시
)

# 혼합 언어 처리 - 주 언어 지정
audio_mixed = generate_custom_voice(
    text="이 API는 RESTful architecture를 따릅니다.",
    speaker="leah",
    language="ko",           # 주 언어는 한국어
    detect_foreign=True      # 외래어 자동 감지 활성화
)

박시니어 씨가 김개발 씨의 질문을 듣고 다가왔습니다. "아, 언어 감지 문제구나.

그거 은근히 까다로워." 언어 자동 감지는 마치 통역사가 대화를 듣고 어떤 언어인지 파악하는 것과 같습니다. 대부분의 경우 정확하게 작동합니다.

순수한 한국어 문장이나 순수한 영어 문장은 거의 100% 정확하게 감지합니다. 문제는 혼합 언어 상황에서 발생합니다.

"이 function은 parameter를 받아서..."처럼 한국어와 영어가 섞인 문장에서 시스템이 혼란을 겪을 수 있습니다. 자동 감지 알고리즘은 문장의 과반수를 차지하는 언어를 기준으로 판단합니다.

그래서 짧은 문장에서는 판단 오류가 생기기 쉽습니다. "OK, 알겠어요"라는 문장에서 시스템이 영어로 판단할 수도 있습니다.

이런 상황에서 명시적 언어 지정이 해결책입니다. language 파라미터에 "ko", "en", "ja" 등의 언어 코드를 직접 지정하면 시스템이 해당 언어의 발음 규칙을 적용합니다.

위 코드에서 detect_foreign=True 옵션에 주목해주세요. 이 옵션은 주 언어를 한국어로 설정하면서도, 영어 단어가 나오면 영어 발음으로 처리하라는 의미입니다.

기술 문서나 비즈니스 콘텐츠에서 매우 유용합니다. 언제 자동 감지를 쓰고, 언제 명시적 지정을 써야 할까요?

자동 감지가 적합한 경우는 단일 언어로 된 콘텐츠입니다. 순수 한국어 소설, 영어 뉴스 기사 등이 여기에 해당합니다.

편리하고 빠르게 처리할 수 있습니다. 명시적 지정이 필요한 경우는 세 가지입니다.

첫째, 기술 문서처럼 외래어가 많은 경우. 둘째, 짧은 문장을 처리하는 경우.

셋째, 발음 정확도가 매우 중요한 전문 콘텐츠의 경우입니다. 김개발 씨는 자신의 프로젝트를 떠올렸습니다.

프로그래밍 교육 콘텐츠라 영어 용어가 많이 나옵니다. API, function, variable 같은 단어들이요.

이런 경우에는 language="ko"로 설정하고 detect_foreign=True를 활성화하는 것이 최선입니다. 한 가지 더 알아둘 점이 있습니다.

명시적 지정을 해도 완벽하지는 않습니다. 고유명사나 신조어는 발음이 어색할 수 있습니다.

이런 경우에는 발음 기호를 직접 입력하거나, 비슷한 발음의 텍스트로 대체하는 방법을 사용합니다. 김개발 씨는 테스트 문장 몇 개로 발음을 확인한 후, 프로젝트 전체에 언어 설정을 적용하기로 했습니다.

실전 팁

💡 - 배치 처리 전에 대표 문장으로 발음 테스트를 꼭 진행하세요

  • 발음이 어색한 단어는 발음 나는 대로 한글로 적어주면 해결되는 경우가 많습니다

5. 단일 추론과 배치 추론 비교

김개발 씨의 스크립트가 완성되었습니다. 총 50개의 문장이 있었습니다.

처음에는 반복문으로 하나씩 처리하려고 했는데, 박시니어 씨가 제지했습니다. "잠깐, 그렇게 하면 시간이 너무 오래 걸려.

배치 처리를 써봐."

단일 추론은 한 번에 하나의 문장을 처리하는 방식입니다. 간단하지만 대량 처리에는 비효율적입니다.

배치 추론은 여러 문장을 한 번에 처리하여 시간을 크게 단축합니다. 마치 택배를 하나씩 보내는 것과 트럭에 모아서 보내는 것의 차이와 같습니다.

다음 코드를 살펴봅시다.

from custom_voice import generate_custom_voice, batch_generate

# 단일 추론: 하나씩 처리
texts = ["첫 번째 문장입니다.", "두 번째 문장입니다.", "세 번째 문장입니다."]
results_single = []

for text in texts:
    audio = generate_custom_voice(text=text, speaker="leah")
    results_single.append(audio)
    # 매번 API 호출 → 느림

# 배치 추론: 한 번에 처리
results_batch = batch_generate(
    texts=texts,
    speaker="leah",
    output_format="mp3",
    max_concurrent=5    # 동시 처리 수
)

# 결과 저장
for i, audio in enumerate(results_batch):
    audio.save(f"output_{i:03d}.mp3")

# 성능 비교 (예시)
# 단일 추론 50문장: 약 150초
# 배치 추론 50문장: 약 30초 (5배 빠름)

박시니어 씨가 화이트보드에 그림을 그리기 시작했습니다. "택배로 비유해볼게.

단일 추론은 물건 하나마다 택배 기사가 출발하는 거야. 배치 추론은 물건을 모아서 트럭 한 대로 보내는 거고." 김개발 씨가 고개를 끄덕였습니다.

"아, 그래서 배치가 빠른 거군요." 단일 추론의 동작 방식을 자세히 살펴보겠습니다. 각 요청마다 네트워크 연결을 새로 맺고, 모델을 초기화하고, 결과를 받습니다.

이 과정에서 오버헤드가 발생합니다. 문장 자체를 처리하는 시간보다 준비하는 시간이 더 길 수도 있습니다.

반면 배치 추론은 한 번의 연결로 여러 문장을 처리합니다. 오버헤드가 한 번만 발생하고, 모델도 효율적으로 재사용됩니다.

GPU를 사용하는 경우에는 병렬 처리로 더욱 빨라집니다. 위 코드에서 max_concurrent=5는 동시에 5개의 문장을 처리한다는 의미입니다.

이 값을 높이면 더 빨라질 수 있지만, 서버 부하와 메모리 사용량도 증가합니다. 일반적으로 5-10 사이가 적당합니다.

그렇다면 단일 추론은 언제 사용할까요? 단일 추론이 적합한 경우가 있습니다.

첫째, 실시간 응답이 필요한 챗봇이나 음성 비서입니다. 사용자가 말할 때마다 즉시 응답해야 하니까요.

둘째, 문장이 몇 개 안 되는 간단한 작업입니다. 배치 설정하는 것보다 그냥 처리하는 게 빠릅니다.

배치 추론이 적합한 경우는 더 많습니다. 오디오북처럼 긴 콘텐츠, 여러 버전의 음성을 생성할 때, 정기적으로 대량의 콘텐츠를 생성할 때 모두 배치가 유리합니다.

실제 성능 차이를 보면 놀랍습니다. 50개 문장 기준으로, 단일 추론은 약 150초가 걸립니다.

같은 작업을 배치 추론으로 하면 약 30초면 끝납니다. 5배나 빠른 겁니다.

배치 추론 사용 시 주의할 점도 있습니다. 모든 문장이 처리될 때까지 결과를 받지 못합니다.

중간에 하나가 실패하면 전체가 영향받을 수 있습니다. 따라서 에러 처리 로직을 잘 구현해야 합니다.

김개발 씨는 50개 문장을 배치로 처리하기로 결정했습니다. max_concurrent는 보수적으로 5로 설정했습니다.

서버에 무리를 주지 않으면서도 충분히 빠를 테니까요. 결과는 놀라웠습니다.

커피 한 잔 마시고 오니 이미 모든 음성 파일이 생성되어 있었습니다.

실전 팁

💡 - 대량 처리 시에는 반드시 배치 추론을 사용하세요. 시간과 비용을 크게 절약할 수 있습니다

  • max_concurrent 값은 서버 상황에 따라 조절하되, 처음에는 낮은 값으로 시작하세요

6. 실전 첫 음성 파일 생성하기

이론은 충분히 배웠습니다. 이제 김개발 씨는 실제로 첫 번째 음성 파일을 생성해보려 합니다.

교육 콘텐츠의 오프닝 멘트를 만들 예정입니다. 두근거리는 마음으로 에디터를 열었습니다.

실전에서 음성 파일을 생성하는 전체 과정을 살펴봅니다. 환경 설정부터 텍스트 준비, 음성 생성, 품질 확인, 파일 저장까지의 완전한 워크플로우를 경험합니다.

이 과정을 익히면 어떤 프로젝트에서도 음성 생성 작업을 수행할 수 있습니다.

다음 코드를 살펴봅시다.

from custom_voice import generate_custom_voice, batch_generate
import os

# 1단계: 출력 디렉토리 준비
output_dir = "generated_audio"
os.makedirs(output_dir, exist_ok=True)

# 2단계: 스크립트 준비
scripts = [
    {"text": "안녕하세요, 프로그래밍 기초 강의에 오신 것을 환영합니다.", "speaker": "leah"},
    {"text": "오늘은 Python의 기본 문법을 배워보겠습니다.", "speaker": "leah"},
    {"text": "주목해주세요! 이 부분이 가장 중요합니다.", "speaker": "dan"},
    {"text": "천천히 따라와 주세요. 어렵지 않습니다.", "speaker": "maya"},
]

# 3단계: 음성 생성
generated_files = []
for i, script in enumerate(scripts):
    audio = generate_custom_voice(
        text=script["text"],
        speaker=script["speaker"],
        language="ko",
        detect_foreign=True,
        output_format="mp3",
        speed=0.95  # 교육용이라 약간 천천히
    )

    # 4단계: 파일 저장
    filename = f"{output_dir}/audio_{i:03d}_{script['speaker']}.mp3"
    audio.save(filename)
    generated_files.append(filename)
    print(f"생성 완료: {filename} ({audio.duration:.1f}초)")

print(f"\n총 {len(generated_files)}개 파일 생성 완료!")

김개발 씨는 심호흡을 하고 키보드에 손을 올렸습니다. 지금까지 배운 모든 것을 종합해서 실제 음성 파일을 만들어볼 시간입니다.

1단계는 환경 준비입니다. 생성될 음성 파일을 저장할 디렉토리를 만듭니다.

os.makedirsexist_ok=True 옵션을 주면 디렉토리가 이미 있어도 에러가 나지 않습니다. 사소해 보이지만 이런 세심한 처리가 안정적인 코드를 만듭니다.

2단계는 스크립트 준비입니다. 딕셔너리 리스트 형태로 텍스트와 스피커를 함께 관리합니다.

이렇게 하면 각 문장에 다른 스피커를 지정하기 쉽습니다. 위 예시에서 일반 설명은 Leah가, 강조 부분은 Dan이, 부드러운 안내는 Maya가 담당합니다.

3단계는 실제 음성 생성입니다. 반복문을 돌면서 각 스크립트를 처리합니다.

여기서 앞서 배운 옵션들을 모두 활용합니다. language="ko"로 한국어를 명시하고, detect_foreign=True로 영어 단어는 영어 발음으로 처리합니다.

speed=0.95로 약간 천천히 읽도록 설정했습니다. 4단계는 파일 저장입니다.

파일명에 인덱스와 스피커 이름을 포함시키면 나중에 관리하기 편합니다. audio_001_leah.mp3처럼 명명하면 어떤 순서의 어떤 스피커인지 한눈에 알 수 있습니다.

코드를 실행하자 콘솔에 진행 상황이 출력되었습니다. "생성 완료: generated_audio/audio_000_leah.mp3 (3.2초)".

하나씩 파일이 만들어지는 걸 보니 뿌듯했습니다. 김개발 씨는 생성된 파일을 하나씩 재생해보았습니다.

Leah의 친근한 목소리로 환영 인사가 나왔습니다. Dan의 힘 있는 목소리로 중요 포인트가 강조되었습니다.

Maya의 포근한 목소리로 격려의 말이 들렸습니다. "오, 진짜 괜찮은데?" 김개발 씨가 혼잣말을 했습니다.

물론 아직 개선할 점이 있었습니다. 몇몇 단어의 발음이 살짝 어색했고, 문장 사이 간격도 조절이 필요했습니다.

하지만 첫 결과물치고는 훌륭했습니다. 박시니어 씨가 다가와 결과물을 들어보더니 엄지를 치켜세웠습니다.

"괜찮네! 이제 기본은 된 거야.

나머지는 경험으로 채워가면 돼." 김개발 씨는 이제 자신감이 생겼습니다. Custom Voice Generation의 기본을 완전히 익힌 것입니다.

앞으로는 더 복잡한 프로젝트에도 도전할 수 있을 것 같습니다. 여러분도 이 코드를 직접 실행해보세요.

자신만의 텍스트로 음성을 생성해보면 이론으로 배운 것보다 훨씬 깊이 이해할 수 있습니다.

실전 팁

💡 - 파일명에 날짜나 버전 정보를 포함하면 이력 관리가 쉬워집니다

  • 첫 생성 후에는 반드시 전체 파일을 들어보고 발음 이슈를 체크하세요. 일괄 수정이 나중에 수정하는 것보다 효율적입니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#TTS#VoiceGeneration#CustomVoice#AudioProcessing#TTS,Python

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

함께 보면 좋은 카드 뉴스