Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

purestory/edgetts-service

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

3 Commits

Repository files navigation

πŸŽ™οΈ EdgeTTS - Microsoft Edge Text-to-Speech μŒμ„± ν•©μ„± μ„œλΉ„μŠ€

Microsoft Edge의 κ°•λ ₯ν•œ Text-to-Speech 엔진을 ν™œμš©ν•œ μ›Ή 기반 μŒμ„± ν•©μ„± μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

✨ μ£Όμš” κΈ°λŠ₯

🌍 λ‹€κ΅­μ–΄ 지원

  • 75개 μ΄μƒμ˜ μ–Έμ–΄ 지원
  • 450개 μ΄μƒμ˜ κ³ ν’ˆμ§ˆ μŒμ„± 제곡
  • μžλ™ μ–Έμ–΄ 감지 κΈ°λŠ₯
  • 성별별 μŒμ„± 선택 (κΈ°λ³Έ: μ—¬μ„± μŒμ„±)

🎡 κ³ κΈ‰ μŒμ„± μ œμ–΄

  • 속도 쑰절: -50% ~ +200%
  • 음쑰 쑰절: -50Hz ~ +50Hz
  • λ³Όλ₯¨ 쑰절: -50% ~ +200%
  • μ‹€μ‹œκ°„ μŒμ„± μƒ˜ν”Œ μž¬μƒ

πŸ“ ν…μŠ€νŠΈ 처리

  • 일반 ν…μŠ€νŠΈ μŒμ„± ν•©μ„± (μ΅œλŒ€ 5,000자)
  • κΈ΄ ν…μŠ€νŠΈ 청크 λΆ„ν•  처리
  • SSML μ§€μ›μœΌλ‘œ κ³ κΈ‰ μŒμ„± μ œμ–΄
  • μžλ™ ν…μŠ€νŠΈ 정리 및 μ΅œμ ν™”

πŸ’Ύ μ‚¬μš©μž κ²½ν—˜

  • μŒμ„± ν•©μ„± νžˆμŠ€ν† λ¦¬ 관리
  • μ‚¬μš© 톡계 및 뢄석
  • ν…μŠ€νŠΈ μž¬μ‚¬μš© κΈ°λŠ₯
  • λ°˜μ‘ν˜• λͺ¨λ˜ UI

πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ React β”‚ β”‚ Nginx β”‚ β”‚ FastAPI β”‚
β”‚ Frontend │◄──►│ Proxy │◄──►│ Backend β”‚
β”‚ (Vite) β”‚ β”‚ (/edge-api)β”‚ β”‚ (Port 3701) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
 β”‚
 β–Ό
 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚ Microsoft β”‚
 β”‚ Edge TTS API β”‚
 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ› οΈ 기술 μŠ€νƒ

Backend

  • Python 3.8+
  • FastAPI - κ³ μ„±λŠ₯ API μ„œλ²„
  • edge-tts 6.1.12 - Microsoft Edge TTS 라이브러리
  • Uvicorn - ASGI μ„œλ²„
  • Pydantic - 데이터 검증

Frontend

  • React 18 - μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€
  • Vite - λΉŒλ“œ 도ꡬ
  • Axios - HTTP ν΄λΌμ΄μ–ΈνŠΈ
  • CSS3 - λͺ¨λ˜ μŠ€νƒ€μΌλ§

Infrastructure

  • Nginx - λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ & 정적 파일 μ„œλΉ™
  • Systemd - μ„œλΉ„μŠ€ 관리
  • Ubuntu Linux - μ„œλ²„ ν™˜κ²½

πŸ“¦ μ„€μΉ˜ 방법

1. μ €μž₯μ†Œ 클둠

git clone https://github.com/purestory/edgetts.git
cd edgetts

2. λ°±μ—”λ“œ μ„€μ •

# Python κ°€μƒν™˜κ²½ 생성
python3 -m venv .venv
source .venv/bin/activate
# μ˜μ‘΄μ„± μ„€μΉ˜
pip install -r requirements.txt

3. ν”„λ‘ νŠΈμ—”λ“œ μ„€μ •

cd frontend
npm install
npm run build

4. μ„œλΉ„μŠ€ μ„€μ •

# EdgeTTS μ„œλΉ„μŠ€ 파일 볡사
sudo cp edgetts.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable edgetts.service
sudo systemctl start edgetts.service

5. Nginx μ„€μ •

# /etc/nginx/sites-available/your-domain
location = /edgetts {
 return 301 /edgetts/;
}
location ^~ /edgetts/ {
 alias /path/to/edgetts/frontend/dist/;
 index index.html;
 try_files $uri $uri/ /edgetts/index.html;
 
 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
 expires 1y;
 add_header Cache-Control "public, immutable";
 }
}
location ^~ /edge-api/ {
 rewrite ^/edge-api/(.*)$ /1ドル break;
 proxy_pass http://localhost:3701;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_buffering off;
 client_max_body_size 50G;
}

πŸš€ μ‚¬μš©λ²•

μ›Ή μΈν„°νŽ˜μ΄μŠ€

  1. λΈŒλΌμš°μ €μ—μ„œ http://your-domain/edgetts/ 접속
  2. ν…μŠ€νŠΈ μž…λ ₯ μ˜μ—­μ— ν•©μ„±ν•  ν…μŠ€νŠΈ μž…λ ₯
  3. μ›ν•˜λŠ” 언어와 μŒμ„± 선택
  4. 속도, 음쑰, λ³Όλ₯¨ 쑰절 (선택사항)
  5. "μŒμ„± ν•©μ„±" λ²„νŠΌ 클릭
  6. μƒμ„±λœ μŒμ„± μž¬μƒ 및 λ‹€μš΄λ‘œλ“œ

API μ‚¬μš©λ²•

μŒμ„± ν•©μ„±

curl -X POST "http://your-domain/edge-api/synthesize" \
 -H "Content-Type: application/json" \
 -d '{
 "text": "μ•ˆλ…•ν•˜μ„Έμš”! EdgeTTSμž…λ‹ˆλ‹€.",
 "voice": "ko-KR-SunHiNeural",
 "rate": "+0%",
 "pitch": "+0Hz",
 "volume": "+0%"
 }' \
 --output audio.mp3

지원 μ–Έμ–΄ λͺ©λ‘

curl "http://your-domain/edge-api/languages"

μŒμ„± λͺ©λ‘ 쑰회

curl "http://your-domain/edge-api/voices/language/ko"

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

edgetts/
β”œβ”€β”€ backend/ # FastAPI λ°±μ—”λ“œ
β”‚ β”œβ”€β”€ app.py # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”‚ └── ...
β”œβ”€β”€ frontend/ # React ν”„λ‘ νŠΈμ—”λ“œ
β”‚ β”œβ”€β”€ src/
β”‚ β”‚ β”œβ”€β”€ App.jsx # 메인 μ»΄ν¬λ„ŒνŠΈ
β”‚ β”‚ β”œβ”€β”€ main.jsx # μ—”νŠΈλ¦¬ 포인트
β”‚ β”‚ └── index.css # μŠ€νƒ€μΌ
β”‚ β”œβ”€β”€ dist/ # λΉŒλ“œλœ 파일
β”‚ β”œβ”€β”€ package.json
β”‚ └── vite.config.js
β”œβ”€β”€ samples/ # μŒμ„± μƒ˜ν”Œ 파일
β”œβ”€β”€ tmp/ # μž„μ‹œ 파일
β”œβ”€β”€ .venv/ # Python κ°€μƒν™˜κ²½
β”œβ”€β”€ requirements.txt # Python μ˜μ‘΄μ„±
β”œβ”€β”€ edgetts.service # Systemd μ„œλΉ„μŠ€ 파일
β”œβ”€β”€ generate_samples.py # μƒ˜ν”Œ 생성 슀크립트
└── README.md

🎯 API μ—”λ“œν¬μΈνŠΈ

μŒμ„± ν•©μ„±

  • POST /synthesize - 일반 ν…μŠ€νŠΈ μŒμ„± ν•©μ„±
  • POST /synthesize-long - κΈ΄ ν…μŠ€νŠΈ 청크 λΆ„ν•  처리
  • POST /voice-sample/{voice_name} - μŒμ„± μƒ˜ν”Œ 생성

정보 쑰회

  • GET /languages - 지원 μ–Έμ–΄ λͺ©λ‘
  • GET /voices - 전체 μŒμ„± λͺ©λ‘
  • GET /voices/language/{code} - νŠΉμ • μ–Έμ–΄ μŒμ„± λͺ©λ‘
  • POST /detect-language - ν…μŠ€νŠΈ μ–Έμ–΄ μžλ™ 감지

관리

  • GET /health - μ„œλΉ„μŠ€ μƒνƒœ 확인
  • DELETE /cleanup - μž„μ‹œ 파일 정리
  • GET /samples/stats - μƒ˜ν”Œ 파일 톡계

🌟 νŠΉλ³„ν•œ κΈ°λŠ₯

μžλ™ μ–Έμ–΄ 감지

μž…λ ₯된 ν…μŠ€νŠΈλ₯Ό λΆ„μ„ν•˜μ—¬ μ–Έμ–΄λ₯Ό μžλ™μœΌλ‘œ κ°μ§€ν•˜κ³  μ μ ˆν•œ μŒμ„±μ„ μΆ”μ²œν•©λ‹ˆλ‹€.

청크 λΆ„ν•  처리

κΈ΄ ν…μŠ€νŠΈλ₯Ό μžλ™μœΌλ‘œ μ μ ˆν•œ 크기둜 λΆ„ν• ν•˜μ—¬ μ²˜λ¦¬ν•˜κ³  ν•˜λ‚˜μ˜ μ˜€λ””μ˜€ 파일둜 κ²°ν•©ν•©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ΅œμ ν™”

Blob URL 생성과 ν•΄μ œλ₯Ό 적절히 κ΄€λ¦¬ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

μΊμ‹œ μ΅œμ ν™”

μŒμ„± λͺ©λ‘κ³Ό μƒ˜ν”Œ νŒŒμΌμ„ μΊμ‹œν•˜μ—¬ λΉ λ₯Έ 응닡 속도λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

πŸ”§ μ„€μ • μ˜΅μ…˜

ν™˜κ²½ λ³€μˆ˜

# 포트 μ„€μ • (κΈ°λ³Έ: 3701)
export PORT=3701
# μž„μ‹œ 파일 디렉토리
export TEMP_DIR="/home/purestory/edgetts/tmp"
# μƒ˜ν”Œ 파일 디렉토리 
export SAMPLE_DIR="/home/purestory/edgetts/samples"

파일 관리 μ„€μ •

  • MAX_GENERATED_FILES: μ΅œλŒ€ 생성 파일 수 (κΈ°λ³Έ: 100개)
  • KEEP_GENERATED_FILES: 정리 μ‹œ μœ μ§€ν•  파일 수 (κΈ°λ³Έ: 50개)

πŸ› 문제 ν•΄κ²°

자주 λ°œμƒν•˜λŠ” 문제

1. Blob URL μ—λŸ¬

// λΈŒλΌμš°μ € μ½˜μ†”μ—μ„œ μ‹€ν–‰
localStorage.removeItem('edgetts_history');
localStorage.removeItem('edgetts_stats');
location.reload();

2. μŒμ„± ν•©μ„± μ‹€νŒ¨

  • μ„œλΉ„μŠ€ μƒνƒœ 확인: sudo systemctl status edgetts.service
  • 둜그 확인: sudo journalctl -u edgetts.service -f

3. Nginx μ„€μ • 문제

  • μ„€μ • ν…ŒμŠ€νŠΈ: sudo nginx -t
  • μ„œλΉ„μŠ€ μž¬μ‹œμž‘: sudo systemctl reload nginx

πŸ“Š μ„±λŠ₯ μ΅œμ ν™”

ꢌμž₯ μ„€μ •

  • CPU: 2μ½”μ–΄ 이상
  • RAM: 4GB 이상
  • μ €μž₯곡간: 10GB 이상 (μƒ˜ν”Œ 파일 포함)
  • λ„€νŠΈμ›Œν¬: 1Mbps 이상

μ΅œμ ν™” 팁

  1. μŒμ„± μƒ˜ν”Œ 사전 μƒμ„±μœΌλ‘œ 응닡 속도 ν–₯상
  2. Nginx μ••μΆ• 및 μΊμ‹œ μ„€μ •
  3. 정기적인 μž„μ‹œ 파일 정리
  4. ν”„λ‘œμ„ΈμŠ€ λͺ¨λ‹ˆν„°λ§ 및 μžλ™ μž¬μ‹œμž‘

🀝 κΈ°μ—¬ν•˜κΈ°

  1. Fork ν”„λ‘œμ νŠΈ
  2. Feature 브랜치 생성 (git checkout -b feature/AmazingFeature)
  3. 변경사항 컀밋 (git commit -m 'Add some AmazingFeature')
  4. λΈŒλžœμΉ˜μ— Push (git push origin feature/AmazingFeature)
  5. Pull Request 생성

πŸ“„ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€ ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ LICENSE νŒŒμΌμ„ μ°Έμ‘°ν•˜μ„Έμš”.

πŸ™ κ°μ‚¬μ˜ 말

  • Microsoft Edge TTS - 핡심 μŒμ„± ν•©μ„± μ—”μ§„
  • FastAPI - κ³ μ„±λŠ₯ API ν”„λ ˆμž„μ›Œν¬
  • React - μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ 라이브러리

πŸ“ž 지원 및 문의


⭐ 이 ν”„λ‘œμ νŠΈκ°€ 도움이 λ˜μ…¨λ‹€λ©΄ Starλ₯Ό λˆŒλŸ¬μ£Όμ„Έμš”!

About

πŸ”Š Microsoft Edge TTS service with React frontend

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /