๐Ÿ“ป ์ด์ œ๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋ณธ์ธ ์‚ฌ๋ก€๊ธ€๋กœ ๋ผ๋””์˜ค๋ฅผ ์ƒ์„ฑํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!! (ํด๋กœ๋“œ MCP๋ฅผ n8n ์›Œํฌํ”Œ๋กœ๋กœ ๋‹ค ์˜ฎ๊ฒผ์–ด์š”!)

ํ•˜๋ ค๋˜ ๊ฒƒ

๋“œ๋””์–ด ์™„์„ฑํ•œ ์ง€ํ”ผํ„ฐ์Šค ๋ผ๋””์˜ค ๐Ÿ“ป - ํด๋กœ๋“œ์•ผ ์ผํ•ด๋ผ!

  • ํด๋กœ๋“œ MCP ๋กœ๋งŒ ํ™œ์šฉํ•ด์„œ ์‚ฌ๋ก€๊ธ€ url๋งŒ ๋„ฃ์œผ๋ฉด ๋ผ๋””์˜ค๋กœ ์ƒ์„ฑํ•ด์„œ ๋“ค์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋˜ ์‚ฌ๋ก€

  • ๊ทธ๋Ÿฌ๋‚˜..! ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ n8n์œผ๋กœ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ๋กœ ํ•จ

ํ–ฅํ›„ ๊ณผ์ œ

  • ํด๋กœ๋“œ mcp๋กœ ๋งŒ๋“œ๋‹ˆ๊นŒ ๋‚˜๋งŒ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ -> ๋ˆ„๊ตฌ๋‚˜ ์ผ๋ ˆ๋ธ๋žฉ์Šค api ํ‚ค๋ฅผ ๋„ฃ์œผ๋ฉด ์ง์ ‘ ๋ผ๋””์˜ค๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์Œ

  • ์•„๋งˆ ์ด๋Ÿฌ๋ ค๋ฉด n8n ์›Œํฌํ”Œ๋กœ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”๋“ฏ???

  • ์•„๋ž˜ '์ƒ์„ฑํ•˜๊ธฐ' ํƒญ์—์„œ url ๋„ฃ๊ณ  ์ƒ์„ฑํ•˜๊ธฐ ๋ˆ„๋ฅด๋ฉด -> ํด๋กœ๋“œ๊ฐ€ ์—์ด์ „ํŠธ๊ฐ€ ๋˜์–ด ์ˆ˜ํ–‰ํ•œ ๋ชจ๋“  ๊ณผ์ •์„ ์›Œํฌํ”Œ๋กœ๋กœ ๋‹ด์€ n8n์ด ํ˜ธ์ถœ๋˜์–ด -> ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ฑ๋ก๋˜๋Š” ๊ฑธ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

์ด์ œ๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋ณธ์ธ ์‚ฌ๋ก€๊ธ€๋กœ ๋ผ๋””์˜ค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š” ๐Ÿ“ป

  • ์ง€ํ”ผํ„ฐ์Šค ๋ผ๋””์˜ค ์›น์‚ฌ์ดํŠธ ์ ‘์†

  • ์‚ฌ๋ก€๊ธ€ URL ๋„ฃ๊ณ  ์ผ๋ ˆ๋ธ๋žฉ์Šค API Key ๋„ฃ๊ณ  '๋ผ๋””์˜ค ์ƒ์„ฑํ•˜๊ธฐ' ๋ฒ„ํŠผ ํด๋ฆญ

  • ์›นํ›… ํŠธ๋ฆฌ๊ฑฐ -> n8n ์›Œํฌํ”Œ๋กœ๊ฐ€ ์‹คํ–‰๋จ

  • ์•ฝ 30์ดˆ ํ›„, ์ตœ์ข…์ ์œผ๋กœ '๋ผ๋””์˜ค ๋“ฃ๊ธฐ' ํŽ˜์ด์ง€์—์„œ ์ƒ์„ฑ๋œ ๋ผ๋””์˜ค๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ์Œ

N8N ์›Œํฌํ”Œ๋กœ ์†Œ๊ฐœ

โœ… ์ „์ฒด ์›Œํฌํ”Œ๋กœ ๊ฐœ์š”

์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ

์ด ์›Œํฌํ”Œ๋กœ๋Š” ์ด 7๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ „์ฒด ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. Webhook: ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ URL์„ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์‹œ์ž‘

  2. HTML ์ „์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ: URL์—์„œ ์ „์ฒด HTML์„ ๊ฐ€์ ธ์˜ด

  3. ์ œ๋ชฉ, ์ž‘์„ฑ์ž, ๋ณธ๋ฌธ ์ถ”์ถœ: ์ฝ˜ํ…์ธ ์—์„œ ์ œ๋ชฉ, ์ž‘์„ฑ์ž, ๋ณธ๋ฌธ์„ ์ •์ œ ์ถ”์ถœ

  4. OpenAI: GPT-4o๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ + ํƒœ๊ทธ ์ถ”์ถœ + ํŒŒ์ผ๋ช… ์ƒ์„ฑ

  5. ElevenLabs: ํ…์ŠคํŠธ๋ฅผ mp3 ์Œ์„ฑ์œผ๋กœ ๋ณ€ํ™˜

  6. Supabase ํŒŒ์ผ ์—…๋กœ๋“œ: ์ƒ์„ฑ๋œ mp3 ํŒŒ์ผ์„ Supabase Storage์— ์ €์žฅ

  7. 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 ํ–ˆ์Œ

๋งˆ์Œ์— ๋“œ๋Š” ๋Ÿฌ๋ฒ„๋ธ” ๊ฒฐ๊ณผ๋ฌผ

๋—!!!!!!!!!!!

16
8๊ฐœ์˜ ๋‹ต๊ธ€

๐Ÿ‘‰ ์ด ๊ฒŒ์‹œ๊ธ€๋„ ์ฝ์–ด๋ณด์„ธ์š”