feat(subtitles): add local Japanese subtitle generation (#240)

This commit is contained in:
2026-09-15 21:43:11 -07:00
committed by GitHub
parent 6841a37a22
commit 2831e05124
90 changed files with 4934 additions and 57 deletions
+4
View File
@@ -1,4 +1,5 @@
import type { AnkiConnectConfig, WordCardKind } from './anki';
import type { SubtitleGenerationConfig } from '../shared/subtitle-generation';
import type {
AiConfig,
AiFeatureConfig,
@@ -124,6 +125,7 @@ export interface ShortcutsConfig {
openRuntimeOptions?: string | null;
openJimaku?: string | null;
openTsukihime?: string | null;
openSubtitleGeneration?: string | null;
openSessionHelp?: string | null;
openControllerSelect?: string | null;
openControllerDebug?: string | null;
@@ -149,6 +151,7 @@ export interface Config {
shortcuts?: RawShortcutsConfig;
secondarySub?: SecondarySubConfig;
subsync?: SubsyncConfig;
subtitleGeneration?: Partial<SubtitleGenerationConfig>;
startupWarmups?: StartupWarmupsConfig;
subtitleStyle?: SubtitleStyleConfig;
subtitleSidebar?: SubtitleSidebarConfig;
@@ -298,6 +301,7 @@ export interface ResolvedConfig {
shortcuts: Required<ShortcutsConfig>;
secondarySub: Required<SecondarySubConfig>;
subsync: Required<SubsyncConfig>;
subtitleGeneration: SubtitleGenerationConfig;
startupWarmups: {
lowPowerMode: boolean;
mecab: boolean;
+22
View File
@@ -12,6 +12,12 @@ import type {
MediaTimingReviewWaveformResult,
} from './anki';
import type { ChangelogSnapshot } from './changelog';
import type { SubtitleGenerationProgress } from '../shared/subtitle-generation';
import type { SubtitleGenerationModelId } from '../shared/subtitle-generation-model-catalog';
import type {
SubtitleGenerationResult,
SubtitleGenerationStatus,
} from '../shared/subtitle-generation-ipc';
import type { ResolvedConfig, ShortcutsConfig } from './config';
import type {
CompiledSessionBinding,
@@ -431,6 +437,20 @@ export interface SessionNumericSelectionStartPayload {
}
export interface ElectronAPI {
requestSubtitleGenerationOpen: () => Promise<boolean>;
onSubtitleGenerationOpen: (callback: () => void) => void;
getSubtitleGenerationStatus: () => Promise<SubtitleGenerationStatus>;
selectSubtitleGenerationModel: (
model: SubtitleGenerationModelId,
) => Promise<SubtitleGenerationStatus>;
startSubtitleGeneration: () => Promise<SubtitleGenerationResult>;
downloadSubtitleGenerationModel: () => Promise<SubtitleGenerationResult>;
downloadSubtitleGenerationVadModel: () => Promise<SubtitleGenerationResult>;
setSubtitleGenerationVadEnabled: (enabled: boolean) => Promise<SubtitleGenerationStatus>;
cancelSubtitleGeneration: () => Promise<void>;
onSubtitleGenerationProgress: (
callback: (progress: SubtitleGenerationProgress) => void,
) => () => void;
getOverlayLayer: () => 'visible' | 'modal' | null;
getPathForFile: (file: File) => string;
onSubtitle: (callback: (data: SubtitleData) => void) => void;
@@ -579,6 +599,7 @@ export interface ElectronAPI {
modal:
| 'runtime-options'
| 'subsync'
| 'subtitle-generation'
| 'jimaku'
| 'tsukihime'
| 'youtube-track-picker'
@@ -596,6 +617,7 @@ export interface ElectronAPI {
modal:
| 'runtime-options'
| 'subsync'
| 'subtitle-generation'
| 'jimaku'
| 'tsukihime'
| 'youtube-track-picker'
+1
View File
@@ -23,6 +23,7 @@ export type SessionActionId =
| 'openControllerDebug'
| 'openJimaku'
| 'openTsukihime'
| 'openSubtitleGeneration'
| 'openYoutubePicker'
| 'openPlaylistBrowser'
| 'replayCurrentSubtitle'