Allows choosing and managing each tool

This commit is contained in:
Guillaume Tâche
2024-10-03 21:55:14 +02:00
parent 0a2f9e0c31
commit df58cf4585
117 changed files with 1547 additions and 1515 deletions

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperX {
}

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperXBundledRoot {
}

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperXPythonVersion {
}

View File

@@ -1,43 +1,59 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.conda.CondaSetupModule;
import com.github.gtache.autosubtitle.modules.setup.impl.SubtitleExtractorSetup;
import com.github.gtache.autosubtitle.modules.setup.impl.ToolsRoot;
import com.github.gtache.autosubtitle.modules.setup.whisper.PythonVersion;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperBundledRoot;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperCommonSetupModule;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.setup.SetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import com.github.gtache.autosubtitle.setup.whisperx.WhisperXSetupManager;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import java.nio.file.Path;
/**
* Setup module for Whisper
*/
@Module(includes = WhisperCommonSetupModule.class)
@Module(includes = CondaSetupModule.class)
public abstract class WhisperXSetupModule {
@Binds
@SubtitleExtractorSetup
@IntoMap
@StringKey("whisperx")
abstract SetupManager bindsSubtitleExtractorSetupManager(final WhisperXSetupManager manager);
@Binds
@SubtitleExtractorSetup
abstract SetupManager bindsDefaultSubtitleExtractorSetupManager(final WhisperXSetupManager manager);
@Provides
@PythonVersion
@WhisperXPythonVersion
static String providesPythonVersion() {
return "3.10";
}
@Provides
@WhisperBundledRoot
@WhisperXBundledRoot
static Path providesWhisperXBundledRoot(@ToolsRoot final Path root) {
return root.resolve("whisperx");
}
@Provides
@WhisperVenvPath
static Path providesWhisperXVenvPath(@WhisperBundledRoot final Path root) {
@WhisperXVenvPath
static Path providesWhisperXVenvPath(@WhisperXBundledRoot final Path root) {
return root.resolve("whisperx-env");
}
@Provides
@WhisperX
static WhisperSetupConfiguration providesWhisperSetupConfiguration(@WhisperXBundledRoot final Path root,
@WhisperXVenvPath final Path venvPath,
@WhisperXPythonVersion final String pythonVersion,
final OS os) {
return new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
}
}

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperXVenvPath {
}

View File

@@ -4,6 +4,8 @@ import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.whisperx.WhisperXSubtitleExtractor;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
/**
* Dagger module for Whisper
@@ -16,5 +18,10 @@ public abstract class WhisperXExtractorModule {
}
@Binds
abstract SubtitleExtractor bindsSubtitleExtractor(final WhisperXSubtitleExtractor extractor);
@IntoMap
@StringKey("whisperx")
abstract SubtitleExtractor<?> bindsSubtitleExtractor(final WhisperXSubtitleExtractor extractor);
@Binds
abstract SubtitleExtractor providesDefaultSubtitleExtractor(final WhisperXSubtitleExtractor extractor);
}

View File

@@ -1,31 +0,0 @@
package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.parser.json.whisperx.JSONSubtitleConverter;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import javax.inject.Singleton;
@Module
public abstract class WhisperXJsonModule {
private WhisperXJsonModule() {
}
@Binds
@IntoMap
@StringKey("json")
abstract SubtitleConverter bindsJSONSubtitleConverter(final JSONSubtitleConverter subtitleConverter);
@Provides
@Singleton
static ObjectMapper providesObjectMapper() {
return new ObjectMapper();
}
}

View File

@@ -2,16 +2,17 @@ package com.github.gtache.autosubtitle.modules.whisperx;
import com.github.gtache.autosubtitle.modules.setup.whisperx.WhisperXSetupModule;
import com.github.gtache.autosubtitle.modules.subtitle.extractor.whisperx.WhisperXExtractorModule;
import com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx.WhisperXJsonModule;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import com.github.gtache.autosubtitle.whisperx.WhisperXExtractionModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
/**
* Dagger module for Whisper
*/
@Module(includes = {WhisperXSetupModule.class, WhisperXJsonModule.class, WhisperXExtractorModule.class})
@Module(includes = {WhisperXSetupModule.class, WhisperXExtractorModule.class})
public abstract class WhisperXModule {
private WhisperXModule() {
@@ -19,5 +20,10 @@ public abstract class WhisperXModule {
}
@Binds
@IntoMap
@StringKey("whisperx")
abstract ExtractionModelProvider bindsExtractionModelProvider(final WhisperXExtractionModelProvider provider);
@Binds
abstract ExtractionModelProvider bindsDefaultExtractionModelProvider(final WhisperXExtractionModelProvider provider);
}

View File

@@ -1,7 +1,10 @@
package com.github.gtache.autosubtitle.setup.whisperx;
import com.github.gtache.autosubtitle.modules.setup.whisperx.WhisperX;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.setup.SetupException;
import com.github.gtache.autosubtitle.setup.SetupManager;
import com.github.gtache.autosubtitle.setup.SetupUserBridge;
import com.github.gtache.autosubtitle.setup.conda.CondaSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.AbstractWhisperSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
@@ -16,18 +19,22 @@ import java.nio.file.Files;
import java.time.Duration;
import java.util.List;
import static java.util.Objects.requireNonNull;
/**
* {@link com.github.gtache.autosubtitle.setup.SetupManager} for WhisperX
* {@link SetupManager} for WhisperX
*/
@Singleton
public class WhisperXSetupManager extends AbstractWhisperSetupManager {
private static final Logger logger = LogManager.getLogger(WhisperXSetupManager.class);
private final SetupUserBridge setupUserBridge;
@Inject
WhisperXSetupManager(final CondaSetupManager condaSetupManager, final WhisperSetupConfiguration configuration,
final ProcessRunner processRunner, final HttpClient httpClient) {
WhisperXSetupManager(final CondaSetupManager condaSetupManager, @WhisperX final WhisperSetupConfiguration configuration,
final SetupUserBridge setupUserBridge, final ProcessRunner processRunner, final HttpClient httpClient) {
super(condaSetupManager, configuration, processRunner, httpClient);
this.setupUserBridge = requireNonNull(setupUserBridge);
}
@Override
@@ -35,6 +42,7 @@ public class WhisperXSetupManager extends AbstractWhisperSetupManager {
return "WhisperX";
}
@Override
protected void installWhisper() throws SetupException {
final var path = getPythonPath();
@@ -42,6 +50,7 @@ public class WhisperXSetupManager extends AbstractWhisperSetupManager {
logger.info("Installing whisper");
final var result = processRunner().run(List.of(path.toString(), "-m", "pip", "install", "-U", "git+https://github.com/m-bain/whisperx.git", "numpy<2"), Duration.ofMinutes(15));
if (result.exitCode() == 0) {
checkInstallCuda();
logger.info("Whisper installed");
} else {
throw new SetupException("Error installing whisper: " + result.output());
@@ -51,6 +60,12 @@ public class WhisperXSetupManager extends AbstractWhisperSetupManager {
}
}
private void checkInstallCuda() {
if (setupUserBridge.askForUserConfirmation("WhisperX can use CUDA. Do you want to install it?")) {
//TODO install CUDA "conda install cudnn=8"
}
}
@Override
protected boolean isWhisperInstalled() throws SetupException {
final var path = getPythonPath();

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
public record JSONSubtitleWords(String word, double start, double end, double score) {
}

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -28,14 +28,14 @@ import java.util.stream.Stream;
* {@link SubtitleConverter} implementation for JSON files
*/
@Singleton
public class JSONSubtitleConverter implements SubtitleConverter<SubtitleImpl> {
public class WhisperXJSONSubtitleConverter implements SubtitleConverter<SubtitleImpl> {
private static final Pattern SPLIT_PATTERN = Pattern.compile("[ \n]+");
private final ObjectMapper mapper;
@Inject
JSONSubtitleConverter(final ObjectMapper mapper) {
WhisperXJSONSubtitleConverter(final ObjectMapper mapper) {
this.mapper = Objects.requireNonNull(mapper);
}

View File

@@ -2,16 +2,15 @@ package com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.modules.setup.whisperx.WhisperXVenvPath;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import com.github.gtache.autosubtitle.subtitle.converter.json.whisperx.WhisperXJSONSubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.whisper.AbstractWhisperSubtitleExtractor;
import com.github.gtache.autosubtitle.whisper.WhisperModels;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -19,12 +18,11 @@ import java.util.List;
/**
* WhisperX implementation of {@link SubtitleExtractor}
*/
@Singleton
public class WhisperXSubtitleExtractor extends AbstractWhisperSubtitleExtractor {
@Inject
WhisperXSubtitleExtractor(@WhisperVenvPath final Path venvPath, final SubtitleConverterProvider converterProvider, final ProcessRunner processRunner, final OS os) {
super(venvPath, converterProvider, processRunner, os);
WhisperXSubtitleExtractor(@WhisperXVenvPath final Path venvPath, final WhisperXJSONSubtitleConverter converter, final ProcessRunner processRunner, final OS os) {
super(venvPath, converter, processRunner, os);
}
@Override

View File

@@ -5,14 +5,12 @@ import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider
import com.github.gtache.autosubtitle.whisper.WhisperModels;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Arrays;
import java.util.List;
/**
* Whisper implementation of {@link ExtractionModelProvider}
*/
@Singleton
public class WhisperXExtractionModelProvider implements ExtractionModelProvider {
@Inject

View File

@@ -3,15 +3,14 @@
*/
module com.github.gtache.autosubtitle.whisperx {
requires transitive com.github.gtache.autosubtitle.whisper.common;
requires transitive com.fasterxml.jackson.databind;
requires org.apache.logging.log4j;
exports com.github.gtache.autosubtitle.whisperx;
exports com.github.gtache.autosubtitle.setup.whisperx;
exports com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
exports com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
exports com.github.gtache.autosubtitle.modules.whisperx;
exports com.github.gtache.autosubtitle.modules.setup.whisperx;
exports com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
exports com.github.gtache.autosubtitle.modules.subtitle.extractor.whisperx;
exports com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx;
exports com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
}