2026년 1~2월, 주말 토일, 9시반~1시반(4H)

 

(1개월) 멀티모달 서비스 개발 기초

  1주차: 멀티모달AI 개요 및 프롬프트 엔지니어링

  2주차: 멀티모달 비전/음성 이해

  3주차: Langchain/Langgraph 및 RAG 멀티모달 개발

  4주차: 멀티모달 서빙(FastAPI) 및 웹개발 바이브코딩

(2개월차) 팀 프로젝트 수행

  5주차: SW공학개론 + 기획안발표, 요구사항분석 

  6주차: 설계 및 UML, 아키텍처/디자인패턴

  7주차: 버전관리(Git), 테스트/품질속성

  8주차: 프로젝트관리/애자일, 최종발표

 

* 부족했던점 / 개선할점:

  - 1개월차 과정이 너무 빡빡했음 

  - 1개월차 과정을 1.5~2개월로 늘려서 진행해야함.

  - SW공학은 필요없음(개인 프로젝트로 구성하는게 더 효과적)

 

*KoreaIT아카데미(강남점), 주말: 토/일 오전9시반~1시반(4H)

 

- 2026년 4월

(1개월) LLM 기초

  1주차: LLM개요 및 Mini-GPT 개발

  2주차: SimCLR 모델 개발 (이미지 대조학습)

  3주차: CLIP 모델 개발 (이미지-Text 대조학습)

  4주차: LLaVA 모델 개발 (이미지-Text 멀티모달 학습)

 

- 2026년 5월

(2개월) 파인튜닝/모델서빙/프로젝트수행

  5주차: LLM 파인튜닝 및 Qwen2.5 파인튜닝, 프로젝트 기획안발표

  6주차: CPT/SFT/DPO/RoLA

  7주차: 모델서빙(FastAPI, Ollama/vLLM)

  8주차: HuggingFace업로드, 최종발표

 

*온라인과정(인프런) 5월중 개설예정 !

 

오랜만에 n8n을 다시 돌려볼려고 했더니, 완전 다 잊어버렸다.

그래서 다시 정리하고 기록해둠

 

1.[n8n] credentials 설정

- 외부와 연동하는 설정이 되어야 정보를 가져올수 있음

 

2.구글 API 연동

구글 클라우드 > 프로젝트 생성 > API 연동 설정 > 기타 설정

 

2.1 클라이언트 ID 생성

 

2.2. 데이터 접근 허용

 

2.3 게시: 인증을 더하라고 나오는데, n8n에서 설정후 무시하고 진행하면 접근이 허용되더라...

: 테스트 모드에서는 7일단위로 인증을 다시 해야한다는게 있어서, 게시를 클릭해서 프로덕션모드로 설정해두면 된다.(앱 인증은 무시가능)

 

2.4 API 사용 설정

 : 인증은 성공했는데, 막상 실행해보면(노드), 아래 오류발생(링크를 따라갔더니 사용허용까지 설정해야 정상적으로 처리됨(26.04.01 확인, 구글 API 인증/사용 방식/설정이 약간 변경이 있었는듯)

 

Google Sheets API has not been used in project 675402156405 before or it is disabled. 
Enable it by visiting https://console.developers.google.com/apis/api/sheets.googleapis.com/overview?project=.... then retry. 
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

 

text to speech를 쓴다면 아래도 추가

1

 

* 중요: text-to-spee API는 유료인데, 무료300$ 크레딧이 있으면 사용가능(계정을 3개월단위로 새로 생성해서 사용하면된다)

 

- text to speech API 연결은 아래 인증방식으로 세팅하면된다.

 

* 이미지 관련해서 사용하던 무료모델이 유료화로 전환됨. 일단 무료 크레딧300$에서 차감된다고 이해했는데, 유료설정후에 사용가능

 - gemini API 사용설정 추가

참고:  https://ai.google.dev/gemini-api/docs/imagen?hl=ko+curl+-X+POST+%5C#rest

 

설정은 https://aistudio.google.com/app/api-keys?project=... 에서 진행

> 카드결재가 연계된 계정인데 한번에 10만원이 결재된다고한다. 300크레딧안에서 사용할수 있또록 조심

 

Taskmaster 란 무엇인가

: A task management system for AI-driven development, designed to work seamlessly with any AI chat.(

모든 AI 채팅과 원활하게 작동하도록 설계된 AI 기반 개발을 위한 작업 관리 시스템입니다.

 

* Cursor와 같은 AI Driven 개발을 진행할때, Cursor + 채팅만으로 구현을 하게되면, 작업의 연속성(모델을 바꾸거나, Cursor를 재부팅하거나 등)을 해치게된다(대화 히스토리의 context의 전달도 한계가 있음). 이때 사용하는것이 AI Workflow 관리도구인 Task-Master이다.(이외에는 Bmad-Method란것도 있고, 요즘 이쪽으로 연구가 활발히 진행중)

 

* Github: https://github.com/eyaltoledano/claude-task-master

 

GitHub - eyaltoledano/claude-task-master: An AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo,

An AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo, and others. - eyaltoledano/claude-task-master

github.com

 

 

Task-Master 동작 핵심요약

 

1. prd.md 작성 : Product(상품, 제품, 프로그램)의 상세 명세서를 작성한다.

  - 프로그램 요구사항, 제약사항, 버전관리 등

  - 구현에 필요한 데이터, 패키지버전, 설계내용 등 내가 원하는 구현내용에 대한 최대한 상세한 내용 기술필요

2. task01.txt등으로 실행할 task 세분화: 분할정복 방법으로 진행할 내용을 세분화해서 작성

  - AI-Assistant(LLM)이 이걸 기준으로 작업하기 때문에 일관된 작업가능

  - 어떻게 보면, 수행할 프롬프트를 세분화한다고 볼수도 있음(하지만, task를 나눈다는게 정확한 표현이긴함)

  - 보통은 10개의 하위 task로 나눔

3. 반복(iteration)을 통해 task_01.txt~task_10.txt를 수행함

  - 이과정에서 task.txt명세가 빈양하면(구체적이지 않으면) 재작업이 다수 발생함

  - 이때 AI-Chat을 통해서만 명령을 하게되면, 연속성이 무너지게 됨 -> 반드시 재작업시에는 prd.md와 task.txt파일을 같이 수정해줘야함

  - 또한 최대한 자세히(구현 가능하게 설계레벨로 구체적으로) task가 명시되어있어야만, 내가 원하는 결과물이 나옴(퀄리티 보장가능)

 

Task-Master 주의할점

  1. Cursor 결제외에, API-Key(유료 사용이 가능한)가 필요함

    - 무료버전은 금방 쿼터(임계치)에 도달함

    - openai(chatgpt), claue.ai(sonnet 4)등 유료 API가 있어야만, 구동시 해당 API로 task-master와 연동됨

    - MCP로 동작: cursor IDE와 task-master는 MCP라는 인터페이스로 연동되고, 별도의 gtp서비스 API-KEY로 LLM(AI)와 연동하여 동작을 수행함

  2. 위에서도 언급했지만, Task-Master를 제대로 사용하지못하고, prd.md->task.txt 분해이후 Cursor Chat만으로 진행하게되면, 연속성이 깨짐

   - 요구사항이 바뀌거나하면, prd.md, task.txt파일을 현행화해가면서 작업을해야함. 

   - 아니면 문제(퀄리티가 떨어지는 결과물, 버그)가 발생했을때, 재작업으로 인한 시간이 엄청 소비됨

  3. task-master를 사용하다가 Cursor Chat만으로 작업이 진행될때, 두번째 문제 -> 비용

   - Cursor IDE를 유료로 쓰고 있더라도, 설정에 따라 추가결제가 될수 있음(ㅠㅠ 최초에 사용하다가 삽질로 그랬음)

   - Thinking모델 또는 최고사용모델만 사용하면 임계치에 금방도달할수도 있음(소스 규모가 커짐에 따라 Context사이즈도 금방 넘쳐버림), 

  4. Cursor의 Auto모드로 전환하여 개발시, 버그 양산되거나, 버그를 해결못하는 문제 발생가능

   - Auto버전은 성능이 구림(비용이 큰 모델보다 가격이 싼? 효율적인 모델을 우선 동작하는듯)

  5. 설치 및 적응에 러닝커브가 있음(첫번째 프로젝트는 삽질하고 두번째부터 잘쓸수 있을듯)

Task-Master의 장점(AI Workflow 관리시스템의 장점)

1. 작업의 효율화

  -  PC재부팅, Cursor재부팅, 모델 변경간에 일관성을 유지함으로 효율성이 생김

2. 작업의 표준화

  - 공통 산출물(doc 등)을 정의해두고, 해당 레퍼런스를 참조해서 생성할게 할수 있으므로 작업의 표준화 가능(ex: java ->Srping Framework를 쓰는 효과)

3. 작업 품질 보장?

  - 여러 개발자들이 Cursor + 프롬프트의 개인적인 역량에 의존하던걸, 이런 툴을 사용하면 어느정도 상향 평준화 가능


 

설치방법

 

* github에 보면, cursor에서 퀵스타는 하는 방법으로는 나는 따라하기 어려웠다.

Claude Code Quick Install

For Claude Code users:

claude mcp add taskmaster-ai -- npx -y task-master-ai
 

Don't forget to add your API keys to the configuration:

  • in the root .env of your Project
  • in the "env" section of your mcp config for taskmaster-ai

 

NPM을 설치하고 진행하는 방법:

 

At least one (1) of the following is required:

  • Anthropic API key (Claude API)
  • OpenAI API key
  • Google Gemini API key
  • Perplexity API key (for research model)
  • xAI API Key (for research or main model)
  • OpenRouter API Key (for research or main model)
  • Claude Code (no API key required - requires Claude Code CLI)
  • Codex CLI (OAuth via ChatGPT subscription - requires Codex CLI)

 

1. NPM 설치: https://nodejs.org/ko/download

 

Node.js — Node.js® 다운로드

Node.js® is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.

nodejs.org

 

Option 2: Using Command Line

Installation

# Install globally
npm install -g task-master-ai

# OR install locally within your project
npm install task-master-ai
 

Initialize a new project

# If installed globally
task-master init

# If installed locally
npx task-master init

# Initialize project with specific rules
task-master init --rules cursor,windsurf,vscode
 

This will prompt you for project details and set up a new project with the necessary files and structure.

Common Commands

# Initialize a new project
task-master init

# Parse a PRD and generate tasks
task-master parse-prd your-prd.txt

# List all tasks
task-master list

# Show the next task to work on
task-master next

# Show specific task(s) - supports comma-separated IDs
task-master show 1,3,5

# Research fresh information with project context
task-master research "What are the latest best practices for JWT authentication?"

# Move tasks between tags (cross-tag movement)
task-master move --from=5 --from-tag=backlog --to-tag=in-progress
task-master move --from=5,6,7 --from-tag=backlog --to-tag=done --with-dependencies
task-master move --from=5 --from-tag=backlog --to-tag=in-progress --ignore-dependencies

# Generate task files
task-master generate

# Add rules after initialization
task-master rules add windsurf,roo,vscode

 

(cmd 모드)

NPM설치

-> task-master 설치

-> 프로젝트 경로 이동

-> Task-Master 초기화(init) : 사용할 모델등 설정 진행

task master init

-> prd.md(prd.txt) 작성 후 파싱(parse-prd)  수행

* parse-prd 수행전에, .env파일을 생성하고 API_KEY 세팅 필요

OPENAI_API_KEY=~~

  : 여기까지만 해두면 .taskmaster/tasks/task_01~10.txt가 생성되고, 이제 구현 준비가 완료되었다고 보면된다.

 

* 만약에 cursor만 결재한 상태이고 별도의 openai(ChatGPT API_KEY 유료버전이 없다면/무료버전은 금방 소진됨), 아래처럼 cursor에서 진행도 가능하다.

  엄밀하게 따지면, 이건 task-master를 패턴을 cursor로 흉내내는것이다.(task-master init까지는 수행한 이후에 실행)

-------------------------- -------------------------- -------------------------- -------------------------- -------------------------- -----------------------

(cursor AI Chat에서 아래를 실행: task.txt파일 생성 -> 차례대로 실행 )

 

.taskmaster/templates/prd.txt를 참고해서 .taskmaster/tasks하위에 task_01.txt~task_nn.txt까지 task를 분해해줘

(task-master parse-prd prd.txt 과정 참고)

자 이제 .taskmaster/tasks/task_01.txt~task_06.txt를 차례대로 실행해줘
.taskmaster/docs 에 이론노트와 .taskmaster/code 실습코드파일을 저장해주면되!
(task-master generate 과정 참고)

-------------------------- -------------------------- -------------------------- -------------------------- -------------------------- --------------------------

  

 

*나는 이후 task-master의 명령을 충분히 활용해서 작업은 하지 않았고, cursor AI Chat을 통해 진행하였는데

 (chat ex: taks_01.txt ~ task_10.txt를 순차적으로 실행해줘)

  이 때문인지, Cursor의 작업비용이 많이 발생하였다.

  task-master명령으로 진행하였다면, 설정된 API-KEY를 사용하여 진행되어서 Cursor비용은 추가로 크게 발생안할수 있지 않았을까 생각해본다. 좀더 프로젝트를 진행해봐야 감을 잡을수 있을거 같다.

 

 

 

 

작업과정 요약:

1. 동화 데이터 수집

2. google cloude gemini로 줄거리 요약 및 이미지 생성용 동화 Scene 스크립트 작성

3. google cloude Text-to-Speech 모델로, 한국어/영어 오디오 변환

4. google cloude  이미지모델로 동화 씬 이미지 11장 생성(썸네일1장 + 스토리10장)

5. Vrew로 이미지 + 오디오 간단 합성

6. 유튜브 제목/설명/태그 Chatgpt로 최적화 및 업로드

 

(google colude 모델 비용은 300$ 무료로 제공되는걸로 사용시 영상 50편 이상 제작가능)


1. 영미 고전동화 다운로드(저작권이 60~70년 지난 데이터)

 

2. google cloude gemini로 줄거리 요약 및 이미지 생성용 동화 Scene 스크립트 작성

- gemini로 작성할 Scene 예시(0번, 썸네일)

- (2.5-flash-lite 저비용) https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent

"scenes": [
    {
      "scene_id": 0,
      "title": "피터팬",
      "title_en": "Peter Pan",
      "one_line": "네버랜드의 신비로운 모험!",
      "script_ko": "창문 너머로 들려오는 '어린 시절'이라는 노래에 이끌려, 웬디와 형제들은 밤하늘을 나는 신비로운 소년 피터팬을 만나게 됩니다.",
      "script_en": "Drawn by the song of 'childhood' from beyond the window, Wendy and her brothers meet the mysterious boy Peter Pan, who flies across the night sky.",
      "image_prompt": "A whimsical night scene with a starry sky over a London rooftop. A silhouette of a young boy with a mischievous grin, Peter Pan, is seen flying with two young children, Wendy and her brothers, holding his hands. The moonlight casts a magical glow. The style should be a classic storybook illustration with rich, deep blues and silvers, emphasizing wonder and adventure. Consistent character designs for Peter, Wendy, and her brothers should be maintained throughout.",
      "negative_prompt": "photorealistic, modern, blurry, disfigured, extra limbs, low quality",
      "seed": 1000,
      "painting_style": "storybook watercolor illustration, vibrant colors, consistent character design"
    },

 

3. google cloude Text-to-Speech 모델로, 한국어/영어 오디오 변환

 - (모델은 검색후 돌려가며 음성 테스트 및 선택) https://texttospeech.googleapis.com/v1/text:synthesize

 

4. google cloude  이미지모델로 동화 씬 이미지 11장 생성(썸네일1장 + 스토리10장)

  * 핵심 *

    - google cloude 이미지 생성모델은 한번 4장까지 생성해서 출력할수 있다고 한다 -> 시도했지만 실패하였다.

    - 할수 없이, 한장씩 전달해서 이미지를 생성해야했다.

      * 그런데 문제는 이렇게 하면, 이미지 스타일이 제각각이고 주인공 생김새나 표현도 다 다르게 생성되는 문제점이 발생한다.

      * 그래서 나는, 11장의 이미지를 차례로 전달하되, 전체 줄거리도 전달하여 전체 맥락을 제공하였다.

      * 추가로 Seed값을 고정시키니 11장 이미지 모두 유사한 스케치 패턴이 적용되었다.

 

5. Vrew로 이미지 + 오디오 간단 합성

 

6. 유튜브 제목/설명/태그 Chatgpt로 최적화 및 업로드

 

 - 태그

  • n8n
  • 유튜브 쇼츠 만들기
  • 유튜브 자동화
  • 유튜브 무료 영상 제작
  • 쇼츠 자동 제작
  • 영상 편집 자동화
  • 유튜브 채널 운영 꿀팁
  • 유튜브 크리에이터 툴
  • 노코드 영상 제작
  • 유튜브 쇼츠 제작 프로그램

 

n8n구동시간 5분, Vrew 이미지/동영상 편집시간 15분, 기타 등 해서 30분안에 업로드 완료!

+ 구글 Cloude 무료 크레딧으로 AI 모델 공짜 사용!

 

 

[1분 동화] 피터팬, 네버랜드로 떠나는 짧은 여행

https://youtube.com/shorts/r74AC9PoOQY?feature=share

 

 

 

완벽하지는 않지만, 그래도 들어줄만한 품질로 완성되었다.

(이정도 수준이면, 잘때 둘째에게 들려줘도 되겠다는 생각이 든다ㅋ)

 

3시간짜리 Audio북을 작업하는데는 꽤나 노하우가 필요했다.

 

- 봉착한 문제들과 해결방법

 

1. text chunk

 

 : google cloud text-to-speech모델은 5000자까지만 한번에 변환이 가능하다.

 : 5000자 이하로 자르고 이걸 차례대로 호출하며 반복적으로 생성해야한다.

 : 이때 특수문자(특히 개행문자) 관련 처리가 까다로웠음

    * 원본 데이터를 저장해서 txt파일로 보관해서 검사할때는 개행을 남겨두고, text2speech로 전달할때는 모든 개행을 점(.)으로 변환하였다.(그래야만 끊어읽기가 적당히 들어가기 때문이다)

    * 사실 이조차도 ChatGPT로 작업을 하면 되겠지만, 여기서도 또 큰 데이터는 한번에 처리가 안되기 때문에, 아쉽게도 이부분은 약간의 수작업과 자동화를 섞을수 밖에 없었다.(body추출은 수동으로, 개행문자 치환등은 code 노드에서)

    * 이때, wait 노드를 on-form-submitted로 하면, 중간에 내가 txt파일을 만들고, 이후에 완성이되면 재시작 버튼을 누르듯 처리가 가능하다.

 

2. audio 합성

 

  : 여러개 분해된 오디오 파일을 FFMpeg (loca docker구동)로 병합한다.

  : 이때 메모리를 최소화하도록 적당히 페라미터들을 세팅해줘야한다.(그래야 변환속도도 빨라지고, PC 메모리가 터지는 문제도 방지할수 있다.)

  : 약 5~10분 정도면 70M정도의 오디파일을 병합할수 있음

  : 이미지와 오디오를 합성하면 150~200M (3시간) 짜리 파일이 생성됨(약 10~15분 소요),

     * PC사양이 너무 낮아서 여러개를 동시에 돌릴수도 없는게 넘 아쉽다.

 

3. 유튜브 업로드 및 업데이트

 

  : 장시간짜리 영상을 업로드할때는, 추가적인 인증을 받아야 업로드가 가능하다.(인증절차는 간단, 업로드 후 처리실패 내용을 알려줌)

  : 유튜브 사이트에서 설정하는 모든 정보를 n8n 노드에서 설정할수 없는게 좀 아쉬운 점이다.

  : 업로드시 공개설정을 비공개(부분공개?)로 올렸다가, 완성시 실제로 이상없이 올라간게 확인되면 설정을 공개로 수동으로 바꿔주게끔 하였다.

 

 

4. Google Sheets로 목록 및 처리순서 관리

 

  : 100개의 동화내역을 미리 만들어두고, 처리 성공하면 N->Y로 바꿔주도록 하였다.

  : 매번 노드 시작 버튼을 눌렀을때 다음번(N)인 목록을 순서대로 가져오도록하여 편의성을 높임.

 

5. 작업비용

 

 : 일단, google colud에 있는 API 위주로 사용하였고, 최초 가입시 300$(약 40만원) 정도를 무료로 쓸수가 있다.

 : 한편당 대략 3~5천원 이내로 비용이 발생하는듯하고, 대략 100편 정도는 무료로 작업이 가능할듯하다.


 

https://youtu.be/IEXjaY98Ti8

 

https://www.youtube.com/@Moonlight-Stories-i7f

 

Moonlight-Stories

영어 고전 동화를 읽어주는 오디오북 채널입니다. 자녀들에게 영미 고전을 들려주세요. 영어 공부를 하고싶은 성인에게도 추천합니다.

www.youtube.com

 

 

n8n 개발하면서, 있었던 시행착오 기록

 

1. merge

: 병렬로 실행한뒤, 여러개의 실행이 완료되었을때 진행시키고 싶을때, merge노드를 추가하여 기다리게 할 수 있다.

 

2. tow input

: 노드에서 2개 이상의 입력을 받았을때, 해당 변수를 추출하는 방법

  -> Code 노드에서 $input 대신에 해당 입력의 이름을 지정하면 됨

const inputData = $("Read/Write Files from Disk").first().binary;
const img_prompt = $("Get row(s) in sheet").first().json.img_prompt

 

3. Response type

 : output respons type을 FILE로 설정하면, binary로 추출되면서, 이전에 전달받은 json값들을 다음노드로 전달할 수 있다.
   (response type을 자동으로 두거나 하면, binary 출력되는데, json 값들이 전달 안되는 경우가 있었다)

 

4. execute once

 : 앞선 노드에서 List를 전달받은경우, Google gemini같은 노드에서는 자동으로 여러번 호출하게 된다.

   (이러면 too many request라는 오류가 발생할 수 있음)

 : 한번만 실행하고 싶은경우, settings에서 Execute Once로 설정하면 1번만 실행되게 제한할수 있다.

 

5. loop

 : List로 전달되면, 반복실행되지만, 명시적으로 반복설정도 가능하다.

 : loop는 반복할 노드들을, done은 완료시 실행할 노드를 연결한다.

 

6.Wait

 : 파일을 생성후, 파일을 읽거나 할때, 제대로 완성되지 않은 파일을 읽을때가 있다.

 : wait설정(1초이상)으로 잠시 대기하게하면 문제가 해결된다.

 

7.파일 정리

 : 여러파일을 작업이후, 파일을 정리(삭제, 이동)하고 싶을때는, 별도의 Excute Command노드를 연결해서 해결가능

mkdir -p /files/audiobook_en/{{ $json.no }}
mv /files/output/image.png /files/audiobook_en/{{ $json.no }}/image.png
mv /files/output/merged_audio.mp3 /files/audiobook_en/{{ $json.no }}/merged_audio.mp3
mv /files/output/audiobook_en_vedio.mp4 /files/audiobook_en/{{ $json.no }}/audiobook_en_vedio.mp4
mkdir -p /files/audiobook_en/{{ $json.no }}/tmp
mv /files/output/tmp/* /files/audiobook_en/{{ $json.no }}/tmp/
rm -rf /files/output/tmp/*
mv /files/output/book.txt /files/audiobook_en/{{ $json.no }}/book.txt

 

8.텔레그램 연동

: slack을 먼저 해보았으나, 쉽지 않았음

: 기존에 텔레그램 API를 사용했던 적이 있어서 해보니, 텔레그램이 더 간단한듯하다

  * 텔레그램 API 설정과정(간단설명): bot father로 신규생성-> ChatID, Token 획득

  * 노드입력 key: Chat ID (전화번호별로 생성되는 ID 값인듯)

  * credential 입력 key: Token(텔레그램 채팅방 별로 생성되는 key)

 

 

 

9. 오디오,영상 합성시 저용량으로 생성하기

- 오디오 합성

cd /files/output/tmp && \
rm -f filelist.txt && \
printf '%s\n' chunk_*.mp3 | \
  sed 's/^chunk_\([0-9][0-9]*\)\.mp3/\1 &/' | \
  sort -n | cut -d' ' -f2- | \
  awk '!seen[$0]++' | \
  sed "s/^/file '/; s/$/'/" > filelist.txt && \
ffmpeg -y -f concat -safe 0 -i filelist.txt \
  -c:a libopus -b:a 48k -vbr on -ac 1 -ar 48000 \
  -application voip -frame_duration 60 \
  /files/output/merged_audio.opus

 

- 영상합성(이미지+오디오)

ffmpeg -y -loop 1 -framerate 2 \
  -i /files/output/image.png -i /files/output/merged_audio.opus \
  -vf "scale=1920:1080:force_original_aspect_ratio=decrease:sws_flags=fast_bilinear,\
pad=1920:1080:(ow-iw)/2:(oh-ih)/2" \
  -c:v libx264 -preset ultrafast -tune stillimage -crf 20 -pix_fmt yuv420p \
  -c:a copy -shortest \
  /files/output/audiobook_en_video.mkv

 

1.유튜브 API 권한 얻기

- google cloud console 접속 및 검색

 

- YouTube API 선택 및 사용하기 클릭

- 사용자 인증정보 만들기(기존에 만들어둔 인증 재사용 가능)

  : 인증생성방법은 기존 글 참고(https://coding-mentor.tistory.com/9)

  : 접속 오류가 발생한다면, 테스트 사용자 추가(메일계정 추가)

 

2.n8n에서 인증 추가(Auth2) + 유튜브 채널 선택하기

- 삽질한 부분: 만약 한 계정에(유튜브 메일계정) 채널이 여러개인 경우 어떻게 특정 채널로 업로드하지?

    ==> n8n 인증 과정에서 메일계정 선택 ==> 채널이 여러개인 경우 채널 선택단계가 나옴

 

- 계정 선택 이후 단계에, 채널이 여러개인경우, 채널을 선택하는 단계가 나옴 (인증이름을 구분하여 관리하고, 유튜브 업로드 노드별로 인증을 구분하면됨)

 

3. n8n 유튜브 업로드

- 영상합성 데이터를 바로 유튜브 노드로 연결할수 있을지도 모르는데,

  나는 생성된 영상을 검증/히스토리관리 하기위해서, 로컬에 저장한다음에 유튜브 노드와 연결하도록 했음

 

Read Mp4 Node

 

- 유튜브 업로드 설정

 

- 추가옵션: 유튜브 사이트에서 설정하는 설명문구, 태그 등을 설정할수 있음(유튜브에서 설정하는 모든 상세설정을 할수 있는건 아니였음),

 * Privacy Status:Unlisted로 하면 부분공개로 업로드되고, 이후에 여러 부가적인 설정을 사이트에서 수정해야할거 같음(100% 자동화가 될수도 있겠지만.. n8n에서 설정할수 있는 옵션이 좀 아쉬웠음)

 

 

 

- 유튜브 업로드 테스트 결과

 

 

* 기존에 인터넷에 올라와 있는 영상합성 자료들은, 온라인(클라우드)상의 API를 호출(사용)하는 형태로 된게 많았다.

  나는 기본적으로 로컬PC(또는 서버환경내)에서 동작하는 프로세스를 구축하고자한다.

  (2틀이상 찾아보고 삽질을 생각보다 오래한듯하다)

 

1.Docker에 ffmpeg 설치

- docker-compose.yml

 : 볼륨을 설정해야만, 도커를 재기동해도 사용하던 설정(workflow 등)을 유지할수 있다.

 : Dockerfile을 빌드하고자 build .을 사용한다.

version: "3.8"

services:
  n8n:
    #image: docker.n8n.io/n8nio/n8n:latest
    build: .
    ports:
      - "5678:5678"       # n8n 웹 UI 접속 포트
    environment:
      - GENERIC_TIMEZONE=Asia/Seoul
      - TZ=Asia/Seoul
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      #- N8N_BASIC_AUTH_PASSWORD=강력한비밀번호
      #- N8N_ENCRYPTION_KEY=랜덤_32자리_키
    volumes:
      - n8n_data:/home/node/.n8n      # n8n 데이터 보존
      - C:/02_repository/youtobe_automation/n8n/files:/files  # 로컬 PC files 폴더를 컨테이너 내부 /files 로 마운트
    restart: unless-stopped

volumes:
  n8n_data:

 

- Dockerfile

 : alpine 리눅스는 apk 패키지 사용함

FROM docker.n8n.io/n8nio/n8n:latest

USER root
#RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
RUN apk add --no-cache ffmpeg
USER node

 

- 빌드 및 실행

 : docker compose up -d --build

 

2. 영상합성

 : 아래와 같은 노드로 구성하였다

 : 이미지/오디오 생성뒤에 바로 FFmpeg노드를 붙여도 될거같은데, 중간에 오디오/이미지 파일을 저장하게 하여, 문제가 발생했을때 확인이 용이하게 하고자 아래와같이 각각의 파일응 저장한 후 로딩하게 하였다.

 

- ffmpeg 명령어는 다음과 같다.

- 입력하는 output경로를 잡고, 생성후에 mp4 생성경로만 잡아주면 된다.

ffmpeg -y -loop 1 -i /files/output/image.png -i /files/output/audio.mp3 -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" -shortest /files/output/audiobook_vedio.mp4

 

* 온라인 API를 사용할려면, https://creatomate.com/ 서비스를 활용하면 된다.

  (단 raw데이터 audio/image도 온라인에 올라간 상태여야한다)

 

- 결과물

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

 

 

1.노드 구성

 1) GPT 이미지 생성모델에게 프롬프트를 전달하여 이미지 생성요청

 2) 생성한 바이너리 이미지를 읽어서 png로 저장

 3) 로컬 PC에 저장

 

2.GPT 이미지 모델 연결

1) gemini

: (aisudio) https://aistudio.google.com/prompts/new_chat

: (레퍼런스) https://ai.google.dev/gemini-api/docs/imagen?hl=ko

curl -X POST \
    "https://generativelanguage.googleapis.com/v1beta/models/imagen-4.0-generate-001:predict" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "instances": [
          {
            "prompt": "Robot holding a red skateboard"
          }
        ],
        "parameters": {
          "sampleCount": 4
        }
      }'

 * API-Key를 생성해서 간단하게 테스트 가능: 생성량 제한이 있을껀데, 무한정 무료는 아닐꺼라서... chatgpt에게 물어보면 어느정도 무료로 쓸수 있다고 나오긴함, 

-------------------------------------- chatgpt 답변 -----------------------------

1. Gemini 앱 (웹/모바일): 무제한 무료 사용

  • Gemini 앱 내에서는 Imagen 4 기반 이미지 생성무료로 제공됩니다. 기본 모델 품질 이용 시 요금이 부과되지 않으며, 단, 일일 생성량은 시스템 부하에 따라 제한될 수 있습니다.
    DEV Community+15Zenn+15DEV Community+15
  • 무료 계층에서 주로 쓰는 모델은 Imagen 4이며, **고급 기능(예: 심화 편집, 고속 처리)**은 유료 계층으로 제한됩니다.

 

2) google cloud vertax ai (결국 gemini 모델을 쓰긴함)

 - 무료 크레딧이 있으므로, 그 크레딧을 사용하는 기간에는 안정적으로 이미지 생성 가능

 - vertax ai api를 사용하기 클릭해서 권한받고 진행

 - 레퍼런스 사이트를 찾는 과정이 너무 삽질이 길었다. 구글 could 쪽은 이게 문제인듯....

 - (레펀런스) https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/imagen-api?hl=ko#rest

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \

https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_VERSION}:predict \
-d '{
  "instances": [
    {
      "prompt": "..."
    }
  ],
  "parameters": {
    "sampleCount": ...
  }
}'

 

post 주소 예시: https://us-east5-aiplatform.googleapis.com/v1/projects/gen-lang-client-0695181249/locations/us-east5/publishers/google/models/imagen-3.0-generate-002:predict

 

* 인증은 두가지 방식을 지원하는거 같은데(API-KEY, auth2), api-key로는 오류가 나서, 기존 AUTH2 방식(google cloud nature langage)으로 설정한걸 사용했다.

 

3) fal.ai (recraft)

 - 유로 버전은 fal.ai 인터페이스가 가장 쉬운듯(모델도 많음) 

https://fal.ai/models/fal-ai/recraft/v3/text-to-image

 

Recraft V3 | Text to Image | fal.ai

Recraft V3 is a text-to-image model with the ability to generate long texts, vector art, images in brand style, and much more. As of today, it is SOTA in image generation, proven by Hugging Face's industry-leading Text-to-Image Benchmark by Artificial Anal

fal.ai

 

 

3.생성해온 이미지를 png로 변환 (code node)

// predictions[0].bytesBase64Encoded 값 꺼내기
const b64 = $json.predictions[0].bytesBase64Encoded;

// Binary 데이터로 변환해서 반환
return [{
  json: {},   // JSON 결과는 비워두고
  binary: {
    data: {
      data: b64,              // Base64 문자열
      fileName: 'output.png', // 저장할 파일명
      mimeType: $json.predictions[0].mimeType || 'image/png'
    }
  }
}];

3.최종결과

- gemini 버전

 

- vertax 버전(이것도 gemini 모델임)

 

 

+ Recent posts