라즈베리파이 5 홈서버에서 영어 텍스트를 음성(MP3)으로 변환해주는 웹사이트를 직접 만들었습니다. Microsoft의 edge-tts 엔진을 활용해 자연스러운 영어 발음을 생성하고, 브라우저에서 바로 재생하거나 MP3 파일로 다운로드할 수 있습니다.
완성된 서비스는 tts.life-debugging.com에서 확인할 수 있습니다.
완성된 기능
- 영어 텍스트 입력 (최대 10,000자)
- 목소리 선택 — en-US 기준 11가지 (Andrew, Aria, Ava, Brian, Emma, Jenny 등)
- 재생 속도 조절 (-50% ~ +100%)
- 브라우저에서 바로 재생
- MP3 파일 다운로드
기술 스택
- TTS 엔진: edge-tts (Microsoft Edge TTS 무료 활용)
- 백엔드: Python Flask
- 프론트엔드: 단일 HTML + TailwindCSS CDN
- 인프라: Docker 컨테이너 + Cloudflare Tunnel
전체 아키텍처
사용자 브라우저
↕ HTTPS
Cloudflare Tunnel (tts.life-debugging.com)
↕
Docker 컨테이너 (포트)
↕
Flask 앱 → edge-tts → MP3 생성 → 스트리밍 응답Step 1 — 프로젝트 구조
/srv/docker/services/tts-web/
├── Dockerfile
├── app.py
└── static/
└── index.htmlStep 2 — Flask 백엔드 (app.py)
핵심 엔드포인트 3가지:
GET /— 프론트엔드 HTML 서빙GET /api/voices— 사용 가능한 목소리 목록 반환POST /api/tts— 텍스트 받아서 MP3 생성 후 스트리밍 응답
TTS 생성 로직은 edge-tts의 Communicate 클래스를 asyncio로 실행하고, 임시 파일(/tmp/tts_uuid.mp3)로 저장한 뒤 전송 후 삭제합니다.
import asyncio, os, uuid, tempfile
from flask import Flask, request, send_file
import edge_tts
async def _generate_tts(text, voice, rate, output_path):
communicate = edge_tts.Communicate(
text=text, voice=voice,
rate=f"{"+" if rate >= 0 else ""}{rate}%",
)
await communicate.save(output_path)
@app.route("/api/tts", methods=["POST"])
def tts():
data = request.get_json(force=True)
tmp_path = os.path.join(tempfile.gettempdir(), f"tts_{uuid.uuid4().hex}.mp3")
try:
asyncio.run(_generate_tts(data["text"], data["voice"], int(data["rate"]), tmp_path))
return send_file(tmp_path, mimetype="audio/mpeg",
as_attachment=True, download_name="tts_output.mp3")
finally:
os.remove(tmp_path)Step 3 — Dockerfile
FROM python:3.11-slim
WORKDIR /app
RUN pip install --no-cache-dir flask==3.0.3 edge-tts==7.2.7
COPY app.py .
COPY static/ ./static/
EXPOSE 5000
CMD ["python", "app.py"]Step 4 — docker-compose.yml에 추가
tts-web:
build: ./tts-web
container_name: tts-web
restart: always
ports:
- "127.0.0.1:XXXX:XXXX"Step 5 — Cloudflare Tunnel 연결
/etc/cloudflared/config.yml에 한 줄 추가:
- hostname: tts.life-debugging.com
service: http://127.0.0.1:XXXX
Cloudflare Zero Trust 대시보드에서 동일하게 Public Hostname을 추가하면 외부 HTTPS 접속이 가능합니다.
빌드 및 실행
cd /srv/docker/services
docker compose build tts-web
docker compose up -d tts-web
# 동작 확인
curl -X POST http://127.0.0.1:XXXX/api/tts \
-H "Content-Type: application/json" \
-d '{"text":"Hello world","voice":"en-US-AndrewNeural","rate":0}' \
-o test.mp3
# HTTP 200 + 6KB MP3 생성 확인활용 예시
영어 공부에 활용하기 좋습니다. 영어 아티클을 입력하면 원어민 발음으로 읽어주는 오디오 파일을 만들어 섀도잉 연습에 사용할 수 있습니다. Andrew(남성), Emma(여성) 등 다양한 목소리를 비교해볼 수 있다는 점도 유용합니다.
마치며
라즈베리파이와 오픈소스 도구만으로 유료 TTS 서비스 수준의 웹사이트를 만들 수 있었습니다. edge-tts는 Microsoft Edge의 TTS 엔진을 무료로 활용하는 방식이라 음질도 매우 자연스럽습니다. 홈서버가 있다면 한번 만들어보세요!