키워드 오프너(keyword openers)
'핫도그 굽는 스틱'을 검색한 쇼핑객과 '야채 굽는 스틱'을 검색한 쇼핑객은 오늘 같은 동영상을 보게 되고, 그 동영상은 마시멜로로 시작합니다. 이 스킬은 각 쇼핑객이 입력한 검색어에 맞는 오프닝을 제공합니다.
변경되는 부분: 처음 2~6초의 화면, 그리고 키워드가 포함된 제목. 절대 변경되지 않는 부분: 사운드트랙, 길이, 첫 컷 이후의 모든 부분.
Sponsored Brands 비디오는 소리 없이 시작되므로, 쇼핑객이 실제로 보게 되는 것은 첫 화면과 그 위의 단어입니다. 그렇기 때문에 오프닝을 검색어에 맞추는 것이 중요합니다.
판매자가 준비해야 할 것
- 완성된 제품 동영상(mp4 또는 mov). 16:9 또는 9:16.
- 키워드, 3~10개. 목록이 없으면 직접 선정해 드릴 수 있습니다: 리스팅을 읽고 용도(USE), 음식(FOOD), 사람(PERSON), 장소(PLACE) 등을 나타내는 키워드를 제안합니다(화면이 달라집니다). 같은 단어 순서만 바꾼 키워드는 같은 장면이 나오므로 제외합니다.
- ASIN. 오프닝 장면에 실제 제품을 표시하기 위함입니다.
세 가지를 하나의 메시지로 요청하세요. 빠진 정보가 있으면 한 번 더 물어본 후 진행합니다.
1단계: 동영상 분석
python3 scripts/openers.py inspect "<video>" "<workdir>" --keywords "kw one; kw two; kw three"
<workdir>은 동영상 파일 옆에 생성되는 keyword-openers라는 새 폴더입니다. 이 명령어는 inspect.json, plan.json, 그리고 두 개의 콘택트 시트를 생성합니다. Windows에서는 python3 대신 python을 사용합니다(여기와 4단계 동일).
opening-sheet.jpg를 열어서 확인합니다. REPLACED로 표시된 타일이 제거될 부분입니다. 로고, 가격, 주장(claim), 또는 내장 텍스트(burned-in text)가 해당 영역에 있으면 진행하기 전에 판매자에게 알리고, cuts_first_20s에서 더 이른 컷을 제공합니다(plan.json의 "window" 설정).
look-sheet.jpg도 확인합니다. 이 동영상을 위해 촬영된 것처럼 보이는 장면을 작성해야 합니다: 같은 시간대, 같은 조명, 같은 유형의 사람들, 같은 렌즈 느낌.
inspect.json의 notes가 비어 있지 않으면, 해당 노트를 그대로 판매자에게 읽어줍니다. 노트에서 재내보내기(re-export)를 요구하는 경우(30fps 초과, 가변 프레임 레이트, 96kHz 사운드), ffmpeg를 사용하여 직접 수정된 복사본을 만들고 그 복사본에 대해 inspect를 실행하겠다고 제안합니다. aspect가 16:9가 아닌 경우, 크레딧이 사용되기 전에 Sponsored Brands 비디오는 16:9만 지원한다고 말하고, 판매자가 다른 플레이스먼트용 버전을 원하는 경우에만 진행합니다.
2단계: 키워드당 하나의 오프닝 장면 작성
references/prompt-recipe.md의 지침을 정확히 따릅니다. 키워드당 하나의 프롬프트, 각 프롬프트는 opener_seconds_to_generate초 길이의 단일 샷입니다. 각 장면을 한 줄씩 간략하게 설명하여 판매자에게 보여줍니다(예: "핫도그 굽는 스틱: 아버지와 아들이 같은 캠프파이어 위에 핫도그 두 개를 들고 있는 모습") 그리고 판매자가 반대하지 않으면 넘어갑니다. 요청하지 않는 한 전체 프롬프트를 붙여넣지 마십시오.
3단계: 가격 책정, 생성
제품 참조 이미지: ASIN(리스팅의 마켓플레이스 domain이 amazon.com이 아닌 경우 domain도 포함)을 사용하여 scrape_video_reference_images_from_asin을 호출하고 이미지 URL을 기다립니다. 처음 4개를 사용합니다.
움직이는 기능을 나타내는 키워드(확장 가능, 접이식, 열리는 뚜껑 등)는 모션 참조가 필요합니다. 그렇지 않으면 모델이 메커니즘을 임의로 생성합니다(처음 만들어진 확장 가능 오프닝은 마치 마법처럼 저절로 자랐습니다). 먼저 판매자의 동영상에서 해당 기능을 찾고 ffmpeg로 해당 부분을 잘라냅니다. 동영상에 기능이 표시되지 않는 경우에만 판매자에게 해당 기능이 사용되는 짧은 클립(3~8초, 최소 300px 높이, 휴대폰 클립도 가능)을 요청합니다.
create_reference_asset_upload 기능( search_capabilities로 찾고, 반환된 URL에 PUT으로 파일을 업로드)을 사용하여 업로드하고 seedanceReferenceVideoUrls에 assetUrl을 전달합니다. 프롬프트에는 클립에서 가져올 내용(모션)과 무시할 내용(테이블, 조명, 기타 물체)을 명시합니다. 참조 동영상은 가격에 추가되므로 가격 확인에 포함시킵니다.
실행 전에 가격을 책정합니다. get_credit_balance_and_costs를 video_generation 프리셋(모델 seedance_2_5_reference, 720p, 오프너 길이, videoCount = 키워드 수)으로 호출합니다. 720p는 모든 동영상의 기본값입니다. 오프닝은 작은 슬롯에서 몇 초 동안 재생되며, 1080p와의 차이는 거의 눈에 띄지 않습니다. 판매자의 동영상이 1080p 이상이고 가장 선명한 오프닝을 원하는 경우에만 1080p 가격도 제시합니다. 기억에 의존하여 가격을 인용하지 마십시오. 그런 다음 한 줄을 말하고 승인을 기다립니다:
"5개 오프닝, 각 5초, Seedance 2.5 720p: [가격 호출에서 반환된 숫자] 크레딧. 진행할까요?"
판매자가 더 저렴한 것을 원하면 seedance_2_mini_reference의 가격을 제시합니다. 480p 드래프트는 장면을 평가하기에 충분하지만 1080p 동영상의 광고에는 너무 부드럽습니다.
그런 다음 키워드당 하나씩 모든 generate_video 호출을 함께 전송합니다:
modelType: "fal_seedance",seedanceModel,seedanceMode: "reference_to_video"seedanceReferenceImageUrls: 제품 이미지seedanceDuration:opener_seconds_to_generateseedanceAspectRatio:inspect.json의aspectseedanceResolution: 가격에 따라 설정asin: ASIN(프로젝트가 생성되거나 재사용됨)promptEnhancement: "skip"(레시피가 이미 최종 프롬프트를 작성했음)sceneTitle: 키워드
wait_for_operation / get_video_generation_result로 기다립니다. 각 완성된 클립을 plan.json의 해당 행이 지정하는 경로에 다운로드합니다:
curl -L -s -o "<workdir>/openers/<slug>.mp4" "<video url>"
생성 실패 또는 거부: 한 줄로 보고하고 나머지는 계속 진행합니다. 허락 없이 두 번 이상 재시도하지 마십시오. 재시도에도 동일한 비용이 청구됩니다. 다시 생성된 장면은 자체 "label"과 파일 이름으로 새 테이크로 저장되며, 이미 비용을 지불한 클립을 덮어쓰지 않습니다.
Genrupt가 없나요? 그래도 스킬은 작동합니다. 판매자가 plan.json의 경로에 클립(촬영, 스톡, 다른 도구)을 넣으면 바로 4단계로 이동합니다.
4단계: 모든 버전 빌드
python3 scripts/openers.py build "<workdir>/plan.json"
크레딧이 필요하지 않습니다. 한 버전은 720p에서 약 4초, 1080p에서 10초, 4K에서 25초가 소요되며, 각 버전이 완료될 때마다 한 줄씩 출력됩니다. 10분 타임아웃으로 명령을 실행하십시오. 일반적인 2분 제한은 긴 목록을 자를 수 있습니다. 각 키워드에 대해 오프닝 화면을 교체하고, 제목을 그리고, 작성된 파일을 확인합니다: 원본과 길이가 같고, 사운드트랙이 비트 단위로 동일하며, 나머지 화면이 변경되지 않고, 오프닝이 실제로 새로워지고, 제목이 프레임 내에 있어야 합니다.
수정 후 하나의 키워드를 다시 빌드하고 나머지는 그대로 유지하려면 --only "hot dog roasting sticks"를 추가합니다(여러 개: "kw one; kw two").
그런 다음 모든 out/check/<slug>-seam.jpg를 확인합니다. 스크립트가 확인할 수 없는 세 가지를 확인해야 합니다:
- 새 장면의 제품이 판매자의 제품인지(모양, 색상, 개수).
- 제목을 읽을 수 있고 얼굴이나 키워드가 지칭하는 대상 위에 있지 않은지. "title held" 타일과 그 옆의 "under the title" 타일을 비교합니다: 같은 순간에 단어가 없는 장면입니다.
auto는 밝기와 디테일만으로 추측할 뿐이며, 얼굴을 볼 수 없고, 불빛 아래에서 조용한 밴드는 종종 얼굴이 있는 곳입니다. - "마지막 새 프레임"에서 "첫 번째 원본 프레임"으로의 전환이 일반적인 컷처럼 보이는지.
잘못된 위치의 제목은 수정이 무료이므로 판매자가 보기 전에 수정하십시오. 해당 변형에 place(top, bottom, top-left, top-right, bottom-left, bottom-right)를 지정하고, 전체 크기에서 사용 가능한 공간이 없으면 title_scale(0.5~1)을 지정합니다. 다시 빌드하고 다시 확인합니다. 제품 검증에 실패한 장면은 수정된 프롬프트로 다시 생성합니다(먼저 물어보고, 크레딧이 소모됩니다).
5단계: 전달
판매자를 위해 out/index.html을 엽니다. 다음 순서대로 알려줍니다:
- 준비된 버전 수와 업로드할 파일이
out/upload/에 있으며, 키워드별로 하나의 파일이 키워드 이름으로 지정되어 있다는 점. - 시트(seam sheet)에서 발견한 내용 중 판매자가 확인해야 할 사항.
- 사용 방법:
references/amazon-upload.md(키워드당 하나의 광고 그룹, 각 그룹에 자체 버전 사용). 페이지에 동일한 단계가 포함되어 있습니다.
여러 테이크가 있는 키워드의 경우 하나가 선택될 때까지 out/upload/에 파일이 없습니다. 판매자에게 어떤 테이크를 선택할지 물어보고 해당 변형에 "pick": true를 설정한 후 다시 빌드합니다.
plan.json
{
"video": "/path/to/video.mp4",
"window": 3.875,
"style": "pop",
"font": "bold",
"accent": "CD763C",
"title": true,
"opener_audio": "off",
"variants": [
{"keyword": "hot dog roasting sticks", "opener": "openers/hot-dog-roasting-sticks.mp4"}
]
}
window: 교체할 화면의 초(seconds)입니다.inspect는 동영상의 컷 중 4초에 가장 가까운 값을 선택합니다.cuts_first_20s의 다른 값으로만 변경하십시오.style: 키워드가 화면에 표시되는 방식입니다.pop(기본값): 큰 대문자. 다른 키워드와 다른 단어가 하이라이터 막대에 나타나며, 나머지 단어는 단어별로 나타납니다. 검색 결과의 작은 무음 타일을 위해 설계되었습니다.sticker: 기울어진 흰색 검색 스티커에 키워드가 찍히고, 다른 단어가 표시됩니다.kinetic,line,search: 차분한 브랜드를 위한 조용한 하단 1/3 제목.
punch:pop및sticker스타일의 경우, 제목이 나타나는 비트에 맞춰 화면이 1.08x로 확대됩니다.false는 끄고,punch_zoom은 다른 크기를 설정합니다.place(pop및sticker전용):auto(기본값)는 샷의 조용한 밴드(상단 또는 하단)를 추측하고, 한쪽이 확실히 더 조용하면 해당 쪽을 선택합니다.top,bottom,top-left,top-right,bottom-left또는bottom-right로 강제 지정합니다. 세 가지 조용한 스타일은 항상 하단에 위치합니다.title_scale(pop및sticker전용): 0.5~1. 전체 크기에 빈 공간이 없는 샷을 위한 더 작은 제목입니다. 파일 상단의 모든 버전 또는 하나의 변형에 적용됩니다.font:bold,round,serif,clean. 동영상에 이미 있는 글꼴과 일치시킵니다.accent: 동영상 자체 색상에서 가져옵니다. 브랜드 색상을 알고 있으면 재정의합니다.title:false는 화면에 단어를 표시하지 않습니다.opener_audio:"off"는 사운드트랙을 그대로 유지합니다.-18과 같은 숫자는 새 장면의 자체 사운드를 해당 dB만큼 낮추어 혼합합니다.take: 오프너는 일반적으로window보다 약간 깁니다.end(기본값)는 장면이 안정된 마지막 몇 초를 유지합니다.start는 동작이 즉시 시작되는 장면(막대 확장, 뚜껑 열림)의 처음 몇 초를 유지합니다.- 하나의 키워드에 여러 테이크: 동일한
keyword, 다른opener및"label"("A","B")로 변형을 반복합니다. 각각 자체 파일과 카드로 빌드되어 판매자가 보고 선택합니다. 키워드가 중요한 경우 두 번째 테이크를 제안하고 비용을 알려줍니다. 선택한 테이크의"pick": true는out/upload/<keyword>.mp4로 복사합니다. - 변형(variant)에는
"title_text"(화면에 표시될 단어가 키워드와 다른 경우),"take","emphasis"(표시할 단어, 기본값은 키워드가 공유하지 않는 단어, 예: "hot dog roasting sticks"에서 "hot dog"),"place","title_scale","pick", 자체"window"가 포함될 수 있습니다.
문제 발생 시
build는 먼저 plan.json을 확인하고 수정할 사항을 말로 알려줍니다. 내장 글꼴로 그릴 수 없는 문자(히브리어, 중국어, 아랍어)의 키워드는 해당 문장과 함께 실패합니다. 변형에 라틴 문자로 된 "title_text"를 제공하거나 "title": false로 설정합니다. 이모지는 제목에서 제거됩니다. 5단어가 넘는 키워드는 작게 그려집니다. 더 짧은 "title_text"를 제공합니다. 2초에서 6초 사이에 컷이 없는 동영상은 컷 대신 짧은 디졸브(dissolve)를 얻습니다.
규칙
- 동영상을 절대 늘리지 말고 사운드트랙을 절대 건드리지 마십시오. 요청에 둘 중 하나가 필요하면 다른 작업이므로 그렇게 말하십시오.
- 장면에서 제품 기능을 절대 임의로 만들지 마십시오. 장면은 있는 그대로의 제품을 사용하여 키워드의 용도를 보여줍니다.
- 새 장면의 사람은 동영상에 사람이 있는 경우 동영상의 사람과 일치해야 합니다.
- 판매자가 승인하지 않는 한 키워드당 하나의 유료 생성만 가능합니다.