Merge branch 'develop' of https://github.com/HBAI-Ltd/Toonflow-app into develop
This commit is contained in:
commit
493ae5d3b6
@ -13,12 +13,13 @@
|
|||||||
### 2. 资产信息
|
### 2. 资产信息
|
||||||
|
|
||||||
```
|
```
|
||||||
资产信息[id, type, name], [id, type, name], ...
|
资产信息[id, type, name], [id, type, name, audio], ...
|
||||||
```
|
```
|
||||||
|
|
||||||
- `id`:资产唯一标识(如 `A001`)
|
- `id`:资产唯一标识(如 `A001`)
|
||||||
- `type`:资产类型,取值 `role`(角色)/ `scene`(场景)/ `prop`(道具)
|
- `type`:资产类型,取值 `role`(角色)/ `scene`(场景)/ `prop`(道具)
|
||||||
- `name`:资产名称(如 `沈辞`、`城楼`、`长剑`)
|
- `name`:资产名称(如 `沈辞`、`城楼`、`长剑`)
|
||||||
|
- `audio`:可选标记;存在时表示该资产带参考音频,编号规则会在该资产之后自动追加一个 `@参考N` 给该资产的参考音频(详见下文「参考引用编号规则」)
|
||||||
|
|
||||||
### 3. 分镜信息
|
### 3. 分镜信息
|
||||||
|
|
||||||
@ -87,19 +88,24 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 资产引用编号规则
|
## 参考引用编号规则
|
||||||
|
|
||||||
本 Skill 统一使用 `@图N ` 格式引用资产和分镜图,编号按输入顺序连续递增:
|
本 Skill 统一使用 `@参考N ` 格式引用资产、资产音频和分镜图,编号按输入顺序连续递增:
|
||||||
|
|
||||||
1. **资产**:按资产信息中 `[id, type, name]` 的出现顺序,从 `@图1 ` 开始编号(不区分 role / scene / prop)。**资产类型的出现顺序不固定**——可能先 scene 后 character,也可能 prop 在前、character 在后,或任意交替出现,编号严格按输入位置分配,不按类型归组
|
1. **资产(图片)**:按资产信息中 `[id, type, name(, audio)]` 的出现顺序,从 `@参考1 ` 开始编号(不区分 role / scene / prop)。**资产类型的出现顺序不固定**——可能先 scene 后 character,也可能 prop 在前、character 在后,或任意交替出现,编号严格按输入位置分配,不按类型归组
|
||||||
2. **分镜图**:每条 `<storyboardItem>` 对应一张分镜图,编号接续资产之后
|
2. **资产音频**:当某资产带 `audio` 字段时,紧跟在该资产编号之后**自动**追加一个 `@参考N+1`,归属为该资产的参考音频;下一条资产从 N+2 开始编号
|
||||||
3. **跳过无分镜图的条目**:当 `shouldGenerateImage="false"` 时,该分镜未生成图片,**不分配**分镜图编号,后续编号顺延
|
3. **分镜图**:每条 `<storyboardItem>` 对应一张分镜图,编号接续所有资产(含资产音频)之后
|
||||||
|
4. **跳过无分镜图的条目**:当 `shouldGenerateImage="false"` 时,该分镜未生成图片,**不分配**分镜图编号,后续编号顺延
|
||||||
|
5. **类型识别(关键)**:
|
||||||
|
- 图片参考 = type ∈ {role, scene, prop} 的资产 + 分镜图
|
||||||
|
- 音频参考 = 任一资产 `audio` 字段衍生出的编号
|
||||||
|
- 调用规则:音色绑定(`音色:@参考N`)只能用音频参考;参考定义里图片与音频条目要分别标注;**禁止把音频参考用作图片参考、或反之**
|
||||||
|
|
||||||
#### 示例
|
#### 示例
|
||||||
|
|
||||||
输入 3 个资产 + 2 条分镜:
|
输入 3 个资产(其中苏锦带 audio)+ 2 条分镜:
|
||||||
```
|
```
|
||||||
资产信息[A001, role, 沈辞], [A002, role, 苏锦], [A003, scene, 城楼]
|
资产信息[A001, role, 沈辞], [A002, role, 苏锦, audio], [A003, scene, 城楼]
|
||||||
```
|
```
|
||||||
```xml
|
```xml
|
||||||
<storyboardItem ...> <!-- 分镜1 -->
|
<storyboardItem ...> <!-- 分镜1 -->
|
||||||
@ -110,17 +116,20 @@
|
|||||||
|
|
||||||
| 输入项 | 引用标签 | 说明 |
|
| 输入项 | 引用标签 | 说明 |
|
||||||
|--------|----------|------|
|
|--------|----------|------|
|
||||||
| [A001, role, 沈辞] | `@图1 ` | 角色·沈辞 参考图 |
|
| [A001, role, 沈辞] | `@参考1 ` | 角色·沈辞 参考图 |
|
||||||
| [A002, role, 苏锦] | `@图2 ` | 角色·苏锦 参考图 |
|
| [A002, role, 苏锦, audio] | `@参考2 ` | 角色·苏锦 参考图 |
|
||||||
| [A003, scene, 城楼] | `@图3 ` | 场景·城楼 参考图 |
|
| ↑ 上一条带 audio | `@参考3 ` | 角色·苏锦 参考音频(自动顺延) |
|
||||||
| storyboardItem 第1条 | `@图4 ` | 分镜图1 |
|
| [A003, scene, 城楼] | `@参考4 ` | 场景·城楼 参考图 |
|
||||||
| storyboardItem 第2条 | `@图5 ` | 分镜图2 |
|
| storyboardItem 第1条 | `@参考5 ` | 分镜图1 |
|
||||||
|
| storyboardItem 第2条 | `@参考6 ` | 分镜图2 |
|
||||||
|
|
||||||
|
> 表格用于讲解编号分配;实际「参考定义」输出时音频不另起一行,而是写在所属资产行尾的「,参考音频为:@参考N」。
|
||||||
|
|
||||||
**混合顺序示例**
|
**混合顺序示例**
|
||||||
|
|
||||||
输入 3 个资产(场景在前)+ 2 条分镜:
|
输入 3 个资产(场景在前,苏锦带 audio)+ 2 条分镜:
|
||||||
```
|
```
|
||||||
资产信息[A003, scene, 城楼], [A001, role, 沈辞], [A002, role, 苏锦]
|
资产信息[A003, scene, 城楼], [A001, role, 沈辞], [A002, role, 苏锦, audio]
|
||||||
```
|
```
|
||||||
```xml
|
```xml
|
||||||
<storyboardItem ...> <!-- 分镜1 -->
|
<storyboardItem ...> <!-- 分镜1 -->
|
||||||
@ -131,22 +140,23 @@
|
|||||||
|
|
||||||
| 输入项 | 引用标签 | 说明 |
|
| 输入项 | 引用标签 | 说明 |
|
||||||
|--------|----------|------|
|
|--------|----------|------|
|
||||||
| [A003, scene, 城楼] | `@图1 ` | 场景·城楼 参考图 |
|
| [A003, scene, 城楼] | `@参考1 ` | 场景·城楼 参考图 |
|
||||||
| [A001, role, 沈辞] | `@图2 ` | 角色·沈辞 参考图 |
|
| [A001, role, 沈辞] | `@参考2 ` | 角色·沈辞 参考图 |
|
||||||
| [A002, role, 苏锦] | `@图3 ` | 角色·苏锦 参考图 |
|
| [A002, role, 苏锦, audio] | `@参考3 ` | 角色·苏锦 参考图 |
|
||||||
| storyboardItem 第1条 | `@图4 ` | 分镜图1 |
|
| ↑ 上一条带 audio | `@参考4 ` | 角色·苏锦 参考音频(自动顺延) |
|
||||||
| storyboardItem 第2条 | `@图5 ` | 分镜图2 |
|
| storyboardItem 第1条 | `@参考5 ` | 分镜图1 |
|
||||||
|
| storyboardItem 第2条 | `@参考6 ` | 分镜图2 |
|
||||||
|
|
||||||
> **关键**:此例中 `@图1 ` 是场景而非角色,`@图2 ` `@图3 ` 才是角色。生成提示词时,必须根据资产的实际 `type` 字段确定引用方式,而非根据编号大小假定类型。
|
> **关键**:此例中 `@参考1 ` 是场景而非角色,`@参考2 ` `@参考3 ` 才是角色,`@参考4 ` 是音频而非图片。生成提示词时,必须根据资产的实际 `type` 字段与是否有 `audio` 字段确定引用方式,不能仅看编号大小,更不能把音频参考当图片用。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Seedance 2.0 提示词生成规则
|
## Seedance 2.0 提示词生成规则
|
||||||
|
|
||||||
### 核心原则
|
### 核心原则
|
||||||
- **结构化12维编码**:统一用 `@图N ` 引用资产和分镜图,时长 `{N}s`
|
- **结构化12维编码**:统一用 `@参考N ` 引用资产、资产音频和分镜图,时长 `{N}s`
|
||||||
- **最前面先定义图片映射**:先输出“图片定义”段,集中声明 `@图N : 主体名字/场景名字,简述`;后续分镜正文只使用主体名字,不再写 `@图N `
|
- **最前面先定义参考映射**:先输出”参考定义”段,集中声明 `@参考N : 主体名字/场景名字,简述`;带 audio 的资产在同一行尾追加「,参考音频为:@参考N+1」(音频不另起一行,但占用编号);后续分镜正文只使用主体名字,不再写 `@参考N `
|
||||||
- **音色按三级优先处理**(有台词时必填):① 角色资产音色描述(原文照搬不得润色)→ ② 角色资产参考音频(`@` 绑定)→ ③ 都没有则按角色特征生成 9 维度描述
|
- **音色按三级优先处理**(有台词时必填):① 角色资产音色描述(原文照搬不得润色)→ ② 角色资产参考音频(`@参考N` 绑定)→ ③ 都没有则按角色特征生成 9 维度描述
|
||||||
- **秒级时长控制**:单分镜时长最低 1s
|
- **秒级时长控制**:单分镜时长最低 1s
|
||||||
- **中文提示词**
|
- **中文提示词**
|
||||||
- **严格遵循 videoDesc**:每条分镜的描述内容严格基于 videoDesc 中的画面描述、时长、景别、运镜、角色动作、情绪、光影氛围、台词、音效字段生成,不编造额外内容
|
- **严格遵循 videoDesc**:每条分镜的描述内容严格基于 videoDesc 中的画面描述、时长、景别、运镜、角色动作、情绪、光影氛围、台词、音效字段生成,不编造额外内容
|
||||||
@ -155,16 +165,18 @@
|
|||||||
|
|
||||||
### prompt 生成模板
|
### prompt 生成模板
|
||||||
|
|
||||||
> **注意**:`@图{编号}` 仅用于最前面的“图片定义”段。分镜正文中禁止再写 `@图{编号}`,统一改用主体名字/场景名字。
|
> **注意**:`@参考{编号}` 仅用于最前面的"参考定义"段。分镜正文中禁止再写 `@参考{编号}`,统一改用主体名字/场景名字。
|
||||||
|
>
|
||||||
|
> 若资产带 audio,则把该音频写在所属资产同一行尾部,格式为 `@参考K: {资产名字},{简述},参考音频为:@参考K+1`;音频本身**不另起一行**,但仍占用编号 K+1,下一条资产从 K+2 开始。
|
||||||
|
|
||||||
**单分镜模板:**
|
**单分镜模板:**
|
||||||
```
|
```
|
||||||
画面风格和类型: {风格}, {色调}, {类型}
|
画面风格和类型: {风格}, {色调}, {类型}
|
||||||
|
|
||||||
图片定义:
|
参考定义:
|
||||||
@图1: {资产1名字},{简述}
|
@参考1: {资产1名字},{简述}
|
||||||
@图2: {资产2名字},{简述}
|
@参考2: {资产2名字},{简述}
|
||||||
@图N: {资产N名字},{简述}
|
@参考N: {资产N名字},{简述}
|
||||||
...
|
...
|
||||||
|
|
||||||
生成一个由以下 1 个分镜组成的视频:
|
生成一个由以下 1 个分镜组成的视频:
|
||||||
@ -179,10 +191,10 @@
|
|||||||
```
|
```
|
||||||
画面风格和类型: {风格}, {色调}, {类型}
|
画面风格和类型: {风格}, {色调}, {类型}
|
||||||
|
|
||||||
图片定义:
|
参考定义:
|
||||||
@图1: {资产1名字},{简述}
|
@参考1: {资产1名字},{简述}
|
||||||
@图2: {资产2名字},{简述}
|
@参考2: {资产2名字},{简述}
|
||||||
@图N: {资产N名字},{简述}
|
@参考N: {资产N名字},{简述}
|
||||||
...
|
...
|
||||||
|
|
||||||
生成一个由以下 {N} 个分镜组成的视频:
|
生成一个由以下 {N} 个分镜组成的视频:
|
||||||
@ -205,13 +217,13 @@
|
|||||||
{角色名字} 说:「{台词内容}」音色:{角色资产音色描述原文}
|
{角色名字} 说:「{台词内容}」音色:{角色资产音色描述原文}
|
||||||
```
|
```
|
||||||
|
|
||||||
**情况 2:角色资产带"参考音频"(无音色描述)** → 以 `@` 方式绑定参考音频
|
**情况 2:角色资产带"参考音频"(无音色描述)** → 以 `@参考N` 方式绑定参考音频
|
||||||
|
|
||||||
```
|
```
|
||||||
{角色名字} 说:「{台词内容}」音色:@{参考音频引用}
|
{角色名字} 说:「{台词内容}」音色:@参考N
|
||||||
```
|
```
|
||||||
|
|
||||||
- 参考音频的引用标签由资产信息中的参考音频条目分配(与 `@图N` 同理,按输入顺序编号)
|
- 参考音频编号 = 该角色资产 `@参考N` 的下一个编号(依「参考引用编号规则」自动顺延,无需额外指定)
|
||||||
|
|
||||||
**情况 3:角色资产既无音色描述,也无参考音频** → 根据角色特征生成一段音色描述
|
**情况 3:角色资产既无音色描述,也无参考音频** → 根据角色特征生成一段音色描述
|
||||||
|
|
||||||
@ -239,9 +251,9 @@
|
|||||||
|
|
||||||
| 台词类型 | 格式 | 嘴型描述 |
|
| 台词类型 | 格式 | 嘴型描述 |
|
||||||
|----------|------|----------|
|
|----------|------|----------|
|
||||||
| 普通对白 | `{角色名字} 说:「{台词}」音色:{音色描述 / @参考音频 / 按角色特征生成}` | 角色嘴部开合说话 |
|
| 普通对白 | `{角色名字} 说:「{台词}」音色:{音色描述 / @参考N / 按角色特征生成}` | 角色嘴部开合说话 |
|
||||||
| 内心独白 | `{角色名字} 内心OS:「{台词}」音色:{音色描述 / @参考音频 / 按角色特征生成}` | 角色嘴部紧闭不动 |
|
| 内心独白 | `{角色名字} 内心OS:「{台词}」音色:{音色描述 / @参考N / 按角色特征生成}` | 角色嘴部紧闭不动 |
|
||||||
| 画外音 | `{角色名字} 画外音VO:「{台词}」音色:{音色描述 / @参考音频 / 按角色特征生成}` | 角色嘴部紧闭不动(或角色不在画面中) |
|
| 画外音 | `{角色名字} 画外音VO:「{台词}」音色:{音色描述 / @参考N / 按角色特征生成}` | 角色嘴部紧闭不动(或角色不在画面中) |
|
||||||
|
|
||||||
### 生成约束
|
### 生成约束
|
||||||
1. **中文提示词**
|
1. **中文提示词**
|
||||||
@ -249,17 +261,18 @@
|
|||||||
3. **严格遵循 videoDesc**:每条分镜内容严格基于 videoDesc 的画面描述、时长、景别、运镜、角色动作、情绪、光影氛围、台词、音效字段,不编造额外信息
|
3. **严格遵循 videoDesc**:每条分镜内容严格基于 videoDesc 的画面描述、时长、景别、运镜、角色动作、情绪、光影氛围、台词、音效字段,不编造额外信息
|
||||||
4. **台词不可缺失**:videoDesc 中有台词的分镜,必须完整输出台词和音色
|
4. **台词不可缺失**:videoDesc 中有台词的分镜,必须完整输出台词和音色
|
||||||
5. **台词类型正确标注**:普通对白用「说:」,内心独白用「内心OS:」,画外音用「画外音VO:」
|
5. **台词类型正确标注**:普通对白用「说:」,内心独白用「内心OS:」,画外音用「画外音VO:」
|
||||||
6. **先图片定义,后写分镜**:最前面必须先输出"图片定义"段,列出 `@图N : 名字,描述`
|
6. **先参考定义,后写分镜**:最前面必须先输出"参考定义"段,列出 `@参考N : 名字,描述`
|
||||||
7. **分镜正文禁用 `@图N `**:正文统一使用角色名/场景名,不写 `@图1/@图2` 等编号
|
7. **分镜正文禁用 `@参考N `**:正文统一使用角色名/场景名,不写 `@参考1/@参考2` 等编号
|
||||||
8. **单分镜时长最低 1s**
|
8. **单分镜时长最低 1s**
|
||||||
9. **时长单位**:直接使用 videoDesc 中的秒数,格式为 `{N}s`(如 `4s`),最低 1s
|
9. **时长单位**:直接使用 videoDesc 中的秒数,格式为 `{N}s`(如 `4s`),最低 1s
|
||||||
|
10. **参考类型严格区分**:音色绑定(`音色:@参考N`)只能指向音频参考;参考定义里图片条目独占一行(`@参考K: 名字,描述`),若该资产带 audio,则在同一行尾部追加「,参考音频为:@参考K+1」标记其归属,音频本身不另起行但仍占用编号 K+1;禁止把音频参考写在图片角色描述位上,禁止把图片参考用作音色绑定
|
||||||
|
|
||||||
### 完整示例
|
### 完整示例
|
||||||
|
|
||||||
输入:
|
输入:
|
||||||
```
|
```
|
||||||
模型:Seedance2.0
|
模型:Seedance2.0
|
||||||
资产信息[A001, role, 沈辞], [A002, role, 苏锦], [A003, scene, 城楼]
|
资产信息[A001, role, 沈辞], [A002, role, 苏锦, audio], [A003, scene, 城楼]
|
||||||
```
|
```
|
||||||
```xml
|
```xml
|
||||||
<storyboardItem videoDesc='(沈辞独立城楼远眺苍茫大地、城楼、沈辞/城楼、4s、全景、静止、负手而立衣袂随风飘扬、坚定决绝、黄昏冷调侧逆光、无台词、风声衣袂声、A001/A003)' prompt='全景,平视略仰,城楼之上,沈辞负手而立,衣袂飘扬,黄昏冷调侧逆光...' track='main' duration='4' associateAssetsIds="["A001","A003"]" shouldGenerateImage="true" ></storyboardItem>
|
<storyboardItem videoDesc='(沈辞独立城楼远眺苍茫大地、城楼、沈辞/城楼、4s、全景、静止、负手而立衣袂随风飘扬、坚定决绝、黄昏冷调侧逆光、无台词、风声衣袂声、A001/A003)' prompt='全景,平视略仰,城楼之上,沈辞负手而立,衣袂飘扬,黄昏冷调侧逆光...' track='main' duration='4' associateAssetsIds="["A001","A003"]" shouldGenerateImage="true" ></storyboardItem>
|
||||||
@ -271,9 +284,9 @@
|
|||||||
画面风格和类型: 真人写实, 电影风格, 冷调, 古风
|
画面风格和类型: 真人写实, 电影风格, 冷调, 古风
|
||||||
|
|
||||||
参考定义:
|
参考定义:
|
||||||
@图1: 沈辞,黑色长袍,气质冷峻的青年男性
|
@参考1: 沈辞,黑色长袍,气质冷峻的青年男性
|
||||||
@图2: 苏锦,浅色衣裙,神情细腻的青年女性
|
@参考2: 苏锦,浅色衣裙,神情细腻的青年女性,参考音频为:@参考3
|
||||||
@图3: 城楼,古代砖石城楼与台阶场景
|
@参考4: 城楼,古代砖石城楼与台阶场景
|
||||||
|
|
||||||
生成一个由以下 2 个分镜组成的视频:
|
生成一个由以下 2 个分镜组成的视频:
|
||||||
|
|
||||||
@ -282,5 +295,5 @@
|
|||||||
|
|
||||||
分镜1 4s: 时间:黄昏,场景:城楼,镜头:全景,平视略仰,静止镜头,沈辞独立城楼之上,负手而立,衣袂随风飘扬,目光远眺苍茫大地,神情肃然面容沉着,眼神坚定目光清冽,眉眼沉静气质凛然。无台词。背景是古城楼砖石纹理清晰,远方大地苍茫辽阔,天际线冷暖交替。黄昏斜射余晖侧逆光,冷调为主,长影拉伸,轮廓光微勾勒人物边缘,光感诗意。镜头静止。
|
分镜1 4s: 时间:黄昏,场景:城楼,镜头:全景,平视略仰,静止镜头,沈辞独立城楼之上,负手而立,衣袂随风飘扬,目光远眺苍茫大地,神情肃然面容沉着,眼神坚定目光清冽,眉眼沉静气质凛然。无台词。背景是古城楼砖石纹理清晰,远方大地苍茫辽阔,天际线冷暖交替。黄昏斜射余晖侧逆光,冷调为主,长影拉伸,轮廓光微勾勒人物边缘,光感诗意。镜头静止。
|
||||||
|
|
||||||
分镜2 4s: 时间:黄昏,场景:城楼,镜头:中景,平视,跟踪拍摄,苏锦拾级而上,走向城楼上的沈辞,面部朝向沈辞方向,神情微愣面色微变,眼神中带着担忧,苏锦说:「你又一个人在这里。」音色:女声,青年音色,音调中等偏高,音色质感明亮清脆,声音清亮柔和,发音方式干净,气息充沛平稳,语速适中,带温婉真诚感。背景城楼台阶纹理清晰,余晖渐暗,天际线冷暖交替加深。镜头跟踪苏锦移动。
|
分镜2 4s: 时间:黄昏,场景:城楼,镜头:中景,平视,跟踪拍摄,苏锦拾级而上,走向城楼上的沈辞,面部朝向沈辞方向,神情微愣面色微变,眼神中带着担忧,苏锦说:「你又一个人在这里。」音色:@参考3。背景城楼台阶纹理清晰,余晖渐暗,天际线冷暖交替加深。镜头跟踪苏锦移动。
|
||||||
```
|
```
|
||||||
@ -1 +1 @@
|
|||||||
1.1.6
|
1.1.7
|
||||||
2216
data/web/index.html
2216
data/web/index.html
File diff suppressed because one or more lines are too long
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "toonflow",
|
"name": "toonflow",
|
||||||
"version": "1.1.6",
|
"version": "1.1.7",
|
||||||
"description": "Toonflow 是一款 AI 短剧漫剧工具,能够利用 AI 技术将小说自动转化为剧本,并结合 AI 生成的图片和视频,实现高效的短剧创作。",
|
"description": "Toonflow 是一款 AI 短剧漫剧工具,能够利用 AI 技术将小说自动转化为剧本,并结合 AI 生成的图片和视频,实现高效的短剧创作。",
|
||||||
"author": "HBAI-Ltd <ltlctools@outlook.com>",
|
"author": "HBAI-Ltd <ltlctools@outlook.com>",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
|||||||
@ -82,14 +82,12 @@ export default router.post(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
const assetsNotAudioIds = assets.filter((i) => i.type == "audio").map((i) => i.id);
|
const assetsNotAudioIds = assets.filter((i) => i.type == "audio").map((i) => i.id);
|
||||||
console.log("%c Line:85 🧀 assetsNotAudioIds", "background:#3f7cff", assetsNotAudioIds);
|
|
||||||
|
|
||||||
const assets2Audio = await u
|
const assets2Audio = await u
|
||||||
.db("o_assets")
|
.db("o_assets")
|
||||||
.whereIn("o_assets.id", assetsNotAudioIds)
|
.whereIn("o_assets.id", assetsNotAudioIds)
|
||||||
.join("o_assetsRole2Audio", "o_assetsRole2Audio.assetsAudioId", "o_assets.assetsId")
|
.join("o_assetsRole2Audio", "o_assetsRole2Audio.assetsAudioId", "o_assets.assetsId")
|
||||||
.select("o_assets.assetsId", "o_assets.id", "o_assetsRole2Audio.assetsAudioId", "o_assetsRole2Audio.assetsRoleId");
|
.select("o_assets.assetsId", "o_assets.id", "o_assetsRole2Audio.assetsAudioId", "o_assetsRole2Audio.assetsRoleId");
|
||||||
console.log("%c Line:88 🌶 assets2Audio", "background:#2eafb0", assets2Audio);
|
|
||||||
|
|
||||||
const assetsAudioRecord: Record<number, number> = {};
|
const assetsAudioRecord: Record<number, number> = {};
|
||||||
assets2Audio.forEach((i) => {
|
assets2Audio.forEach((i) => {
|
||||||
@ -122,16 +120,16 @@ export default router.post(
|
|||||||
|
|
||||||
if (modelLower.includes("wan") && modelLower.includes("2.6")) {
|
if (modelLower.includes("wan") && modelLower.includes("2.6")) {
|
||||||
// wan2.6 系列 => 单图首尾帧模式
|
// wan2.6 系列 => 单图首尾帧模式
|
||||||
fileName = "wan2.6单图首帧模式.md";
|
fileName = "wan2.6Single-imageFirstFrameMode.md";
|
||||||
} else if (/seedance.*2[.\-]0/i.test(modelData)) {
|
} else if (/seedance.*2[.\-]0/i.test(modelData)) {
|
||||||
// seedance 2.0 / 2-0 系列
|
// seedance 2.0 / 2-0 系列
|
||||||
fileName = "seedance2多参模式.md";
|
fileName = "seedance2Multi-parameterMode.md";
|
||||||
} else if (mode === "startEndRequired" || mode === "endFrameOptional" || mode === "startFrameOptional") {
|
} else if (mode === "startEndRequired" || mode === "endFrameOptional" || mode === "startFrameOptional") {
|
||||||
// body.mode 为首尾帧相关 => 通用首尾帧模式
|
// body.mode 为首尾帧相关 => 通用首尾帧模式
|
||||||
fileName = "通用首尾帧模式.md";
|
fileName = "universalFirstAndLastFrameMode.md";
|
||||||
} else if (typeof mode === "string" && mode.startsWith('["') && mode.endsWith('"]')) {
|
} else if (typeof mode === "string" && mode.startsWith('["') && mode.endsWith('"]')) {
|
||||||
// 其他 => 通用多参模式
|
// 其他 => 通用多参模式
|
||||||
fileName = "通用多参模式.md";
|
fileName = "universalMulti-parameterMode.md";
|
||||||
}
|
}
|
||||||
if (fileName) {
|
if (fileName) {
|
||||||
try {
|
try {
|
||||||
@ -153,9 +151,12 @@ export default router.post(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const artStyle = projectData?.artStyle || "无";
|
const artStyle = projectData?.artStyle || "无";
|
||||||
|
console.log("%c Line:158 🍢", "background:#ffdd4d",assets);
|
||||||
|
|
||||||
const visualManual = u.getArtPrompt(artStyle, "art_skills", "art_storyboard_video");
|
const visualManual = u.getArtPrompt(artStyle, "art_skills", "art_storyboard_video");
|
||||||
const content = `
|
const content = `
|
||||||
**模型名称**:${modelData},
|
**模型名称**:${modelData},
|
||||||
|
|
||||||
**资产信息**(角色、场景、道具、音频):${assets
|
**资产信息**(角色、场景、道具、音频):${assets
|
||||||
.filter((i) => i.filePath)
|
.filter((i) => i.filePath)
|
||||||
.map((i) => `[${i.id},${i.type},${i.name} ${assetsAudioRecord[i.id] ? `audio:${assetsAudioRecord[i.id]}` : ""} ] `)
|
.map((i) => `[${i.id},${i.type},${i.name} ${assetsAudioRecord[i.id] ? `audio:${assetsAudioRecord[i.id]}` : ""} ] `)
|
||||||
@ -167,7 +168,7 @@ export default router.post(
|
|||||||
></storyboardItem>`,
|
></storyboardItem>`,
|
||||||
)},
|
)},
|
||||||
`;
|
`;
|
||||||
console.log("%c Line:158 🍪 content", "background:#4fff4B", content);
|
console.log("%c Line:156 🍬 content", "background:#4fff4B", content);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { text } = await u.Ai.Text("universalAi").invoke({
|
const { text } = await u.Ai.Text("universalAi").invoke({
|
||||||
|
|||||||
21
src/types/database.d.ts
vendored
21
src/types/database.d.ts
vendored
@ -1,22 +1,6 @@
|
|||||||
// @db-hash 17b50430f27f3b720ad137e6c30cc477
|
// @db-hash 46c86c97b2ffc399387f42c5b7c014eb
|
||||||
//该文件由脚本自动生成,请勿手动修改
|
//该文件由脚本自动生成,请勿手动修改
|
||||||
|
|
||||||
export interface _o_assets_old_20260428 {
|
|
||||||
'assetsId'?: number | null;
|
|
||||||
'describe'?: string | null;
|
|
||||||
'flowId'?: number | null;
|
|
||||||
'id'?: number;
|
|
||||||
'imageId'?: number | null;
|
|
||||||
'name'?: string | null;
|
|
||||||
'projectId'?: number | null;
|
|
||||||
'prompt'?: string | null;
|
|
||||||
'promptErrorReason'?: string | null;
|
|
||||||
'promptState'?: string | null;
|
|
||||||
'remark'?: string | null;
|
|
||||||
'scriptId'?: number | null;
|
|
||||||
'startTime'?: number | null;
|
|
||||||
'type'?: string | null;
|
|
||||||
}
|
|
||||||
export interface memories {
|
export interface memories {
|
||||||
'content': string;
|
'content': string;
|
||||||
'createTime': number;
|
'createTime': number;
|
||||||
@ -39,6 +23,7 @@ export interface o_agentDeploy {
|
|||||||
'modelName'?: string | null;
|
'modelName'?: string | null;
|
||||||
'name'?: string | null;
|
'name'?: string | null;
|
||||||
'temperature'?: number | null;
|
'temperature'?: number | null;
|
||||||
|
'topP'?: number | null;
|
||||||
'type'?: string | null;
|
'type'?: string | null;
|
||||||
'vendorId'?: string | null;
|
'vendorId'?: string | null;
|
||||||
}
|
}
|
||||||
@ -229,7 +214,6 @@ export interface o_user {
|
|||||||
'password'?: string | null;
|
'password'?: string | null;
|
||||||
}
|
}
|
||||||
export interface o_vendorConfig {
|
export interface o_vendorConfig {
|
||||||
'code'?: string | null;
|
|
||||||
'enable'?: number | null;
|
'enable'?: number | null;
|
||||||
'id'?: string;
|
'id'?: string;
|
||||||
'inputValues'?: string | null;
|
'inputValues'?: string | null;
|
||||||
@ -258,7 +242,6 @@ export interface o_videoTrack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface DB {
|
export interface DB {
|
||||||
"_o_assets_old_20260428": _o_assets_old_20260428;
|
|
||||||
"memories": memories;
|
"memories": memories;
|
||||||
"o_agentDeploy": o_agentDeploy;
|
"o_agentDeploy": o_agentDeploy;
|
||||||
"o_agentWorkData": o_agentWorkData;
|
"o_agentWorkData": o_agentWorkData;
|
||||||
|
|||||||
@ -53,7 +53,7 @@ class OSS {
|
|||||||
// URL 始终使用 /,所以这里需要将系统分隔符转回 /
|
// URL 始终使用 /,所以这里需要将系统分隔符转回 /
|
||||||
let url = `/${prefix}/`;
|
let url = `/${prefix}/`;
|
||||||
if (process.env.ossURL && process.env.ossURL !== "") url = process.env.ossURL + `/${prefix}/`;
|
if (process.env.ossURL && process.env.ossURL !== "") url = process.env.ossURL + `/${prefix}/`;
|
||||||
if (process.env.NODE_ENV == "dev") url = `http://192.168.0.116:10588/${prefix}/`;
|
if (process.env.NODE_ENV == "dev") url = `http://localhost:10588/${prefix}/`;
|
||||||
if (isEletron()) url = `http://localhost:${process.env.PORT}/${prefix}/`;
|
if (isEletron()) url = `http://localhost:${process.env.PORT}/${prefix}/`;
|
||||||
return `${url}${safePath.split(path.sep).join("/")}`;
|
return `${url}${safePath.split(path.sep).join("/")}`;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user