From 4cd6ca69e538a1e8e04077278d2d9359e75d828b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Wed, 15 Jul 2026 14:34:57 +0800 Subject: [PATCH] 1 --- Dockerfile | 3 +- api.json | 218 +++++ default_first_frame.png | Bin 69 -> 5525 bytes negative_prompt.md | 1 + short_drama.db | Bin 143360 -> 462848 bytes shortdrama/agent/chat_model.go | 88 +- shortdrama/agent/react_agent.go | 11 + shortdrama/consts/status.go | 1 + shortdrama/controller/config_controller.go | 10 - shortdrama/dao/generation_task_dao.go | 22 +- shortdrama/dao/model_config_dao.go | 23 +- shortdrama/model/dto/config_dto.go | 4 +- shortdrama/model/entity/generation_task.go | 25 +- shortdrama/model/entity/model_config.go | 4 +- shortdrama/model/segment_output.go | 2 +- shortdrama/service/config_service.go | 129 +-- shortdrama/service/drama_service.go | 971 +++++++++++++-------- shortdrama/service/episode_service.go | 383 +++++++- shortdrama/service/generation_context.go | 27 +- test.json | 1 + tools/split_merged/split_merged.go | 263 ++++++ 21 files changed, 1595 insertions(+), 591 deletions(-) create mode 100644 api.json create mode 100644 negative_prompt.md create mode 100644 test.json create mode 100644 tools/split_merged/split_merged.go diff --git a/Dockerfile b/Dockerfile index 561f976..30b64a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,12 +13,13 @@ RUN go build -ldflags="-s -w" -o main ./main.go FROM alpine:3.19 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ - && apk add --no-cache ca-certificates tzdata + && apk add --no-cache ca-certificates tzdata ffmpeg ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone WORKDIR /app COPY --from=builder /build/config.yml . COPY --from=builder /build/prompt.md . +COPY --from=builder /build/negative_prompt.md . COPY --from=builder /build/default_first_frame.png . COPY --from=builder /build/main . RUN printf '#!/bin/sh\nif [ -d /app/short_drama.db ]; then rm -rf /app/short_drama.db; fi\ntouch /app/short_drama.db 2>/dev/null || true\nexec ./main\n' > /app/entrypoint.sh && chmod +x /app/entrypoint.sh diff --git a/api.json b/api.json new file mode 100644 index 0000000..a44d3f0 --- /dev/null +++ b/api.json @@ -0,0 +1,218 @@ +{ + "model": "wan2.6-r2v-flash", + "input": { + "prompt": "Character2 坐在靠窗的椅子上,手持 character3,在 character4 旁演奏一首舒缓的美国乡村民谣。Character1 对Character2开口说道:“听起来不错”", + "negative_prompt": "", + "reference_urls": [ + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/hfugmr/wan-r2v-role1.mp4", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/qigswt/wan-r2v-role2.mp4", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/qpzxps/wan-r2v-object4.png", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260129/wfjikw/wan-r2v-backgroud5.png" + ] + }, + "parameters": { + "size": "1280*720", + "duration": 10, + "audio": true, + "shot_type": "multi", + "watermark": true, + "seed": 2147483647 + } +} + +//model string (必选) +// +//模型名称。模型列表与价格详见模型价格。 +// +//示例值:wan2.6-r2v-flash。 +// +//input object (必选) +// +//输入的基本信息,如提示词等。 +// +//属性 +// +//prompt string (必选) +// +//文本提示词。用来描述生成视频中期望包含的元素和视觉特点。 +// +//支持中英文,每个汉字、字母、标点占一个字符,超过部分会自动截断。 +// +//wan2.6-r2v-flash:长度不超过1500个字符。 +// +//wan2.6-r2v:长度不超过1500个字符。 +// +//角色引用说明:通过“character1、character2”这类标识引用参考角色,每个参考(视频或图像)仅包含单一角色。模型仅通过此方式识别参考中的角色。 +// +//示例值:character1在沙发上开心地看电影。 +// +//提示词的使用技巧请参见文生视频/图生视频Prompt指南。 +// +//negative_prompt string (可选) +// +//反向提示词,用来描述不希望在视频画面中出现的内容,可以对视频画面进行限制。 +// +//支持中英文,长度不超过500个字符,超过部分会自动截断。 +// +//示例值:低分辨率、错误、最差质量、低质量、残缺、多余的手指、比例不良等。 +// +//reference_urls array[string] (必选) +// +//重要 +//reference_urls直接影响费用,计费规则请参见计费与限流。 +// +//上传的参考文件 URL 数组,支持传入视频和图像。用于提取角色形象与音色(如有),以生成符合参考特征的视频。 +// +//每个 URL 可指向 一张图像 或 一段视频: +// +//图像数量:0~5。 +// +//视频数量:0~3。 +// +//总数限制:图像 + 视频 ≤ 5。 +// +//传入多个参考文件时,按照数组顺序定义角色的顺序。即第 1 个 URL 对应 character1,第 2 个对应 character2,以此类推。 +// +//每个参考文件仅包含一个主体角色。例如 character1 为小女孩,character2 为闹钟。 +// +//支持输入的格式: +// +//公网URL: +// +//支持 HTTP 或 HTTPS 协议。 +// +//示例值:https://cdn.translate.alibaba.com/xxx.png。 +// +//临时URL: +// +//支持OSS协议,必须通过上传文件获取临时 URL。 +// +//示例值:oss://dashscope-instant/xxx/xxx.png。 +// +//参考视频要求: +// +//格式:MP4、MOV。 +// +//时长:1s~30s。 +// +//视频大小:不超过100MB。 +// +//参考图像要求: +// +//格式:JPEG、JPG、PNG(不支持透明通道)、BMP、WEBP。 +// +//分辨率:宽高均需在[240,8000]像素之间。 +// +//图像大小:不超过20MB。 +// +//示例值:["https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/xxx.mp4", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/xxx.jpg"]。 +// +//已废弃字段 +// +//parameters object (可选) +// +//图像处理参数。如设置视频分辨率、开启prompt智能改写、添加水印等。 +// +//属性 +// +//size string (可选) +// +//重要 +//size直接影响费用,费用 = 单价(基于分辨率)× 时长(秒)。同一模型:1080P > 720P ,请在调用前确认模型价格。 +// +//size必须设置为具体数值(如 1280*720),而不是 1:1或720P。 +// +//指定生成的视频分辨率,格式为宽*高。该参数的默认值和可用枚举值依赖于 model 参数,规则如下: +// +//wan2.6-r2v-flash:默认值为 1920*1080(1080P)。可选分辨率:720P、1080P对应的所有分辨率。 +// +//wan2.6-r2v:默认值为 1920*1080(1080P)。可选分辨率:720P、1080P对应的所有分辨率。 +// +//720P档位:可选的视频分辨率及其对应的视频宽高比为: +// +//1280*720:16:9。 +// +//720*1280:9:16。 +// +//960*960:1:1。 +// +//1088*832:4:3。 +// +//832*1088:3:4。 +// +//1080P档位:可选的视频分辨率及其对应的视频宽高比为: +// +//1920*1080: 16:9。 +// +//1080*1920: 9:16。 +// +//1440*1440: 1:1。 +// +//1632*1248: 4:3。 +// +//1248*1632: 3:4。 +// +//duration integer (可选) +// +//重要 +//duration直接影响费用。费用 = 单价(基于分辨率)× 时长(秒),请在调用前确认模型价格。 +// +//生成视频的时长,单位为秒。 +// +//wan2.6-r2v-flash:取值为[2, 10]之间的整数。默认值为5。 +// +//wan2.6-r2v:取值为[2, 10]之间的整数。默认值为5。 +// +//示例值:5。 +// +//shot_type string (可选) +// +//指定生成视频的镜头类型,即视频是由一个连续镜头还是多个切换镜头组成。 +// +//参数优先级:shot_type > prompt。例如,若 shot_type设置为"single",即使 prompt 中包含“生成多镜头视频”,模型仍会输出单镜头视频。 +// +//可选值: +// +//single:默认值,输出单镜头视频 +// +//multi:输出多镜头视频。 +// +//示例值:single。 +// +//说明 +//当希望严格控制视频的叙事结构(如产品展示用单镜头、故事短片用多镜头),可通过此参数指定。 +// +//audio boolean (可选) +// +//重要 +//audio直接影响费用,有声视频与无声视频价格不同,请在调用前确认模型价格。 +// +//支持模型:wan2.6-r2v-flash。 +// +//是否生成有声视频。 +// +//可选值: +// +//true:默认值,输出有声视频。 +// +//false:输出无声视频。 +// +//示例值:true。 +// +//watermark boolean (可选) +// +//是否添加水印标识,水印位于视频右下角,文案固定为“AI生成”。 +// +//false:默认值,不添加水印。 +// +//true:添加水印。 +// +//示例值:false。 +// +//seed integer (可选) +// +//随机数种子,取值范围为[0, 2147483647]。 +// +//未指定时,系统自动生成随机种子。若需提升生成结果的可复现性,建议固定seed值。 +// +//请注意,由于模型生成具有概率性,即使使用相同 seed,也不能保证每次生成结果完全一致。 \ No newline at end of file diff --git a/default_first_frame.png b/default_first_frame.png index 94381b429d7f7fe87e1bade52d893ab348ae29cc..9fce5c051b42b774d7f3c4e0411b93df4c459e11 100644 GIT binary patch literal 5525 zcmeAS@N?(olHy`uVBq!ia0y~yV7kD-z{!qK{6v}zn}8H_fJM%#s>&EnB+!e}pPw39g6M;;v_7#$%Q9U&PVAsN{tB-;;f Xz2YaoCLbOjtsO4K;=@IRoV0O25US`7c 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ℜgRH5P*byJ**Y4{w3`mnf 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

HE<>EaQ?? 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 PW^t4tP2fz(rhWQf`wwzt literal 143360 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 KG^<76mj4eyRvE4U diff --git a/shortdrama/agent/chat_model.go b/shortdrama/agent/chat_model.go index 16ea6f6..463c402 100644 --- a/shortdrama/agent/chat_model.go +++ b/shortdrama/agent/chat_model.go @@ -6,10 +6,11 @@ import ( "encoding/json" "fmt" "io" - "log" "net/http" "strings" "time" + + "github.com/gogf/gf/v2/frame/g" ) // ModelConfig 模型配置 @@ -39,7 +40,7 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch timeout := cfg.Timeout if timeout <= 0 { - timeout = 60 * time.Second + timeout = 180 * time.Second } body, err := buildReqBody(cfg.ModelName, req) @@ -48,13 +49,14 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch } url := trimSlashes(cfg.BaseURL) + "/v1/chat/completions" + g.Log().Infof(ctx, "ChatAPI 开始调用 model=%s timeout=%v max_retries=3 body_size=%d", cfg.ModelName, timeout, len(body)) var lastErr error maxRetries := 3 for attempt := 0; attempt <= maxRetries; attempt++ { if attempt > 0 { wait := time.Duration(1<<(attempt-1)) * time.Second - log.Printf("API限流重试第%d次(等待%v)...", attempt, wait) + g.Log().Infof(ctx, "ChatAPI 限流重试第%d次(等待%v)", attempt, wait) select { case <-ctx.Done(): return nil, ctx.Err() @@ -64,10 +66,13 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch result, doErr := doChatRequest(ctx, url, cfg.APIKey, body, timeout) if doErr == nil { + g.Log().Infof(ctx, "ChatAPI 调用成功 url=%s tool_calls=%d content_len=%d", + url, len(result.ToolCalls), len(result.Content)) return result, nil } lastErr = doErr + g.Log().Warningf(ctx, "ChatAPI 请求失败(attempt=%d/%d): %v", attempt+1, maxRetries+1, doErr) // 只有限流或服务端错误才重试 errStr := lastErr.Error() if !strings.Contains(errStr, "limit_requests") && @@ -79,6 +84,7 @@ func CallChatModel(ctx context.Context, cfg *ModelConfig, req *ChatRequest) (*Ch } } + g.Log().Errorf(ctx, "ChatAPI %d次重试后最终失败: %v", maxRetries+1, lastErr) return nil, lastErr } @@ -90,18 +96,27 @@ func doChatRequest(ctx context.Context, url, apiKey string, body []byte, timeout httpReq.Header.Set("Authorization", "Bearer "+apiKey) httpReq.Header.Set("Content-Type", "application/json") + start := time.Now() client := &http.Client{Timeout: timeout} resp, err := client.Do(httpReq) + elapsed := time.Since(start) if err != nil { - return nil, fmt.Errorf("请求失败: %w", err) + return nil, fmt.Errorf("请求失败(耗时%v): %w", elapsed, err) } defer resp.Body.Close() respBody, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("读取响应失败: %w", err) + return nil, fmt.Errorf("读取响应失败(状态码=%d): %w", resp.StatusCode, err) } + if resp.StatusCode != 200 { + return nil, fmt.Errorf("API返回错误状态码=%d body=%s", resp.StatusCode, string(respBody)) + } + + g.Log().Infof(ctx, "ChatAPI 响应完成 status=%d body_len=%d elapsed=%v", + resp.StatusCode, len(respBody), elapsed) + return parseRespBody(respBody) } @@ -145,24 +160,37 @@ type apiRespBody struct { } type apiChoice struct { - Index int `json:"index"` - Message apiMsg `json:"message"` + Index int `json:"index"` + Message apiRespMsg `json:"message"` } -type apiMsg struct { - Content string `json:"content"` - ToolCalls []apiToolCall `json:"tool_calls,omitempty"` +// apiRespMsg 响应消息体(arguments 使用 json.RawMessage 兼容对象和字符串) +type apiRespMsg struct { + Content string `json:"content"` + ToolCalls []apiRespToolCall `json:"tool_calls,omitempty"` +} + +type apiRespToolCall struct { + ID string `json:"id"` + Type string `json:"type"` + Function apiRespFuncCall `json:"function"` +} + +type apiRespFuncCall struct { + Name string `json:"name"` + Arguments json.RawMessage `json:"arguments"` } type apiToolCall struct { - ID string `json:"id"` - Type string `json:"type"` - Function apiFuncCall `json:"function"` + ID string `json:"id"` + Type string `json:"type"` + Function apiReqFuncCall `json:"function"` } -type apiFuncCall struct { - Name string `json:"name"` - Arguments string `json:"arguments"` +// apiReqFuncCall 请求中的 function call(arguments 为 json.RawMessage 避免二次编码) +type apiReqFuncCall struct { + Name string `json:"name"` + Arguments json.RawMessage `json:"arguments"` } func buildReqBody(model string, req *ChatRequest) ([]byte, error) { @@ -201,12 +229,16 @@ func toAPIMessages(msgs []*ChatMessage) []apiMessage { if len(m.ToolCalls) > 0 { om.ToolCalls = make([]apiToolCall, 0, len(m.ToolCalls)) for _, tc := range m.ToolCalls { + args := tc.Arguments + if args == "" { + args = "{}" + } om.ToolCalls = append(om.ToolCalls, apiToolCall{ ID: tc.ID, Type: "function", - Function: apiFuncCall{ + Function: apiReqFuncCall{ Name: tc.Name, - Arguments: tc.Arguments, + Arguments: json.RawMessage(args), }, }) } @@ -233,16 +265,34 @@ func parseRespBody(data []byte) (*ChatResponse, error) { if len(msg.ToolCalls) > 0 { cr.ToolCalls = make([]*ToolCall, 0, len(msg.ToolCalls)) for _, tc := range msg.ToolCalls { + args := resolveArguments(tc.Function.Arguments) cr.ToolCalls = append(cr.ToolCalls, &ToolCall{ ID: tc.ID, Name: tc.Function.Name, - Arguments: tc.Function.Arguments, + Arguments: args, }) } } return cr, nil } +// resolveArguments 将 json.RawMessage 的参数转为字符串 +// API 可能返回 "arguments": "{\"key\":\"val\"}"(字符串)或 "arguments": {"key":"val"}(对象) +func resolveArguments(raw json.RawMessage) string { + if len(raw) == 0 { + return "" + } + // 如果是 JSON 字符串(以 " 开头),直接提取字符串值 + if raw[0] == '"' { + var s string + if json.Unmarshal(raw, &s) == nil { + return s + } + } + // 否则是 JSON 对象,重新序列化回字符串 + return string(raw) +} + func trimSlashes(s string) string { for len(s) > 0 && s[len(s)-1] == '/' { s = s[:len(s)-1] diff --git a/shortdrama/agent/react_agent.go b/shortdrama/agent/react_agent.go index 881c230..fc23f5d 100644 --- a/shortdrama/agent/react_agent.go +++ b/shortdrama/agent/react_agent.go @@ -81,6 +81,17 @@ func (a *ReActAgent) Run(ctx context.Context, userInput string) (string, error) continue } + if tc.Arguments == "" { + g.Log().Warningf(ctx, "ReAct step %d: 工具 %s 参数为空,跳过", step+1, tc.Name) + messages = append(messages, &ChatMessage{ + Role: RoleTool, + Content: "工具参数为空", + Name: tc.Name, + ToolCallID: tc.ID, + }) + continue + } + var args map[string]any if err := json.Unmarshal([]byte(tc.Arguments), &args); err != nil { g.Log().Warningf(ctx, "ReAct step %d: 参数解析失败: %v", step+1, err) diff --git a/shortdrama/consts/status.go b/shortdrama/consts/status.go index 63e64ae..5600f4c 100644 --- a/shortdrama/consts/status.go +++ b/shortdrama/consts/status.go @@ -7,6 +7,7 @@ const ( EpisodeStatusCompleted = "completed" EpisodeStatusFailed = "failed" + TaskStatusPending = "pending" TaskStatusGenerating = "generating" TaskStatusReview = "review" TaskStatusCompleted = "completed" diff --git a/shortdrama/controller/config_controller.go b/shortdrama/controller/config_controller.go index 984f0e2..8f8a0fa 100644 --- a/shortdrama/controller/config_controller.go +++ b/shortdrama/controller/config_controller.go @@ -2,7 +2,6 @@ package controller import ( "context" - "fmt" "video-factory/shortdrama/model/dto" "video-factory/shortdrama/model/entity" @@ -18,15 +17,6 @@ func (c *config) Get(ctx context.Context, req *dto.GetModelConfigReq) (res *dto. } func (c *config) Save(ctx context.Context, req *dto.SaveModelConfigReq) (res *struct{}, err error) { - if req.MinSingleDuration < 1 { - return nil, fmt.Errorf("单次生成最小时长必须大于等于1") - } - if req.MaxSingleDuration < 1 { - return nil, fmt.Errorf("单次生成最大时长必须大于等于1") - } - if req.MinSingleDuration > req.MaxSingleDuration { - return nil, fmt.Errorf("单次生成最小时长不能大于最大时长") - } return nil, service.ConfigService.Save(ctx, req) } diff --git a/shortdrama/dao/generation_task_dao.go b/shortdrama/dao/generation_task_dao.go index 044979f..a40aa60 100644 --- a/shortdrama/dao/generation_task_dao.go +++ b/shortdrama/dao/generation_task_dao.go @@ -23,6 +23,8 @@ func init() { episode_id INTEGER NOT NULL DEFAULT 0, -- 剧集ID segment_idx INTEGER NOT NULL DEFAULT 0, -- 段索引 status TEXT NOT NULL DEFAULT 'pending', -- 任务状态 + script TEXT NOT NULL DEFAULT '', -- 段脚本内容 + duration INTEGER NOT NULL DEFAULT 0, -- 段时长(秒) error_message TEXT NOT NULL DEFAULT '', created_at DATETIME DEFAULT (datetime('now','localtime')), updated_at DATETIME DEFAULT (datetime('now','localtime')) @@ -34,11 +36,6 @@ func init() { `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN segment_idx INTEGER NOT NULL DEFAULT 0`); err != nil { g.Log().Debugf(ctx, "添加 segment_idx 列失败(可能已存在): %v", err) } - // 迁移:添加 script_path 列 - if _, err := g.DB().Exec(ctx, - `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN script_path TEXT NOT NULL DEFAULT ''`); err != nil { - g.Log().Debugf(ctx, "添加 script_path 列失败(可能已存在): %v", err) - } // 迁移:添加 video_task_id 列 if _, err := g.DB().Exec(ctx, `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN video_task_id TEXT NOT NULL DEFAULT ''`); err != nil { @@ -69,6 +66,21 @@ func init() { `ALTER TABLE `+public.TableNameGenerationTask+` DROP COLUMN steps_data`); err != nil { g.Log().Debugf(ctx, "删除 steps_data 列失败(可能已不存在): %v", err) } + // 迁移:删除废弃的 script_path 列 + if _, err := g.DB().Exec(ctx, + `ALTER TABLE `+public.TableNameGenerationTask+` DROP COLUMN script_path`); err != nil { + g.Log().Debugf(ctx, "删除 script_path 列失败(可能已不存在): %v", err) + } + // 迁移:添加 script 列 + if _, err := g.DB().Exec(ctx, + `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN script TEXT NOT NULL DEFAULT ''`); err != nil { + g.Log().Debugf(ctx, "添加 script 列失败(可能已存在): %v", err) + } + // 迁移:添加 duration 列 + if _, err := g.DB().Exec(ctx, + `ALTER TABLE `+public.TableNameGenerationTask+` ADD COLUMN duration INTEGER NOT NULL DEFAULT 0`); err != nil { + g.Log().Debugf(ctx, "添加 duration 列失败(可能已存在): %v", err) + } } func (d *generationTaskDao) Insert(ctx context.Context, data *entity.GenerationTask) (id int64, err error) { diff --git a/shortdrama/dao/model_config_dao.go b/shortdrama/dao/model_config_dao.go index 38c002a..fc09254 100644 --- a/shortdrama/dao/model_config_dao.go +++ b/shortdrama/dao/model_config_dao.go @@ -27,8 +27,6 @@ func init() { video_api_key TEXT NOT NULL DEFAULT '', video_base_url TEXT NOT NULL DEFAULT '', video_model_name TEXT NOT NULL DEFAULT '', - max_single_duration INTEGER NOT NULL DEFAULT 15, - min_single_duration INTEGER NOT NULL DEFAULT 5, video_schema TEXT NOT NULL DEFAULT '', video_task_callback_url TEXT NOT NULL DEFAULT '', price_per_second INTEGER NOT NULL DEFAULT 0, @@ -40,6 +38,7 @@ func init() { // 清理旧字段 for _, col := range []string{ + "max_single_duration", "min_single_duration", "chat_provider", "video_provider", "video_no_duration_support", "video_model_category", "image_model_name", @@ -75,17 +74,15 @@ func init() { count, _ := g.DB().Model(public.TableNameModelConfig).Ctx(ctx).Count() if count == 0 { _, err := g.DB().Model(public.TableNameModelConfig).Ctx(ctx).Data(g.Map{ - "chat_api_key": "sk-ws-H.RXDDPMR.E8Rn.MEUCIQD00xjpXeNJlnXQejmbFTyC5ILHF8hLB2at4QXU6nf6GwIgae5TA8siaylUxMBDQcOWFfNx6hxB4rFsdCxoV6md810", - "chat_base_url": "https://dashscope.aliyuncs.com/compatible-mode", - "chat_model_name": "qwen-math-turbo", - "max_tokens": 8192, - "temperature": 0.7, - "video_api_key": "sk-ws-H.RXDDPMR.E8Rn.MEUCIQD00xjpXeNJlnXQejmbFTyC5ILHF8hLB2at4QXU6nf6GwIgae5TA8siaylUxMBDQcOWFfNx6hxB4rFsdCxoV6md810", - "video_base_url": "https://ws-0mn9581u5vt4lcx9.cn-beijing.maas.aliyuncs.com/api/v1/tasks", - "video_task_callback_url": "https://ws-0mn9581u5vt4lcx9.cn-beijing.maas.aliyuncs.com/api/v1/tasks/{task_id}", - "video_model_name": "wan2.7-r2v", - "max_single_duration": 5, - "min_single_duration": 2, + "chat_api_key": "", + "chat_base_url": "", + "chat_model_name": "", + "max_tokens": 4096, + "temperature": 0.85, + "video_api_key": "", + "video_base_url": "", + "video_task_callback_url": "", + "video_model_name": "", "price_per_second": 10, "created_at": gtime.Now().Format("Y-m-d H:i:s"), "updated_at": gtime.Now().Format("Y-m-d H:i:s"), diff --git a/shortdrama/model/dto/config_dto.go b/shortdrama/model/dto/config_dto.go index 9f8a16d..0aa3bc3 100644 --- a/shortdrama/model/dto/config_dto.go +++ b/shortdrama/model/dto/config_dto.go @@ -31,9 +31,7 @@ type SaveModelConfigReq struct { VideoApiKey string `v:"required" json:"videoApiKey" dc:"视频模型API密钥"` VideoBaseUrl string `v:"required|url" json:"videoBaseUrl" dc:"视频模型API接口地址"` VideoModelName string `v:"required" json:"videoModelName" dc:"视频模型名称"` - MaxSingleDuration int `v:"required" json:"maxSingleDuration" dc:"单段最大时长"` - MinSingleDuration int `v:"required" json:"minSingleDuration" dc:"单段最小时长"` - VideoSchema *gjson.Json `json:"videoSchema" dc:"视频生成模型schema"` + VideoSchema *gjson.Json `json:"videoSchema" dc:"视频生成模型schema(JSON, 含duration/ref/params/sizes)"` PricePerSecond int `v:"required|min:1" json:"pricePerSecond" dc:"每秒价格(分)"` VideoTaskCallbackUrl string `json:"videoTaskCallbackUrl" dc:"视频生成任务回调地址"` } diff --git a/shortdrama/model/entity/generation_task.go b/shortdrama/model/entity/generation_task.go index 5b3c9e9..0aa14fb 100644 --- a/shortdrama/model/entity/generation_task.go +++ b/shortdrama/model/entity/generation_task.go @@ -3,16 +3,17 @@ package entity import "github.com/gogf/gf/v2/os/gtime" type GenerationTask struct { - Id int64 `orm:"id" json:"id" dc:"任务ID" json:"id" json:"id" dc:"任务ID"` - DramaId int64 `orm:"drama_id" json:"dramaId" dc:"短剧ID" json:"drama_id" json:"dramaId" dc:"短剧ID"` - EpisodeId int64 `orm:"episode_id" json:"episodeId" dc:"剧集ID" json:"episode_id" json:"episodeId" dc:"剧集ID"` - SegmentIdx int `orm:"segment_idx" json:"segmentIdx" dc:"段索引" json:"segment_idx" json:"segmentIdx" dc:"段索引"` - Status string `orm:"status" json:"status" dc:"任务状态(pending/generating/review/completed/failed)" json:"status" json:"status" dc:"任务状态(pending/generating/review/completed/failed)"` - ScriptPath string `orm:"script_path" json:"scriptPath" dc:"脚本文件路径" json:"script_path" json:"scriptPath" dc:"脚本文件路径"` - VideoTaskId string `orm:"video_task_id" json:"videoTaskId" dc:"视频合成任务ID" json:"video_task_id" json:"videoTaskId" dc:"视频合成任务ID"` - VideoUrl string `orm:"video_url" json:"videoUrl" dc:"视频文件路径" json:"video_url" json:"videoUrl" dc:"视频文件路径"` - NumSegments int `orm:"num_segments" json:"numSegments" dc:"本集总段数" json:"num_segments" json:"numSegments" dc:"本集总段数"` - ErrorMessage string `orm:"error_message" json:"errorMessage" dc:"错误信息" json:"error_message" json:"errorMessage" dc:"错误信息"` - CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间" json:"created_at" json:"createdAt" dc:"创建时间"` - UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间" json:"updated_at" json:"updatedAt" dc:"更新时间"` + Id int64 `orm:"id" json:"id" dc:"任务ID"` + DramaId int64 `orm:"drama_id" json:"dramaId" dc:"短剧ID"` + EpisodeId int64 `orm:"episode_id" json:"episodeId" dc:"剧集ID"` + SegmentIdx int `orm:"segment_idx" json:"segmentIdx" dc:"段索引"` + Status string `orm:"status" json:"status" dc:"任务状态(pending/generating/review/completed/failed)"` + Script string `orm:"script" json:"script" dc:"段脚本内容"` + Duration int `orm:"duration" json:"duration" dc:"段时长(秒)"` + VideoTaskId string `orm:"video_task_id" json:"videoTaskId" dc:"视频合成任务ID"` + VideoUrl string `orm:"video_url" json:"videoUrl" dc:"视频文件路径"` + NumSegments int `orm:"num_segments" json:"numSegments" dc:"本集总段数"` + ErrorMessage string `orm:"error_message" json:"errorMessage" dc:"错误信息"` + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` } diff --git a/shortdrama/model/entity/model_config.go b/shortdrama/model/entity/model_config.go index 4735c6d..c44954d 100644 --- a/shortdrama/model/entity/model_config.go +++ b/shortdrama/model/entity/model_config.go @@ -15,9 +15,7 @@ type ModelConfig struct { VideoApiKey string `orm:"video_api_key" json:"videoApiKey" dc:"视频模型API密钥"` VideoBaseUrl string `orm:"video_base_url" json:"videoBaseUrl" dc:"视频模型接口地址"` VideoModelName string `orm:"video_model_name" json:"videoModelName" dc:"视频模型名称"` - MaxSingleDuration int `orm:"max_single_duration" json:"maxSingleDuration" dc:"单段最大时长"` - MinSingleDuration int `orm:"min_single_duration" json:"minSingleDuration" dc:"单段最小时长"` - VideoSchema string `orm:"video_schema" json:"videoSchema" dc:"视频生成模型schema"` + VideoSchema string `orm:"video_schema" json:"videoSchema" dc:"视频生成模型schema(JSON, 含duration/ref/prams/sizes)"` PricePerSecond int `orm:"price_per_second" json:"pricePerSecond" dc:"每秒价格(分)"` VideoTaskCallbackUrl string `orm:"video_task_callback_url" json:"videoTaskCallbackUrl" dc:"视频生成任务回调地址"` CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` diff --git a/shortdrama/model/segment_output.go b/shortdrama/model/segment_output.go index 438a760..13b482c 100644 --- a/shortdrama/model/segment_output.go +++ b/shortdrama/model/segment_output.go @@ -30,5 +30,5 @@ type SegmentCharacter struct { type VideoRef struct { Type string `json:"type"` // "character" | "scene" | "prop" Name string `json:"name"` // 实体名称 - MediaURL string `json:"mediaUrl"` // 参考素材 URL(base64 data URL 或 HTTP URL) + MediaURL string `json:"mediaUrl"` // 参考素材 URL(API 要求 HTTPS 公网 URL 或 OSS URL) } diff --git a/shortdrama/service/config_service.go b/shortdrama/service/config_service.go index ab16464..b1e4a90 100644 --- a/shortdrama/service/config_service.go +++ b/shortdrama/service/config_service.go @@ -2,10 +2,6 @@ package service import ( "context" - "encoding/json" - "io" - "net/http" - "strings" "video-factory/shortdrama/dao" "video-factory/shortdrama/model/dto" @@ -88,133 +84,14 @@ func (s *configService) SavePaymentConfig(ctx context.Context, cfg *entity.Payme return dao.PaymentConfigDao.Save(ctx, cfg) } -// syncModelDurationFromAPI 查询模型API,获取模型支持的参数和时长范围 +// syncModelDurationFromAPI 保存前校验配置完整性,设置默认值 func syncModelDurationFromAPI(ctx context.Context, cfg *entity.ModelConfig) { - if cfg.VideoApiKey == "" || cfg.VideoBaseUrl == "" || cfg.VideoModelName == "" { - return - } - - if cfg.MinSingleDuration <= 0 { - cfg.MinSingleDuration = 2 - g.Log().Infof(ctx, "使用默认单段最小时长: 2 秒") - } - if cfg.MaxSingleDuration <= 0 { - cfg.MaxSingleDuration = 15 - g.Log().Infof(ctx, "使用默认单段最大时长: 15 秒") - } if cfg.Temperature <= 0 { cfg.Temperature = 0.85 g.Log().Infof(ctx, "使用默认 Temperature: 0.85") } - - if cfg.ChatApiKey == "" || cfg.ChatBaseUrl == "" || cfg.ChatModelName == "" { - return - } - - modelsURL := strings.TrimRight(cfg.ChatBaseUrl, "/") + "/models" - chatReq, err := http.NewRequestWithContext(ctx, "GET", modelsURL, nil) - if err != nil { - g.Log().Warningf(ctx, "创建对话模型查询请求失败: %v", err) - return - } - chatReq.Header.Set("Authorization", "Bearer "+cfg.ChatApiKey) - chatReq.Header.Set("Content-Type", "application/json") - - chatResp, err := http.DefaultClient.Do(chatReq) - if err != nil { - g.Log().Warningf(ctx, "查询对话模型列表API失败: %v(不影响配置保存,max_tokens将使用默认值)", err) - return - } - defer chatResp.Body.Close() - - chatBody, _ := io.ReadAll(chatResp.Body) - var chatModelList struct { - Object string `json:"object"` - Data []struct { - Id string `json:"id"` - Object string `json:"object"` - Created int64 `json:"created"` - OwnedBy string `json:"owned_by"` - } `json:"data"` - FirstId string `json:"first_id"` - LastId string `json:"last_id"` - HasMore bool `json:"has_more"` - } - if err := json.Unmarshal(chatBody, &chatModelList); err != nil || chatModelList.Object != "list" { - g.Log().Debugf(ctx, "解析对话模型列表响应失败(可能非OpenAI兼容API): %v", err) - return - } - - chatModelName := strings.ToLower(cfg.ChatModelName) - if cfg.MaxTokens <= 0 { - cfg.MaxTokens = inferChatMaxTokens(chatModelName) - g.Log().Infof(ctx, "根据模型名称推断 max_tokens: %d(用户在表单中可手动修改)", cfg.MaxTokens) - } - if cfg.Temperature <= 0 { - cfg.Temperature = inferChatTemperature(chatModelName) - g.Log().Infof(ctx, "根据模型名称推断 Temperature: %.2f(用户在表单中可手动修改)", cfg.Temperature) - } -} - -func inferChatMaxTokens(modelName string) int { - switch { - case strings.Contains(modelName, "qwen-math"): - return 32768 - case strings.Contains(modelName, "qwen3"): - return 65536 - case strings.Contains(modelName, "qwen2.5"): - return 32768 - case strings.Contains(modelName, "qwen-max"): - return 8192 - case strings.Contains(modelName, "qwen-plus"): - return 16384 - case strings.Contains(modelName, "gpt-4o"): - return 16384 - case strings.Contains(modelName, "gpt-4"): - return 8192 - case strings.Contains(modelName, "gpt-3.5"): - return 4096 - case strings.Contains(modelName, "deepseek"): - return 8192 - case strings.Contains(modelName, "doubao") || strings.Contains(modelName, "豆包"): - return 65536 - case strings.Contains(modelName, "glm"): - return 8192 - case strings.Contains(modelName, "ernie"): - return 8192 - default: - return 4096 - } -} - -func inferChatTemperature(modelName string) float64 { - switch { - case strings.Contains(modelName, "qwen-math"): - return 0.5 - case strings.Contains(modelName, "qwen3"): - return 0.7 - case strings.Contains(modelName, "qwen2.5"): - return 0.7 - case strings.Contains(modelName, "qwen-max"): - return 0.8 - case strings.Contains(modelName, "qwen-plus"): - return 0.8 - case strings.Contains(modelName, "gpt-4o"): - return 0.8 - case strings.Contains(modelName, "gpt-4"): - return 0.7 - case strings.Contains(modelName, "gpt-3.5"): - return 0.7 - case strings.Contains(modelName, "deepseek"): - return 0.7 - case strings.Contains(modelName, "doubao") || strings.Contains(modelName, "豆包"): - return 0.95 - case strings.Contains(modelName, "glm"): - return 0.8 - case strings.Contains(modelName, "ernie"): - return 0.8 - default: - return 0.7 + cfg.MaxTokens = 4096 + g.Log().Infof(ctx, "使用默认 MaxTokens: 4096") } } diff --git a/shortdrama/service/drama_service.go b/shortdrama/service/drama_service.go index a93ccd4..1f66240 100644 --- a/shortdrama/service/drama_service.go +++ b/shortdrama/service/drama_service.go @@ -9,7 +9,10 @@ import ( "math" "net/http" "os" + "os/exec" "path/filepath" + "sort" + "strconv" "strings" "sync" "time" @@ -23,7 +26,6 @@ import ( "video-factory/shortdrama/model/dto" "video-factory/shortdrama/model/entity" - "github.com/Eyevinn/mp4ff/mp4" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gcache" @@ -280,31 +282,16 @@ func (s *dramaService) GenerateEpisode(ctx context.Context, dramaId, epId int64, // 清理本集之前生成的 workspace 文件 cleanupEpisodeWorkspace(ctx, d.Title, ep.Index, ep.Title) - // 事务:删除旧任务 → 批量创建新任务 → 更新剧集状态 - taskIds := make([]int64, numSegments) + // 更新任务状态:pending → generating err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { - // 删除旧任务 - if _, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Where("episode_id", epId).Delete(); e != nil { + // 将所有待生成任务标记为生成中 + if _, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx). + Where("episode_id", epId). + Where("status", consts.TaskStatusPending). + Data(g.Map{"status": consts.TaskStatusGenerating}).Update(); e != nil { return e } - // 创建新任务 - for i := range segDurs { - segDur := segDurs[i] - r, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Data(g.Map{ - "drama_id": dramaId, - "episode_id": epId, - "segment_idx": i, - "status": consts.TaskStatusGenerating, - "num_segments": numSegments, - }).Insert() - if e != nil { - return fmt.Errorf("创建第%d段任务失败: %w", i+1, e) - } - taskId, _ := r.LastInsertId() - taskIds[i] = taskId - g.Log().Infof(ctx, "第%d集第%d段任务创建(id=%d, segDur=%ds)", ep.Index, i+1, taskId, segDur) - } - // 更新剧集状态和生成模式 + // 更新剧集状态 _, e := tx.Model(public.TableNameEpisode).Ctx(ctx).Data(g.Map{"status": consts.EpisodeStatusGenerating, "video_url": ""}).Where("id", epId).Update() return e }) @@ -312,8 +299,14 @@ func (s *dramaService) GenerateEpisode(ctx context.Context, dramaId, epId int64, return err } - // 更新 poll cache + // 加载任务列表(状态已更新为 generating) tasks, _ := dao.GenerationTask.ListByEpisode(ctx, epId) + + // 构建 taskId 查找表 + taskIds := make(map[int]int64) + for _, t := range tasks { + taskIds[t.SegmentIdx] = t.Id + } setPollCache(ctx, epId, tasks) if mode == "serial" { @@ -351,7 +344,16 @@ func (s *dramaService) GenerateEpisode(ctx context.Context, dramaId, epId int64, wg.Add(1) sem <- struct{}{} go func(idx, dur int, tid int64) { - defer func() { <-sem; wg.Done() }() + defer func() { + if r := recover(); r != nil { + errMsg := fmt.Sprintf("panic: %v", r) + g.Log().Errorf(genCtx, "第%d集第%d段生成panic: %v", ep.Index, idx+1, r) + _ = dao.GenerationTask.UpdateFailed(genCtx, tid, errMsg) + clearPollCache(genCtx, epId) + } + <-sem + wg.Done() + }() startTime := time.Now() g.Log().Infof(genCtx, "第%d集第%d段开始生成(segDur=%ds)", ep.Index, idx+1, dur) if err := s.generateOneSegment(genCtx, d, ep, tid, idx, dur, "", genCtx2); err != nil { @@ -457,21 +459,83 @@ func (s *dramaService) generateOneSegment(ctx context.Context, d *entity.Drama, // 提交视频合成 // 构建引用列表:从Agent输出的角色名匹配预加载的参考图片 var videoRefs []model.VideoRef + + // 1. 角色参考 for _, ch := range segOutput.Characters { - if url := genCtx.LookupRef("演员", ch.Name); url != "" { + mediaURL := genCtx.LookupRef("演员", ch.Name) + if mediaURL == "" { + continue + } + videoRefs = append(videoRefs, model.VideoRef{ + Type: "character", Name: ch.Name, MediaURL: mediaURL, + }) + } + + // 2. 场景和道具参考:从脚本镜头中解析本段时间范围内涉及的场景和道具 + segEndTime := segStartTime + segDur + var coveredScenes []string + var coveredProps []string + if domain.IsShotsJSON(ep.Script) { + var shots []domain.Shot + if err := json.Unmarshal([]byte(ep.Script), &shots); err == nil { + for _, sh := range shots { + shStart := parseMMSSToSeconds(sh.StartTime) + shEnd := parseMMSSToSeconds(sh.EndTime) + // 检查镜头是否与本段时间范围重叠 + if shEnd <= segStartTime || shStart >= segEndTime { + continue + } + if sh.Scene != "" { + coveredScenes = append(coveredScenes, sh.Scene) + } + for _, p := range sh.Props { + if p != "" { + coveredProps = append(coveredProps, p) + } + } + } + } + } + + // 去重后添加场景参考 + seenScene := make(map[string]bool) + for _, name := range coveredScenes { + if seenScene[name] { + continue + } + seenScene[name] = true + if url := genCtx.LookupRef("场景", name); url != "" { videoRefs = append(videoRefs, model.VideoRef{ - Type: "character", Name: ch.Name, MediaURL: url, + Type: "scene", Name: name, MediaURL: url, }) } } - taskID, submitErr := s.submitVideoTask(ctx, d, ep, segIdx, segDur, segOutput.Scenes, videoRefs) + // 去重后添加道具参考 + seenProp := make(map[string]bool) + for _, name := range coveredProps { + if seenProp[name] { + continue + } + seenProp[name] = true + if url := genCtx.LookupRef("道具", name); url != "" { + videoRefs = append(videoRefs, model.VideoRef{ + Type: "prop", Name: name, MediaURL: url, + }) + } + } + + g.Log().Infof(ctx, "第%d段视频参考素材: %d个(角色%d 场景%d 道具%d)", + segIdx+1, len(videoRefs), len(segOutput.Characters), len(coveredScenes), len(coveredProps)) + + taskID, _, submitErr := s.submitVideoTask(ctx, d, ep, segIdx, segDur, segOutput.Scenes, videoRefs) if submitErr != nil { - g.Log().Warningf(ctx, "第%d段视频提交失败,后台轮询器将自动重试: %v", segIdx+1, submitErr) + g.Log().Errorf(ctx, "第%d段视频提交失败: %v", segIdx+1, submitErr) + return submitErr } else { g.Log().Infof(ctx, "第%d集第%d段视频已提交(taskId=%s, duration=%ds)", ep.Index, segIdx+1, taskID, segDur) } - // 更新 task 字段 + // 只更新 video_task_id 和 num_segments,不覆盖 script(保留 createPendingTasks 的原始 bodyJSON) updateFields := g.Map{ "num_segments": numSegments, "updated_at": nil, @@ -755,7 +819,7 @@ func (s *dramaService) ContinueSegment(ctx context.Context, taskId int64) error return nil } -// FeedbackSegment 反馈并重新生成本段 +// FeedbackSegment 反馈并重新提交本段视频(跳过 Agent,直接使用 task.Script 重新调用模型 API) func (s *dramaService) FeedbackSegment(ctx context.Context, taskId int64, feedback string) error { task, err := dao.GenerationTask.GetOne(ctx, taskId) if err != nil { @@ -780,6 +844,11 @@ func (s *dramaService) FeedbackSegment(ctx context.Context, taskId int64, feedba return err } + modelCfg := ConfigService.Get(ctx) + if modelCfg.VideoApiKey == "" || modelCfg.VideoBaseUrl == "" { + return fmt.Errorf("视频模型未配置") + } + d, err := dao.Drama.GetOne(ctx, task.DramaId) if err != nil || d == nil { return fmt.Errorf("短剧不存在") @@ -789,29 +858,49 @@ func (s *dramaService) FeedbackSegment(ctx context.Context, taskId int64, feedba return fmt.Errorf("剧集不存在") } - modelCfg := ConfigService.Get(ctx) - - segDurs := calcSegDurs(d.EpisodeDuration, modelCfg) - segDur := segDurs[task.SegmentIdx] - - // 预加载引用数据 - feedbackGenCtx, fbErr := BuildGenerationContext(context.Background(), d) - if fbErr != nil { - g.Log().Errorf(ctx, "反馈重试构建生成上下文失败: %v", fbErr) - return fbErr - } - go func() { genCtx := context.Background() genCtx = agent.WithDramaID(genCtx, d.Id) - g.Log().Infof(genCtx, "第%d集第%d段根据反馈重新生成", ep.Index, task.SegmentIdx+1) - if err := s.generateOneSegment(genCtx, d, ep, taskId, task.SegmentIdx, segDur, feedback, feedbackGenCtx); err != nil { - g.Log().Errorf(genCtx, "第%d集第%d段重新生成失败: %v", ep.Index, task.SegmentIdx+1, err) - _ = dao.GenerationTask.UpdateFailed(genCtx, taskId, err.Error()) + g.Log().Infof(genCtx, "第%d集第%d段重新提交视频(跳过Agent)", ep.Index, task.SegmentIdx+1) + + // 将 feedback 追加到 task.Script 的 prompt 末尾,不覆盖原有内容 + // 同时用当前数据库中的模型名更新 model 字段 + bodyBytes := []byte(task.Script) + { + var bodyMap map[string]any + if err := json.Unmarshal(bodyBytes, &bodyMap); err == nil { + if input, ok := bodyMap["input"].(map[string]any); ok { + if p, ok := input["prompt"].(string); ok && feedback != "" { + input["prompt"] = p + "\n\n【修改意见】" + feedback + } + } + // 用当前配置的模型名覆盖(兼容数据库配置变更后重做) + bodyMap["model"] = modelCfg.VideoModelName + bodyBytes, _ = json.Marshal(bodyMap) + } + } + + newTaskID, resolvedBody, submitErr := resubmitVideoTask(genCtx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, bodyBytes) + if submitErr != nil { + g.Log().Errorf(genCtx, "第%d集第%d段重新提交视频失败: %v", ep.Index, task.SegmentIdx+1, submitErr) + _ = dao.GenerationTask.UpdateFailed(genCtx, taskId, submitErr.Error()) clearPollCache(genCtx, task.EpisodeId) if ts, e := dao.GenerationTask.ListByEpisode(genCtx, task.EpisodeId); e == nil { setPollCache(genCtx, task.EpisodeId, ts) } + return + } + + g.Log().Infof(genCtx, "第%d集第%d段重提提交成功(taskId=%s)", ep.Index, task.SegmentIdx+1, newTaskID) + _ = dao.GenerationTask.UpdateFields(genCtx, taskId, g.Map{ + "video_task_id": newTaskID, + "script": string(resolvedBody), + "updated_at": nil, + }) + clearPollCache(genCtx, task.EpisodeId) + _ = dao.Episode.UpdateStatus(genCtx, task.EpisodeId, consts.EpisodeStatusGenerating, "") + if ts, e := dao.GenerationTask.ListByEpisode(genCtx, task.EpisodeId); e == nil { + setPollCache(genCtx, task.EpisodeId, ts) } }() @@ -989,6 +1078,66 @@ func (s *dramaService) pollPendingVideos(ctx context.Context) { continue } + // 任务没有 video_task_id —— 从任务自带 script 或剧集脚本重试提交 + ep, _ := dao.Episode.GetOne(ctx, task.EpisodeId) + d, _ := dao.Drama.GetOne(ctx, task.DramaId) + if ep != nil && d != nil && (task.Script != "" || ep.Script != "") { + // 优先使用任务自带的 script(新格式为 JSON 请求体),旧数据回退到 ep.Script + scriptText := task.Script + if scriptText != "" { + // 新格式:task.Script 为 JSON,从中提取 prompt + var bodyMap map[string]any + if err := json.Unmarshal([]byte(scriptText), &bodyMap); err == nil { + // 如果是完整的 bodyJSON(含 model/input/parameters),说明是 createPendingTasks 创建的新任务 + // 尚未经过 generateOneSegment 的 Agent 处理,跳过重试以避免重复提交 + if _, ok := bodyMap["model"]; ok { + if _, ok := bodyMap["parameters"]; ok { + g.Log().Infof(ctx, "轮询器: 任务 %d 第%d段为 bodyJSON 格式,跳过重试等待主流程处理", + task.Id, task.SegmentIdx+1) + continue + } + } + // 尝试从 bodyJSON 的 input.prompt 提取(兼容旧的重试场景) + if p, ok := bodyMap["prompt"].(string); ok && p != "" { + scriptText = p + } else if input, ok := bodyMap["input"].(map[string]any); ok { + if p, ok := input["prompt"].(string); ok && p != "" { + scriptText = p + } + } + } + // 如果不是 JSON 或没有 prompt 字段,保持原样(旧格式纯文本) + } + if scriptText == "" { + scriptText = ep.Script + } + scenes := []model.SegmentScene{{Description: scriptText}} + g.Log().Infof(ctx, "轮询器: 任务 %d 第%d段尝试重提交视频", + task.Id, task.SegmentIdx+1) + // 优先使用任务自带的 duration,旧数据回退到 calcSegDurs + segD := task.Duration + if segD <= 0 { + segDur := calcSegDurs(d.EpisodeDuration, modelCfg) + segD = 10 + if len(segDur) > task.SegmentIdx { + segD = segDur[task.SegmentIdx] + } + } + taskID, _, err := s.submitVideoTask(ctx, d, ep, task.SegmentIdx, segD, scenes, nil) + if err != nil { + g.Log().Errorf(ctx, "轮询器: 任务 %d 第%d段视频重提交失败: %v", + task.Id, task.SegmentIdx+1, err) + } else { + g.Log().Infof(ctx, "轮询器: 任务 %d 第%d段视频重提交成功(taskId=%s)", + task.Id, task.SegmentIdx+1, taskID) + _ = dao.GenerationTask.UpdateFields(ctx, task.Id, g.Map{"video_task_id": taskID}) + epUpdates[task.EpisodeId] = true + } + } else { + g.Log().Warningf(ctx, "轮询器: 任务 %d 第%d段无剧集脚本,%s", + task.Id, task.SegmentIdx+1, "等待主流程完成") + } + } // 刷新所有 generating 任务的 episode 缓存(不管状态有无变化,确保前端轮询不走 DB) @@ -1005,9 +1154,21 @@ func (s *dramaService) pollPendingVideos(ctx context.Context) { } +// buildPollURL 从视频创建 URL 构建任务查询 URL(DashScope API 规范) +// 创建端点: /api/v1/services/aigc/video-generation/video-synthesis +// 查询端点: /api/v1/tasks/{taskId} +func buildPollURL(baseURL, taskId string) string { + // 查找 "/api/v1/" 路径并替换后面的内容为 tasks/{taskId} + if idx := strings.Index(baseURL, "/api/v1/"); idx > 0 { + return baseURL[:idx] + "/api/v1/tasks/" + taskId + } + // fallback:直接拼接 + return strings.TrimRight(baseURL, "/") + "/" + taskId +} + // pollVideoTaskOnce 单次查询视频生成任务状态 func (s *dramaService) pollVideoTaskOnce(ctx context.Context, modelCfg *entity.ModelConfig, taskId string) (string, error) { - queryURL := strings.TrimRight(modelCfg.VideoBaseUrl, "/") + "/" + taskId + queryURL := buildPollURL(modelCfg.VideoBaseUrl, taskId) req, err := http.NewRequestWithContext(ctx, "GET", queryURL, nil) if err != nil { @@ -1062,17 +1223,17 @@ func (s *dramaService) pollVideoTaskOnce(ctx context.Context, modelCfg *entity.M if videoURL != "" { return videoURL, nil } + // SUCCEEDED 但没有视频URL,输出完整响应帮助调试 + g.Log().Warningf(ctx, "任务 %s 状态为 SUCCEEDED 但未返回视频URL,完整响应: %s", taskId, string(data)) + return "", fmt.Errorf("SUCCEEDED但视频URL为空,完整响应: %s", string(data)) case videoTaskFailed: return "", fmt.Errorf("FAILED: %s", buildErrMsg()) case videoTaskRunning, videoTaskPending: return "", fmt.Errorf("RUNNING") } - errMsg := buildErrMsg() - if errMsg != result.Output.TaskStatus { - return "", fmt.Errorf("任务状态: %s", errMsg) - } - return "", fmt.Errorf("视频URL为空") + g.Log().Warningf(ctx, "任务 %s 返回未知状态,完整响应: %s", taskId, string(data)) + return "", fmt.Errorf("未知任务状态: %s,完整响应: %s", result.Output.TaskStatus, string(data)) } // mapVideoTaskStatus 将供应商任务状态映射为内部状态 @@ -1093,11 +1254,12 @@ func mapVideoTaskStatus(s string) videoTaskStatus { // ==================== Video Generation ==================== -// submitVideoTask 提交视频合成任务 -func (s *dramaService) submitVideoTask(ctx context.Context, d *entity.Drama, ep *entity.Episode, segIdx, segDur int, scenes []model.SegmentScene, refs []model.VideoRef) (string, error) { +// submitVideoTask 提交视频合成任务,返回 (taskID, requestBodyJSON, error) +// requestBodyJSON 是调用视频模型 API 时发送的完整请求体 JSON 字符串 +func (s *dramaService) submitVideoTask(ctx context.Context, d *entity.Drama, ep *entity.Episode, segIdx, segDur int, scenes []model.SegmentScene, refs []model.VideoRef) (string, string, error) { modelCfg := ConfigService.Get(ctx) if modelCfg.VideoApiKey == "" || modelCfg.VideoBaseUrl == "" || modelCfg.VideoModelName == "" { - return "", fmt.Errorf("视频模型未配置") + return "", "", fmt.Errorf("视频模型未配置") } if len(scenes) == 0 { @@ -1110,111 +1272,222 @@ func (s *dramaService) submitVideoTask(ctx context.Context, d *entity.Drama, ep } } + // 从 video_schema 读取模型特定配置(结构按 API 请求格式: input / parameters) + refMaxCount := 5 // 默认最多5个 + promptMaxChars := 0 + if modelCfg.VideoSchema != "" { + var vs map[string]any + if err := json.Unmarshal([]byte(modelCfg.VideoSchema), &vs); err == nil { + refMaxCount = intVal(nested(vs, "input", "reference_urls", "total_max"), refMaxCount) + promptMaxChars = intVal(nested(vs, "input", "prompt", "max_chars"), 0) + } + } + sceneDescs := make([]string, 0, len(scenes)) for _, s := range scenes { sceneDescs = append(sceneDescs, s.Description) } - sceneText := strings.Join(sceneDescs, ";") - // 构建参考素材说明 - var refImages []string - refPrompt := "" - if len(refs) > 0 { - refImages = make([]string, 0, len(refs)) - var refParts []string - for _, r := range refs { - refParts = append(refParts, fmt.Sprintf("%s(%s)", r.Name, r.Type)) - if r.MediaURL != "" { - refImages = append(refImages, r.MediaURL) - } + // 构建 reference_urls 数组:按 演员→场景→道具 优先级排序 + type namedURL struct { + url string + name string + } + var namedURLs []namedURL + + var chars, sceneRefs, props []model.VideoRef + for _, r := range refs { + switch r.Type { + case "character": + chars = append(chars, r) + case "scene": + sceneRefs = append(sceneRefs, r) + case "prop": + props = append(props, r) + } + } + orderedRefs := append(append(chars, sceneRefs...), props...) + + for _, r := range orderedRefs { + if len(namedURLs) >= refMaxCount { + break + } + if r.MediaURL != "" { + namedURLs = append(namedURLs, namedURL{url: r.MediaURL, name: r.Name}) } - refPrompt = fmt.Sprintf(",参考素材:%s", strings.Join(refParts, "、")) } - prompt := fmt.Sprintf("短剧《%s》第%d集第%d段:%s%s", d.Title, ep.Index, segIdx+1, sceneText, refPrompt) - maxInputLen := 3000 - if modelCfg.MaxTokens > 0 { - maxInputLen = modelCfg.MaxTokens + // 构建 prompt:将场景描述中的实体名称替换为 character1/character2/... 直接引用参考素材 + refURLs := make([]string, len(namedURLs)) + refExplanation := "" + if len(namedURLs) > 0 { + type nameLabel struct { + name string + label string + } + nlList := make([]nameLabel, len(namedURLs)) + for i, nu := range namedURLs { + label := fmt.Sprintf("character%d", i+1) + nlList[i] = nameLabel{name: nu.name, label: label} + refURLs[i] = nu.url + } + sort.Slice(nlList, func(i, j int) bool { + return len(nlList[i].name) > len(nlList[j].name) + }) + // 替换场景描述中的实体名为 characterN(模型仅通过此方式识别参考角色) + for _, nl := range nlList { + sceneText = strings.ReplaceAll(sceneText, nl.name, nl.label) + } + // 构建角色引用说明(按 character1/2/3 顺序) + var refParts []string + for i, nu := range namedURLs { + refParts = append(refParts, fmt.Sprintf("character%d=%s", i+1, nu.name)) + } + refExplanation = fmt.Sprintf("。角色引用说明:%s", strings.Join(refParts, "、")) } - if len([]rune(prompt)) > maxInputLen { + + prompt := fmt.Sprintf("短剧《%s》第%d集第%d段:%s%s", d.Title, ep.Index, segIdx+1, sceneText, refExplanation) + if promptMaxChars > 0 && len([]rune(prompt)) > promptMaxChars { prefix := fmt.Sprintf("短剧《%s》第%d集第%d段:", d.Title, ep.Index, segIdx+1) - keepLen := maxInputLen - len([]rune(prefix)) - if keepLen < 0 { - keepLen = 0 + refLen := len([]rune(refExplanation)) + keepSceneLen := promptMaxChars - refLen - len([]rune(prefix)) + if keepSceneLen < 50 { + keepSceneLen = 50 } sceneRunes := []rune(sceneText) - if keepLen < len(sceneRunes) { - sceneText = "..." + string(sceneRunes[len(sceneRunes)-keepLen+3:]) + if keepSceneLen < len(sceneRunes) { + sceneText = "..." + string(sceneRunes[len(sceneRunes)-keepSceneLen+3:]) } - prompt = prefix + sceneText - g.Log().Infof(ctx, "prompt超长已截断至%d字符(原%d字符)", maxInputLen, len([]rune(prompt))) + prompt = prefix + sceneText + refExplanation + g.Log().Infof(ctx, "prompt超长已截断至%d字符(原%d字符)", promptMaxChars, len([]rune(prompt))) } - taskId, err := createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, - prompt, refImages, segDur, resolveVideoSize(d.Resolution, d.AspectRatio)) + // 读取 negative_prompt.md 文件作为反向提示词 + negativePrompt := "" + if data, err := os.ReadFile("negative_prompt.md"); err == nil { + if np := strings.TrimSpace(string(data)); np != "" { + negativePrompt = np + } + } + + taskId, requestJSON, err := createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, + prompt, negativePrompt, refURLs, segDur, d.Resolution, d.AspectRatio, modelCfg.VideoSchema) if err != nil { errStr := strings.ToLower(err.Error()) if strings.Contains(errStr, "duration") && (strings.Contains(errStr, "not support") || strings.Contains(errStr, "not supported")) { - taskId, err = createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, - prompt, refImages, 0, resolveVideoSize(d.Resolution, d.AspectRatio)) + taskId, requestJSON, err = createVideoTask(ctx, modelCfg.VideoApiKey, modelCfg.VideoBaseUrl, modelCfg.VideoModelName, + prompt, negativePrompt, refURLs, 0, d.Resolution, d.AspectRatio, modelCfg.VideoSchema) } if err != nil { - return "", fmt.Errorf("视频合成请求失败: %w", err) + return "", "", fmt.Errorf("视频合成请求失败: %w", err) } } if taskId == "" { - return "", fmt.Errorf("视频合成任务ID为空") + return "", "", fmt.Errorf("视频合成任务ID为空") } - return taskId, nil + return taskId, requestJSON, nil } -// createVideoTask 调用视频生成API提交任务 -func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt string, images []string, duration int, size string) (string, error) { - var ( - inputImages []string - paramsSize string - paramsDur int - hasParams bool - ) - if len(images) > 0 { - inputImages = images - } - if size != "" { - paramsSize = size - hasParams = true - } - if duration > 0 { - paramsDur = duration - hasParams = true - } - +// createVideoTask 调用视频生成API提交任务,返回 (taskID, requestBodyJSON, error) +// API 请求体结构由 model_config.video_schema 定义,包含: +// +// params: 额外参数(如 audio/shot_type/watermark 等) +// sizes: 分辨率→尺寸字符串映射表 +func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt, negativePrompt string, refURLs []string, duration int, resolution, aspectRatio, videoSchema string) (string, string, error) { body := map[string]any{ "model": modelName, "input": map[string]any{ "prompt": prompt, }, } - if len(inputImages) > 0 { - body["input"].(map[string]any)["images"] = inputImages + + // input.negative_prompt — 反向提示词(从 negative_prompt.md 读取,不为空时才发送) + if negativePrompt != "" { + body["input"].(map[string]any)["negative_prompt"] = negativePrompt } - if hasParams { - p := map[string]any{} - if paramsSize != "" { - p["size"] = paramsSize + + // input.reference_urls — 纯 URL 字符串数组,顺序对应 character1/character2/... + // 解析 refURLs:http/https/data: 开头的保持原样,文件路径转为 base64 data URL + for i, u := range refURLs { + if strings.HasPrefix(u, "http://") || strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "data:") { + continue } - if paramsDur > 0 { - p["duration"] = paramsDur + if b64, err := imageFileToBase64(u); err == nil { + refURLs[i] = b64 + } else { + g.Log().Warningf(ctx, "reference_urls 元素无法解析为文件或URL,跳过: %s", u) } - body["parameters"] = p } + if len(refURLs) > 0 { + body["input"].(map[string]any)["reference_urls"] = refURLs + } else { + // 无参考图时使用默认首帧 + if imgData, err := os.ReadFile(DefaultFirstFramePath); err == nil { + b64 := base64.StdEncoding.EncodeToString(imgData) + body["input"].(map[string]any)["reference_urls"] = []string{"data:image/png;base64," + b64} + g.Log().Infof(ctx, "使用默认首帧图作为 reference_urls") + } else { + g.Log().Warningf(ctx, "读取默认首帧图失败: %v", err) + } + } + + // 从 video_schema 读取模型特定参数(结构按 API 请求格式: input / parameters) + params := map[string]any{} + if videoSchema != "" { + var vs map[string]any + if err := json.Unmarshal([]byte(videoSchema), &vs); err == nil { + // 尺寸映射 + if sizes := nested(vs, "parameters", "size", "sizes"); sizes != nil { + if sm, ok := sizes.(map[string]any); ok { + if v := resolveSizeFromSchema(sm, resolution, aspectRatio); v != "" { + params["size"] = v + } + } + } + // 遍历 parameters 读取各字段默认值注入 API 请求,跳过 supported_models 限制的参数 + if paramsDef := nested(vs, "parameters"); paramsDef != nil { + if pm, ok := paramsDef.(map[string]any); ok { + for k, v := range pm { + paramDef, ok := v.(map[string]any) + if !ok { + continue + } + // 如果有 supported_models 且不包含当前模型,跳过 + if sm, ok := paramDef["supported_models"]; ok { + if models, ok := sm.([]any); ok { + found := false + for _, m := range models { + if ms, ok := m.(string); ok && ms == modelName { + found = true + break + } + } + if !found { + continue + } + } + } + if def, ok := paramDef["default"]; ok { + params[k] = def + } + } + } + } + } + } + + if duration > 0 { + params["duration"] = duration + } + body["parameters"] = params payload, _ := json.Marshal(body) req, err := http.NewRequestWithContext(ctx, "POST", baseURL, strings.NewReader(string(payload))) if err != nil { - return "", fmt.Errorf("创建请求失败: %w", err) + return "", "", fmt.Errorf("创建请求失败: %w", err) } req.Header.Set("Authorization", "Bearer "+apiKey) req.Header.Set("Content-Type", "application/json") @@ -1223,7 +1496,7 @@ func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt str client := &http.Client{Timeout: 30 * time.Second} resp, err := client.Do(req) if err != nil { - return "", fmt.Errorf("请求失败: %w", err) + return "", "", fmt.Errorf("请求失败: %w", err) } defer resp.Body.Close() @@ -1236,40 +1509,125 @@ func createVideoTask(ctx context.Context, apiKey, baseURL, modelName, prompt str Message string `json:"message"` } if err := json.Unmarshal(respData, &result); err != nil { - return "", fmt.Errorf("解析响应失败: %s", string(respData)) + return "", "", fmt.Errorf("解析响应失败: %s", string(respData)) } if result.Code != "" { - return "", fmt.Errorf("请求失败(code=%s): %s", result.Code, string(respData)) + return "", "", fmt.Errorf("请求失败(code=%s): %s", result.Code, string(respData)) } if result.Output.TaskID == "" { - return "", fmt.Errorf("任务ID为空") + return "", "", fmt.Errorf("任务ID为空") } - return result.Output.TaskID, nil + return result.Output.TaskID, string(payload), nil } -// resolveVideoSize 根据分辨率和宽高比计算视频尺寸 -func resolveVideoSize(resolution, aspectRatio string) string { - res := resolution - if res == "" { - res = "720P" +// resubmitVideoTask 使用已有的 bodyJSON 重新提交视频任务(跳过 Agent,直接调 API) +func resubmitVideoTask(ctx context.Context, apiKey, baseURL string, bodyJSON []byte) (string, []byte, error) { + var bodyMap map[string]any + if err := json.Unmarshal(bodyJSON, &bodyMap); err != nil { + return "", nil, fmt.Errorf("解析 bodyJSON 失败: %w", err) } - if strings.Contains(aspectRatio, "16:9") { - if res == "1080P" { - return "1920*1080" + + // 解析 reference_urls:http/https/data: 开头的保持原样,文件路径转为 base64 + if input, ok := bodyMap["input"].(map[string]any); ok { + if refs, ok := input["reference_urls"].([]any); ok { + resolved := make([]any, len(refs)) + for i, r := range refs { + u, _ := r.(string) + if strings.HasPrefix(u, "http://") || strings.HasPrefix(u, "https://") || strings.HasPrefix(u, "data:") { + resolved[i] = u + } else if b64, err := imageFileToBase64(u); err == nil { + resolved[i] = b64 + } else { + g.Log().Warningf(ctx, "reference_urls 元素无法解析: %s", u) + resolved[i] = u + } + } + input["reference_urls"] = resolved } - return "1280*720" } - if strings.Contains(aspectRatio, "1:1") { - if res == "1080P" { - return "1080*1080" + + payload, _ := json.Marshal(bodyMap) + req, err := http.NewRequestWithContext(ctx, "POST", baseURL, strings.NewReader(string(payload))) + if err != nil { + return "", nil, fmt.Errorf("创建请求失败: %w", err) + } + req.Header.Set("Authorization", "Bearer "+apiKey) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-DashScope-Async", "enable") + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + return "", nil, fmt.Errorf("请求失败: %w", err) + } + defer resp.Body.Close() + + respData, _ := io.ReadAll(resp.Body) + var result struct { + Output struct { + TaskID string `json:"task_id"` + } `json:"output"` + Code string `json:"code"` + Message string `json:"message"` + } + if err := json.Unmarshal(respData, &result); err != nil { + return "", nil, fmt.Errorf("解析响应失败: %s", string(respData)) + } + if result.Code != "" { + return "", nil, fmt.Errorf("请求失败(code=%s): %s", result.Code, string(respData)) + } + if result.Output.TaskID == "" { + return "", nil, fmt.Errorf("任务ID为空") + } + return result.Output.TaskID, payload, nil +} + +// resolveSizeFromSchema 从 video_schema.sizes 中根据分辨率和宽高比查找尺寸字符串 +// sizes 结构示例: {"720P":{"9:16":"720*1280","16:9":"1280*720"}} +func resolveSizeFromSchema(sizes map[string]any, resolution, aspectRatio string) string { + if resolution == "" || aspectRatio == "" { + return "" + } + res := strings.ToUpper(resolution) + ar := strings.ReplaceAll(aspectRatio, ":", ":") + resMap, ok := sizes[res].(map[string]any) + if !ok { + return "" + } + if v, ok := resMap[ar].(string); ok && v != "" { + return v + } + return "" +} + +// nested 从嵌套 map 中按 keys 路径安全取值 +func nested(m map[string]any, keys ...string) any { + for i, k := range keys { + if m == nil { + return nil + } + if i == len(keys)-1 { + return m[k] + } + if v, ok := m[k].(map[string]any); ok { + m = v + } else { + return nil } - return "720*720" } - // 默认竖屏 9:16 - if res == "1080P" { - return "1080*1920" + return nil +} + +// intVal 将 any 类型转为 int,非数值返回 fallback +func intVal(v any, fallback int) int { + switch n := v.(type) { + case float64: + return int(n) + case int: + return n + default: + return fallback } - return "720*1280" } func (s *dramaService) mergeEpisodeVideo(ctx context.Context, epId int64, lastTaskId int64) error { @@ -1351,6 +1709,14 @@ func (s *dramaService) mergeEpisodeVideo(ctx context.Context, epId int64, lastTa } } + // 叠加背景音乐(如果存在) + if bgmPath, err := s.overlayBackgroundMusic(ctx, d.Id, finalPath); err == nil { + finalPath = bgmPath + g.Log().Infof(ctx, "已叠加背景音乐: %s", finalPath) + } else { + g.Log().Warningf(ctx, "叠加背景音乐失败(跳过): %v", err) + } + // 事务:更新最后一段 task 状态 + 剧集状态和 video_url err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { // 更新最后一段任务为 completed @@ -1385,6 +1751,55 @@ func (s *dramaService) mergeEpisodeVideo(ctx context.Context, epId int64, lastTa // ==================== Video Helpers ==================== +// overlayBackgroundMusic 使用 ffmpeg 为视频叠加背景音乐(循环混音) +func (s *dramaService) overlayBackgroundMusic(ctx context.Context, dramaId int64, videoPath string) (string, error) { + bgmList, err := dao.BackgroundMusic.ListByDrama(ctx, dramaId) + if err != nil || len(bgmList) == 0 { + return "", fmt.Errorf("无背景音乐配置") + } + bgmPath := bgmList[0].FilePath + if bgmPath == "" { + return "", fmt.Errorf("背景音乐文件路径为空") + } + if _, err := os.Stat(bgmPath); os.IsNotExist(err) { + return "", fmt.Errorf("背景音乐文件不存在: %s", bgmPath) + } + // 检查 ffmpeg 是否可用 + if _, err := exec.LookPath("ffmpeg"); err != nil { + return "", fmt.Errorf("ffmpeg 不可用: %w", err) + } + + ext := filepath.Ext(videoPath) + bgmOutput := strings.TrimSuffix(videoPath, ext) + "_bgm" + ext + // ffmpeg 命令:循环 BGM 并降低音量,与视频原音频混音 + cmd := exec.Command("ffmpeg", + "-stream_loop", "-1", + "-i", bgmPath, + "-i", videoPath, + "-filter_complex", "[0:a]volume=0.15[bgm];[1:a][bgm]amix=inputs=2:duration=first[audio]", + "-map", "1:v", + "-map", "[audio]", + "-c:v", "copy", + "-shortest", + "-y", + bgmOutput, + ) + if output, err := cmd.CombinedOutput(); err != nil { + return "", fmt.Errorf("ffmpeg 失败: %w, 输出: %s", err, string(output)) + } + + // 替换原文件 + if err := os.Rename(bgmOutput, videoPath); err != nil { + // 如果替换失败,尝试移除原文件后重命名 + os.Remove(videoPath) + if err2 := os.Rename(bgmOutput, videoPath); err2 != nil { + os.Remove(bgmOutput) + return "", fmt.Errorf("替换视频文件失败: %w", err2) + } + } + return videoPath, nil +} + // waitForSegmentVideo 等待指定任务的视频生成完成。 // 轮询视频 API 直到视频就绪,下载到本地,更新 DB 的 video_url。 // 用于串行模式中让下一段能提取上一段的尾帧作为首帧。 @@ -1438,231 +1853,36 @@ func (s *dramaService) concatVideos(inputs []string, output string) error { return fmt.Errorf("需要至少2个输入文件才能合并") } - // 1. 读取所有 MP4 文件到内存 - var files []*mp4.File + // 创建 ffmpeg concat demuxer 文件列表 + filelist := output + ".filelist.txt" + var lines []string for _, path := range inputs { - f, err := mp4.ReadMP4File(path) + absPath, err := filepath.Abs(path) if err != nil { - return fmt.Errorf("读取 %s 失败: %w", path, err) + absPath = path } - files = append(files, f) + // 转义单引号 + escaped := strings.ReplaceAll(absPath, "'", "'\\''") + lines = append(lines, "file '"+escaped+"'") } - - // 2. 计算累积 mdat 负载大小和各文件原始基址 - cumPayload := make([]uint64, len(files)) - totalPayload := uint64(0) - origBase := make([]uint64, len(files)) - for i, f := range files { - cumPayload[i] = totalPayload - totalPayload += uint64(len(f.Mdat.Data)) - origBase[i] = f.Ftyp.Size() + f.Moov.Size() + f.Mdat.HeaderSize() + if err := os.WriteFile(filelist, []byte(strings.Join(lines, "\n")+"\n"), 0644); err != nil { + return fmt.Errorf("创建文件列表失败: %w", err) } + defer os.Remove(filelist) - // 3. 以第一个文件为蓝本构建输出结构 - outFile := mp4.NewFile() - outFile.Ftyp = files[0].Ftyp - outFile.Moov = files[0].Moov - - outFile.Mdat = &mp4.MdatBox{} - outFile.Mdat.SetData(make([]byte, totalPayload)) - pos := 0 - for _, f := range files { - copy(outFile.Mdat.Data[pos:], f.Mdat.Data) - pos += len(f.Mdat.Data) - } - - // 4. 按轨道类型初始化合并状态 - type mergeState struct { - stbl *mp4.StblBox - chunkBase uint32 // 当前已合并的 chunk 数量(stsc 偏移用) - } - - states := make(map[string]*mergeState) - for _, trak := range files[0].Moov.Traks { - hdlr := trak.Mdia.Hdlr.HandlerType - if _, ok := states[hdlr]; ok { - continue - } - stbl := trak.Mdia.Minf.Stbl - nChunks := chunkCount(stbl) - states[hdlr] = &mergeState{stbl: stbl, chunkBase: nChunks} - } - - // 5. 合并后续文件 - for fi := 1; fi < len(files); fi++ { - f := files[fi] - for _, srcTrak := range f.Moov.Traks { - hdlr := srcTrak.Mdia.Hdlr.HandlerType - st, ok := states[hdlr] - if !ok { - continue - } - srcStbl := srcTrak.Mdia.Minf.Stbl - nChunks := chunkCount(srcStbl) - - // stco/co64:偏移调整 = 第一个文件的基址差 + 累积 mdat 偏移 - adjust := int64(origBase[0]-origBase[fi]) + int64(cumPayload[fi]) - mergeChunkOffsets(st.stbl, srcStbl, adjust) - - // stsz:合并采样大小表 - if err := mergeSampleSizes(st.stbl.Stsz, srcStbl.Stsz); err != nil { - return err - } - - // stts:合并时域采样表 - mergeTimeToSample(st.stbl.Stts, srcStbl.Stts) - - // stsc:合并样块映射表,FirstChunk 需平移 - if srcStbl.Stsc != nil { - for i, e := range srcStbl.Stsc.Entries { - sid := srcStbl.Stsc.GetSampleDescriptionID(i + 1) - if err := st.stbl.Stsc.AddEntry(e.FirstChunk+st.chunkBase, e.SamplesPerChunk, sid); err != nil { - return fmt.Errorf("stsc 合并失败: %w", err) - } - } - } - - st.chunkBase += nChunks - } - } - - // 6. 修正所有 chunk 偏移(合并后 moov 大小变化) - combinedBase := outFile.Ftyp.Size() + outFile.Moov.Size() + outFile.Mdat.HeaderSize() - finalAdjust := int64(combinedBase - origBase[0]) - for _, st := range states { - adjustChunkOffsets(st.stbl, finalAdjust) - } - - // 7. 更新 mvhd 总时长 - totalDur := uint64(0) - for _, f := range files { - totalDur += f.Moov.Mvhd.Duration - } - outFile.Moov.Mvhd.Duration = totalDur - - // 更新每个 tkhd 时长 - for _, trak := range outFile.Moov.Traks { - hdlr := trak.Mdia.Hdlr.HandlerType - totalDur = 0 - for _, f := range files { - for _, t := range f.Moov.Traks { - if t.Mdia.Hdlr.HandlerType == hdlr { - totalDur += t.Tkhd.Duration - break - } - } - } - trak.Tkhd.Duration = totalDur - } - - // 8. 重建顶级 Children(确保 mdat 指向合并后的数据) - outFile.Children = []mp4.Box{outFile.Ftyp, outFile.Moov, outFile.Mdat} - - // 9. 写入输出文件 - return mp4.WriteToFile(outFile, output) -} - -// chunkCount 返回 stbl 中的 chunk 数量 -func chunkCount(stbl *mp4.StblBox) uint32 { - if stbl.Stco != nil { - return uint32(len(stbl.Stco.ChunkOffset)) - } - if stbl.Co64 != nil { - return uint32(len(stbl.Co64.ChunkOffset)) - } - return 0 -} - -// mergeChunkOffsets 将 src 的 stco/co64 追加到 base,每个偏移加上 adjust -func mergeChunkOffsets(base, src *mp4.StblBox, adjust int64) { - if src.Stco != nil { - if base.Stco == nil { - base.Stco = &mp4.StcoBox{} - } - for _, off := range src.Stco.ChunkOffset { - base.Stco.ChunkOffset = append(base.Stco.ChunkOffset, uint32(int64(off)+adjust)) - } - } - if src.Co64 != nil { - if base.Co64 == nil { - base.Co64 = &mp4.Co64Box{} - } - for _, off := range src.Co64.ChunkOffset { - base.Co64.ChunkOffset = append(base.Co64.ChunkOffset, uint64(int64(off)+adjust)) - } - } -} - -// adjustChunkOffsets 对 stbl 中所有 stco/co64 偏移统一加上 adjust -func adjustChunkOffsets(stbl *mp4.StblBox, adjust int64) { - if stbl.Stco != nil { - for i := range stbl.Stco.ChunkOffset { - stbl.Stco.ChunkOffset[i] = uint32(int64(stbl.Stco.ChunkOffset[i]) + adjust) - } - } - if stbl.Co64 != nil { - for i := range stbl.Co64.ChunkOffset { - stbl.Co64.ChunkOffset[i] = uint64(int64(stbl.Co64.ChunkOffset[i]) + adjust) - } - } -} - -// mergeSampleSizes 合并 stsz 采样大小表 -func mergeSampleSizes(base, src *mp4.StszBox) error { - if src == nil { - return nil - } - if base.SampleUniformSize > 0 { - if src.SampleUniformSize == base.SampleUniformSize { - base.SampleNumber += src.SampleNumber - } else { - sizes := make([]uint32, base.SampleNumber) - for i := range sizes { - sizes[i] = base.SampleUniformSize - } - if src.SampleUniformSize > 0 { - for i := uint32(0); i < src.SampleNumber; i++ { - sizes = append(sizes, src.SampleUniformSize) - } - } else { - sizes = append(sizes, src.SampleSize...) - } - base.SampleUniformSize = 0 - base.SampleSize = sizes - base.SampleNumber = uint32(len(sizes)) - } - } else { - if src.SampleUniformSize > 0 { - for i := uint32(0); i < src.SampleNumber; i++ { - base.SampleSize = append(base.SampleSize, src.SampleUniformSize) - } - } else { - base.SampleSize = append(base.SampleSize, src.SampleSize...) - } - base.SampleNumber = uint32(len(base.SampleSize)) + cmd := exec.Command("ffmpeg", + "-f", "concat", + "-safe", "0", + "-i", filelist, + "-c", "copy", + "-y", output, + ) + if out, err := cmd.CombinedOutput(); err != nil { + return fmt.Errorf("ffmpeg concat 失败: %w, 输出: %s", err, string(out)) } return nil } -// mergeTimeToSample 合并 stts 时域采样表(相邻相同 delta 的条目合并) -func mergeTimeToSample(base, src *mp4.SttsBox) { - if src == nil || len(src.SampleCount) == 0 { - return - } - if len(base.SampleCount) > 0 { - lastDelta := base.SampleTimeDelta[len(base.SampleTimeDelta)-1] - firstDelta := src.SampleTimeDelta[0] - if lastDelta == firstDelta { - base.SampleCount[len(base.SampleCount)-1] += src.SampleCount[0] - base.SampleCount = append(base.SampleCount, src.SampleCount[1:]...) - base.SampleTimeDelta = append(base.SampleTimeDelta, src.SampleTimeDelta[1:]...) - return - } - } - base.SampleCount = append(base.SampleCount, src.SampleCount...) - base.SampleTimeDelta = append(base.SampleTimeDelta, src.SampleTimeDelta...) -} - func (s *dramaService) downloadFile(ctx context.Context, url, dest string) error { resp, err := http.Get(url) if err != nil { @@ -1701,12 +1921,9 @@ func (s *dramaService) downloadFile(ctx context.Context, url, dest string) error } func (s *dramaService) probeVideo(path string) error { - f, err := mp4.ReadMP4File(path) - if err != nil { - return fmt.Errorf("视频文件无效: %w", err) - } - if f.Moov == nil { - return fmt.Errorf("视频文件缺少 moov box") + cmd := exec.Command("ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", path) + if out, err := cmd.CombinedOutput(); err != nil { + return fmt.Errorf("视频文件无效: %w, ffprobe 输出: %s", err, string(out)) } return nil } @@ -1751,14 +1968,19 @@ func cleanupEpisodeWorkspace(ctx context.Context, dramaTitle string, epIndex int } func calcSegDurs(episodeDuration int64, cfg *entity.ModelConfig) []int { - effectiveMax := cfg.MaxSingleDuration - if effectiveMax <= 0 { - effectiveMax = 30 - } - - minSingle := cfg.MinSingleDuration - if minSingle <= 0 { - minSingle = effectiveMax + // 从 video_schema.duration 读取模型单段时长约束 + effectiveMax := 15 // 默认值 + minSingle := 5 + if cfg.VideoSchema != "" { + var vs map[string]any + if err := json.Unmarshal([]byte(cfg.VideoSchema), &vs); err == nil { + if v := intVal(nested(vs, "parameters", "duration", "max"), 0); v > 0 { + effectiveMax = v + } + if v := intVal(nested(vs, "parameters", "duration", "min"), 0); v > 0 { + minSingle = v + } + } } if minSingle > effectiveMax { minSingle = effectiveMax @@ -1856,6 +2078,17 @@ func imageFileToBase64(path string) (string, error) { return "data:" + mime + ";base64," + base64.StdEncoding.EncodeToString(data), nil } +// parseMMSSToSeconds 将 "MM:SS" 格式的时间字符串转为总秒数 +func parseMMSSToSeconds(timeStr string) int { + parts := strings.Split(timeStr, ":") + if len(parts) == 2 { + m, _ := strconv.Atoi(parts[0]) + sec, _ := strconv.Atoi(parts[1]) + return m*60 + sec + } + return 0 +} + // ValidateUploadFile 校验上传文件的大小和格式是否符合模型配置约束 // 参数 fileSize 为文件字节数,fileName 为原始文件名 // 返回 error 表示文件不合规 diff --git a/shortdrama/service/episode_service.go b/shortdrama/service/episode_service.go index c7c3e87..c9dd201 100644 --- a/shortdrama/service/episode_service.go +++ b/shortdrama/service/episode_service.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path/filepath" + "sort" "strings" "time" @@ -50,18 +51,35 @@ func (s *dramaService) AddEpisode(ctx context.Context, dramaId int64, title, des } index = maxIdx + 1 } - id, err := dao.Episode.Insert(ctx, &entity.Episode{ - DramaId: dramaId, - Index: index, - Title: title, - Description: description, - Script: script, - Status: consts.EpisodeStatusPending, - }) - if err != nil { - return 0, err + // 无脚本时直接插入剧集(无需创建任务) + if script == "" { + return dao.Episode.Insert(ctx, &entity.Episode{ + DramaId: dramaId, Index: index, Title: title, + Description: description, Script: script, + Status: consts.EpisodeStatusPending, + }) } - return id, nil + // 有脚本时用事务同时写入剧集和任务 + var epId int64 + now := time.Now().Format("2006-01-02 15:04:05") + err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + r, e := tx.Model(public.TableNameEpisode).Ctx(ctx).Data(g.Map{ + "drama_id": dramaId, "idx": index, "title": title, + "description": description, "script": script, + "status": consts.EpisodeStatusPending, + "created_at": now, "updated_at": now, + }).Insert() + if e != nil { + return e + } + id, e := r.LastInsertId() + if e != nil { + return e + } + epId = id + return createPendingTasks(ctx, dramaId, epId, script, tx) + }) + return epId, err } func (s *dramaService) UpdateEpisode(ctx context.Context, dramaId, epId int64, title, description, script string, index int) error { @@ -80,17 +98,29 @@ func (s *dramaService) UpdateEpisode(ctx context.Context, dramaId, epId int64, t } if script != "" { e.Script = script - if e.Status == "" { - e.Status = consts.EpisodeStatusPending - } + e.Status = consts.EpisodeStatusPending } if index > 0 { e.Index = index } - if err := dao.Episode.Update(ctx, epId, e); err != nil { - return err - } - return nil + + needsTaskUpdate := script != "" + return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 更新剧集 + if _, e := tx.Model(public.TableNameEpisode).Ctx(ctx).Data(e).Where("id", epId).Update(); e != nil { + return e + } + // 脚本变动时重创建任务 + if needsTaskUpdate { + if _, e := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Where("episode_id", epId).Delete(); e != nil { + return e + } + if e := createPendingTasks(ctx, dramaId, epId, script, tx); e != nil { + return fmt.Errorf("重新创建待生成任务失败: %w", e) + } + } + return nil + }) } func (s *dramaService) DeleteEpisode(ctx context.Context, dramaId, epId int64) error { @@ -257,7 +287,322 @@ func (s *dramaService) buildScriptGenUserInput(d *entity.Drama, episodeTitle, de b.WriteString("\n") } - b.WriteString(fmt.Sprintf("【要求】\n请根据以上剧情描述,为当前剧集创作一份详细的剧本。剧情描述是核心创作依据,请严格围绕其内容展开。\n\n输出格式:JSON数组,每个元素是一个镜头对象(shot),包含以下字段:\n- index: 镜头序号(从1开始)\n- startTime: 开始时间(格式MM:SS)\n- endTime: 结束时间(格式MM:SS)\n- event: 事件描述(该镜头中发生的情节概括)\n- cameraMovement: 运镜方式,从以下标准类型中选择一种:固定镜头、推、拉、摇、移、跟、升、降、旋转、晃动、航拍\n- characters: 出演人物数组,填写演员名称,如[\"张三\", \"李四\"],从「可用演员」中选择\n- scene: 场景名称,从「可用场景」中选择\n- props: 道具数组,填写道具名称,如[\"剑\", \"酒杯\"],从「可用道具」中选择\n\n直接输出JSON数组,不要markdown代码块标记,不要其他任何内容。\n\n要求:\n1. 剧本必须紧扣剧情描述展开\n2. 所有镜头时长之和应等于 %d 秒(每个镜头5-15秒不等)\n3. 优先使用提供的演员、场景和道具,如需新增请合理创作\n4. 每个镜头的characters、scene、props字段必须从提供的可用列表中选取名称,确保与参考素材一致\n5. 对话自然流畅,情节有起伏\n6. 镜头数量建议6-15个\n", d.EpisodeDuration)) + b.WriteString(fmt.Sprintf("【要求】\n请根据以上剧情描述,为当前剧集创作一份详细的剧本。剧情描述是核心创作依据,请严格围绕其内容展开。\n\n输出格式:JSON数组,每个元素是一个镜头对象(shot),包含以下字段:\n- index: 镜头序号(从1开始)\n- startTime: 开始时间(格式MM:SS)\n- endTime: 结束时间(格式MM:SS)\n- event: 事件描述(该镜头中发生的情节概括)\n- cameraMovement: 运镜方式,从以下标准类型中选择一种:固定镜头、推、拉、摇、移、跟、升、降、旋转、晃动、航拍\n- characters: 出演人物数组,填写演员名称,如[\"张三\", \"李四\"],从「可用演员」中选择\n- scene: 场景名称,从「可用场景」中选择\n- props: 道具名称数组,如[\"剑\", \"酒杯\"],从「可用道具」中选择\n\n直接输出JSON数组,不要markdown代码块标记,不要其他任何内容。\n\n要求:\n1. 剧本必须紧扣剧情描述展开\n2. 所有镜头时长之和应等于 %d 秒(每个镜头%d-%d秒不等)\n3. 优先使用提供的演员、场景和道具,如需新增请合理创作\n4. 每个镜头的characters、scene、props字段必须从提供的可用列表中选取名称,确保与参考素材一致\n5. 对话自然流畅,情节有起伏\n6. 镜头数量建议6-15个\n", d.EpisodeDuration, d.MinShotDuration, d.MaxShotDuration)) return b.String() } + +// createPendingTasks 为剧集创建待生成任务(按 calcSegDurs 拆段),每段脚本只包含本段对应部分 +func createPendingTasks(ctx context.Context, dramaId, epId int64, script string, tx gdb.TX) error { + d, err := dao.Drama.GetOne(ctx, dramaId) + if err != nil || d == nil { + return fmt.Errorf("短剧不存在: %d", dramaId) + } + modelCfg := ConfigService.Get(ctx) + + // 预加载参考素材(演员优先,场景其次,道具最后) + chars, _, _ := dao.Character.ListPageByDrama(ctx, dramaId, 1, -1) + scenes, _ := dao.Scene.ListByDrama(ctx, dramaId) + props, _ := dao.Prop.ListByDrama(ctx, dramaId) + + // 读取反向提示词 + negativePrompt := "" + if data, err := os.ReadFile("negative_prompt.md"); err == nil { + negativePrompt = strings.TrimSpace(string(data)) + } + + // 从 video_schema 读取参考素材上限和默认参数 + refMax := 5 + var vs map[string]any + if modelCfg.VideoSchema != "" { + json.Unmarshal([]byte(modelCfg.VideoSchema), &vs) + } + if vs != nil { + if v := nested(vs, "input", "reference_urls", "total_max"); v != nil { + if n, ok := v.(float64); ok { + refMax = int(n) + } + } + } + + // 从 video_schema 读取 prompt 最大字符数 + promptMaxChars := intVal(nested(vs, "input", "prompt", "max_chars"), 0) + + // 构建参考列表:演员 base64 → 场景图片 base64 → 道具图片 base64(与提交视频时顺序一致) + type namedRef struct { + name string + url string + } + var namedRefs []namedRef + for _, ch := range chars { + if len(namedRefs) >= refMax { + break + } + if ch.PortraitPath != "" { + namedRefs = append(namedRefs, namedRef{name: ch.Name, url: ch.PortraitPath}) + } + } + for _, sc := range scenes { + if len(namedRefs) >= refMax { + break + } + if sc.ImagePath != "" { + namedRefs = append(namedRefs, namedRef{name: sc.Name, url: sc.ImagePath}) + } + } + for _, p := range props { + if len(namedRefs) >= refMax { + break + } + if p.ImagePath != "" { + namedRefs = append(namedRefs, namedRef{name: p.Name, url: p.ImagePath}) + } + } + + // 读取拆段时长约束(与 calcSegDurs 逻辑一致) + effectiveMax := 15 + minSingle := 5 + if vs != nil { + if v := intVal(nested(vs, "parameters", "duration", "max"), 0); v > 0 { + effectiveMax = v + } + if v := intVal(nested(vs, "parameters", "duration", "min"), 0); v > 0 { + minSingle = v + } + } + if minSingle > effectiveMax { + minSingle = effectiveMax + } + + // 从 video_schema 读取默认 parameters(含 duration/audio/watermark 等) + params := map[string]any{} + if vs != nil { + if paramsDef := nested(vs, "parameters"); paramsDef != nil { + if pm, ok := paramsDef.(map[string]any); ok { + for k, v := range pm { + paramDef, ok := v.(map[string]any) + if !ok { + continue + } + // 如果有 supported_models 且不包含当前模型,跳过 + if sm, ok := paramDef["supported_models"]; ok { + if models, ok := sm.([]any); ok { + found := false + for _, m := range models { + if ms, ok := m.(string); ok && ms == modelCfg.VideoModelName { + found = true + break + } + } + if !found { + continue + } + } + } + if def, ok := paramDef["default"]; ok { + params[k] = def + } + } + } + } + // 尺寸映射:从 drama 的 Resolution/AspectRatio 查 video_schema + if sizes := nested(vs, "parameters", "size", "sizes"); sizes != nil { + if sm, ok := sizes.(map[string]any); ok { + if v := resolveSizeFromSchema(sm, d.Resolution, d.AspectRatio); v != "" { + params["size"] = v + } + } + } + } + + // 预构建名称替换信息(characterN 引用) + type _nameRep struct{ name, label string } + var _reps []_nameRep + if len(namedRefs) > 0 { + for j, nr := range namedRefs { + _reps = append(_reps, _nameRep{nr.name, fmt.Sprintf("character%d", j+1)}) + } + sort.Slice(_reps, func(a, b int) bool { return len(_reps[a].name) > len(_reps[b].name) }) + } + var _refStr string + if len(_reps) > 0 { + var _parts []string + for _, r := range _reps { + _parts = append(_parts, fmt.Sprintf("%s=%s", r.label, r.name)) + } + _refStr = fmt.Sprintf("。角色引用说明:%s", strings.Join(_parts, "、")) + } + _refLen := len([]rune(_refStr)) + + // buildFinalPrompt 执行名称替换并追加引用说明 + buildFinalPrompt := func(raw string) string { + for _, r := range _reps { + raw = strings.ReplaceAll(raw, r.name, r.label) + } + return raw + _refStr + } + + // refURLs 在所有段中相同 + refURLs := make([]string, len(namedRefs)) + for j, nr := range namedRefs { + refURLs[j] = nr.url + } + + // ============ 按脚本类型分组 ============ + type _taskGroup struct { + promptText string + dur int + } + var taskGroups []_taskGroup + + if domain.IsShotsJSON(script) { + // JSON 镜头数组:按镜头分组,累加连续镜头直到触及时长或字符上限 + var allShots []domain.Shot + if err := json.Unmarshal([]byte(script), &allShots); err != nil || len(allShots) == 0 { + return fmt.Errorf("解析镜头脚本失败: %w", err) + } + type _shotGroup struct { + shots []domain.Shot + totalDur int + } + var cur _shotGroup + for _, sh := range allShots { + shDur := parseMMSSToSeconds(sh.EndTime) - parseMMSSToSeconds(sh.StartTime) + if shDur <= 0 { + shDur = 1 + } + // 计算加入当前镜头后的候选组总时长和提示词长度 + candShots := make([]domain.Shot, len(cur.shots)+1) + copy(candShots, cur.shots) + candShots[len(cur.shots)] = sh + candDur := cur.totalDur + shDur + candPrompt := buildFinalPrompt(domain.ShotsToText(candShots)) + + exceedDur := len(cur.shots) > 0 && candDur > effectiveMax + exceedChars := promptMaxChars > 0 && len([]rune(candPrompt)) > promptMaxChars + + if exceedDur || exceedChars { + // 当前组已满,保存并开启新组 + taskGroups = append(taskGroups, _taskGroup{ + promptText: buildFinalPrompt(domain.ShotsToText(cur.shots)), + dur: cur.totalDur, + }) + cur = _shotGroup{shots: []domain.Shot{sh}, totalDur: shDur} + } else { + cur.shots = candShots + cur.totalDur = candDur + } + } + if len(cur.shots) > 0 { + taskGroups = append(taskGroups, _taskGroup{ + promptText: buildFinalPrompt(domain.ShotsToText(cur.shots)), + dur: cur.totalDur, + }) + } + } else { + // 纯文本脚本:按 calcSegDurs 拆段 + splitScriptForSegment 切分(保留原逻辑) + segDurs := calcSegDurs(d.EpisodeDuration, modelCfg) + segStartTimes := make([]int, len(segDurs)) + for i := 1; i < len(segDurs); i++ { + segStartTimes[i] = segStartTimes[i-1] + segDurs[i-1] + } + totalDur := d.EpisodeDuration + + if promptMaxChars > 0 { + totalRunes := len([]rune(script)) + if totalRunes > 0 && _refLen < promptMaxChars { + charsPerSeg := promptMaxChars - _refLen + maxDurByChars := charsPerSeg * int(totalDur) / totalRunes + if maxDurByChars > 0 && maxDurByChars < effectiveMax { + if maxDurByChars < minSingle { + maxDurByChars = minSingle + } + segDurs = calcSegmentDurations(int(totalDur), maxDurByChars, minSingle) + segStartTimes = make([]int, len(segDurs)) + for i := 1; i < len(segDurs); i++ { + segStartTimes[i] = segStartTimes[i-1] + segDurs[i-1] + } + } + } + } + + for i, segDur := range segDurs { + segScript := splitScriptForSegment(script, segStartTimes[i], segDur, int(totalDur)) + taskGroups = append(taskGroups, _taskGroup{ + promptText: buildFinalPrompt(segScript), + dur: segDur, + }) + } + } + + // ============ 插入任务 ============ + for i, tg := range taskGroups { + segParams := make(map[string]any, len(params)+1) + for k, v := range params { + segParams[k] = v + } + segParams["duration"] = tg.dur + + bodyJSON, _ := json.Marshal(map[string]any{ + "model": modelCfg.VideoModelName, + "input": map[string]any{ + "prompt": tg.promptText, + "negative_prompt": negativePrompt, + "reference_urls": refURLs, + }, + "parameters": segParams, + }) + + _, err := tx.Model(public.TableNameGenerationTask).Ctx(ctx).Data(g.Map{ + "drama_id": dramaId, + "episode_id": epId, + "segment_idx": i, + "status": consts.TaskStatusPending, + "script": string(bodyJSON), + "duration": tg.dur, + "num_segments": len(taskGroups), + }).Insert() + if err != nil { + return fmt.Errorf("创建第%d段待生成任务失败: %w", i+1, err) + } + } + return nil +} + +// splitScriptForSegment 将整集脚本按时间范围切分为对应段落的脚本内容 +func splitScriptForSegment(fullScript string, segStartTime, segDur, totalDur int) string { + if domain.IsShotsJSON(fullScript) { + var shots []domain.Shot + if err := json.Unmarshal([]byte(fullScript), &shots); err != nil { + return fullScript + } + segEndTime := segStartTime + segDur + var filtered []domain.Shot + for _, s := range shots { + shStart := parseMMSSToSeconds(s.StartTime) + shEnd := parseMMSSToSeconds(s.EndTime) + if shEnd <= segStartTime || shStart >= segEndTime { + continue + } + filtered = append(filtered, s) + } + if len(filtered) > 0 { + return domain.ShotsToText(filtered) + } + return "" + } + // 纯文本脚本:按时长比例切分字符 + runes := []rune(fullScript) + if len(runes) == 0 || totalDur <= 0 { + return fullScript + } + startRune := len(runes) * segStartTime / totalDur + endRune := len(runes) * (segStartTime + segDur) / totalDur + if startRune >= len(runes) { + return "" + } + if endRune > len(runes) { + endRune = len(runes) + } + return string(runes[startRune:endRune]) +} diff --git a/shortdrama/service/generation_context.go b/shortdrama/service/generation_context.go index 8c09ba3..688eeeb 100644 --- a/shortdrama/service/generation_context.go +++ b/shortdrama/service/generation_context.go @@ -20,12 +20,13 @@ type OrderedRef struct { Index int // 在 OrderedRefs 中的位置 } -// GenerationContext 一次生成会话的上下文,预加载当前短剧的演员/场景/道具数据 +// GenerationContext 一次生成会话的上下文,预加载当前短剧的演员/场景/道具/背景音乐数据 type GenerationContext struct { - Drama *entity.Drama - Characters []*entity.Character - Scenes []*entity.Scene - Props []*entity.Prop + Drama *entity.Drama + Characters []*entity.Character + Scenes []*entity.Scene + Props []*entity.Prop + BackgroundMusic []*entity.BackgroundMusic // RefIndex 按名称索引,用于 Agent 输出匹配 RefIndex RefIndex @@ -51,12 +52,18 @@ func BuildGenerationContext(ctx context.Context, drama *entity.Drama) (*Generati return nil, fmt.Errorf("加载道具失败: %w", err) } + bgmList, err := dao.BackgroundMusic.ListByDrama(ctx, drama.Id) + if err != nil { + return nil, fmt.Errorf("加载背景音失败: %w", err) + } + ctx2 := &GenerationContext{ - Drama: drama, - Characters: characters, - Scenes: scenes, - Props: props, - RefIndex: make(RefIndex), + Drama: drama, + Characters: characters, + Scenes: scenes, + Props: props, + BackgroundMusic: bgmList, + RefIndex: make(RefIndex), } // 构建 RefIndex diff --git a/test.json b/test.json new file mode 100644 index 0000000..076c728 --- /dev/null +++ b/test.json @@ -0,0 +1 @@ +{"model": "wan2.6-r2v", "input": {"prompt": {"required": true, "type": "string", "max_chars": 1500, "description": "文本提示词。支持中英文,每个汉字/字母/标点占一个字符,超过部分自动截断。通过 character1、character2 引用参考角色,每个参考仅包含单一角色。模型仅通过此方式识别参考中的角色"}, "negative_prompt": {"required": false, "type": "string", "max_chars": 500, "description": "反向提示词,用来描述不希望在视频画面中出现的内容,可以对视频画面进行限制"}, "reference_urls": {"required": true, "type": "array", "items": "string", "ref_ordering": "按数组顺序定义角色顺序,第1个URL对应character1,第2个对应character2,依此类推。每个参考文件仅包含一个主体角色", "total_max": 5, "image_max": 5, "video_max": 3, "video_formats": ["MP4", "MOV"], "video_duration_sec": {"min": 1, "max": 30}, "video_max_size_mb": 100, "image_formats": ["JPEG", "JPG", "PNG", "BMP", "WEBP"], "image_note": "PNG不支持透明通道", "image_resolution_px": {"min": 240, "max": 8000}, "image_max_size_mb": 20}}, "parameters": {"size": {"required": false, "type": "string", "format": "{width}*{height}", "default": "1920*1080", "description": "视频分辨率,格式为宽*高。必须设置为具体数值(如1280*720),而不是1:1或720P", "sizes": {"720P": {"9:16": "720*1280", "16:9": "1280*720", "1:1": "960*960", "4:3": "1088*832", "3:4": "832*1088"}, "1080P": {"9:16": "1080*1920", "16:9": "1920*1080", "1:1": "1440*1440", "4:3": "1632*1248", "3:4": "1248*1632"}}}, "duration": {"required": false, "type": "integer", "min": 2, "max": 10, "default": 5, "description": "生成视频的时长,单位为秒"}, "shot_type": {"required": false, "type": "string", "enum": ["single", "multi"], "default": "single", "description": "镜头类型。参数优先级:shot_type > prompt。single=单镜头视频,multi=多镜头视频"}, "audio": {"required": false, "type": "boolean", "default": true, "supported_models": ["wan2.6-r2v-flash"], "description": "是否生成有声视频"}, "watermark": {"required": false, "type": "boolean", "default": false}, "seed": {"required": false, "type": "integer", "min": 0, "max": 2147483647}}} \ No newline at end of file diff --git a/tools/split_merged/split_merged.go b/tools/split_merged/split_merged.go new file mode 100644 index 0000000..f371f47 --- /dev/null +++ b/tools/split_merged/split_merged.go @@ -0,0 +1,263 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "strconv" + + "github.com/Eyevinn/mp4ff/mp4" +) + +func main() { + if len(os.Args) < 4 { + fmt.Println("用法: split_merged <输入文件> <输出目录> <段数>") + os.Exit(1) + } + inputPath := os.Args[1] + outDir := os.Args[2] + numSegments, err := strconv.Atoi(os.Args[3]) + if err != nil || numSegments <= 0 { + fmt.Printf("无效的段数: %s\n", os.Args[3]) + os.Exit(1) + } + + // 读取合并文件 + f, err := mp4.ReadMP4File(inputPath) + if err != nil { + fmt.Printf("读取文件失败: %v\n", err) + os.Exit(1) + } + + if err := os.MkdirAll(outDir, 0755); err != nil { + fmt.Printf("创建输出目录失败: %v\n", err) + os.Exit(1) + } + + // 收集每轨道按段划分的 sample 范围 + type trakInfo struct { + trak *mp4.TrakBox + samples uint32 // 总 sample 数 + perSeg uint32 // 每段 sample 数 + } + + var traks []trakInfo + for _, trak := range f.Moov.Traks { + stbl := trak.Mdia.Minf.Stbl + if stbl.Stsz != nil { + totalSamples := stbl.Stsz.SampleNumber + perSeg := totalSamples / uint32(numSegments) + traks = append(traks, trakInfo{ + trak: trak, + samples: totalSamples, + perSeg: perSeg, + }) + fmt.Printf("轨道 %s: 总 %d samples, 每段 %d\n", trak.Mdia.Hdlr.HandlerType, totalSamples, perSeg) + } + } + + if len(traks) == 0 { + fmt.Println("未找到可分割的轨道") + os.Exit(1) + } + + // 逐段切分 + for seg := 0; seg < numSegments; seg++ { + outPath := filepath.Join(outDir, fmt.Sprintf("seg_%d.mp4", seg)) + fmt.Printf("切分第 %d 段 -> %s\n", seg, outPath) + + outFile := mp4.NewFile() + outFile.Ftyp = f.Ftyp + outFile.Moov = f.Moov // 稍后会修改 + + // 为每轨道创建仅包含本段 samples 的 stbl + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + startSample := seg * int(ti.perSeg) + endSample := startSample + int(ti.perSeg) + if seg == numSegments-1 { + endSample = int(ti.samples) // 最后一段拿剩余所有 samples + } + + fmt.Printf(" 轨道 %s: samples [%d, %d)\n", ti.trak.Mdia.Hdlr.HandlerType, startSample, endSample) + + // 拷贝 stsz entry(只保留本段范围) + if stbl.Stsz != nil { + newStsz := &mp4.StszBox{} + if stbl.Stsz.SampleUniformSize > 0 { + newStsz.SampleUniformSize = stbl.Stsz.SampleUniformSize + newStsz.SampleNumber = uint32(endSample - startSample) + } else { + newStsz.SampleSize = make([]uint32, endSample-startSample) + copy(newStsz.SampleSize, stbl.Stsz.SampleSize[startSample:endSample]) + newStsz.SampleNumber = uint32(len(newStsz.SampleSize)) + } + stbl.Stsz = newStsz + } + + // 计算本段 chunk 范围:通过 stsc 找到对应的 chunk + // 直接根据 perSeg chunks 计算。每段 chunks = totalChunks / numSegments + chunkCount := uint32(0) + if stbl.Stco != nil { + chunkCount = uint32(len(stbl.Stco.ChunkOffset)) + } else if stbl.Co64 != nil { + chunkCount = uint32(len(stbl.Co64.ChunkOffset)) + } + perSegChunks := chunkCount / uint32(numSegments) + startChunk := seg * int(perSegChunks) + endChunk := startChunk + int(perSegChunks) + if seg == numSegments-1 { + endChunk = int(chunkCount) + } + + // 重新构建 stco(只保留本段 chunk) + if stbl.Stco != nil { + oldChunks := stbl.Stco.ChunkOffset + stbl.Stco.ChunkOffset = oldChunks[startChunk:endChunk] + // 调整偏移量:减去 mdat 中本段数据的起始位置 + baseOffset := oldChunks[startChunk] + for i := range stbl.Stco.ChunkOffset { + stbl.Stco.ChunkOffset[i] -= baseOffset + } + } + if stbl.Co64 != nil { + oldChunks := stbl.Co64.ChunkOffset + stbl.Co64.ChunkOffset = oldChunks[startChunk:endChunk] + baseOffset := oldChunks[startChunk] + for i := range stbl.Co64.ChunkOffset { + stbl.Co64.ChunkOffset[i] -= baseOffset + } + } + + // 重新构建 stsc(只保留本段 chunk 的 entries) + if stbl.Stsc != nil { + var newEntries []mp4.StscEntry + for _, e := range stbl.Stsc.Entries { + if e.FirstChunk-1 >= uint32(startChunk) && e.FirstChunk-1 < uint32(endChunk) { + newEntries = append(newEntries, mp4.StscEntry{ + FirstChunk: e.FirstChunk - uint32(startChunk), + SamplesPerChunk: e.SamplesPerChunk, + SampleDescriptionIndex: e.SampleDescriptionIndex, + }) + } + } + stbl.Stsc.Entries = newEntries + } + + // 重设 stts(重建,只保留本段 samples 对应的时间) + if stbl.Stts != nil { + newStts := &mp4.SttsBox{} + currentSample := uint32(0) + for i := range stbl.Stts.SampleCount { + count := stbl.Stts.SampleCount[i] + delta := stbl.Stts.SampleTimeDelta[i] + nextSample := currentSample + count + + if nextSample <= uint32(startSample) { + currentSample = nextSample + continue + } + if currentSample >= uint32(endSample) { + break + } + + overlapStart := uint32(0) + if currentSample < uint32(startSample) { + overlapStart = uint32(startSample) - currentSample + } + overlapEnd := count + if nextSample > uint32(endSample) { + overlapEnd = uint32(endSample) - currentSample + } + + if overlapStart < overlapEnd { + newStts.SampleCount = append(newStts.SampleCount, overlapEnd-overlapStart) + newStts.SampleTimeDelta = append(newStts.SampleTimeDelta, delta) + } + currentSample = nextSample + } + stbl.Stts = newStts + } + + // 修正 stco 偏移:加上 ftyp+moov+mdat_header 偏移 + mdatDataStart := uint32(0) // 稍后在写入时修正 + _ = mdatDataStart + } + + // 提取本段 mdat 数据 + mdatStart := uint32(0) + if len(traks) > 0 && traks[0].trak.Mdia.Minf.Stbl.Stco != nil { + // 使用第一个轨道的第一个 chunk 偏移量作为数据起始位置 + mdatStart = traks[0].trak.Mdia.Minf.Stbl.Stco.ChunkOffset[0] + } + + // 重构 mdat:从合并文件提取本段数据 + outFile.Mdat = &mp4.MdatBox{} + mdatPayloadLen := uint64(0) + // 计算本段 mdat 数据长度 + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + if stbl.Stsz != nil { + if stbl.Stsz.SampleUniformSize > 0 { + mdatPayloadLen += uint64(stbl.Stsz.SampleUniformSize) * uint64(stbl.Stsz.SampleNumber) + } else { + for _, s := range stbl.Stsz.SampleSize { + mdatPayloadLen += uint64(s) + } + } + } + } + + if mdatPayloadLen > 0 { + segData := make([]byte, mdatPayloadLen) + // 从原始 mdat 拷贝 + offset := uint64(mdatStart) + _ = offset + copyPos := uint64(0) + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + if stbl.Stsz != nil { + if stbl.Stsz.SampleUniformSize > 0 { + dataLen := uint64(stbl.Stsz.SampleUniformSize) * uint64(stbl.Stsz.SampleNumber) + copy(segData[copyPos:], f.Mdat.Data[offset:offset+dataLen]) + copyPos += dataLen + offset += dataLen + } else { + for _, s := range stbl.Stsz.SampleSize { + copy(segData[copyPos:], f.Mdat.Data[offset:offset+uint64(s)]) + copyPos += uint64(s) + offset += uint64(s) + } + } + } + } + outFile.Mdat.SetData(segData) + } + + // 更新 mdhd/tkhd/mvhd 时长 + outFile.Moov.Mvhd = f.Moov.Mvhd // 拷贝原始 mvhd + // 简化处理:直接使用原始 mvhd 时长 + + // 重建 Children + outFile.Children = []mp4.Box{outFile.Ftyp, outFile.Moov, outFile.Mdat} + + // 修正 stco 偏移:调整到实际文件位置 + combinedBase := outFile.Ftyp.Size() + outFile.Moov.Size() + outFile.Mdat.HeaderSize() + for _, ti := range traks { + stbl := ti.trak.Mdia.Minf.Stbl + if stbl.Stco != nil { + for i := range stbl.Stco.ChunkOffset { + stbl.Stco.ChunkOffset[i] += uint32(combinedBase) + } + } + } + + if err := mp4.WriteToFile(outFile, outPath); err != nil { + fmt.Printf("写入 %s 失败: %v\n", outPath, err) + continue + } + fmt.Printf(" 完成: %s\n", outPath) + } + + fmt.Println("切分完成") +}