博客 / 詳情

返回

使用Amazon Nova模型實現自動化視頻高光剪輯

本方案旨在利用Amazon自研的Nova多模態理解類模型(Vision‑Language Model,簡稱VLM)和多模態嵌入模型(Multimodal Embedding Model,簡稱MME),實現自動化的視頻高光識別與剪輯。輸入視頻文件,通過多模態模型理解結合語義摘要與嵌入檢索實現素材定位,識別高光片段,併合成剪輯。

image.png

📢限時插播:無需管理基礎設施,利用亞馬遜技術與生態,快速集成與部署生成式AI模型能力。
✨ 精心設計,旨在引導您深入探索Amazon Bedrock的模型選擇與調用、模型自動化評估以及安全圍欄(Guardrail)等重要功能。
⏩快快點擊進入《多模一站通 —— Amazon Bedrock 上的基礎模型初體驗》實驗構建無限, 探索啓程!

方案概覽:

image.png

文章概覽:

  • 模型介紹:Nova 多模態理解類模型(VLM)及多模態嵌入模型(MME)
  • 視頻高光剪輯的主要方法:
  1. 純VLM: 用Nova LLM直接進行視頻理解,輸出高光片段的開始和結束時間點

    1. 方案架構與案例代碼
    2. Nova理解類模型輸出視頻精準時間戳(timestamp)的提示詞工程技巧
    3. 效果優化:通過切片增加識別精準度
  2. VLM+MME(video) :結合語義摘要與視頻嵌入檢索

    1. 方案架構與案例代碼(2.1 基礎:高光壓縮; 2.2 跨視頻內容驅動的高光剪輯; 2.3 歷史素材驅動的模板化高光生成
    2. 成本與效果優化思路:片段聚類,初篩,去重
    3. 降本方案:2.4 VLM+MME(image) : 視頻抽幀,結合語義摘要與抽幀嵌入檢索
  • 附加考慮:背景音樂,轉場動畫,字幕及其他效果自動化
  • 總結與討論:實際應用場景,方案特點和選型思路
  • 可用性與定價

模型介紹

Amazon Web Services(Amazon)推出的 Amazon Nova 自研模型系列,是一組基礎模型(foundation models),覆蓋文本、圖像、視頻、語音和智能代理等多模態輸入與輸出,旨在為企業構建生成式 AI 應用提供性能優越、成本更低、可定製性更強的選擇。現已在 Amazon Bedrock 上提供。更多模型全系列信息:https://aws.amazon.com/nova/

image.png

本方案涉及兩類Nova模型:理解類模型和多模態嵌入模型。

理解類模型(Nova LLM)

Amazon Nova Lite 和 Amazon Nova Pro 是 Amazon Nova理解類模型系列(Nova Micro/Lite/Pro/Premier)中兩款高性價,低延遲的多模態模型,支持文本、圖像、視頻等多種格式,並輸出文本響應。
Nova Lite:定位為 “極低成本” 的多模態理解模型,能夠以極快的響應速度處理圖像、視頻和文本輸入,生成文本輸出。
Nova Pro:在精度、速度與成本之間取得平衡,是面向廣泛任務的高能力多模態理解模型。
二者均支持 200 多種語言,並且可通過 Amazon Bedrock 進行定製、微調、結合檢索增強生成(RAG)等,適合企業級應用。
在本文方案中,我們將使用Nova LLM的視頻理解能力,輸入視頻,通過提示詞工程,獲得高光片段時間點的輸出。

多模態嵌入模型(Nova MME)

Amazon Nova 多模態嵌入模型(Amazon Nova Multimodal Embeddings)是一款最先進的多模態嵌入模型,支持文本、文檔、圖像、視頻和音頻的統一嵌入模型,可實現高精度的跨模態檢索。模型細節與使用方法可閲讀博客。
在本文方案中,我們將使用Nova MME的視頻嵌入生成能力,通過語義相似度檢索片段嵌入,以此定位高光片段。

高光剪輯方案

1. 純VLM:多模態模型識別高光

該方案作為視頻高光剪輯的基礎方案,主要使用Nova 理解類模型(如 Nova Lite/Pro等版本),利用其視覺–語言模型(VLM,Vision-Language Model)能力直接對視頻輸入進行理解,通過其內部的視覺編碼、時序建模與語言理解能力,輸出高光片段的“開始時間點”和“結束時間點”。

a. 方案架構與案例代碼

純VLM方案的核心思路是:直接讓Nova模型讀取整個視頻,理解其內容後輸出高光片段的時間戳(開始時間和結束時間),然後使用FFmpeg等工具按時間戳切分並拼接視頻 。

image.png

應用案例1:足球比賽高光提取

以一段1分鐘的足球比賽視頻(視頻來源)為例,我們使用Nova Lite模型自動識別進球等精彩時刻。原始視頻包含完整的比賽片段,其中穿插了多個進球瞬間、精彩撲救和關鍵傳球。通過純VLM方案,模型能夠自動定位這些高光時刻並生成濃縮版視頻。

下圖展示了處理前後的對比效果。左側為原始1分鐘視頻,包含了大量的中場傳球和跑位等常規畫面;右側為自動生成的高光視頻,精準保留了4個進球瞬間,總時長壓縮至約25秒,壓縮比達到60%。有效提取了視頻中最具觀賞價值的片段。

image.png

1min 原始視頻       

image.png

25s高光視頻

識別準確度評估

為了量化評估模型的表現,我們使用IoU (Intersection over Union) 指標將模型輸出與人工標註的Ground Truth進行對比。IoU衡量預測片段與真實片段的重疊程度,當IoU > 0.5時視為成功匹配。測試結果如下 :

image.png

從效果來看,模型實現了100%的召回率,不僅準確識別了所有進球時刻,還自動過濾掉了中場傳球、球員跑位等非高光內容。生成的高光視頻節奏緊湊,適合在社交媒體上快速分享,這正是自動化高光剪輯的核心價值所在。

核心代碼實現

# Nova模型分析視頻
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1', 
                       config=Config(read_timeout=1800))

prompt = """You are an expert in football video analysis.
Identify ONLY goal moments from this match video.

**Output Format (JSON only):**
[
    {
        "start_time": "MM:SS",
        "end_time": "MM:SS",
        "description": "Goal description",
        "scene_type": "Goal"
    }
]

**Critical Constraints:**
- All timestamps MUST be within video duration
- Output ONLY valid JSON array
- NO overlapping timestamps"""

messages = [{
    "role": "user",
    "content": [
        {"video": {"format": "mp4", "source": {"s3Location": {"uri": s3_uri, "bucketOwner": account_id}}}},
        {"text": prompt}
    ]
}]

response = bedrock.converse(
    modelId= <nova-lite-model-id>, #具體名稱可以參考:https://aws.amazon.com/nova
    messages=messages,
    inferenceConfig={"maxTokens": 65535, "temperature": 0.0, "topP": 1.0},
    additionalModelRequestFields={
        "reasoningConfig": {"type": "enabled", "maxReasoningEffort": "low"}
    }
)

output = response['output']['message']['content'][0]['text']

應用案例2:小狗動畫高光提取

為了驗證純VLM方案在不同視頻類型上的泛化能力,我們進一步測試了一段1分鐘的動畫視頻。這段視頻的特點是大部分時間畫面相對靜態——一隻橙色的小狗在藍色大門前休息,而真正的高光時刻集中在三個動態片段:一隻黃色的小狗出現撿球、另一隻小狗從門內探出、以及黃色小狗追逐球的場景。下圖展示了處理效果。左側為原始60秒視頻,右側為自動生成的17秒高光視頻。模型成功識別了所有三個動態時刻,並準確過濾掉了長時間的靜態畫面 。

image.png

1min 原始視頻        

image.png

17s高光視頻

識別準確度評估

為了量化評估模型的表現,我們同樣使用IoU 指標將模型輸出與人工標註的Ground Truth進行對比,測試結果如下:

image.png

可以觀察到,模型成功識別了所有3個真實高光片段,並且所有時間戳均準確且在有效範圍內。特別值得注意的是,第二個片段(小狗開門)實現了完美匹配,説明模型對這類明確的動作轉折點有很強的識別能力。即使在第一和第三個片段中存在1-2秒的時間偏差,時間重疊率仍然達到0.67-0.88的高水平,這對於實際應用已經完全足夠。

綜上,對比足球比賽和動畫視頻兩個案例,我們可以看到純VLM方案展現出良好的跨場景泛化能力,無論是真實拍攝的體育賽事,還是製作精良的動畫內容,Nova Lite都能準確理解視頻語義,識別出符合”動作精彩、戲劇性強、敍事價值高”等標準的高光時刻。這種泛化能力使得同一套技術方案可以應用於多種業務場景,從體育直播、遊戲錄像到教育視頻、產品演示等,大幅降低了開發和維護成本。

b. 使用Nova理解類模型輸出視頻精準timestamp的提示詞工程技巧

在將Amazon Nova模型應用於視頻高光提取時,我們面臨的核心挑戰是如何讓模型準確輸出結構化的時間戳數據。基於對Nova Lite的系統性測試,發現模型在視頻時間定位任務中的表現高度依賴於prompt的設計策略,基於大量測試經驗和視頻理解任務的標準prompt模板,可以總結出以下關鍵技巧:

採用分步驟的任務分解策略。 參考視頻密集描述(Dense Captioning)任務的prompt設計,將複雜的時間戳提取任務分解為清晰的步驟序列,引導模型建立系統化的分析流程:

### Task:
You are an expert in video content analysis and temporal localization.
 
### Analysis Process (Follow these steps):
Step 1: Watch the entire video and identify all highlight moments
Step 2: For each moment, determine precise start and end timestamps
Step 3: Verify all timestamps are within the video duration
Step 4: Output structured JSON format only

這種結構化指引幫助模型建立”觀察→定位→驗證→輸出”的工作流程,顯著減少時間戳錯誤。

針對特定任務定製分析維度。參考視頻標註(Video Tagging)任務的prompt設計,在高光提取時應明確定義分析的多個維度,幫助模型全面理解什麼是”高光”:

**Analyze from these perspectives:** 
- Visual dynamics: motion intensity, camera movement, visual effects
- Emotional impact: excitement level, dramatic tension
- Technical complexity: skill difficulty, coordination required
- Narrative significance: story turning points, key moments
- Audience appeal: shareability, memorable elements

明確定義輸出格式並提供具體示例。在視頻檢索(Video Retrieval)和時間定位任務中,標準做法是明確指定時間戳的格式要求。我們建議同時提供格式説明和具體示例,對於需要更結構化的場景,使用JSON格式:

**Output Format:**
Generate detailed, time-stamped descriptions of events.
Each event follows the format: "#START - END seconds# description"

**Example:**
#0.8 - 11.3 seconds# Athlete performs a high jump over obstacle
#32.5 - 50.0 seconds# Crowd celebrates as player scores

**Output Format (JSON):**
[
    {
        "start_time": "MM:SS",
        "end_time": "MM:SS",
        "description": "Detailed event description",
        "scene_type": "Action|Transition|Climax"
    }
]

強調時間邊界約束以防止幻覺。測試表明,模型在長視頻中容易產生超出實際時長的時間戳。必須在prompt中明確視頻的實際時長:

**CRITICAL CONSTRAINTS:**
- Video duration: exactly 3 minutes 26 seconds (00:00 to 03:26)
- All timestamps MUST be within this range
- No events beyond 03:26
- Use MM:SS format consistently

通過系統性地應用這些提示詞工程技巧,我們能夠顯著提升Nova模型在視頻時間戳識別任務中的表現。在實際應用中,我們還建議結合代碼層面的後處理機制——例如驗證時間戳是否在有效範圍內、合併時間上相鄰的片段等,這種通過結合prompt設計+工程化驗證的組合策略能夠構建更穩健的生產系統。

除了提示詞優化,對於長視頻場景,我們還可以從架構層面進一步提升處理效果,接下來我們將詳細介紹這一優化方案。

c. 效果優化:通過切片增加識別精準度

在實際生產環境測試中,我們發現對於長視頻場景,採用視頻切片策略能夠顯著提升時間戳定位精度和高光識別準確率。該策略的核心思路是將長視頻按固定時長切分成多個片段,對每個片段獨立調用Nova模型進行並行分析,然後將識別結果映射回原視頻的絕對時間軸。這種方法不僅顯著提升了時間戳精度,還帶來了意外的性能收益——通過並行處理多個片段,整體處理時間反而縮短了。

應用案例3:長視頻足球比賽高光提取

以一段9分3秒的足球比賽視頻為例(視頻來源),我們將其切分為18個30秒片段和1個3秒片段,通過Amazon Nova Lite模型並行處理後,自動生成了包含所有進球時刻的高光視頻。下圖展示了原始視頻與自動生成的高光視頻對比:

image.png
切片策略處理流程圖

image.png

9m3s 原視頻     

image.png

1m58s 高光視頻

效果驗證

為量化評估切片策略的效果,我們使用人工標註的Ground Truth進行對比測試。結果顯示,切片策略在時間戳精度和召回率兩個關鍵指標上均有顯著提升:30秒切片策略成功識別了全部4個進球(召回率100%),時間戳精度提升至±1秒以內。

image.png

切片策略的另一個優勢是通過並行處理提升了整體處理效率。需要注意的是,雖然召回率得到了顯著提升,但由於每個片段獨立分析,可能會產生較多冗餘標記(本案例中輸出了14個候選片段),建議在後處理階段增加去重及篩選邏輯以優化最終輸出。

總體而言,純VLM方案的優勢在於流程簡潔、模塊精簡、實現路徑短,非常適合快速原型開發和中短視頻場景。然而,當面對超長視頻,這一方案對模型能力和提示詞工程的要求會顯著提升。此外,對於需要從海量視頻素材庫中全局篩選最佳片段的場景,純VLM方案難以提供跨視頻的語義檢索能力。
在接下來的章節中,我們將介紹:當VLM對高光片段的提取不是那麼精準時,通過引入多模態嵌入模型(MME)在語義空間上進行相似度匹配,不僅能提升系統的容錯能力,彌補VLM在精準性方面的部分不足,同時也提供了跨視頻片段檢索定位的可能性,實現更強大的視頻高光剪輯能力。

2. VLM+MME:語義摘要+嵌入檢索

該方案結合了兩類技術:首先由 VLM(Nova理解類模型,如Nova Lite/Pro)對視頻整體進行理解,生成高光要點或描述;其次,將視頻切片(如每2-3秒一段,具體切片時長根據業務要求和檢索顆粒度決定)生成視頻嵌入向量(通過多模態嵌入模型,Nova MME)——每個片段取得視覺/時序特徵之後形成向量。然後系統將高光描述(文本)作為查詢,與視頻片段的嵌入向量進行相似度匹配,從而精確定位那些“語義上與高光描述最接近”的片段。

image.png![image.png

a. 方案架構

該方案的需要視頻切片、嵌入生成與匹配機制, 可用於跨視頻的剪輯需求。基於嵌入向量的可複用性,提供從冷啓動(2.1, 2.2)到基於素材累積(2.3)的方案進階路徑。如果成本敏感可以考慮(2.4)將視頻抽幀,用圖片向量檢索。

2.1 基本方案:高光壓縮

在不強調原始視頻情節順序的情況下,我們可以採用一種高光壓縮的方法,將視頻內容提煉為精華片段。具體步驟如下:

  1. 視頻內容總結:將視頻輸入到VLM模型(例如亞馬遜雲科技的 Nova Lite/Pro 模型),生成對視頻主要內容的摘要描述,並以要點(bullet points)的形式呈現。這一步讓模型從全局上理解視頻內容的重點。(也可以與方法1. 純VLM( 用Nova VLM直接進行視頻理解,輸出高光片段的開始和結束時間點)方法結合,對VLM生成的高光點查漏補缺。)

    1. (可選)打重要性標籤:每條摘要要點可以附加一個優先級標籤(如重要程度1、2、3)以表示相對重要性(這一步需要在 system prompt 中明確高光片段的判定標準)。
  2. 視頻切片與嵌入:將視頻按時間順序分割成短片段,如2-3秒具體切片時長根據業務要求和檢索顆粒度決定),並對每個片段生成向量嵌入表示(使用Nova MME,多模態嵌入模型,每個片段的嵌入向量都代表了該片段的語義內容)。
  3. 語義匹配選取高光片段:利用第一步中VLM生成的摘要要點作為查詢,根據語義相似度在嵌入向量空間中檢索最相關的影片片段。換言之,我們在嵌入向量庫中查找與每條摘要要點語義最接近的若干片段。這些匹配上的片段即被視為視頻的高光片段集合。由於摘要要點概括了視頻的重要內容,檢索出的片段也就對應了視頻中最精彩或最重要的瞬間。

    1. (可選)初篩:如高光描述過多,可以根據高光點的優先級篩選需要匹配的文字。
    2. (可選)去重:若出現多個要點匹配到同一段視頻(即某片段對多條要點都有高相似度),則根據要點的優先級決定該片段應歸屬哪個要點(確保重要的要點獲得獨特片段)
  4. 高光片段導出:將選定的高光片段按原視頻中的時間順序組合導出,形成一個壓縮版的視頻。如果不關注片段順序,也可以按照相似度得分等權重來自由組合。但通常由於摘要要點源自原始視頻順序,此方法下導出的高光片段天然保持了原視頻的大致順序。

該基本方案不依賴任何外部素材庫,流程簡單直接。VLM提供語義摘要,嵌入向量提供精確檢索,使模型能夠“理解”視頻內容並找到對應片段。此方法依賴第一步VLM的摘要質量和提示詞工程,若VLM未能抓住真正的精彩之處,檢索結果可能欠佳。

案例代碼

使用Amazon Nova Lite進行視頻理解與高光要點生成,Amazon Nova MME進行文本和視頻片段的嵌入生成,開源音視頻處理庫FFmpeg進行視頻處理,該流程的核心代碼架構如下:

import boto3
import json
import subprocess
import base64
import glob
from sklearn.metrics.pairwise import cosine_similarity

bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')

# 1. LLM視頻分析 - Nova模型理解視頻生成高光要點
def analyze_video(video_path):
    with open(video_path, 'rb') as f:
        video_base64 = base64.b64encode(f.read()).decode('utf-8')
    
    response = bedrock.invoke_model(
        modelId="us.amazon.nova-lite-v1:0",
        body=json.dumps({
            "messages": [{"role": "user", "content": [
                {"video": {"format": "mp4", "source": {"bytes": video_base64}}},
                {"text": """請分析這個視頻並提煉高光要點。                       
                            ## 高光片段判定標準:
                            - 動作精彩或技巧性強的時刻
                            - 情感表達豐富或戲劇性的瞬間  
                            - 關鍵轉折點或重要事件
                            - 視覺效果突出或構圖優美的片段
                            - 具有故事性或敍事價值的時刻
                            
                            ## 輸出要求:
                            請按以下格式輸出高光要點,每個要點包含優先級(1=最重要,2=重要,3=一般):
                            
                            **視頻總結:**
                            [簡要描述視頻的整體內容和主題]
                            
                            **高光要點列表:**
                            A. [優先級1] - [具體的高光內容描述]
                            B. [優先級2]  - [具體的高光內容描述]  
                            C. [優先級1]  - [具體的高光內容描述]
                            ...
                            
                            請確保:
                            1. 按視頻時間順序排列要點
                            2. 每個要點都有明確的優先級標記
                            3. 描述具體且便於後續匹配
                            4. 重點關注真正精彩的時刻,而非簡單概括"""}
            ]}]
        })
    )
    return json.loads(response["body"].read())["output"]["message"]["content"][0]["text"]

# 2. 視頻切片 - FFmpeg按固定間隔切分視頻
def extract_clips(video_path, clip_duration=3):
    # 獲取視頻時長
    duration = float(subprocess.check_output(['ffprobe', '-v', 'quiet', '-show_entries', 'format=duration', '-of', 'csv=p=0', video_path]))
    
    clips = []
    for i in range(0, int(duration), clip_duration):
        clip_path = f"clips/clip_{i:04d}_{i}s.mp4"
        subprocess.run(['ffmpeg', '-i', video_path, '-ss', str(i), '-t', str(clip_duration), 
                       '-c:v', 'libx264', clip_path, '-y', '-loglevel', 'quiet'])
        clips.append({'timestamp': i, 'path': clip_path})
    return clips

# 3. 語義匹配 - Nova MME生成嵌入後計算要點與視頻片段相似度
def get_embedding(content, content_type="text"):
    if content_type == "text":
        request = {
            "taskType": "SINGLE_EMBEDDING",
            "singleEmbeddingParams": {
                "embeddingPurpose": "GENERIC_INDEX",
                "embeddingDimension": 1024,
                "text": {"truncationMode": "END", "value": content}
            }
        }
    else:  # video
        with open(content, 'rb') as f:
            video_base64 = base64.b64encode(f.read()).decode('utf-8')
        request = {
            "taskType": "SINGLE_EMBEDDING",
            "singleEmbeddingParams": {
                "embeddingPurpose": "GENERIC_INDEX",
                "embeddingDimension": 1024,
                "video": {
                    "format": "mp4",
                    "embeddingMode": "AUDIO_VIDEO_COMBINED",
                    "source": {"bytes": video_base64}
                }
            }
        }
    
    response = bedrock.invoke_model(modelId="amazon.nova-2-multimodal-embeddings-v1:0", body=json.dumps(request))
    return json.loads(response["body"].read())["embeddings"][0]["embedding"]

def semantic_match(analysis, clips):
    # 提取要點
    points = [line.strip() for line in analysis.split('\n') if line.strip().startswith(('A.', 'B.', 'C.'))]
    
    selected_clips = []
    # 為每個要點找最佳匹配片段
    for point in points:
        text_emb = get_embedding(point)
        best_clip, best_similarity = None, -1
        
        for clip in clips:
            video_emb = get_embedding(clip['path'], "video")
            similarity = cosine_similarity([text_emb], [video_emb])[0][0]
            
            if similarity > best_similarity:
                best_similarity = similarity
                best_clip = {'path': clip['path'], 'timestamp': clip['timestamp'], 'similarity': similarity}
        
        if best_clip and best_similarity > 0.15:
            selected_clips.append(best_clip)
    
    # 按時間順序排序
    selected_clips.sort(key=lambda x: x['timestamp'])
    return selected_clips

# 4. 拼接高光視頻 - FFmpeg合併選中片段
def create_video(selected_clips, output_path):
    # 生成拼接列表
    with open('concat_list.txt', 'w') as f:
        for clip in selected_clips:
            f.write(f"file '{clip['path']}'\n")
    
    # FFmpeg拼接
    subprocess.run(['ffmpeg', '-f', 'concat', '-safe', '0', '-i', 'concat_list.txt', 
                   '-c', 'copy', output_path, '-y', '-loglevel', 'quiet'])

# demo:完整流程
analysis = analyze_video("sample/action.mp4")
clips = extract_clips("sample/action.mp4", 3)
selected_clips = semantic_match(analysis, clips)
create_video(selected_clips, "highlight_video.mp4")
# 流程: 視頻→Nova理解→視頻切片→MME匹配→拼接
# 返回: highlight_video.mp4

應用案例:小狗動畫高光提取

image.png

1min 原始視頻                                     

image.png

14s 高光視頻

該動畫的大部分時間是一隻橙色小狗在藍色大門前睡覺,有3個主要的高光片段:

  • 第16s到第24s:一隻黃色小狗出現在畫面中撿球
  • 第26s到第32s:一隻小的白色和棕色相間的小狗從門內探出
  • 第46s到第52s:黃色小狗繼續出現在畫面中追逐球

按照架構設計進行第1步,將整個視頻作為輸入,使用VLM進行視頻分析,提取高光要點以及優先級:

**視頻總結:**
這個視頻展示了一隻橙色小狗在房子門口的階梯上睡覺。視頻中的場景是一個帶有花園和郵箱的房子,背景中還有一輛自行車停在路邊。

**高光要點列表:**
A. [優先級1] - 0:00 - 視頻開始時,展示了房子和橙色小狗在階梯上睡覺的場景。
B. [優先級2] - 0:19 - 橙色小狗開始翻身並醒來。
C. [優先級1] - 0:21 - 黃色小狗被一個藍色的球吸引,並開始追逐。
D. [優先級2] - 0:25 - 黃色小狗追逐球的動作,展示了它的活潑和好奇心。
E. [優先級3] - 0:30 - 黃色小狗追逐球的過程中,展示了房子的細節和背景。
F. [優先級2] - 0:35 - 黃色小狗最終放棄追逐。
G. [優先級3] - 0:40 - 視頻結尾,展示了房子和花園的全景。

VLM 提取的高光要點包含7條,每條有對應優先級與描述,可以觀察到視頻的大部分高光情節被提取出且故事較為連貫。在語義匹配階段,Nova MME進行多模態嵌入生成,能夠捕捉到視頻片段中的核心動作和場景特徵,而不完全依賴於具體的身份識別。例如,當VLM描述中提到”黃色小狗追逐球”時,無論執行這個動作的是橙色小狗還是黃色小狗,由於”追逐球”這一動作在嵌入空間中產生相似的語義表示,相似度計算都能夠匹配到包含此類動作的視頻片段,從而實現準確的語義關聯。這種語義層面的匹配機制使得系統具有一定的容錯能力:即使文本描述在細節上存在偏差,只要核心的動作、場景或情感特徵保持一致,相似度計算仍能找到正確的視頻片段,保證了語義上的連貫性。最後拼接時根據視頻片段的時間順序拼接保證了時序上的連貫性。
接下來進行第2~4步的視頻片段切分(2s為切分間隔),Nova MME嵌入生成以及語義匹配,每個要點匹配的視頻片段結果如下表所示:

image.png

從實際結果看,儘管VLM在狗的品種識別上存在混淆,但最終選中的片段(20-24秒、26-32秒、50-52秒等)仍然準確覆蓋了預期的高光時段,證明了這種基於語義匹配的方法在處理描述不精確問題上的魯棒性。生成的高光視頻中包含了提到的3個高光片段,且片段之間的銜接也較為自然。

2.2 跨視頻內容驅動的高光剪輯

當高光剪輯場景有較高的自定義劇本需求,需要微調視頻拼接順序,以及需要基於大量視頻媒體庫優選片段的時候,我們可以對2.1方案生成的嵌入基於用户定義的劇本文字(可選:再用prompt增強)進行檢索。

比如在媒體行業場景中,當剪輯需求不僅僅是“提取高光”,而是要按照品牌或用户定義的“劇本”來邁出敍事、結構和風格的步伐,並且擁有一個龐大的素材庫時,我們便可以採用“用户輸入的剪輯需求 + 跨視頻檢索”這一技術路徑。具體來説,用户首先輸入其剪輯意圖,例如“先展示產品問世、再展示用户體驗、最後展示品牌口號”,這一劇本會被系統轉化為一系列描述性事件(如“產品亮相”、“用户微笑試用”、“品牌Logo出現”)。接着系統對整個素材庫中的每條視頻或片段生成嵌入向量,進而將用户的每一個事件描述作為檢索查詢,與庫中各片段的嵌入進行相似度匹配。這樣,系統不僅限於從單個視頻選取高光,而是可以跨視頻檢索:比如,事件1可能匹配竟然是品牌拍攝片,事件2可能匹配直播片段,事件3來自宣傳片。最後,按照用户劇本設定的順序,將這些匹配出的來自不同視頻的片段組合起來,形成一個結構化、連貫而富有品牌風格的高光剪輯。

2.3 歷史素材驅動的模板化高光生成

視頻嵌入技術展現了極高的可複用性。我們可以將歷史上已經被剪輯為高光的片段——或被人工判斷為“精彩時刻”的素材——系統地收集起來,形成一個樣本庫。樣本庫搭建可選擇如Amazon Opensearch Service(博客),亞馬遜雲科技的partner向量數據庫如Zilliz(partner marketplace link)。

對於庫中每一個高光片段,我們不僅為其生成嵌入向量表示,還可按類別或風格進行標籤(例如 “體育比賽”“遊戲直播”“演講訪談” 等),併為片段附加豐富的元數據,如所屬視頻類別、片段簡介、精彩評分等。這一機制使得後續的新視頻可以跨視頻檢索:在面對一條新拍攝視頻時,系統首先對其進行分析(包括 VLM 摘要或粗分類),然後將其切分為2–3 秒的片段並生成嵌入向量。接下來,這些片段將與樣本庫中已有的高光嵌入進行相似度匹配——如果某個新視頻片段在視覺或語義上與歷史高光片段高度相似,就可將其標記為高光候選。同時,如果新視頻所屬類別明確(比如籃球比賽),系統還可參考該類別過去形成的“高光劇本”——例如典型進球、扣籃、關鍵三分、絕殺這一順序——並在樣本庫選片中優先匹配這些典型事件。將匹配出的片段(可能來自不同原視頻)按劇本順序組合拼接,就能生成符合觀眾預期節奏、結構連貫的高光成片。

以下為流程圖:

image.png

b. VLM+MME鏈路優化思路

在系統設計階段,成本考量非常重要。如不需要為視頻 embedding 支付持久化存儲費用,僅需要考慮模型推理費用(即 Nova 或嵌入模型 MME 的運行費用)。如需儲備歷史素材庫——需要存儲 embedding,因此還要考慮存儲和檢索成本。除了存儲外,還有一些成本優化手段,可以在整個流程中降低計算/存儲/帶寬等資源消耗。以下是幾項建議:

視頻壓縮 + 再識別
可以先將原始視頻做輕量壓縮或降幀處理(降低分辨率、降低幀率)以減少計算/存儲開銷。利用壓縮後的視頻用VLM識別哪些片段可能是高光,然後在原始視頻中按照排序結果選取對應高分片段,再拼接成最終剪輯。這樣可以避免對高分辨率視頻VLM理解/MME嵌入。

初篩過濾 + 再嵌入
在做精細的嵌入匹配之前,先做一個粗篩階段以減少待處理片段數量,從而降低後續嵌入計算量。粗篩可通過幾種方式實現:

  1. 靠 VLM 輸出大致 timestamp:結合方法1,調用 VLM 先對視頻做快速分析,輸出可能的高光時間段(例如“00:12–00:16”、“04:30–04:35”),然後只對這些候選區段做切片 + 嵌入匹配。提升方法1的精度,同時無需對全部視頻做嵌入處理。
  2. 靠去重:如果視頻存在大量“平淡”“重複”的片段,可以先用幀差異規則做去重,刪除重複內容,剩餘片段即為“亮點候選”:如幀之間變化率、場景切換檢測、視覺差異閾值做快速過濾,僅保留“變化大”的區段供後續處理。
  3. 靠前置邏輯:利用其他模態(如音頻、運動檢測)做預篩。比如音頻音量變大、頻率變化劇烈可能對應“高潮、高光”片段(如賽車轟鳴、演唱高潮);或視覺中檢測到快速運動/剪輯變化也可作為候選。這樣可減少對視覺嵌入的遍歷。

這種“粗 → 精”兩級篩選方式能顯著降低整體系統負載。

效果優化思路

切片粒度與高光時長彈性
實際場景中,高光時長並不固定(可能為 3 秒/5 秒/15 秒等),因此在切片設計時需要靈活。一個簡明工程實現方式是:
先用最小細粒度切片(例如 1-2 秒)遍歷全視頻。對於每個高光描述(來自 VLM),在匹配出的片段基礎上,可合併相鄰切片、或者根據優先級擴展時間段,以形成較長的高光片段。匹配邏輯可為:對於某一高光描述,找到所有相似度 ≥ 閾值(例如 0.5) 的細切片集合;然後合併這些相鄰切片(時間上連續或相近)為一個完整高光區間,再按時間順序拼接。
這樣既保證了系統能夠靈活應對不同長度的高光,又避免硬編碼“高光必為3 秒”的限制。

2.4 VLM+MME(視頻抽幀-圖片嵌入)

此方案與方案 2 的流程類似,但區別在於“嵌入對象”從視頻片段變為“抽幀圖片”。也就是説:對視頻抽取關鍵幀,對這些靜態幀生成圖片嵌入;同時由 VLM 生成高光描述文本;然後對圖片嵌入與描述文本做匹配,從這些匹配結果推斷高光的時間點。技術上這種方法降低了對完整視頻切片和時序建模的依賴,使實現更輕量。

image.png

案例代碼:

import boto3
import json
import subprocess
import base64
from sklearn.metrics.pairwise import cosine_similarity

bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')

# 1. VLM視頻分析
def analyze_video(video_path):
    # 同 “2.1 基本方案”部分案例代碼
    pass
    
# 2. FFmpeg抽幀:將視頻抽幀為圖片用於後續語義匹配
def extract_frames(video_path, interval=1):
    duration = float(subprocess.check_output(['ffprobe', '-v', 'quiet', '-show_entries', 'format=duration', '-of', 'csv=p=0', video_path]))
    
    frames = []
    for i, t in enumerate(range(0, int(duration), interval)):
        frame_path = f"frame_{i:04d}.jpg"
        subprocess.run(['ffmpeg', '-i', video_path, '-ss', str(t), '-vframes', '1', frame_path, '-y', '-loglevel', 'quiet'])
        frames.append({'timestamp': t, 'path': frame_path})
    return frames

# 3. 語義匹配:Nova MME生成嵌入後計算要點與圖片相似度
def get_embedding(content, content_type="text"):
    # 生成嵌入
    if content_type == "text":
        data = {"text": {"value": content}}
    else:
        with open(content, 'rb') as f:
            data = {"image": {"format": "jpeg", "source": {"bytes": base64.b64encode(f.read()).decode()}}}
    
    response = bedrock.invoke_model(
        modelId="amazon.nova-2-multimodal-embeddings-v1:0",
        body=json.dumps({"taskType": "SINGLE_EMBEDDING", "singleEmbeddingParams": data})
    )
    return json.loads(response["body"].read())["embeddings"][0]["embedding"]

def semantic_match(analysis, frames):
    # 提取要點
    points = [line.strip() for line in analysis.split('\n') if line.strip().startswith(('A.', 'B.', 'C.'))]
    
    selected_clips = []
    # 針對每一個要點,匹配處Top10最相關的幀集合
    for point in points:
        text_emb = get_embedding(point)
        best_frames = []
        
        for frame in frames:
            img_emb = get_embedding(frame['path'], "image")
            similarity = cosine_similarity([text_emb], [img_emb])[0][0]
            if similarity > 0.1:
                best_frames.append({'timestamp': frame['timestamp'], 'similarity': similarity})
        
        best_frames.sort(key=lambda x: x['similarity'], reverse=True)
        selected_clips.extend(best_frames[:10])  # Top10
    
    return selected_clips

# 4. 生成高光視頻
def create_video(video_path, clips, output_path):
    clips.sort(key=lambda x: x['timestamp'])
    
    # 按照幀集合提取片段
    temp_clips = []
    for i, clip in enumerate(clips):
        clip_path = f"clip_{i}.mp4"
        subprocess.run(['ffmpeg', '-i', video_path, '-ss', str(clip['timestamp']), '-t', '2', clip_path, '-y', '-loglevel', 'quiet'])
        temp_clips.append(clip_path)
    
    # 拼接
    with open('list.txt', 'w') as f:
        for clip in temp_clips:
            f.write(f"file '{clip}'\n")
    
    subprocess.run(['ffmpeg', '-f', 'concat', '-safe', '0', '-i', 'list.txt', '-c', 'copy', output_path, '-y', '-loglevel', 'quiet'])

# demo:完整流程
analysis = analyze_video("input.mp4")
frames = extract_frames("input.mp4")
clips = semantic_match(analysis, frames)
create_video("input.mp4", clips, "highlight.mp4")
# 流程: 視頻→Nova理解→視頻抽幀為圖片→MME匹配→拼接
# 返回: highlight.mp4

應用案例:小貓草地玩耍高光提取

image.png
1min 原始視頻                                       
image.png
16s 高光視頻

該視頻的大部分時間是小貓在草地上張望,主要高光片段為:

  • 在第21s到第28s:小貓有向前撲的動作
  • 第37s到第43s:小貓回到原位坐下回頭看向鏡頭

和2.1 基本方案類似,進行第1步將整個視頻作為輸入,使用VLM進行視頻分析,提取高光要點以及優先級:

**視頻總結:**
這段視頻展示了一隻橙色和白色相間的小貓在草地上的活動。從開始到結束,小貓一直在草地上探索、玩耍,並最終發現並嘗試吃一個蛋殼。

原始高光要點列表:
A. [優先級1] [0:00-0:05] - 小貓在草地上坐下,觀察周圍環境,展示了它的好奇心和警覺性
B. [優先級2] [0:23-0:25] - 小貓抬頭看向遠處,表現出對環境的探索和興趣
C. [優先級1] [0:27-0:30] - 小貓發現地上的蛋殼,並開始嘗試吃掉,展示了它的食慾和探索行為
D. [優先級2] [0:33-0:35] - 小貓嘗試吃蛋殼時,表現出一些困惑和不確定的表情,增加了視頻的趣味性
E. [優先級1] [0:37-0:40] - 小貓最終成功吃掉了蛋殼,並繼續在草地上活動,展示了它的滿足感

接下來進行的2~4步的處理,以1s為間隔對視頻進行抽幀,對高光要點與抽幀後的圖片進行嵌入生成與語義匹配,最後根據抽幀間隔與幀起始時間合併連續片段。最終提取出9個連續的高光片段(總時長16秒)如下表所示:

image.png

從結果上看,高光視頻短片包含了原視頻中2個主要高光瞬間(撲抓動作和看向鏡頭),同時也整合了VLM分析中關於小貓“靠近、玩弄/咬住蛋殼”的高優先級動作片段(對應片段4、5、7、8),跳過了較長的靜態張望部分同時保持了一定的動作連貫性。
總結:該方案優點是資源消耗更低、實現速度更快;但缺點在於抽幀可能丟失動作延續或動態效果,因此定位精度可能略遜於方案 2,適合快速試驗或成本/資源受限的場景。

附加考慮:BGM,轉場動畫,字幕及其他自動化

背景音樂匹配:高光剪輯常配以恰當的背景音樂(BGM)增強觀賞性。我們可以利用上述文本描述和嵌入技術來自動挑選BGM。例如,將高光片段的文字描述(來自VLM總結的高光要點)輸入音樂庫的嵌入查詢,尋找語義上契合的音樂片段。音樂庫中每首背景音樂可事先標註情緒、風格或含有描述文本,按需檢索。舉例來説,如果高光描述提到“激動人心的絕殺時刻”,系統可能選擇一首節奏緊湊、激昂的配樂與之對應。

視覺轉場和特效:生成剪輯時還可考慮自動添加一些轉場效果或字幕説明。例如,在片段銜接處插入快速淡入淡出或動感轉場,以增強流暢度(這裏可以用大模型基於提示詞直接生成剪輯劇本和轉場動畫標籤);增加字幕:  字幕可用各方案第一階段的VLM輸出的描述增加到對應的高光片段上,或進一步用LLM優化,在對應片段下方疊加字幕或標題,提示觀眾這個片段精彩之處(例如“最後三秒絕殺進球!”)。

迭代優化:在實際應用中,可以根據用户反饋或觀看數據,不斷優化高光選擇規則和效果處理。例如統計哪些自動生成的高光片段留存率高,哪種BGM搭配更受歡迎,反過來調整VLM的提示詞和相似度匹配的閾值,形成反饋循環,逐步提高高光剪輯的質量。

總結與討論:應用場景,方案特點和選型思路

綜上所述,本方案提出了一套利用AI進行視頻高光剪輯的思路:從基本的純大語言模型識別高光節點,到語義摘要+嵌入檢索實現跨素材的檢索和剪輯,並提供了隨着素材積累逐步提升的思路。

VLM 直接識別 vs 嵌入模型檢索:

隨着模型規模與多模態預訓練技術的發展,現代 VLM (比如本文案例中使用的Nova理解類模型)擅長同時處理視覺內容、語義信息與時序結構。它們能夠從整段視頻中快速提取“哪些時刻是高光”“這些高光的起止時間在哪裏”,因為它們在訓練階段已學習到“動作/事件 → 關鍵幀”與“視覺+語言語義”之間的對應關係。在現實剪輯任務中,如果視頻結構相對簡單、動作明顯、視覺變化突出,VLM 直接識別的路徑可能幾乎一步到位:模型讀取視頻,識別出“高光動作”或“精彩節點”,並直接標出時間戳。在這種場景下,少了切片、分割、索引、匹配等環節,流程更短、響應更快。

那麼為什麼我們在解決方案裏引入嵌入模型?其價值主要體現在以下幾個方面:第一,在素材庫規模大、跨視頻檢索需求高的場景,嵌入模型使你能夠為每個視頻片段或幀生成可索引的向量,從而構建“素材庫可複用+檢索加速”的結構。通過這種方式,無論未來你要處理多少條視頻或多少次剪輯任務,都可以依賴已生成的向量庫進行高效檢索,而不是每次都讓 VLM 全面掃描。第二,對於高度定製化剪輯需求(如品牌劇本、風格統一、跨視頻片段拼接)來説,嵌入模型提供了更強的“匹配”能力:你可以用描述或事件提示作為查詢,在向量空間中查找與之最相似的片段,再組合成成片。這種方法更適用於“從大量素材中選”“按照用户劇本拼接”這類複雜任務。

為方便產品或技術團隊快速決策,下面是選型建議:

image.png

自動高光剪輯技術方案可用於製造業如相機雲存剪輯, 媒資場景如明星高光,電視劇摘要等。在未來,我們期待這種自動化高光剪輯能夠大幅減少人工剪輯耗時,實現“一鍵生成精彩瞬間”,為內容創作者和觀眾帶來更高效的體驗,為亞馬遜雲科技客户產品帶來創新和效益。

可用性與定價

Amazon Nova理解類模型和多模態嵌入模型現已在Amazon Bedrock上線,可用區域包括美國東部(弗吉尼亞北部)的亞馬遜雲科技區域。如需詳細定價信息,請參閲Amazon Bedrock定價頁面(Amazon Bedrock pricing page)。

*前述特定亞馬遜雲科技生成式人工智能相關的服務目前在亞馬遜雲科技海外區域可用。亞馬遜雲科技中國區域相關雲服務由西雲數據和光環新網運營,具體信息以中國區域官網為準。

本篇作者

image.png

本期最新實驗《多模一站通 —— Amazon Bedrock 上的基礎模型初體驗》
✨ 精心設計,旨在引導您深入探索Amazon Bedrock的模型選擇與調用、模型自動化評估以及安全圍欄(Guardrail)等重要功能。無需管理基礎設施,利用亞馬遜技術與生態,快速集成與部署生成式AI模型能力。
⏩️[點擊進入實驗] 即刻開啓 AI 開發之旅
構建無限, 探索啓程!
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.