| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import { Injectable } from '@angular/core';
- import type { GeneratedResult, HistoryRecord, RemixVersion } from '../models/app-shell.model';
- export interface DigitalHumanPublicationState {
- dhPrompt: string;
- dhResolution: string;
- }
- export interface DigitalHumanPublicationPayload {
- result: Partial<GeneratedResult>;
- history: Partial<HistoryRecord>;
- }
- export interface DigitalHumanRemixPublicationInput {
- videoTitle: string;
- videoId: string;
- videoUrl: string;
- prompt: string;
- resolution: '720p' | '1080p';
- durationSeconds: number;
- remixId: string;
- }
- export interface DigitalHumanRemixVersionInput {
- videoUrl: string;
- thumbnailUrl?: string;
- resolution: '720p' | '1080p';
- }
- @Injectable({ providedIn: 'root' })
- export class DigitalHumanPublicationService {
- build(videoUrl: string, state: DigitalHumanPublicationState, now = new Date()): DigitalHumanPublicationPayload {
- const title = `数字人合成 - ${now.toLocaleString('zh-CN')}`;
- const quality = state.dhResolution === '1080p' ? '1080P' : '720P';
- return {
- result: {
- type: 'video',
- url: videoUrl,
- title,
- quality,
- duration: '数字人视频',
- cost: 0,
- segments: [{ id: 'DH-01', videoUrl, prompt: state.dhPrompt, status: 'completed' }],
- pipelineId: 'digital_human',
- },
- history: {
- keyword: '数字人合成',
- status: 'completed',
- cost: 0,
- duration: '数字人视频',
- styleName: '数字人合成',
- resultUrl: videoUrl,
- quality,
- segmentCount: 1,
- successCount: 1,
- },
- };
- }
- buildRemix(input: DigitalHumanRemixPublicationInput): DigitalHumanPublicationPayload {
- const quality = input.resolution === '1080p' ? '1080P' : '720P';
- const duration = input.durationSeconds > 0 ? `${input.durationSeconds} 秒` : '数字人视频';
- const cost = Math.round(input.durationSeconds * 100) / 100;
- const title = `${input.videoTitle} - 数字人生成`;
- return {
- result: {
- type: 'video',
- url: input.videoUrl,
- title,
- quality,
- duration,
- cost,
- remixId: input.remixId,
- videoId: input.videoId,
- segments: [{ id: 'DH-01', videoUrl: input.videoUrl, prompt: input.prompt, status: 'completed' }],
- pipelineId: 'digital_human',
- },
- history: {
- keyword: title,
- original_video_title: input.videoTitle,
- status: 'completed',
- cost,
- duration,
- remixId: input.remixId,
- videoId: input.videoId,
- styleName: '数字人生成',
- resultUrl: input.videoUrl,
- quality,
- segmentCount: 1,
- successCount: 1,
- },
- };
- }
- buildRemixVersion(input: DigitalHumanRemixVersionInput, now = new Date()): RemixVersion {
- return {
- id: `REMIX-${Date.now()}`,
- style: '数字人生成',
- created_at: now,
- file_path: input.videoUrl,
- thumbnail: input.thumbnailUrl || 'assets/default-remix-thumb.jpg',
- description: '使用上传形象图与原视频提取音频生成的数字人版本',
- parameters: {
- style: 'digital-human',
- intensity: 1,
- preserve_audio: true,
- quality: input.resolution === '1080p' ? 'high' : 'standard',
- effects: ['digital-human'],
- },
- };
- }
- }
|