986 lines
28 KiB
TypeScript
Raw Normal View History

2025-09-04 16:58:42 +08:00
//#region 图转视频类型
import { t } from '@/i18n'
import { BookBackTaskType } from './bookEnum'
2025-09-04 16:58:42 +08:00
2025-09-25 17:21:45 +08:00
export type ToVIdeoType = 'textToVideo' | 'imageToVideo' | "firstLastFrame"
2025-09-04 16:58:42 +08:00
/** 图片转视频的方式 */
export enum ImageToVideoModels {
/** runway 生成视频 */
RUNWAY = 'RUNWAY',
2025-09-04 16:58:42 +08:00
/** luma 生成视频 */
LUMA = 'LUMA',
2025-09-04 16:58:42 +08:00
/** 可灵生成视频 */
KLING = 'KLING',
/** 可灵视频拓展 */
KLING_VIDEO_EXTEND = 'KLING_VIDEO_EXTEND',
2025-09-04 16:58:42 +08:00
/** Pika 生成视频 */
PIKA = 'PIKA',
2025-09-25 17:21:45 +08:00
/** 海螺生成视频 */
HAILUO = 'HAILUO',
2025-09-04 16:58:42 +08:00
/** MJ 图转视频 */
MJ_VIDEO = 'MJ_VIDEO',
2025-09-04 16:58:42 +08:00
/** MJ 视频拓展 */
MJ_VIDEO_EXTEND = 'MJ_VIDEO_EXTEND'
2025-09-04 16:58:42 +08:00
}
2025-09-25 17:21:45 +08:00
/**
*
*
* BookBackTaskType
* 使 ImageToVideoModels
* 便
*
* @param type BookBackTaskType
* @returns ImageToVideoModels 'UNKNOWN'
*
* @description
* -
* - 'UNKNOWN'便
* -
*
* @example
* ```typescript
* const model = MappingTaskTypeToVideoModel(BookBackTaskType.LUMA_VIDEO);
* // model === ImageToVideoModels.LUMA
* ```
*
* @see BookBackTaskType -
* @see ImageToVideoModels -
*/
2025-09-04 16:58:42 +08:00
export const MappingTaskTypeToVideoModel = (type: BookBackTaskType | string) => {
switch (type) {
case BookBackTaskType.LUMA_VIDEO:
return ImageToVideoModels.LUMA
2025-09-25 17:21:45 +08:00
case BookBackTaskType.HAILUO_TEXT_TO_VIDEO:
return ImageToVideoModels.HAILUO
2025-09-04 16:58:42 +08:00
case BookBackTaskType.RUNWAY_VIDEO:
return ImageToVideoModels.RUNWAY
2025-09-04 16:58:42 +08:00
case BookBackTaskType.KLING_VIDEO:
return ImageToVideoModels.KLING
case BookBackTaskType.KLING_VIDEO_EXTEND:
return ImageToVideoModels.KLING_VIDEO_EXTEND
2025-09-04 16:58:42 +08:00
case BookBackTaskType.MJ_VIDEO:
return ImageToVideoModels.MJ_VIDEO
2025-09-04 16:58:42 +08:00
case BookBackTaskType.MJ_VIDEO_EXTEND:
return ImageToVideoModels.MJ_VIDEO_EXTEND
2025-09-04 16:58:42 +08:00
default:
return 'UNKNOWN'
2025-09-04 16:58:42 +08:00
}
}
/**
*
* @param model
* @returns
*/
export const GetImageToVideoModelsLabel = (model: ImageToVideoModels | string) => {
switch (model) {
case ImageToVideoModels.RUNWAY:
return 'Runway'
2025-09-04 16:58:42 +08:00
case ImageToVideoModels.LUMA:
return 'Luma'
2025-09-04 16:58:42 +08:00
case ImageToVideoModels.KLING:
return t('可灵')
2025-09-04 16:58:42 +08:00
case ImageToVideoModels.PIKA:
return 'Pika'
2025-09-25 17:21:45 +08:00
case ImageToVideoModels.HAILUO:
return t('海螺')
2025-09-04 16:58:42 +08:00
case ImageToVideoModels.MJ_VIDEO:
case ImageToVideoModels.MJ_VIDEO_EXTEND:
return t('MJ视频')
2025-09-04 16:58:42 +08:00
default:
return '未知'
2025-09-04 16:58:42 +08:00
}
}
/**
*
*
2025-09-04 16:58:42 +08:00
*
* labelvalue
* GetImageToVideoModelsLabel 使 ImageToVideoModels
*
2025-09-04 16:58:42 +08:00
* @returns label value
*/
export const GetImageToVideoModelsOptions = () => {
return [
{
label: GetImageToVideoModelsLabel(ImageToVideoModels.MJ_VIDEO),
value: ImageToVideoModels.MJ_VIDEO
2025-09-25 17:21:45 +08:00
}, {
label: GetImageToVideoModelsLabel(ImageToVideoModels.HAILUO),
value: ImageToVideoModels.HAILUO
},
{
label: GetImageToVideoModelsLabel(ImageToVideoModels.RUNWAY),
value: ImageToVideoModels.RUNWAY
},
2025-09-04 16:58:42 +08:00
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.LUMA), value: ImageToVideoModels.LUMA },
{
label: GetImageToVideoModelsLabel(ImageToVideoModels.KLING),
value: ImageToVideoModels.KLING
},
{ label: GetImageToVideoModelsLabel(ImageToVideoModels.PIKA), value: ImageToVideoModels.PIKA }
2025-09-04 16:58:42 +08:00
]
}
//#endregion
//#region 通用
/** 生成视频的方式 */
export enum VideoModel {
/** 文生视频 */
TEXT_TO_VIDEO = 'textToVideo',
2025-09-04 16:58:42 +08:00
/** 图生视频 */
IMAGE_TO_VIDEO = 'imageToVideo'
2025-09-04 16:58:42 +08:00
}
/** 图转视频的状态 */
export enum VideoStatus {
/** 等待 */
WAIT = 'wait',
/** 提交成功 */
SUBMITTED = 'submitted',
2025-09-04 16:58:42 +08:00
/** 处理中 */
PROCESSING = 'processing',
2025-09-04 16:58:42 +08:00
/** 完成 */
SUCCESS = 'success',
2025-09-04 16:58:42 +08:00
/** 失败 */
FAIL = 'fail'
2025-09-04 16:58:42 +08:00
}
export const GetVideoStatus = (status: VideoStatus | string) => {
switch (status) {
case VideoStatus.WAIT:
case '0':
return t('等待')
2025-09-04 16:58:42 +08:00
case VideoStatus.PROCESSING:
case '1':
return t('处理中')
2025-09-04 16:58:42 +08:00
case VideoStatus.SUCCESS:
case '3':
return t('完成')
2025-09-04 16:58:42 +08:00
case VideoStatus.FAIL:
case '2':
return t('失败')
2025-09-04 16:58:42 +08:00
default:
return t('未知')
2025-09-04 16:58:42 +08:00
}
}
//#endregion
//#region runway 相关
/** runway 生成视频的模型 */
export enum RunawayModel {
GNE2 = 'gen2',
GNE3 = 'gen3'
2025-09-04 16:58:42 +08:00
}
/** runway 合成视频的时长 */
export enum RunwaySeconds {
FIVE = 5,
TEN = 10
2025-09-04 16:58:42 +08:00
}
//#endregion
//#region 可灵相关
/**
*
* - std
* - pro
*/
2025-09-04 16:58:42 +08:00
export enum KlingMode {
/** 高性能 */
STD = 'std',
2025-09-04 16:58:42 +08:00
/** 高表现 */
PRO = 'pro'
2025-09-04 16:58:42 +08:00
}
/**
*
*
* @param mode
* @returns
*/
export function GetKlingModeLabel(mode: KlingMode | string) {
switch (mode) {
case KlingMode.STD:
return t('高性能 (std)')
case KlingMode.PRO:
return t('高表现 (pro)')
default:
return t('未知')
}
}
/**
*
*
* @returns UI组件
*/
export function GetKlingModeOptions() {
return [
{
label: GetKlingModeLabel(KlingMode.STD),
value: KlingMode.STD
},
{
label: GetKlingModeLabel(KlingMode.PRO),
value: KlingMode.PRO
}
]
}
/**
*
* - '5'5
* - '10'10
*/
export enum KlingDuration {
FIVE = 5,
TEN = 10
}
/**
*
*
* @param duration
* @returns
*/
export function GetKlingDurationLabel(duration: KlingDuration | string) {
switch (duration) {
case KlingDuration.FIVE:
return t('5秒')
case KlingDuration.TEN:
return t('10秒')
default:
return t('未知')
}
}
/**
*
*
* @returns UI组件
*/
export function GetKlingDurationOptions() {
return [
{
label: GetKlingDurationLabel(KlingDuration.FIVE),
value: KlingDuration.FIVE
},
{
label: GetKlingDurationLabel(KlingDuration.TEN),
value: KlingDuration.TEN
}
]
}
/**
*
* - kling-v1V1
* - kling-v1-5V1.5
* - kling-v1-6V1.6
* - kling-v2-masterV2 master
* - kling-v2-1V2.1
* - kling-v2-1-masterV2.1 master
*/
export enum KlingModelName {
/** V1 版本 */
KLING_V1 = 'kling-v1',
/** V1.5 版本 */
KLING_V1_5 = 'kling-v1-5',
/** V1.6 版本 */
KLING_V1_6 = 'kling-v1-6',
/** V2 master 版本 */
KLING_V2_MASTER = 'kling-v2-master',
/** V2.1 版本 */
KLING_V2_1 = 'kling-v2-1',
/** V2.1 master 版本 */
KLING_V2_1_MASTER = 'kling-v2-1-master'
}
/**
*
*
* @param modelName
* @returns
*/
export function GetKlingModelNameLabel(modelName: KlingModelName | string) {
switch (modelName) {
case KlingModelName.KLING_V1:
return t('Kling V1')
case KlingModelName.KLING_V1_5:
return t('Kling V1.5')
case KlingModelName.KLING_V1_6:
return t('Kling V1.6')
case KlingModelName.KLING_V2_MASTER:
return t('Kling V2 Master')
case KlingModelName.KLING_V2_1:
return t('Kling V2.1')
case KlingModelName.KLING_V2_1_MASTER:
return t('Kling V2.1 Master')
default:
return t('未知')
}
}
/**
*
*
* @returns UI组件
*/
export function GetKlingModelNameOptions() {
return [
{
label: GetKlingModelNameLabel(KlingModelName.KLING_V1),
value: KlingModelName.KLING_V1
},
{
label: GetKlingModelNameLabel(KlingModelName.KLING_V1_5),
value: KlingModelName.KLING_V1_5
},
{
label: GetKlingModelNameLabel(KlingModelName.KLING_V1_6),
value: KlingModelName.KLING_V1_6
},
{
label: GetKlingModelNameLabel(KlingModelName.KLING_V2_MASTER),
value: KlingModelName.KLING_V2_MASTER
},
{
label: GetKlingModelNameLabel(KlingModelName.KLING_V2_1),
value: KlingModelName.KLING_V2_1
},
{
label: GetKlingModelNameLabel(KlingModelName.KLING_V2_1_MASTER),
value: KlingModelName.KLING_V2_1_MASTER
}
]
}
2025-09-04 16:58:42 +08:00
//#endregion
//#region MJ Video
/**
* indextaskId必填
*/
export enum MJVideoAction {
Extend = 'extend'
2025-09-04 16:58:42 +08:00
}
/**
*
*/
export enum MJVideoImageType {
Base64 = 'base64',
Url = 'url'
2025-09-04 16:58:42 +08:00
}
/**
* MJ Video的动作幅度
*/
export enum MJVideoMotion {
High = 'high',
Low = 'low'
2025-09-04 16:58:42 +08:00
}
2025-09-04 16:58:42 +08:00
/**
* MJ视频动作幅度的标签
*
2025-09-04 16:58:42 +08:00
* @param model MJ视频动作幅度枚举值或字符串
* @returns
*/
export function GetMJVideoMotionLabel(model: MJVideoMotion | string) {
switch (model) {
case MJVideoMotion.High:
return t('高 (High)')
2025-09-04 16:58:42 +08:00
case MJVideoMotion.Low:
return t('低 (Low)')
2025-09-04 16:58:42 +08:00
default:
return t('未知')
2025-09-04 16:58:42 +08:00
}
}
/**
* MJ视频动作幅度的选项列表
*
2025-09-04 16:58:42 +08:00
* @returns UI组件
*/
export function GetMJVideoMotionOptions() {
return [
{
label: GetMJVideoMotionLabel(MJVideoMotion.Low),
value: MJVideoMotion.Low
},
{
label: GetMJVideoMotionLabel(MJVideoMotion.High),
value: MJVideoMotion.High
}
]
}
/**
* MJ Video
*/
export enum MJVideoType {
/** 标清 480p */
SD = 'vid_1.1_i2v_480',
/** 高清 720p */
HD = 'vid_1.1_i2v_720'
}
/**
* MJ视频质量类型的标签
*
* @param type MJ视频质量类型枚举值或字符串
* @returns
*/
export function GetMJVideoTypeLabel(type: MJVideoType | string) {
switch (type) {
case MJVideoType.SD:
return t('标清 (SD 480p)')
case MJVideoType.HD:
return t('高清 (HD 720p)')
default:
return t('未知')
}
}
/**
* MJ视频质量类型的选项列表
*
* @returns UI组件
*/
export function GetMJVideoTypeOptions() {
return [
{
label: GetMJVideoTypeLabel(MJVideoType.SD),
value: MJVideoType.SD
},
{ label: GetMJVideoTypeLabel(MJVideoType.HD), value: MJVideoType.HD }
]
}
/**
* MJ Video
*/
export enum MJVideoBatchSize {
/** 生成1个视频 */
ONE = 1,
/** 生成2个视频 */
TWO = 2,
/** 生成4个视频 */
FOUR = 4
}
/**
* MJ视频批次大小的标签
*
* @param batchSize MJ视频批次大小枚举值或数字
* @returns
*/
export function GetMJVideoBatchSizeLabel(batchSize: MJVideoBatchSize | number) {
switch (batchSize) {
case MJVideoBatchSize.ONE:
return t('1个视频')
case MJVideoBatchSize.TWO:
return t('2个视频')
case MJVideoBatchSize.FOUR:
return t('4个视频')
default:
return t('未知')
}
}
/**
* MJ视频批次大小的选项列表
*
* @returns UI组件
*/
export function GetMJVideoBatchSizeOptions() {
return [
{
label: GetMJVideoBatchSizeLabel(MJVideoBatchSize.ONE),
value: MJVideoBatchSize.ONE
},
{
label: GetMJVideoBatchSizeLabel(MJVideoBatchSize.TWO),
value: MJVideoBatchSize.TWO
},
{
label: GetMJVideoBatchSizeLabel(MJVideoBatchSize.FOUR),
value: MJVideoBatchSize.FOUR
2025-09-04 16:58:42 +08:00
}
]
}
//#endregion
2025-09-25 17:21:45 +08:00
//#region 海螺视频相关
/**
*
*/
export enum HailuoModel {
/** MiniMax-Hailuo-02 模型 */
MINIMAX_HAILUO_02 = 'MiniMax-Hailuo-02',
/** I2V-01-Director 模型 */
I2V_01_DIRECTOR = 'I2V-01-Director',
/** I2V-01-live 模型 */
I2V_01_LIVE = 'I2V-01-live',
/** I2V-01 模型 */
I2V_01 = 'I2V-01',
/** T2V-01-Director 模型 */
T2V_01_DIRECTOR = "T2V-01-Director",
/** T2V-01 模型 */
T2V_01 = 'T2V-01'
}
/**
*
*/
export enum HailuoResolution {
/** 512P 分辨率 */
P512 = '512P',
/** 720P 分辨率 */
P720 = '720P',
/** 768P 分辨率 */
P768 = '768P',
/** 1080P 分辨率 */
P1080 = '1080P'
}
/**
*
*/
export enum HailuoDuration {
/** 6秒 */
SIX = 6,
/** 10秒 */
TEN = 10
}
/**
*
*
* @param model
* @returns
*/
export function GetHailuoModelLabel(model: HailuoModel | string) {
switch (model) {
case HailuoModel.MINIMAX_HAILUO_02:
return t('MiniMax-Hailuo-02')
case HailuoModel.I2V_01_DIRECTOR:
return t('I2V-01-Director')
case HailuoModel.I2V_01_LIVE:
return t('I2V-01-live')
case HailuoModel.I2V_01:
return t('I2V-01')
case HailuoModel.T2V_01_DIRECTOR:
return t('T2V-01-Director')
case HailuoModel.T2V_01:
return t('T2V-01')
default:
return t('未知')
}
}
/**
*
*
* @returns UI组件
*/
export function GetHailuoModelOptions(type: ToVIdeoType) {
if (type == "textToVideo") {
return [
{
label: GetHailuoModelLabel(HailuoModel.MINIMAX_HAILUO_02),
value: HailuoModel.MINIMAX_HAILUO_02
},
{
label: GetHailuoModelLabel(HailuoModel.T2V_01_DIRECTOR),
value: HailuoModel.T2V_01_DIRECTOR
},
{
label: GetHailuoModelLabel(HailuoModel.T2V_01),
value: HailuoModel.T2V_01
}
]
} else if (type == "imageToVideo") {
return [
{
label: GetHailuoModelLabel(HailuoModel.MINIMAX_HAILUO_02),
value: HailuoModel.MINIMAX_HAILUO_02
},
{
label: GetHailuoModelLabel(HailuoModel.I2V_01_DIRECTOR),
value: HailuoModel.I2V_01_DIRECTOR
},
{
label: GetHailuoModelLabel(HailuoModel.I2V_01_LIVE),
value: HailuoModel.I2V_01_LIVE
},
{
label: GetHailuoModelLabel(HailuoModel.I2V_01),
value: HailuoModel.I2V_01
}
]
} else if (type == "firstLastFrame") {
return [
{
label: GetHailuoModelLabel(HailuoModel.MINIMAX_HAILUO_02),
value: HailuoModel.MINIMAX_HAILUO_02
}]
}
return [
[
{
label: GetHailuoModelLabel(HailuoModel.MINIMAX_HAILUO_02),
value: HailuoModel.MINIMAX_HAILUO_02
},
{
label: GetHailuoModelLabel(HailuoModel.I2V_01_DIRECTOR),
value: HailuoModel.I2V_01_DIRECTOR
},
{
label: GetHailuoModelLabel(HailuoModel.I2V_01_LIVE),
value: HailuoModel.I2V_01_LIVE
},
{
label: GetHailuoModelLabel(HailuoModel.I2V_01),
value: HailuoModel.I2V_01
},
{
label: GetHailuoModelLabel(HailuoModel.T2V_01_DIRECTOR),
value: HailuoModel.T2V_01_DIRECTOR
},
{
label: GetHailuoModelLabel(HailuoModel.T2V_01),
value: HailuoModel.T2V_01
}
]
]
}
/**
*
*
* @param model
* @returns
*/
export function IsHailuoModelSupportDirectorCommands(model: HailuoModel | string): boolean {
return model === HailuoModel.MINIMAX_HAILUO_02 || model === HailuoModel.I2V_01_DIRECTOR
}
/**
*
*
* @param type : 'textToVideo' (), 'imageToVideo' (), 'firstLastFrame' ()
* @param model
* @param duration
* @returns
*/
export function GetHailuoModelSupportedResolutions(type: ToVIdeoType, model: HailuoModel | string, duration: HailuoDuration | number = HailuoDuration.SIX) {
if (model === HailuoModel.MINIMAX_HAILUO_02) {
// MiniMax-Hailuo-02 模型根据类型和时长的不同支持
if (type === 'textToVideo') {
// 文生视频
if (duration === HailuoDuration.SIX) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P768), value: HailuoResolution.P768 }, // 默认
{ label: GetHailuoResolutionLabel(HailuoResolution.P1080), value: HailuoResolution.P1080 }
]
} else if (duration === HailuoDuration.TEN) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P768), value: HailuoResolution.P768 } // 默认
]
}
} else if (type === 'imageToVideo') {
// 图生视频
if (duration === HailuoDuration.SIX) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P512), value: HailuoResolution.P512 },
{ label: GetHailuoResolutionLabel(HailuoResolution.P768), value: HailuoResolution.P768 }, // 默认
{ label: GetHailuoResolutionLabel(HailuoResolution.P1080), value: HailuoResolution.P1080 }
]
} else if (duration === HailuoDuration.TEN) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P512), value: HailuoResolution.P512 },
{ label: GetHailuoResolutionLabel(HailuoResolution.P768), value: HailuoResolution.P768 } // 默认
]
}
} else if (type === 'firstLastFrame') {
// 首尾帧视频
if (duration === HailuoDuration.SIX) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P768), value: HailuoResolution.P768 }, // 默认
{ label: GetHailuoResolutionLabel(HailuoResolution.P1080), value: HailuoResolution.P1080 }
]
} else if (duration === HailuoDuration.TEN) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P768), value: HailuoResolution.P768 }
]
}
}
} else {
// 其他模型 (I2V-01-Director, I2V-01-live, I2V-01)
if (duration === HailuoDuration.SIX) {
return [
{ label: GetHailuoResolutionLabel(HailuoResolution.P720), value: HailuoResolution.P720 } // 默认
]
}
// 其他模型不支持10秒时长
}
return []
}
/**
*
*
*
*
*
* @param type - 'textToVideo' (), 'imageToVideo' (), 'firstLastFrame' ()
* @param model -
* @param duration - 610
* @param resolution - 512P, 720P, 768P, 1080P
*
* @returns {boolean} truefalse
*
* @description
* - MiniMax-Hailuo-02
* - I2V系列模型通常只支持720P分辨率
* - 1080P分辨率通常只在6秒时长下被支持
*
* @example
* ```typescript
* // 验证文生视频在MiniMax-Hailuo-02模型下6秒时长是否支持768P
* const isValid = IsValidResolution('textToVideo', HailuoModel.MINIMAX_HAILUO_02, HailuoDuration.SIX, HailuoResolution.P768);
* // isValid === true
*
* // 验证图生视频在I2V-01模型下6秒时长是否支持1080P
* const isValid2 = IsValidResolution('imageToVideo', HailuoModel.I2V_01, HailuoDuration.SIX, HailuoResolution.P1080);
* // isValid2 === false
* ```
*
* @see GetHailuoModelSupportedResolutions -
*/
export function IsValidResolution(type: ToVIdeoType, model: HailuoModel, duration: HailuoDuration, resolution: HailuoResolution): boolean {
let spportedResolutions = GetHailuoModelSupportedResolutions(type, model, duration)
// 检查传入的分辨率是否在支持的列表中
return spportedResolutions.some(r => r.value === resolution)
}
/**
*
*
* @param type : 'textToVideo' (), 'imageToVideo' (), 'firstLastFrame' ()
* @param model
* @param resolution
* @returns
*/
export function GetHailuoModelSupportedDurations(type: ToVIdeoType, model: HailuoModel | string, resolution?: HailuoResolution | string) {
if (model === HailuoModel.MINIMAX_HAILUO_02) {
if (type === 'textToVideo') {
// 文生视频 - MiniMax-Hailuo-02 支持 6s 和 10s但 1080P 只支持 6s
if (resolution === HailuoResolution.P1080) {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX }
]
} else {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX },
{ label: GetHailuoDurationLabel(HailuoDuration.TEN), value: HailuoDuration.TEN }
]
}
} else if (type === 'imageToVideo') {
// 图生视频 - MiniMax-Hailuo-02 支持 6s 和 10s1080P 只支持 6s
if (resolution === HailuoResolution.P1080) {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX }
]
} else {
// 512P, 768P 都支持 6s 和 10s
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX },
{ label: GetHailuoDurationLabel(HailuoDuration.TEN), value: HailuoDuration.TEN }
]
}
} else if (type === 'firstLastFrame') {
// 首尾帧视频 - MiniMax-Hailuo-02 支持 6s 和 10s但 1080P 只支持 6s
if (resolution === HailuoResolution.P1080) {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX }
]
} else {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX },
{ label: GetHailuoDurationLabel(HailuoDuration.TEN), value: HailuoDuration.TEN }
]
}
} else {
// 兼容旧版本调用,默认逻辑
if (resolution === HailuoResolution.P1080) {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX }
]
} else {
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX },
{ label: GetHailuoDurationLabel(HailuoDuration.TEN), value: HailuoDuration.TEN }
]
}
}
} else {
// 其他模型 (I2V-01-Director, I2V-01-live, I2V-01) 只支持6秒
return [
{ label: GetHailuoDurationLabel(HailuoDuration.SIX), value: HailuoDuration.SIX }
]
}
}
/**
*
*
*
*
*
* @param type - 'textToVideo' (), 'imageToVideo' (), 'firstLastFrame' ()
* @param model -
* @param resolution - 512P, 720P, 768P, 1080P
* @param duration - 610
*
* @returns {boolean} truefalse
*
* @description
* - MiniMax-Hailuo-02 6101080P分辨率只支持6秒
* - I2V系列模型 (I2V-01-Director, I2V-01-live, I2V-01) 6
* - 1080P
*
* @example
* ```typescript
* // 验证文生视频在MiniMax-Hailuo-02模型下768P分辨率是否支持10秒
* const isValid = IsValidDuratio('textToVideo', HailuoModel.MINIMAX_HAILUO_02, HailuoResolution.P768, HailuoDuration.TEN);
* // isValid === true
*
* // 验证图生视频在MiniMax-Hailuo-02模型下1080P分辨率是否支持10秒
* const isValid2 = IsValidDuratio('imageToVideo', HailuoModel.MINIMAX_HAILUO_02, HailuoResolution.P1080, HailuoDuration.TEN);
* // isValid2 === false (1080P只支持6秒)
*
* // 验证I2V-01模型是否支持10秒时长
* const isValid3 = IsValidDuratio('imageToVideo', HailuoModel.I2V_01, HailuoResolution.P720, HailuoDuration.TEN);
* // isValid3 === false (I2V系列只支持6秒)
* ```
*
* @see GetHailuoModelSupportedDurations -
*/
export function IsValidDuratio(type: ToVIdeoType, model: HailuoModel, resolution: HailuoResolution, duration: HailuoDuration): boolean {
// 获取当前模型、类型和分辨率组合下支持的所有时长选项
let spportedResolutions = GetHailuoModelSupportedDurations(type, model, resolution)
// 检查传入的时长是否在支持的列表中
return spportedResolutions.some(r => r.value === duration)
}
/**
*
*
* @param resolution
* @returns
*/
export function GetHailuoResolutionLabel(resolution: HailuoResolution | string) {
switch (resolution) {
case HailuoResolution.P512:
return t('512P')
case HailuoResolution.P720:
return t('720P')
case HailuoResolution.P768:
return t('768P')
case HailuoResolution.P1080:
return t('1080P')
default:
return t('未知')
}
}
/**
*
*
* @returns UI组件
*/
export function GetHailuoResolutionOptions() {
return [
{
label: GetHailuoResolutionLabel(HailuoResolution.P512),
value: HailuoResolution.P512
},
{
label: GetHailuoResolutionLabel(HailuoResolution.P720),
value: HailuoResolution.P720
},
{
label: GetHailuoResolutionLabel(HailuoResolution.P768),
value: HailuoResolution.P768
},
{
label: GetHailuoResolutionLabel(HailuoResolution.P1080),
value: HailuoResolution.P1080
}
]
}
/**
*
*
* @param duration
* @returns
*/
export function GetHailuoDurationLabel(duration: HailuoDuration | number) {
switch (duration) {
case HailuoDuration.SIX:
return t('6秒')
case HailuoDuration.TEN:
return t('10秒')
default:
return t('未知')
}
}
/**
*
*
* @returns UI组件
*/
export function GetHailuoDurationOptions() {
return [
{
label: GetHailuoDurationLabel(HailuoDuration.SIX),
value: HailuoDuration.SIX
},
{
label: GetHailuoDurationLabel(HailuoDuration.TEN),
value: HailuoDuration.TEN
}
]
}
//#endregion