video_translate/src/types.ts
Song367 e3c4b0f697
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 1m7s
超时时间
2026-03-19 21:02:22 +08:00

103 lines
2.1 KiB
TypeScript

export interface Subtitle {
id: string;
startTime: number;
endTime: number;
originalText: string;
translatedText: string;
ttsText?: string;
ttsLanguage?: string;
speaker: string;
speakerId?: string;
words?: WordTiming[];
confidence?: number;
voiceId: string;
audioUrl?: string;
volume?: number;
age?: string;
voiceCharacteristics?: string;
emotion?: string;
textStyle?: TextStyles;
}
export type LlmProvider = 'doubao' | 'gemini';
export type PipelineQuality = 'full' | 'partial' | 'fallback';
export type SubtitleJobStatus = 'queued' | 'running' | 'succeeded' | 'failed';
export type SubtitleJobStage =
| 'queued'
| 'upload_received'
| 'preparing'
| 'calling_provider'
| 'processing_result'
| 'succeeded'
| 'failed';
export interface WordTiming {
text: string;
startTime: number;
endTime: number;
speakerId: string;
confidence: number;
}
export interface SpeakerTrack {
speakerId: string;
label: string;
gender?: 'male' | 'female' | 'unknown';
}
export interface SubtitlePipelineResult {
subtitles: Subtitle[];
speakers: SpeakerTrack[];
quality: PipelineQuality;
sourceLanguage?: string;
targetLanguage?: string;
ttsLanguage?: string;
duration?: number;
alignmentEngine?: string;
}
export interface SubtitleGenerationProgress {
jobId: string;
requestId: string;
status: SubtitleJobStatus;
stage: SubtitleJobStage;
progress: number;
message: string;
pollTimeoutMs?: number;
}
export interface TextStyles {
fontFamily: string;
fontSize: number;
color: string;
backgroundColor: string;
strokeColor: string;
strokeWidth: number;
alignment: 'left' | 'center' | 'right';
isBold: boolean;
isItalic: boolean;
isUnderline: boolean;
}
export interface SubtitleDefaults {
fontSize: number;
bottomOffsetPercent: number;
}
export const DEFAULT_SUBTITLE_DEFAULTS: SubtitleDefaults = {
fontSize: 24,
bottomOffsetPercent: 10,
};
export interface Voice {
id: string;
name: string;
tag: string;
avatar: string;
gender: 'male' | 'female' | 'neutral';
language: string;
}