Allows choosing and managing each tool
This commit is contained in:
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user