AI ๊ธฐ๋ฐ ํ์บ์คํธ ๋ํ ์์ฑ๊ธฐ - URL, ํ ์คํธ, ๋ฌธ์๋ฅผ ์์ฐ์ค๋ฌ์ด ๋ค๊ตญ์ด ํ์บ์คํธ ๋ํ๋ก ๋ณํํฉ๋๋ค.
-
2025-01-02 (v2.0)
-
๐ ๋คํฌ๋ชจ๋/๋ผ์ดํธ๋ชจ๋ ํ ๊ธ: ์ฐ์ธก ์๋จ ๋ฒํผ์ผ๋ก ํ ๋ง ์ ํ ๊ฐ๋ฅ
- Tailwind CSS v4 ๊ธฐ๋ฐ ๋คํฌ๋ชจ๋ ๊ตฌํ
- localStorage๋ฅผ ํตํ ์ฌ์ฉ์ ํ ๋ง ์ค์ ์ ์ฅ
- ๊ธฐ๋ณธ ํ ๋ง: ๋คํฌ๋ชจ๋
- ๋ชจ๋ UI ์์์ ๋ผ์ดํธ๋ชจ๋ ์์ ์ต์ ํ ์ ์ฉ
- ํ๋จ ๋ก๊ณ ๊ฐ ํ ๋ง์ ๋ฐ๋ผ ์๋ ๋ณ๊ฒฝ (๋คํฌ๋ชจ๋: logo_dark.png / ๋ผ์ดํธ๋ชจ๋: logo_white.png)
-
โ ์์ ์ทจ์ ๊ธฐ๋ฅ: ๋ชจ๋ Generate Conversation ๋ฒํผ ์์ Cancel ๋ฒํผ ์ถ๊ฐ
- ์คํฌ๋ํ, ๋ํ ์์ฑ, ์ค๋์ค ํฉ์ฑ ๋ฑ ๋ชจ๋ ํ๋ก์ธ์ค ์ค๋จ ๊ฐ๋ฅ
- AbortController๋ฅผ ์ด์ฉํ ์์ ํ ์์ฒญ ์ทจ์
- ์ํ ์๋ ์ด๊ธฐํ๋ก ์๋ฌ ์์ด ๊น๋ํ ์ค๋จ
- ์ค๋์ค ์ฌ์ ์ค์ง ๋ฐ ๋ฆฌ์
-
๐ ๋ค๊ตญ์ด ์ง์ ์ถ๊ฐ: 14๊ฐ ์ธ์ด ์ง์ (ํ๊ตญ์ด, ์์ด, ์ค๊ตญ์ด, ์ผ๋ณธ์ด, ์คํ์ธ์ด, ํ๋์ด, ํ๋์ค์ด, ์๋์ด, ๋ ์ผ์ด, ๋ฒ ํธ๋จ์ด, ํฌ๋ฅดํฌ๊ฐ์ด, ๋ฌ์์์ด, ํ๊ตญ์ด, ์ธ๋๋ค์์์ด)
-
์ธ์ด๋ณ ์ต์ ํ: ๊ฐ ์ธ์ด์ ๋ง๋ ์์ฐ์ค๋ฌ์ด ๋ํ ์คํ์ผ๊ณผ ํ๋ฅด์๋
-
์ธ์ด ์ ํ UI: 7x2 ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ผ๋ก ๊น๋ํ ์ธ์ด ์ ํ ์ธํฐํ์ด์ค
-
ํดํ ์ง์: ๊ฐ ์ธ์ด ๋ฒํผ์ ๋ง์ฐ์ค ์ค๋ฒ ์ ์ ์ฒด ์ธ์ด ์ด๋ฆ ํ์
-
Agent Status ๊ฐ์ : ์ ๋ ฅ ์์ค(URL/Text/File) ์ ํ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ํ ๋ฉ์์ง ๋ณ๊ฒฝ
-
-
2025-01-01
- ํ๋ฅด์๋ ์ปค์คํฐ๋ง์ด์ง: ๊ฐ ํ์์ ์ฑ๊ฒฉ๊ณผ ๋ํ ์คํ์ผ์ ์์ ๋กญ๊ฒ ์ค์ ๊ฐ๋ฅ
- UI/UX ๊ฐ์ : Voices ์ปจํ ์ด๋ ํ์ฅ ๋ฐ ํ๋ฅด์๋ ์ ๋ ฅ ๋ฐ์ค ํฌ๊ธฐ ์ต์ ํ
- ๋ก๊ณ ํฌ๊ธฐ ์กฐ์ : ํ์ด์ง ํ๋จ ๋ก๊ณ ํฌ๊ธฐ ์ต์ ํ (72px)
- ๋ฒํผ ์ํ ๊ด๋ฆฌ: ์ค๋์ค ์์ฑ ์ค Generate Conversation ๋ฒํผ ์๋ ๋นํ์ฑํ
-
2024-12-31
- ์์ฑ ์ ํ ๊ธฐ๋ฅ ์ถ๊ฐ: 33๊ฐ์ ๋ค์ํ ElevenLabs ์์ฑ ์ค ์ ํ ๊ฐ๋ฅ
- ์์ฑ ๋ฏธ๋ฆฌ๋ฃ๊ธฐ: ๊ฐ ์์ฑ๋ณ ์ํ ์ฌ์ ๋ฒํผ ์ถ๊ฐ
- ๋๋กญ๋ค์ด UI ๊ฐ์ : ๋ฐ์ํ ์์ฑ ์ ํ ์ธํฐํ์ด์ค
-
2024-12-30
- MP3 ๋ค์ด๋ก๋ ๋ฒํผ ์ถ๊ฐ (์ฌ์/์ ์ง, ๋๊ฐ๊ธฐ ๋ฒํผ ์)
- Conversation UI ๊ฐ์ (๊ฐ์ ํ๊ทธ ์๋ ์จ๊น ์ฒ๋ฆฌ)
- ์ปจํ ์ด๋ ๋์ด ์๋ ์ ๋ ฌ ์์คํ ๊ตฌํ
- ์คํฌ๋กค ์ต์ ํ ๋ฐ ๋ฐ์ํ ๋ ์ด์์ ๊ฐ์
-
๐ ๋คํฌ๋ชจ๋/๋ผ์ดํธ๋ชจ๋ ์ง์
- ์ฐ์ธก ์๋จ ํ ๊ธ ๋ฒํผ์ผ๋ก ๊ฐํธํ ํ ๋ง ์ ํ
- localStorage๋ฅผ ํตํ ์ฌ์ฉ์ ์ค์ ์ ์ฅ
- ๋ผ์ดํธ๋ชจ๋์์ ๋ชจ๋ UI ์์ ์ต์ ํ
- ํ ๋ง์ ๋ง๋ ๋ก๊ณ ์๋ ๋ณ๊ฒฝ
-
๋ค์ํ ์ ๋ ฅ ์์ค ์ง์
- URL ์คํฌ๋ํ (์น ๊ธฐ์ฌ, ๋ธ๋ก๊ทธ ํฌ์คํธ)
- ํ ์คํธ ์ง์ ์ ๋ ฅ
- ํ์ผ ์ ๋ก๋ (์ด๋ฏธ์ง, PDF, DOCX, XLSX, PPTX, CSV, TXT, MD)
-
๐ 14๊ฐ ์ธ์ด ์ง์ ํ์บ์คํธ ์์ฑ
- ์ง์ ์ธ์ด: ํ๊ตญ์ด, English, ไธญๆ, ๆฅๆฌ่ช, Espaรฑol, เคนเคฟเคจเฅเคฆเฅ, Franรงais, ุงูุนุฑุจูุฉ, Deutsch, Tiแบฟng Viแปt, Portuguรชs, ะ ัััะบะธะน, เนเธเธข, Bahasa Indonesia
- GPT-5-mini๋ฅผ ํ์ฉํ ์์ฐ์ค๋ฌ์ด ๋ค๊ตญ์ด ๋ํ ์์ฑ
- ์ธ์ด๋ณ ์ต์ ํ๋ ๋ํ ์คํ์ผ ๋ฐ ํ๋ฅด์๋
- ๋ ๋ช ์ ํ์ (ํ๊ธฐ์ฐฌ Speaker1, ๋น๊ด์ ์ธ Speaker2)
- ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ํ ํ์
- ๊ฐ์ ํํ์ ๋ชจ๋ ์ธ์ด์์ ์์ด๋ก ํต์ผ ([laughs], [excited] ๋ฑ)
-
์์ฑ ํฉ์ฑ
- ElevenLabs API๋ฅผ ํตํ ๊ณ ํ์ง TTS
- 33๊ฐ์ ๋ค์ํ ์์ฑ ์ ํ ๊ฐ๋ฅ (Narrative, Conversational, Characters ๋ฑ)
- ํ์๋ณ ๋ค๋ฅธ ๋ชฉ์๋ฆฌ ์ ์ฉ (๋๋กญ๋ค์ด์ผ๋ก ์ ํ)
- ์์ฑ ๋ฏธ๋ฆฌ๋ฃ๊ธฐ ๊ธฐ๋ฅ ์ ๊ณต
- ์ฆ์ ์ฌ์ ๊ฐ๋ฅํ ์ค๋์ค ํ์ผ ์์ฑ
- MP3 ๋ค์ด๋ก๋ ๊ธฐ๋ฅ (ํ์์คํฌํ ํฌํจ ํ์ผ๋ช )
- Framework: Next.js 15.5.2 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- AI Services:
- OpenAI GPT-5-mini (๋ค๊ตญ์ด ํ์บ์คํธ ๋ํ ์์ฑ)
- OpenAI GPT-4o (์ด๋ฏธ์ง ๋ถ์, ๋ฌธ์ ์์ฝ)
- ElevenLabs (TTS, eleven_v3 ๋ชจ๋ธ)
- Firecrawl (์น ์คํฌ๋ํ)
- Localization:
- 14๊ฐ ์ธ์ด ์ง์ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ฒด๊ณ (
src/locales/prompts.ts) - ์ธ์ด๋ณ ํ๋ฅด์๋ ๋ฐ ๋ํ ํ๋กฌํํธ ํ ํ๋ฆฟ
- 14๊ฐ ์ธ์ด ์ง์ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ฒด๊ณ (
- Document Parsing:
- pdf-parse (PDF)
- mammoth (DOCX)
- xlsx (Excel)
- jszip & xml2js (PPTX)
- Node.js 18.0.0 ์ด์
- npm ๋๋ yarn
git clone https://github.com/your-username/ai-podcast.git
cd ai-podcastnpm install
# ๋๋
yarn install.env ํ์ผ์ ์์ฑํ๊ณ ๋ค์ API ํค๋ฅผ ์ค์ :
# OpenAI API
OPENAI_API_KEY=your_openai_api_key
# ElevenLabs API
ELEVENLABS_API_KEY=your_elevenlabs_api_key
# Firecrawl API (์น ์คํฌ๋ํ)
FIRECRAWL_API_KEY=your_firecrawl_api_key
# ํ์ผ ์
๋ก๋ ์ค์ (MB ๋จ์)
MAX_UPLOAD_FILE_SIZE=20
NEXT_PUBLIC_MAX_UPLOAD_FILE_SIZE=20npm run dev
# ๋๋
yarn devhttp://localhost:3000์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ธํ ์ ์์ต๋๋ค.
npm run build
npm run start- Render.com์์ ๊ณ์ ์์ฑ
- GitHub ์ ์ฅ์ ์ฐ๊ฒฐ
- Dashboard์์ "New +" โ "Web Service" ์ ํ
- GitHub ์ ์ฅ์ ์ ํ
- ์๋น์ค ์ค์ :
- Name: horizon-ai-podcast-generator
- Environment: Node
- Build Command:
npm install && npm run build - Start Command:
npm run start - Instance Type: Free ๋๋ ์ํ๋ ํ๋ ์ ํ
Render Dashboard โ Environment์์ ๋ค์ ํ๊ฒฝ ๋ณ์ ์ถ๊ฐ:
OPENAI_API_KEY=your_openai_api_key
ELEVENLABS_API_KEY=your_elevenlabs_api_key
FIRECRAWL_API_KEY=your_firecrawl_api_key
MAX_UPLOAD_FILE_SIZE=20
NEXT_PUBLIC_MAX_UPLOAD_FILE_SIZE=20
NODE_ENV=production
- "Create Web Service" ํด๋ฆญ
- ์๋์ผ๋ก ๋น๋ ๋ฐ ๋ฐฐํฌ ์์
- ๋ฐฐํฌ ์๋ฃ ํ ์ ๊ณต๋ URL๋ก ์ ์
- GitHub main ๋ธ๋์น์ pushํ๋ฉด ์๋์ผ๋ก ์ฌ๋ฐฐํฌ๋จ
Conversation ์น์ ์์ ์ํ๋ ์ธ์ด๋ฅผ ์ ํํฉ๋๋ค (๊ธฐ๋ณธ๊ฐ: ํ๊ตญ์ด)
- 14๊ฐ ์ธ์ด ์ค ์ ํ ๊ฐ๋ฅ
- ์ธ์ด ๋ฒํผ์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ์ ์ฒด ์ธ์ด ์ด๋ฆ ํ์ธ ๊ฐ๋ฅ
- "URL to convert" ๋ผ๋์ค ๋ฒํผ ์ ํ
- ์น ํ์ด์ง URL ์ ๋ ฅ (๋ด์ค ๊ธฐ์ฌ, ๋ธ๋ก๊ทธ ๋ฑ)
- "Generate Conversation" ํด๋ฆญ
- "Text to convert" ๋ผ๋์ค ๋ฒํผ ์ ํ
- ํ ์คํธ ์ง์ ์ ๋ ฅ
- "Generate Conversation" ํด๋ฆญ
- "File to convert" ๋ผ๋์ค ๋ฒํผ ์ ํ
- ํ์ผ ๋๋๊ทธ ์ค ๋๋กญ ๋๋ ํด๋ฆญํ์ฌ ์ ํ
- "Generate Conversation" ํด๋ฆญ
- ์ด๋ฏธ์ง: JPG, PNG, GIF, WEBP
- ๋ฌธ์: PDF, DOCX, PPTX, XLSX, CSV, TXT, MD
- ์ต๋ ํฌ๊ธฐ: 20MB
๋ํ๊ฐ ์์ฑ๋๋ ๋์ ์ค์๊ฐ์ผ๋ก ํ๋ฉด์ ํ์๋ฉ๋๋ค.
๋ํ์ [excited], [skeptical] ๋ฑ์ ๊ฐ์ ํ๊ทธ๊ฐ ํฌํจ๋์ด ๋์ฑ ์๋๊ฐ ์๋ ์์ฑ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
- Speaker1: ํ๊ธฐ์ฐจ๊ณ ์์งํ ์ฑ๊ฒฉ, ๋ชจ๋ ๊ฒ์ ์ด์ ์
- ๊ธฐ๋ณธ ์์ฑ: Blondie (Conversational)
- 33๊ฐ ์์ฑ ์ค ์์ ๋กญ๊ฒ ์ ํ ๊ฐ๋ฅ
- ํ๋ฅด์๋ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ: ํ ์คํธ ์ ๋ ฅ์ผ๋ก ์ฑ๊ฒฉ, ๋งํฌ, ํน์ง ์์ ์ค์
- Speaker2: ๋น๊ด์ ์ด๊ณ ์ค๋งํ ์ฑ๊ฒฉ, ํ์์ ์ธ ์๊ฐ
- ๊ธฐ๋ณธ ์์ฑ: Bradford (Narrative & Story)
- 33๊ฐ ์์ฑ ์ค ์์ ๋กญ๊ฒ ์ ํ ๊ฐ๋ฅ
- ํ๋ฅด์๋ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ: ํ ์คํธ ์ ๋ ฅ์ผ๋ก ์ฑ๊ฒฉ, ๋งํฌ, ํน์ง ์์ ์ค์
- ์ฌ์/์ผ์์ ์ง: ์์ฑ๋ ํ์บ์คํธ ์ฌ์ ์ ์ด
- ๋๊ฐ๊ธฐ: ์ฒ์๋ถํฐ ๋ค์ ์ฌ์
- MP3 ๋ค์ด๋ก๋: ์์ฑ๋ ์ค๋์ค๋ฅผ MP3 ํ์ผ๋ก ์ ์ฅ
- ์์ ์ทจ์: Generate Conversation ๋ฒํผ ์ Cancel ๋ฒํผ์ผ๋ก ์งํ ์ค์ธ ์์ ์ค๋จ
# node_modules ์ฌ์ค์น
rm -rf node_modules package-lock.json
npm install- ๋ชจ๋ ํ๊ฒฝ ๋ณ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธ
- API ํค์ ์ ํจ์ฑ ๋ฐ ์ฌ์ฉ ํ๋ ํ์ธ
MIT License
๊ธฐ์ฌ๋ฅผ ํ์ํฉ๋๋ค! Pull Request๋ฅผ ๋ณด๋ด์ฃผ์ธ์.
๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ์ ์์ฌํญ์ด ์์ผ๋ฉด Issues๋ฅผ ํตํด ์๋ ค์ฃผ์ธ์.
Made with โค๏ธ by HORIZON-AI Team