Google Colab에서 Text-to-Speech 앱 자체 호스팅
I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (excluding the source line you already provided) here? Once I have the text, I’ll translate it into Korean while preserving the original formatting, markdown, and technical terms.
소개
텍스트‑투‑스피치는 조용히 로봇‑같은 데모에서 자연스럽고 표현력 있는 목소리로 발전했습니다. 문제는 고품질 음성은 보통 사용 제한이나 문자당 요금이 따른다는 점입니다. 최신 모델을 로컬에서 실행하려면 성능 좋은 GPU가 필요해 어려울 수 있습니다. 실용적인 절충안은 무료 클라우드 컴퓨팅을 활용하고 앱을 직접 호스팅하는 것입니다.
이 글에서는 Google Colab, Kokoro TTS 모델, Gradio를 이용한 깔끔한 인터페이스, 그리고 **Pinggy**를 통한 공개 접근을 활용해 완전한 텍스트‑투‑스피치 웹 애플리케이션을 구축합니다. 모든 과정은 Colab 노트북 안에서 실행되며 세션이 살아 있는 한 계속 활성화됩니다.
왜 Colab에서 텍스트‑투‑스피치를 실행할까
- 대부분의 상용 TTS 플랫폼은 문자 수나 오디오 길이 기준으로 요금을 부과합니다. 작은 프로젝트에는 괜찮지만, 실험을 하거나 대량의 오디오를 생성할 때는 금방 제한이 됩니다.
- Colab은 Tesla T4 GPU에 대한 무료 접근을 제공하며, 이는 경량 음성 모델에 충분히 강력합니다. Kokoro가 CPU에서도 실행될 수 있지만, GPU 가속을 사용하면 특히 긴 텍스트의 경우 생성 속도가 훨씬 빠르고 부드러워집니다.
- Colab 노트북은 기본적으로 외부에서 접근할 수 없습니다. 여기서 **Pinggy**가 유용해집니다. Pinggy는 보안 터널을 생성하고 로컬 웹 앱을 공개 URL로 노출합니다. 결과적으로 노트북에서 코드를 작성하고, 웹 앱을 실행하며, 이를 어떤 브라우저에서도 접근할 수 있는 환경이 마련됩니다.
환경 시작하기
- 새 노트북을 colab.google.com에서 엽니다.
- Runtime 메뉴에서 런타임 유형을 변경하고 GPU를 활성화합니다 (가능하면 T4를 선택하세요).
Pinggy 설치
웹 앱을 시작하기 전에 터널이 활성화되어 있어야 합니다.
!pip install pinggy
터널 시작
import pinggy
tunnel = pinggy.start_tunnel(
forwardto="localhost:5000"
)
print("Public URLs:", tunnel.urls)
출력된 URL을 잘 보관하세요 – 나중에 애플리케이션을 열 때 사용할 것입니다.
텍스트‑투‑스피치 의존성 설치
!pip install kokoro-onnx gradio soundfile torch numpy
- kokoro‑onnx – 음성 합성을 처리합니다.
- gradio – 웹 인터페이스를 구축합니다.
- soundfile – 오디오 출력을 저장합니다.
Kokoro TTS 이해하기
- Kokoro ONNX는 Kokoro 82M 모델을 기반으로 하며 효율적인 추론을 위해 최적화되었습니다.
- 이 모델은 비교적 작지만 자연스럽고 명확한 음성을 생성합니다.
- 영어, 일본어, 독일어, 프랑스어, 스페인어, 이탈리아어, 중국어, 한국어, 포르투갈어, 러시아어 등 여러 언어와 남성·여성 음성 스타일을 지원합니다.
- 경량화되어 있어 Colab의 메모리 제한 내에 편하게 들어가며 무료 GPU 티어에서도 안정적으로 실행됩니다.
핵심 텍스트‑투‑스피치 로직
import soundfile as sf
import urllib.request
import tempfile
import uuid
import os
from kokoro_onnx import Kokoro
# ----------------------------------------------------------------------
# Model URLs
# ----------------------------------------------------------------------
MODEL_URL = "https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/"
model_path = "kokoro-v1.0.onnx"
voices_bin_path = "voices-v1.0.bin"
# ----------------------------------------------------------------------
# Download if missing
# ----------------------------------------------------------------------
if not os.path.exists(model_path):
urllib.request.urlretrieve(MODEL_URL + "kokoro-v1.0.onnx", model_path)
if not os.path.exists(voices_bin_path):
urllib.request.urlretrieve(MODEL_URL + "voices-v1.0.bin", voices_bin_path)
# ----------------------------------------------------------------------
# Load model
# ----------------------------------------------------------------------
kokoro = Kokoro(model_path, voices_bin_path)
voice_options = list(kokoro.voices.keys())
VOICE_LABELS = {v.replace("_", " ").title(): v for v in voice_options}
LANG_LABELS = {
"English US": "en-us",
"English UK": "en-gb",
"Japanese": "ja-jp",
"Chinese": "zh-cn",
"German": "de-de",
"Spanish": "es-es",
"French": "fr-fr",
"Italian": "it-it",
"Korean": "ko-kr",
"Portuguese": "pt-br",
"Russian": "ru-ru",
}
def tts_generate(text, voice_label, speed, language):
"""Generate speech from text."""
if not text.strip():
return None, "Please enter text"
voice_id = VOICE_LABELS[voice_label]
lang_code = LANG_LABELS[language]
samples, sr = kokoro.create(
text=text,
voice=voice_id,
speed=float(speed),
lang=lang_code
)
filename = f"tts_{uuid.uuid4().hex[:8]}.wav"
path = os.path.join(tempfile.gettempdir(), filename)
sf.write(path, samples, sr)
return path, "Audio generated"
이 함수는 text, voice, speed, language를 받아서 재생 가능한 오디오 파일을 반환합니다.
Gradio로 웹 인터페이스 구축
Gradio를 사용하면 TTS 기능을 아주 적은 코드만으로 사용 가능한 웹 앱으로 전환할 수 있습니다.
import gradio as gr
def build_ui():
with gr.Blocks(title="Text to Speech AI") as app:
gr.Markdown("### Text to Speech AI")
# --------------------------------------------------------------
# Input components
# --------------------------------------------------------------
text_input = gr.Textbox(
label="Text",
placeholder="Enter text here",
lines=4
)
with gr.Row():
voice_dropdown = gr.Dropdown(
label="Voice",
choices=list(VOICE_LABELS.keys()),
value=list(VOICE_LABELS.keys())[0]
)
language_dropdown = gr.Dropdown(
label="Language",
choices=list(LANG_LABELS.keys()),
value="English US"
)
speed_slider = gr.Slider(
minimum=0.5,
maximum=2.0,
value=1.0,
step=0.1,
label="Speed"
)
generate_btn = gr.Button("Generate Speech")
# --------------------------------------------------------------
# Output components
# --------------------------------------------------------------
audio_output = gr.Audio(label="Output")
status_output = gr.Markdown()
# --------------------------------------------------------------
# Interaction
# --------------------------------------------------------------
generate_btn.click(
fn=tts_generate,
inputs=[text_input, voice_dropdown, speed_slider, language_dropdown],
outputs=[audio_output, status_output]
)
return app
# Launch the interface
ui = build_ui()
ui.launch(server_name="0.0.0.0", server_port=5000, share=False)
노트북을 실행하면 다음과 같습니다:
- Pinggy 터널을 시작합니다 (앞서 설명).
localhost:5000에서 Gradio UI를 실행합니다.- Pinggy가 제공하는 공개 URL을 노출하여, 링크를 가진 누구나 TTS 앱을 사용할 수 있게 합니다.
최종 메모
- 터널을 유지하기 위해 Colab 세션을 살아 있게 유지하세요 (예: 주기적으로 셀을 실행).
- 더 긴 오디오나 높은 처리량이 필요하면 유료 Colab 티어 또는 전용 GPU 인스턴스로 업그레이드하는 것을 고려하세요.
- 프로젝트에 가장 적합한 설정을 찾기 위해 다양한 음성, 언어 및 속도 설정을 자유롭게 실험해 보세요.
코드
inputs = [text_input, voice_dropdown, speed_slider, language_dropdown]
outputs = [audio_output, status_output]
return app
app = build_ui()
app.launch(server_name="0.0.0.0", server_port=5000, share=False)
전체 화면 제어
- 전체 화면 모드 진입
- 전체 화면 모드 종료
이 셀을 실행하면 앱이 노트북 내부에서 포트 5000을 청취하기 시작합니다.
브라우저에서 앱에 접근하기
앞서 표시된 Pinggy URL을 엽니다. 텍스트‑투‑스피치 인터페이스가 표시됩니다.
- 텍스트를 입력합니다.
- 음성 및 언어를 선택합니다.
- 필요에 따라 속도를 조정합니다.
- 오디오를 생성합니다.
출력은 바로 재생하거나 WAV 파일로 다운로드할 수 있습니다.
음성 및 언어 팁
- 가장 자연스러운 결과를 얻으려면 음성 프리픽스를 텍스트의 언어와 일치시키세요.
- English voices → English text
- Japanese voices → Japanese text
- …and so on.
- 속도 조절은 내레이션에 유용합니다; 약간 느린 말투가 긴 단락에서는 더 명확하게 들릴 수 있습니다.
성능 참고 사항
- 무료 T4 GPU에서는 짧은 문장이 거의 즉시 생성됩니다.
- 긴 문단은 몇 초 정도 걸립니다.
- 모델을 로드한 후 첫 번째 요청은 다소 느리게 느껴질 수 있지만, 이후 생성은 더 빠릅니다.
- Colab 세션은 비활동 후 연결이 끊길 수 있으므로, 노트북을 닫기 전에 중요한 오디오 파일을 다운로드하십시오.
결론
Google Colab에서 텍스트‑투‑스피치 시스템을 자체 호스팅하는 것은 사용량 제한이나 인프라 설정에 신경 쓰지 않고 고품질 음성 합성을 탐구할 수 있는 실용적인 방법입니다.
- Kokoro는 모델 크기와 오디오 품질 사이에서 좋은 균형을 제공합니다.
- Gradio는 인터페이스를 간단하게 유지합니다.
- Pinggy는 개인 노트북과 공개 접근 사이의 격차를 메워줍니다.
이 설정은 학습, 프로토타이핑, 접근성 도구, 혹은 유연성이 다듬어진 상업 플랫폼보다 더 중요한 콘텐츠 제작 워크플로우에 적합합니다.