μΌκΈ° ν μ€νΈλ₯Ό μ λ ₯νλ©΄ Gemini AIκ° λΆμνκ³ , κ·Έ κ²°κ³Όλ₯Ό Zonos TTSλ‘ μμ± λ³ννλ μΉ μ ν리μΌμ΄μ μ λλ€.
- μΌκΈ° ν μ€νΈ μ λ ₯: μ€λ ν루 μμλ μΌμ μμ λ‘κ² μ λ ₯
- AI λΆμ: Gemini APIλ₯Ό ν΅ν μΌκΈ° λ΄μ© λΆμ λ° νΌλλ°±
- μμ± λ³ν: Zonos TTSλ₯Ό μ¬μ©ν κ³ νμ§ νκ΅μ΄ μμ± λ³ν
- μ€λμ€ μ¬μ: λΈλΌμ°μ μμ λ°λ‘ λΆμ κ²°κ³Ό μμ± λ£κΈ°
- νμΌ λ€μ΄λ‘λ: MP3 ννλ‘ μμ± νμΌ μ μ₯
- Frontend: React 19 + TypeScript + Vite
- Styling: Tailwind CSS 4.0
- State Management: TanStack React Query
- API Integration: Gemini API + Zonos TTS API
- Node.js 18+ λ° npm/yarn
- Zonos TTS μλ² (localhost:8000μμ μ€ν μ€μ΄μ΄μΌ ν¨)
- Gemini API λ°±μλ (/api/gemini μλν¬μΈνΈ νμ)
git clone <repository-url>
cd 4th-hackathon-beautyandthebeasts-web
npm installμμΈν μ€μ λ°©λ²μ ZONOS_SETUP.mdλ₯Ό μ°Έμ‘°νμΈμ.
# Zonos TTS μ μ₯μ ν΄λ‘
git clone https://github.com/Zyphra/Zonos.git
cd Zonos
# Dockerλ‘ μ€ν (κΆμ₯)
docker compose up
# λλ μλ μ€μΉ
sudo apt install -y espeak-ng
pip install -U uv
uv sync
uv pip install -e .
python api.pynpm run devλΈλΌμ°μ μμ http://localhost:5173μΌλ‘ μ μνμΈμ.
- ν μ€νΈ μ λ ₯: μ€λ ν루 μμλ μΌμ ν μ€νΈ μμμ μ λ ₯ν©λλ€.
- λΆμ μμ²: "μΌκΈ° λΆμνκ³ μμ±μΌλ‘ λ£κΈ°" λ²νΌμ ν΄λ¦ν©λλ€.
- κ²°κ³Ό νμΈ: AIκ° λΆμν κ²°κ³Όλ₯Ό ν μ€νΈλ‘ νμΈν©λλ€.
- μμ± λ£κΈ°: "μμ± μ¬μ" λ²νΌμ ν΄λ¦νμ¬ κ²°κ³Όλ₯Ό μμ±μΌλ‘ λ€μ΄λ΄ λλ€.
- νμΌ μ μ₯: νμμ "μμ± λ€μ΄λ‘λ" λ²νΌμΌλ‘ MP3 νμΌμ μ μ₯ν©λλ€.
src/
βββ components/ # React μ»΄ν¬λνΈ
β βββ Layout.tsx # κΈ°λ³Έ λ μ΄μμ
β βββ Header.tsx # ν€λ
β βββ AudioControls.tsx # μ€λμ€ μ μ΄
βββ hooks/ # 컀μ€ν
ν
β βββ hook.ts # API νΈμΆ ν
λ€
βββ pages/ # νμ΄μ§ μ»΄ν¬λνΈ
β βββ HomePage.tsx # λ©μΈ νμ΄μ§
βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β βββ api.ts # API νΈμΆ ν¨μ
β βββ classname.ts # CSS ν΄λμ€ μ νΈ
βββ Router.tsx # λΌμ°ν° μ€μ
POST /api/gemini
Content-Type: application/json
{
"prompt": "μΌκΈ° ν
μ€νΈ"
}
POST http://localhost:8000/v1/audio/speech
Content-Type: application/json
{
"model": "Zyphra/Zonos-v0.1-transformer",
"input": "λ³νν ν
μ€νΈ",
"voice": "default",
"speed": 1.0,
"language": "ko-kr",
"emotion": {
"happiness": 0.5
},
"response_format": "mp3"
}
- Zonos TTS μλ²κ° localhost:8000μμ μ€ν μ€μΈμ§ νμΈ
- λ°©νλ²½ μ€μ νμΈ
- Docker 컨ν μ΄λ μν νμΈ
- λΈλΌμ°μ μ μλ μ¬μ μ μ± νμΈ
- HTTPS νκ²½μμ Mixed Content μ μ± νμΈ
μ΄ νλ‘μ νΈλ React + TypeScript + Vite κΈ°λ°μΌλ‘ κ°λ°λμμ΅λλ€.
νλ‘λμ μ ν리μΌμ΄μ κ°λ° μ νμ μΈμ λ¦°νΈ κ·μΉμ νμ±ννλ κ²μ κΆμ₯ν©λλ€:
export default tseslint.config([
globalIgnores(["dist"]),
{
files: ["**/*.{ts,tsx}"],
extends: [
...tseslint.configs.recommendedTypeChecked,
...tseslint.configs.strictTypeChecked,
...tseslint.configs.stylisticTypeChecked,
],
languageOptions: {
parserOptions: {
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
tsconfigRootDir: import.meta.dirname,
},
},
},
]);μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€.