ํ๋ ค๋ ๊ฒ
๋๋์ด ์์ฑํ ์งํผํฐ์ค ๋ผ๋์ค ๐ป - ํด๋ก๋์ผ ์ผํด๋ผ!
ํด๋ก๋ MCP ๋ก๋ง ํ์ฉํด์ ์ฌ๋ก๊ธ url๋ง ๋ฃ์ผ๋ฉด ๋ผ๋์ค๋ก ์์ฑํด์ ๋ค์ ์ ์๋๋ก ๋ง๋ค์๋ ์ฌ๋ก
๊ทธ๋ฌ๋..! ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ด์ n8n์ผ๋ก ์๋ก ๊ตฌ์ถํ๊ธฐ๋ก ํจ
ํฅํ ๊ณผ์
ํด๋ก๋ mcp๋ก ๋ง๋๋๊น ๋๋ง ์ฌ๋ฆด ์ ์๋ ๋ฌธ์ ๊ฐ ์์ -> ๋๊ตฌ๋ ์ผ๋ ๋ธ๋ฉ์ค api ํค๋ฅผ ๋ฃ์ผ๋ฉด ์ง์ ๋ผ๋์ค๋ฅผ ์ฌ๋ฆด ์ ์๋๋ก ํ๊ณ ์ถ์
์๋ง ์ด๋ฌ๋ ค๋ฉด n8n ์ํฌํ๋ก๋ก ๋ฐ๊ฟ์ผ ํ๋๋ฏ???
์๋ '์์ฑํ๊ธฐ' ํญ์์ url ๋ฃ๊ณ ์์ฑํ๊ธฐ ๋๋ฅด๋ฉด -> ํด๋ก๋๊ฐ ์์ด์ ํธ๊ฐ ๋์ด ์ํํ ๋ชจ๋ ๊ณผ์ ์ ์ํฌํ๋ก๋ก ๋ด์ n8n์ด ํธ์ถ๋์ด -> ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋ก๋๋ ๊ฑธ ๋ง๋ค์ด๋ณด๊ธฐ
์ด์ ๋ ๋๊ตฌ๋ ๋ณธ์ธ ์ฌ๋ก๊ธ๋ก ๋ผ๋์ค๋ฅผ ๋ง๋ค ์ ์์ด์ ๐ป
์ฌ๋ก๊ธ URL ๋ฃ๊ณ ์ผ๋ ๋ธ๋ฉ์ค API Key ๋ฃ๊ณ '๋ผ๋์ค ์์ฑํ๊ธฐ' ๋ฒํผ ํด๋ฆญ
์นํ ํธ๋ฆฌ๊ฑฐ -> n8n ์ํฌํ๋ก๊ฐ ์คํ๋จ
์ฝ 30์ด ํ, ์ต์ข ์ ์ผ๋ก '๋ผ๋์ค ๋ฃ๊ธฐ' ํ์ด์ง์์ ์์ฑ๋ ๋ผ๋์ค๋ฅผ ๋ค์ ์ ์์
N8N ์ํฌํ๋ก ์๊ฐ
โ ์ ์ฒด ์ํฌํ๋ก ๊ฐ์
์ด ์ํฌํ๋ก๋ ์ด 7๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ ์ฒด ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Webhook: ์ฌ์ฉ์๊ฐ ๋ณด๋ธ URL์ ํธ๋ฆฌ๊ฑฐ๋ก ์์
HTML ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ: URL์์ ์ ์ฒด HTML์ ๊ฐ์ ธ์ด
์ ๋ชฉ, ์์ฑ์, ๋ณธ๋ฌธ ์ถ์ถ: ์ฝํ ์ธ ์์ ์ ๋ชฉ, ์์ฑ์, ๋ณธ๋ฌธ์ ์ ์ ์ถ์ถ
OpenAI: GPT-4o๋ฅผ ์ฌ์ฉํด ์คํฌ๋ฆฝํธ ์์ฑ + ํ๊ทธ ์ถ์ถ + ํ์ผ๋ช ์์ฑ
ElevenLabs: ํ ์คํธ๋ฅผ mp3 ์์ฑ์ผ๋ก ๋ณํ
Supabase ํ์ผ ์ ๋ก๋: ์์ฑ๋ mp3 ํ์ผ์ Supabase Storage์ ์ ์ฅ
Supabase DB ๊ธฐ๋ก: ๋ฉํ๋ฐ์ดํฐ (์ ๋ชฉ, ์์ฑ์, ํ์ผ ๊ฒฝ๋ก, ๋ ์ง, ํ๊ทธ ๋ฑ) ์ ์ฅ
๐ง ์์ธ ํ๋ฆ ๋ถ์
1. ๐ฉ Webhook (ํธ๋ฆฌ๊ฑฐ)
์ธ๋ถ ์ฑ์์
case_url
,elevenlabs_api_key
๋ฅผ ๋ด์ POST ์์ฒญ์ ๋ฐ์์ด URL์ ์ฌ๋ก ๊ฒ์๊ธ์ ๋งํฌ์ ๋๋ค
2. ๐ HTML ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ
case_url
์ HTTP ์์ฒญ โ HTML ์ ๋ฌธ ์์์ดํ Code ๋ ธ๋์์ ํ์ํ ๋ถ๋ถ๋ง ์ ์ ํ ์ค๋น
3. ๐งพ ์ ๋ชฉ, ์์ฑ์, ๋ณธ๋ฌธ ์ถ์ถ (Code ๋ ธ๋)
<h1> โ ์ ๋ชฉ
<a href="/member/..."> โ ์์ฑ์
<article class="prose"> โ ๋ณธ๋ฌธ๋ง ์ถ์ถ (์คํฌ๋ฆฝํธ/์คํ์ผ ์ ๊ฑฐ ํฌํจ)
๋งค์ฐ ์ ํํ CSS ๊ตฌ์กฐ ๊ธฐ๋ฐ ํ์ฑ
์ ๊ทํํ์ ํ์ฉ, HTML ํ๊ทธ ์ ๊ฑฐ ๋ฐ ๊ณต๋ฐฑ ์ ๋ฆฌ
4. ๐ฌ OpenAI GPT-4o: ์คํฌ๋ฆฝํธ ๋ฐ ํ๊ทธ ์์ฑ
์์ฐ์ค๋ฌ์ด ๊ฐ์ ์ด์ ๋งํฌ์ ๋ผ๋์ค ์คํฌ๋ฆฝํธ ์์ฑ
์ฌ์ฉ ๋๊ตฌ ๋ฐ ๋ถ์ผ ํค์๋ 1~2๊ฐ์ฉ
tags
๋ก ์ถ์ถ์ ๋ชฉ โ ์์ด โ ํ์ผ๋ช (
yyyy-mm-dd-title-in-english
) ์์ฑ
์ถ๋ ฅ ์์:
{
"file_name": "2025-05-31-my-case",
"script": "...",
"tags": ["n8n", "์ ์ ๊ฑด๊ฐ"]
}
5. ๐๏ธ ElevenLabs ์์ฑ ์์ฑ
script
๋ฅผ ํ ์คํธ๋ก ๋ฐ์ mp3 ํ์ผ ์์ฑoutput_format
:mp3_44100_128
,model_id
:eleven_multilingual_v2
Binary ํํ๋ก ๊ฒฐ๊ณผ ๋ฐํ (n8n ๋ด๋ถ์์
data
๋ก ์ ์ง๋จ)
6. โ๏ธ Supabase Storage์ ํ์ผ ์ ๋ก๋
ํ์ผ๋ช :
audio-files/{{ file_name }}.mp3
Authorization
ํค๋๋ก ์๋น์ค ํค ์ ๋ฌSend Body As: Binary
, ํ๋๋ช :data
x-upsert: true
๋ก ์ค๋ณต ๋ฎ์ด์ฐ๊ธฐ ํ์ฉ
7. ๐๏ธ Supabase DB posts
ํ
์ด๋ธ์ ๋ฉํ๋ฐ์ดํฐ ์
๋ก๋
์ ์ฅ๋๋ ํ๋:
title
,author
,original_url
,created_date
audio_file_path
: mp3 ํ์ผ ์์นtags
: GPT์์ ์ถ์ถํ ํ๊ทธ ๋ฆฌ์คํธ
created_date
๋ ํ๊ตญ ์๊ฐ ๊ธฐ์ค ISO ํ์ (2025-05-31
)์ผ๋ก ์๋ ์์ฑ๋จ
์ํ์ฐฉ์ค
1๏ธโฃ ์ปค๋ฎค๋ํฐ ๋ ธ๋๋ ํด๋ผ์ฐ๋์์ ์ธ ์ ์์๋ค
๋ฌธ์ ์ํฉ: HTML์์ ๋ณธ๋ฌธ์ ์ถ์ถํ๋ ค๊ณ ํ ๋, ๋ง์ ์์๋ค์ด
HTML Extract
๋ผ๋ ์ปค๋ฎค๋ํฐ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ์๋ ค์ค.๊ทธ๋ฌ๋: n8n Cloud ๋ฒ์ ์์๋ ์ปค๋ฎค๋ํฐ ๋ ธ๋๋ฅผ ์ค์นํ ์ ์์.
ํด๊ฒฐ ๋ฐฉ๋ฒ: ์ง์
Code
๋ ธ๋์์ HTML ํ์ฑ ๋ก์ง์ ๊ตฌํ.Regex
์replaceAll()
์ ํ์ฉํดarticle
ํ๊ทธ ๋ด๋ถ์์ ๋ณธ๋ฌธ๋ง ์ถ์ถ<script>
,<style>
,<div>
๋ฑ์ ๋ชจ๋ ์ ๊ฑฐ
2๏ธโฃ Supabase ๋ ธ๋์๋ ํ์ผ ์คํ ๋ฆฌ์ง ์ ๋ก๋ ๊ธฐ๋ฅ์ด ์์๋ค
๋ฌธ์ ์ํฉ: ElevenLabs์์ ์์ฑํ
mp3
ํ์ผ์ Supabase์ ์ฌ๋ฆฌ๋ ค๋๋ฐ,n8n Supabase ๋ ธ๋
์๋ Storage Upload ๊ธฐ๋ฅ์ด ์์ํด๊ฒฐ ๋ฐฉ๋ฒ:
Supabase ๊ณต์ REST API ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์ง์ HTTP ๋ ธ๋ ๊ตฌ์ฑ
POST https://<project>.supabase.co/storage/v1/object/<bucket>/<filename>.mp3
Binary๋ก mp3 ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ,
Authorization
ํค๋์ API ํค ์ถ๊ฐ
3๏ธโฃ ElevenLabs๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด๋ผ ๋ JSON ์ค๋ฅ ๋ฐ์
๋ฌธ์ ์ํฉ: GPT๊ฐ ์์ฑํ
"script"
ํ ์คํธ๋ฅผ ElevenLabs API์ ์ ์กํ ๋"JSON parameter needs to be valid JSON"
์๋ฌ ๋ฐ์์์ธ:
script
ํ ์คํธ ์์ **๋ฐ์ดํ("
)๋ ์ค๋ฐ๊ฟ(\n
)**์ด ํฌํจ๋์ด JSON ์ ์ฒด ํ์์ด ๊นจ์งํด๊ฒฐ ๋ฐฉ๋ฒ:
JSON.stringify($json.message.content.script)
์ ์ฉ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ์ค๋ฐ๊ฟ, ๋ฐ์ดํ, ํน์๋ฌธ์๊ฐ ์๋ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋์ด
"text"
ํ๋์ ์์ ํ๊ฒ ๋ค์ด๊ฐ ์ ์์
4๏ธโฃ ElevenLabs์ create
vs stream
API ์ฐจ์ด๋ฅผ ๋ชฐ๋ผ์ ํผ๋
๋ฌธ์ ์ํฉ: ElevenLabs ๋ฌธ์์
create speech
,stream speech
๊ฐ ๋์์ ์๊ฐ๋์ด ์์ด
์ด๋ค ๊ฑธ ์จ์ผ ํ ์ง ํผ๋์ค๋ฌ์ํท๊ฐ๋ฆฐ ์ด์ : ๋ ๋ค ํ ์คํธ โ ์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋ฐฉ์์ด ๋ค๋ฆ
ํด๊ฒฐ ์์ฝ:
ํญ๋ชฉ
create speech
stream speech
๋ฐฉ์
mp3 ํ์ผ ์์ฑ ํ ํต์งธ๋ก ๋ฐํ
์์ฑ ๋ฐ์ดํฐ๋ฅผ chunk๋ก ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ
์๋
์ฝ๊ฐ ๋๋ฆฌ์ง๋ง ์ ์ฒด ํ์ผ ๋ฐ์
๋น ๋ฅด์ง๋ง ์ค์๊ฐ ์๋น ๋ชฉ์
์ฐ์์
โ ์ ์ฅ์ฉ / ๋ค์ด๋ก๋ / ๋ฐฐํฌ
โ ์คํธ๋ฆฌ๋ฐ ํ๋ ์ด์ด๋ TTS๋ด ์ฉ๋
์ฌ์ฉ ์ํฉ
n8n์์ ํ์ผ ์ ์ฅํ ๋ชฉ์ ์ด๋ฉด ๋ฌด์กฐ๊ฑด create
์ถ์ฒ
ํด๊ฒฐ: n8n์์๋ ํ์ผ์ Supabase์ ์ ์ฅํด์ผ ํ๋ฏ๋ก,
create
๋ฐฉ์์ผ๋ก ํ์ ์ฌ์ฉ
5๏ธโฃ ElevenLabs API ์ธ์ฆ ์ค๋ฅ์ ์ ํํ ์์ธ
๋ฌธ์ ์ํฉ: API ํค๋ ์ ๋๋ก ์ ๋ ฅํ์ง๋ง
"Unauthorized"
(401) ์๋ฌ ๋ฐ์์ฒ์ ์ถ์ธก: ํค๊ฐ ํ๋ ธ๊ฑฐ๋ ํค๋๊ฐ ์๋ชป๋ ์ค ์์์
์ค์ ์์ธ:
๋ฌด๋ฃ ์๊ธ์ ์์๋ ํน์ ๋ชฉ์๋ฆฌ์ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์์
์๋ฅผ ๋ค์ด:
yohankoo
์์ฑ: ํ๋ฆฌ๋ฏธ์ ๋ณด์ด์คeleven_multilingual_v2
๋ชจ๋ธ: ์ ๋ฃ ์๊ธ์ ์ด์๋ง ์ง์
ํด๊ฒฐ ๋ฐฉ๋ฒ:
ElevenLabs ์ ๋ฃ ์๊ธ์ ๊ฐ์ ํ, ๋์ผํ API ํค๋ก ๋ค์ ์์ฒญ โ ๋ฌธ์ ์ฆ์ ํด๊ฒฐ
๋ฌ๋ฒ๋ธ์์ ์ถ๊ฐํ ๊ธฐ๋ฅ๋ค
ํ๋ค๊ฐ ๋ฌ๋ฒ๋ธ 5๊ฐ ๋ฌด๋ฃ ๋ค ์จ์ ์ปค์๋ก ๋์ด๊ฐ
์ปค์์์ ์์ ์์ฒญ์ ํ ๋ค
์ปค๋ฐํด๋ฌ๋ผ๊ณ ์์ฒญํ๊ณ
๋ฌ๋ฒ๋ธ๋ก ๊ฐ์ ๋ค์ publish ํ์
๋ง์์ ๋๋ ๋ฌ๋ฒ๋ธ ๊ฒฐ๊ณผ๋ฌผ
๋!!!!!!!!!!!