라즈베리파이로 나만의 TTS 웹사이트 만들기 — 영어 텍스트를 MP3로 변환하는 홈서버 프로젝트

라즈베리파이 5 홈서버에서 edge-tts와 Flask, Docker를 이용해 영어 텍스트를 MP3로 변환해주는 웹사이트를 직접 만드는 방법을 단계별로 정리했습니다. Cloudflare Tunnel로 외부 접속까지 완성.

라즈베리파이 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

전체 아키텍처

Bash
사용자 브라우저
     HTTPS
Cloudflare Tunnel (tts.life-debugging.com)
    
Docker 컨테이너 (포트)
    
Flask   edge-tts  MP3 생성  스트리밍 응답

Step 1 — 프로젝트 구조

Bash
/srv/docker/services/tts-web/
├── Dockerfile
├── app.py
└── static/
    └── index.html

Step 2 — Flask 백엔드 (app.py)

핵심 엔드포인트 3가지:

  • GET / — 프론트엔드 HTML 서빙
  • GET /api/voices — 사용 가능한 목소리 목록 반환
  • POST /api/tts — 텍스트 받아서 MP3 생성 후 스트리밍 응답

TTS 생성 로직은 edge-tts의 Communicate 클래스를 asyncio로 실행하고, 임시 파일(/tmp/tts_uuid.mp3)로 저장한 뒤 전송 후 삭제합니다.

Python
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

Python
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에 추가

Python
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 접속이 가능합니다.

빌드 및 실행

Python
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 엔진을 무료로 활용하는 방식이라 음질도 매우 자연스럽습니다. 홈서버가 있다면 한번 만들어보세요!