Allows choosing and managing each tool
This commit is contained in:
@@ -15,9 +15,5 @@
|
||||
<groupId>com.github.gtache.autosubtitle</groupId>
|
||||
<artifactId>autosubtitle-whisper-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper;
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
import java.lang.annotation.Documented;
|
||||
@@ -12,5 +12,5 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
@Documented
|
||||
@Retention(RUNTIME)
|
||||
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
|
||||
public @interface PythonVersion {
|
||||
public @interface Whisper {
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper;
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
import java.lang.annotation.Documented;
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
|
||||
|
||||
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 WhisperPythonVersion {
|
||||
}
|
||||
@@ -1,30 +1,33 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
|
||||
|
||||
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.whisper.base.WhisperSetupManager;
|
||||
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 WhisperSetupModule {
|
||||
@Binds
|
||||
@SubtitleExtractorSetup
|
||||
@IntoMap
|
||||
@StringKey("whisper")
|
||||
abstract SetupManager bindsSubtitleExtractorSetupManager(final WhisperSetupManager manager);
|
||||
|
||||
@Provides
|
||||
@PythonVersion
|
||||
@WhisperPythonVersion
|
||||
static String providesPythonVersion() {
|
||||
return "3.9.19";
|
||||
}
|
||||
@@ -40,4 +43,13 @@ public abstract class WhisperSetupModule {
|
||||
static Path providesWhisperVenvPath(@WhisperBundledRoot final Path root) {
|
||||
return root.resolve("whisper-env");
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Whisper
|
||||
static WhisperSetupConfiguration providesWhisperSetupConfiguration(@WhisperBundledRoot final Path root,
|
||||
@WhisperVenvPath final Path venvPath,
|
||||
@WhisperPythonVersion final String pythonVersion,
|
||||
final OS os) {
|
||||
return new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper;
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
import java.lang.annotation.Documented;
|
||||
@@ -4,6 +4,8 @@ import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.whisper.base.WhisperSubtitleExtractor;
|
||||
import dagger.Binds;
|
||||
import dagger.Module;
|
||||
import dagger.multibindings.IntoMap;
|
||||
import dagger.multibindings.StringKey;
|
||||
|
||||
/**
|
||||
* Dagger module for Whisper
|
||||
@@ -16,5 +18,7 @@ public abstract class WhisperExtractorModule {
|
||||
}
|
||||
|
||||
@Binds
|
||||
abstract SubtitleExtractor bindsSubtitleExtractor(final WhisperSubtitleExtractor extractor);
|
||||
@IntoMap
|
||||
@StringKey("whisper")
|
||||
abstract SubtitleExtractor<?> bindsSubtitleExtractor(final WhisperSubtitleExtractor extractor);
|
||||
}
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper.base;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
|
||||
import com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base.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 WhisperJsonModule {
|
||||
|
||||
private WhisperJsonModule() {
|
||||
|
||||
}
|
||||
|
||||
@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.whisper.base;
|
||||
|
||||
import com.github.gtache.autosubtitle.modules.setup.whisper.base.WhisperSetupModule;
|
||||
import com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper.base.WhisperExtractorModule;
|
||||
import com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper.base.WhisperJsonModule;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
|
||||
import com.github.gtache.autosubtitle.whisper.base.WhisperExtractionModelProvider;
|
||||
import dagger.Binds;
|
||||
import dagger.Module;
|
||||
import dagger.multibindings.IntoMap;
|
||||
import dagger.multibindings.StringKey;
|
||||
|
||||
/**
|
||||
* Dagger module for Whisper
|
||||
*/
|
||||
@Module(includes = {WhisperSetupModule.class, WhisperJsonModule.class, WhisperExtractorModule.class})
|
||||
@Module(includes = {WhisperSetupModule.class, WhisperExtractorModule.class})
|
||||
public abstract class WhisperModule {
|
||||
|
||||
private WhisperModule() {
|
||||
@@ -19,5 +20,7 @@ public abstract class WhisperModule {
|
||||
}
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@StringKey("whisper")
|
||||
abstract ExtractionModelProvider bindsExtractionModelProvider(final WhisperExtractionModelProvider provider);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package com.github.gtache.autosubtitle.setup.whisper.base;
|
||||
|
||||
import com.github.gtache.autosubtitle.modules.setup.whisper.base.Whisper;
|
||||
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.conda.CondaSetupManager;
|
||||
import com.github.gtache.autosubtitle.setup.whisper.AbstractWhisperSetupManager;
|
||||
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
|
||||
@@ -17,7 +19,7 @@ import java.time.Duration;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* {@link com.github.gtache.autosubtitle.setup.SetupManager} for Whisper
|
||||
* {@link SetupManager} for Whisper
|
||||
*/
|
||||
@Singleton
|
||||
public class WhisperSetupManager extends AbstractWhisperSetupManager {
|
||||
@@ -25,7 +27,7 @@ public class WhisperSetupManager extends AbstractWhisperSetupManager {
|
||||
private static final Logger logger = LogManager.getLogger(WhisperSetupManager.class);
|
||||
|
||||
@Inject
|
||||
WhisperSetupManager(final CondaSetupManager condaSetupManager, final WhisperSetupConfiguration configuration,
|
||||
WhisperSetupManager(final CondaSetupManager condaSetupManager, @Whisper final WhisperSetupConfiguration configuration,
|
||||
final ProcessRunner processRunner, final HttpClient httpClient) {
|
||||
super(condaSetupManager, configuration, processRunner, httpClient);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base;
|
||||
package com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base;
|
||||
package com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base;
|
||||
package com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -2,9 +2,9 @@ package com.github.gtache.autosubtitle.subtitle.extractor.whisper.base;
|
||||
|
||||
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.whisper.base.WhisperVenvPath;
|
||||
import com.github.gtache.autosubtitle.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base.JSONSubtitleConverter;
|
||||
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;
|
||||
@@ -24,9 +24,9 @@ public class WhisperSubtitleExtractor extends AbstractWhisperSubtitleExtractor {
|
||||
|
||||
|
||||
@Inject
|
||||
WhisperSubtitleExtractor(@WhisperVenvPath final Path venvPath, final SubtitleConverterProvider converterProvider,
|
||||
WhisperSubtitleExtractor(@WhisperVenvPath final Path venvPath, final JSONSubtitleConverter converter,
|
||||
final ProcessRunner processRunner, final OS os) {
|
||||
super(venvPath, converterProvider, processRunner, os);
|
||||
super(venvPath, converter, processRunner, os);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
*/
|
||||
module com.github.gtache.autosubtitle.whisper.base {
|
||||
requires transitive com.github.gtache.autosubtitle.whisper.common;
|
||||
requires com.fasterxml.jackson.databind;
|
||||
requires com.github.gtache.autosubtitle.core;
|
||||
requires org.apache.logging.log4j;
|
||||
|
||||
exports com.github.gtache.autosubtitle.setup.whisper.base;
|
||||
exports com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
|
||||
exports com.github.gtache.autosubtitle.subtitle.extractor.whisper.base;
|
||||
exports com.github.gtache.autosubtitle.whisper.base;
|
||||
|
||||
exports com.github.gtache.autosubtitle.modules.setup.whisper.base;
|
||||
exports com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper.base;
|
||||
exports com.github.gtache.autosubtitle.modules.whisper.base;
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper;
|
||||
|
||||
import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.modules.setup.conda.CondaSetupModule;
|
||||
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
@Module(includes = CondaSetupModule.class)
|
||||
public final class WhisperCommonSetupModule {
|
||||
|
||||
private WhisperCommonSetupModule() {
|
||||
|
||||
}
|
||||
|
||||
@Provides
|
||||
static WhisperSetupConfiguration providesWhisperSetupConfiguration(@WhisperBundledRoot final Path root,
|
||||
@WhisperVenvPath final Path venvPath,
|
||||
@PythonVersion final String pythonVersion,
|
||||
final OS os) {
|
||||
return new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.github.gtache.autosubtitle.setup.whisper;
|
||||
|
||||
import com.github.gtache.autosubtitle.ToolType;
|
||||
import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.setup.SetupAction;
|
||||
@@ -35,6 +36,11 @@ public abstract class AbstractWhisperSetupManager extends AbstractSetupManager {
|
||||
this.configuration = requireNonNull(configuration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ToolType type() {
|
||||
return ToolType.SUBTITLE_EXTRACTOR;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SetupStatus getStatus() throws SetupException {
|
||||
if (isWhisperInstalled()) {
|
||||
|
||||
@@ -5,17 +5,16 @@ import com.github.gtache.autosubtitle.File;
|
||||
import com.github.gtache.autosubtitle.Video;
|
||||
import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.subtitle.Subtitle;
|
||||
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.impl.ExtractEventImpl;
|
||||
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@@ -34,7 +33,7 @@ import static java.util.Objects.requireNonNull;
|
||||
/**
|
||||
* Base implementation of {@link SubtitleExtractor} for Whisper
|
||||
*/
|
||||
public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtractor<Subtitle> {
|
||||
public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtractor<SubtitleImpl> {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(AbstractWhisperSubtitleExtractor.class);
|
||||
|
||||
@@ -44,14 +43,14 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
|
||||
private static final Pattern TQDM_PROGRESS_PATTERN = Pattern.compile("^(?<progress>\\d{1,3})%\\|.+");
|
||||
private final Path venvPath;
|
||||
private final ProcessRunner processRunner;
|
||||
private final SubtitleConverter converter;
|
||||
private final SubtitleConverter<SubtitleImpl> converter;
|
||||
private final OS os;
|
||||
private final Set<SubtitleExtractorListener> listeners;
|
||||
|
||||
protected AbstractWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverterProvider converterProvider,
|
||||
protected AbstractWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverter<SubtitleImpl> converter,
|
||||
final ProcessRunner processRunner, final OS os) {
|
||||
this.venvPath = requireNonNull(venvPath);
|
||||
this.converter = requireNonNull(converterProvider.getConverter("json"));
|
||||
this.converter = requireNonNull(converter);
|
||||
this.processRunner = requireNonNull(processRunner);
|
||||
this.os = requireNonNull(os);
|
||||
this.listeners = new HashSet<>();
|
||||
@@ -78,16 +77,16 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
|
||||
|
||||
|
||||
@Override
|
||||
public SubtitleCollection<Subtitle> extract(final Video video, final ExtractOptions options) throws ExtractException {
|
||||
public SubtitleCollection<SubtitleImpl> extract(final Video video, final ExtractOptions options) throws ExtractException {
|
||||
return extract(new AudioOrVideo(video), options);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SubtitleCollection<Subtitle> extract(final Audio audio, final ExtractOptions options) throws ExtractException {
|
||||
public SubtitleCollection<SubtitleImpl> extract(final Audio audio, final ExtractOptions options) throws ExtractException {
|
||||
return extract(new AudioOrVideo(audio), options);
|
||||
}
|
||||
|
||||
private SubtitleCollection<Subtitle> extract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException {
|
||||
private SubtitleCollection<SubtitleImpl> extract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException {
|
||||
if (av.inner() instanceof final File f) {
|
||||
return extract(f.path(), options, av.info().duration());
|
||||
} else {
|
||||
@@ -99,7 +98,7 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
|
||||
}
|
||||
}
|
||||
|
||||
private SubtitleCollection<Subtitle> dumpExtract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException, IOException {
|
||||
private SubtitleCollection<SubtitleImpl> dumpExtract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException, IOException {
|
||||
final var path = Files.createTempFile(AUTOSUBTITLE, "." + av.info().format());
|
||||
try (final var in = av.getInputStream()) {
|
||||
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
|
||||
@@ -109,7 +108,7 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
|
||||
}
|
||||
}
|
||||
|
||||
private SubtitleCollection<Subtitle> extract(final Path path, final ExtractOptions options, final long duration) throws ExtractException {
|
||||
private SubtitleCollection<SubtitleImpl> extract(final Path path, final ExtractOptions options, final long duration) throws ExtractException {
|
||||
try {
|
||||
final var outputDir = Files.createTempDirectory(AUTOSUBTITLE);
|
||||
final var args = createArgs(path, options, outputDir);
|
||||
@@ -137,7 +136,7 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
|
||||
}
|
||||
}
|
||||
|
||||
private SubtitleCollection<Subtitle> parseResult(final Path subtitleFile, final ExtractOptions options) throws ExtractException {
|
||||
private SubtitleCollection<SubtitleImpl> parseResult(final Path subtitleFile, final ExtractOptions options) throws ExtractException {
|
||||
try {
|
||||
return converter.parse(subtitleFile, options.parseOptions());
|
||||
} catch (final ParseException e) {
|
||||
|
||||
@@ -10,5 +10,4 @@ module com.github.gtache.autosubtitle.whisper.common {
|
||||
exports com.github.gtache.autosubtitle.whisper;
|
||||
exports com.github.gtache.autosubtitle.setup.whisper;
|
||||
exports com.github.gtache.autosubtitle.subtitle.extractor.whisper;
|
||||
exports com.github.gtache.autosubtitle.modules.setup.whisper;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisper;
|
||||
|
||||
import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
class TestWhisperCommonSetupModule {
|
||||
|
||||
@Test
|
||||
void testWhisperSetupConfiguration() {
|
||||
final var root = mock(Path.class);
|
||||
final var venvPath = mock(Path.class);
|
||||
final var pythonVersion = "3.10";
|
||||
final var os = OS.LINUX;
|
||||
final var expected = new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
|
||||
assertEquals(expected, WhisperCommonSetupModule.providesWhisperSetupConfiguration(root, venvPath, pythonVersion, os));
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.github.gtache.autosubtitle.setup.whisper;
|
||||
|
||||
import com.github.gtache.autosubtitle.ToolType;
|
||||
import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.setup.SetupException;
|
||||
@@ -53,6 +54,11 @@ class TestAbstractWhisperSetupManager {
|
||||
assertEquals(BUNDLE_INSTALLED, setupManager.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testType() {
|
||||
assertEquals(ToolType.SUBTITLE_EXTRACTOR, setupManager.type());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testInstallAlreadyInstalled() throws SetupException {
|
||||
final var venvPath = Paths.get("path");
|
||||
|
||||
@@ -9,17 +9,16 @@ import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.process.ProcessListener;
|
||||
import com.github.gtache.autosubtitle.process.ProcessResult;
|
||||
import com.github.gtache.autosubtitle.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.subtitle.Subtitle;
|
||||
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
|
||||
import com.github.gtache.autosubtitle.subtitle.extractor.impl.ExtractEventImpl;
|
||||
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
@@ -42,8 +41,7 @@ import static org.mockito.Mockito.*;
|
||||
class TestAbstractWhisperSubtitleExtractor {
|
||||
|
||||
private final Path venvPath;
|
||||
private final SubtitleConverter<Subtitle> converter;
|
||||
private final SubtitleConverterProvider converterProvider;
|
||||
private final SubtitleConverter<SubtitleImpl> converter;
|
||||
private final ProcessRunner processRunner;
|
||||
private final ProcessListener processListener;
|
||||
private final ProcessResult processResult;
|
||||
@@ -54,17 +52,16 @@ class TestAbstractWhisperSubtitleExtractor {
|
||||
private final VideoInfo videoInfo;
|
||||
private final ExtractOptions options;
|
||||
private final ParseOptions parseOptions;
|
||||
private final SubtitleCollection<Subtitle> collection;
|
||||
private final SubtitleCollection<SubtitleImpl> collection;
|
||||
|
||||
|
||||
TestAbstractWhisperSubtitleExtractor(@Mock final SubtitleConverterProvider converterProvider, @Mock final SubtitleConverter<Subtitle> converter,
|
||||
TestAbstractWhisperSubtitleExtractor(@Mock final SubtitleConverter<SubtitleImpl> converter,
|
||||
@Mock final ProcessRunner processRunner, @Mock final ProcessListener processListener,
|
||||
@Mock final ProcessResult processResult, @Mock final VideoInfo videoInfo,
|
||||
@Mock final AudioInfo audioInfo, @Mock final ExtractOptions options,
|
||||
@Mock final ParseOptions parseOptions, @Mock final SubtitleCollection<Subtitle> collection) {
|
||||
@Mock final ParseOptions parseOptions, @Mock final SubtitleCollection<SubtitleImpl> collection) {
|
||||
this.venvPath = Path.of("venv");
|
||||
this.os = OS.LINUX;
|
||||
this.converterProvider = Objects.requireNonNull(converterProvider);
|
||||
this.converter = Objects.requireNonNull(converter);
|
||||
this.processRunner = Objects.requireNonNull(processRunner);
|
||||
this.processListener = Objects.requireNonNull(processListener);
|
||||
@@ -78,13 +75,12 @@ class TestAbstractWhisperSubtitleExtractor {
|
||||
|
||||
@BeforeEach
|
||||
void beforeEach() throws IOException {
|
||||
doReturn(converter).when(converterProvider).getConverter("json");
|
||||
when(processRunner.startListen(anyList())).thenReturn(processListener);
|
||||
when(processListener.join(Duration.ofHours(1))).thenReturn(processResult);
|
||||
when(audioInfo.format()).thenReturn("mp3");
|
||||
when(videoInfo.format()).thenReturn("mp4");
|
||||
when(options.parseOptions()).thenReturn(parseOptions);
|
||||
this.extractor = new DummyWhisperSubtitleExtractor(venvPath, converterProvider, processRunner, os);
|
||||
this.extractor = new DummyWhisperSubtitleExtractor(venvPath, converter, processRunner, os);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -200,14 +196,14 @@ class TestAbstractWhisperSubtitleExtractor {
|
||||
|
||||
@Test
|
||||
void testGetPythonPathWindows() {
|
||||
final var windowsExtractor = new DummyWhisperSubtitleExtractor(venvPath, converterProvider, processRunner, OS.WINDOWS);
|
||||
final var windowsExtractor = new DummyWhisperSubtitleExtractor(venvPath, converter, processRunner, OS.WINDOWS);
|
||||
assertEquals(venvPath.resolve("python.exe"), windowsExtractor.getPythonPath());
|
||||
}
|
||||
|
||||
private static final class DummyWhisperSubtitleExtractor extends AbstractWhisperSubtitleExtractor {
|
||||
|
||||
private DummyWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverterProvider converterProvider, final ProcessRunner processRunner, final OS os) {
|
||||
super(venvPath, converterProvider, processRunner, os);
|
||||
private DummyWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverter<SubtitleImpl> converter, final ProcessRunner processRunner, final OS os) {
|
||||
super(venvPath, converter, processRunner, os);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,9 +16,5 @@
|
||||
<groupId>com.github.gtache.autosubtitle</groupId>
|
||||
<artifactId>autosubtitle-whisper-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -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;
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.github.gtache.autosubtitle.modules.setup.whisperx;
|
||||
|
||||
import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
@@ -24,4 +26,17 @@ class TestWhisperXSetupModule {
|
||||
final var root = Paths.get("root");
|
||||
assertEquals(root.resolve("whisperx-env"), WhisperXSetupModule.providesWhisperXVenvPath(root));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testWhisperSetupConfiguration() {
|
||||
final var root = Paths.get("root");
|
||||
final var venvPath = Paths.get("venv");
|
||||
final var pythonVersion = "3.10";
|
||||
final var os = OS.WINDOWS;
|
||||
final var configuration = new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
|
||||
assertEquals(root, configuration.root());
|
||||
assertEquals(venvPath, configuration.venvPath());
|
||||
assertEquals(pythonVersion, configuration.pythonVersion());
|
||||
assertEquals(os, configuration.os());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
||||
|
||||
class TestWhisperXJsonModule {
|
||||
|
||||
@Test
|
||||
void testObjectMapper() {
|
||||
assertInstanceOf(ObjectMapper.class, WhisperXJsonModule.providesObjectMapper());
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import com.github.gtache.autosubtitle.impl.OS;
|
||||
import com.github.gtache.autosubtitle.process.ProcessResult;
|
||||
import com.github.gtache.autosubtitle.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.setup.SetupException;
|
||||
import com.github.gtache.autosubtitle.setup.SetupUserBridge;
|
||||
import com.github.gtache.autosubtitle.setup.conda.CondaSetupManager;
|
||||
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -30,17 +31,19 @@ class TestWhisperXSetupManager {
|
||||
|
||||
private final CondaSetupManager condaSetupManager;
|
||||
private final ProcessRunner processRunner;
|
||||
private final SetupUserBridge setupUserBridge;
|
||||
private final WhisperSetupConfiguration configuration;
|
||||
private final HttpClient httpClient;
|
||||
private final WhisperXSetupManager whisperXSetupManager;
|
||||
|
||||
TestWhisperXSetupManager(@Mock final CondaSetupManager condaSetupManager, @Mock final WhisperSetupConfiguration configuration,
|
||||
@Mock final ProcessRunner processRunner, @Mock final HttpClient httpClient) {
|
||||
@Mock final SetupUserBridge setupUserBridge, @Mock final ProcessRunner processRunner, @Mock final HttpClient httpClient) {
|
||||
this.condaSetupManager = Objects.requireNonNull(condaSetupManager);
|
||||
this.processRunner = Objects.requireNonNull(processRunner);
|
||||
this.setupUserBridge = Objects.requireNonNull(setupUserBridge);
|
||||
this.configuration = Objects.requireNonNull(configuration);
|
||||
this.httpClient = Objects.requireNonNull(httpClient);
|
||||
this.whisperXSetupManager = new WhisperXSetupManager(condaSetupManager, configuration, processRunner, httpClient);
|
||||
this.whisperXSetupManager = new WhisperXSetupManager(condaSetupManager, configuration, setupUserBridge, processRunner, httpClient);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -115,9 +118,10 @@ class TestWhisperXSetupManager {
|
||||
|
||||
@Test
|
||||
void testIllegal() {
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(null, configuration, processRunner, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, null, processRunner, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, null, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, processRunner, null));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(null, configuration, setupUserBridge, processRunner, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, null, setupUserBridge, processRunner, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, null, processRunner, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, setupUserBridge, null, httpClient));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, setupUserBridge, processRunner, null));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
|
||||
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
|
||||
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
|
||||
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -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.databind.ObjectMapper;
|
||||
import com.github.gtache.autosubtitle.Language;
|
||||
@@ -27,16 +27,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class TestJSONSubtitleConverter {
|
||||
class TestWhisperXJSONSubtitleConverter {
|
||||
|
||||
private final ParseOptions parseOptions;
|
||||
private final FormatOptions formatOptions;
|
||||
private final JSONSubtitleConverter converter;
|
||||
private final WhisperXJSONSubtitleConverter converter;
|
||||
|
||||
TestJSONSubtitleConverter(@Mock final ParseOptions parseOptions, @Mock final FormatOptions formatOptions) {
|
||||
TestWhisperXJSONSubtitleConverter(@Mock final ParseOptions parseOptions, @Mock final FormatOptions formatOptions) {
|
||||
this.parseOptions = Objects.requireNonNull(parseOptions);
|
||||
this.formatOptions = Objects.requireNonNull(formatOptions);
|
||||
this.converter = new JSONSubtitleConverter(new ObjectMapper());
|
||||
this.converter = new WhisperXJSONSubtitleConverter(new ObjectMapper());
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
@@ -3,9 +3,7 @@ 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.process.ProcessRunner;
|
||||
import com.github.gtache.autosubtitle.subtitle.Subtitle;
|
||||
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
|
||||
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.whisper.WhisperModels;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -21,23 +19,20 @@ import java.util.List;
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class TestWhisperXSubtitleExtractor {
|
||||
|
||||
private final Path venvPath;
|
||||
private final SubtitleConverterProvider converterProvider;
|
||||
private final SubtitleConverter<Subtitle> converter;
|
||||
private final WhisperXJSONSubtitleConverter converter;
|
||||
private final ProcessRunner processRunner;
|
||||
private final ExtractOptions options;
|
||||
private final OS os;
|
||||
private WhisperXSubtitleExtractor whisperXSubtitleExtractor;
|
||||
|
||||
TestWhisperXSubtitleExtractor(@Mock final SubtitleConverterProvider converterProvider, @Mock final SubtitleConverter<Subtitle> converter,
|
||||
TestWhisperXSubtitleExtractor(@Mock final WhisperXJSONSubtitleConverter converter,
|
||||
@Mock final ProcessRunner processRunner, @Mock final ExtractOptions options) {
|
||||
this.converterProvider = requireNonNull(converterProvider);
|
||||
this.converter = requireNonNull(converter);
|
||||
this.processRunner = requireNonNull(processRunner);
|
||||
this.options = requireNonNull(options);
|
||||
@@ -47,8 +42,7 @@ class TestWhisperXSubtitleExtractor {
|
||||
|
||||
@BeforeEach
|
||||
void beforeEach() {
|
||||
doReturn(converter).when(converterProvider).getConverter("json");
|
||||
this.whisperXSubtitleExtractor = new WhisperXSubtitleExtractor(venvPath, converterProvider, processRunner, os);
|
||||
this.whisperXSubtitleExtractor = new WhisperXSubtitleExtractor(venvPath, converter, processRunner, os);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -97,9 +91,9 @@ class TestWhisperXSubtitleExtractor {
|
||||
|
||||
@Test
|
||||
void testIllegal() {
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(null, converterProvider, processRunner, os));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(null, converter, processRunner, os));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, null, processRunner, os));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converterProvider, null, os));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converterProvider, processRunner, null));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converter, null, os));
|
||||
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converter, processRunner, null));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user