Added explicit whisper properties, so the application is easier to configure.

Changed the upload and output root so when developing you can more easily find the files.
Model folder is also changed to be consistent with other directory changes.
Users are no longer required to go from a login page and click on the application name to get to oauth login.
Transcribed files in the files management view are now sorted the same way as the uploaded file status.
This commit is contained in:
Nico Athanassiadis 2025-01-14 12:46:08 +01:00
parent 7b6087ad89
commit 2e680f2bd8
8 changed files with 70 additions and 18 deletions

6
.gitignore vendored

@ -31,3 +31,9 @@ build/
### VS Code ###
.vscode/
### Whisper Models ###
whisper-models/
### Seshat stuff ###
files/

@ -4,9 +4,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import se.su.dsv.seshat.services.JobProcessorService;
import se.su.dsv.seshat.services.WhisperProperties;
@SpringBootApplication
@EnableConfigurationProperties
@ConfigurationPropertiesScan
public class Application implements CommandLineRunner {
@Autowired

@ -23,6 +23,8 @@ import se.su.dsv.seshat.services.UserService;
import java.io.File;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -64,7 +66,19 @@ public class FileController {
}));
model.addAttribute("filesByDirectory", filesByDirectory);
Map<FileMetadata, List<FileMetadata>> sortedFilesByDirectory = filesByDirectory.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.comparing(FileMetadata::getUploadedAt).reversed()))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> {
e1.addAll(e2);
return e1;
},
LinkedHashMap::new
));
model.addAttribute("filesByDirectory", sortedFilesByDirectory);
model.addAttribute("statuses", statuses);
return "file-management";

@ -8,11 +8,8 @@ import org.springframework.web.bind.annotation.GetMapping;
public class LandingController {
@GetMapping("/")
public String showHomePage(Authentication authentication) {
if (authentication != null) {
return "redirect:/files/manage";
}
return "redirect:/login";
public String showHomePage() {
return "redirect:/files/manage";
}
}

@ -11,14 +11,22 @@ import java.io.IOException;
public class Transcriber {
private static final Logger logger = LoggerFactory.getLogger(Transcriber.class);
private static final String MODEL_PATH = System.getProperty("user.home") + "/playground/whisper.cpp/models";
private static final String WHISPER_WORKING_DIRECTORY = System.getProperty("user.home") + "/git/python-whisper/";
private String modelPath;
private String selectedModel;
private String workingDirectory;
ProcessBuilder startVirtualEnv;
private String selectedDevice;
String[] activateVirtualEnv = {"/bin/bash", "-c", "source activate"};
ProcessBuilder startVirtualEnv = new ProcessBuilder(activateVirtualEnv);
public Transcriber(WhisperProperties whisperProperties) {
modelPath = whisperProperties.modelPath();
selectedModel = whisperProperties.selectedModel();
startVirtualEnv = new ProcessBuilder(whisperProperties.activateVirtualEnvCommand());
workingDirectory = whisperProperties.workingDirectory();
selectedDevice = whisperProperties.selectedDevice();
}
private void setStartVirtualEnv() {
startVirtualEnv.directory(new File(WHISPER_WORKING_DIRECTORY + "env/bin/"));
startVirtualEnv.directory(new File(workingDirectory + "/env/bin/"));
startVirtualEnv.inheritIO();
try {
Process p = startVirtualEnv.start();
@ -33,9 +41,13 @@ public class Transcriber {
StringBuilder whisperCommandOptions = new StringBuilder("env/bin/whisper ")
.append(inputFilePath)
.append(" --model_dir ")
.append(MODEL_PATH)
.append(" --model medium --output_dir ")
.append(outputDirectory);
.append(modelPath)
.append(" --model ")
.append(selectedModel)
.append(" --output_dir ")
.append(outputDirectory)
.append(" --device ")
.append(selectedDevice);
if(language != null && !language.equalsIgnoreCase("auto")) {
whisperCommandOptions.append(" --language ")
.append(language);
@ -44,7 +56,7 @@ public class Transcriber {
String[] whisperCommand = {"/bin/bash", "-c", whisperCommandOptions.toString()};
ProcessBuilder transcribeProcess = new ProcessBuilder(whisperCommand);
transcribeProcess.directory(new File(WHISPER_WORKING_DIRECTORY));
transcribeProcess.directory(new File(workingDirectory));
transcribeProcess.inheritIO();
try {
Process p = transcribeProcess.start();

@ -0,0 +1,11 @@
package se.su.dsv.seshat.services;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "whisper")
public record WhisperProperties(String modelPath,
String selectedModel,
String workingDirectory,
String selectedDevice,
String[] activateVirtualEnvCommand) {
}

@ -4,10 +4,17 @@ server.port=8181
spring.servlet.multipart.max-file-size=5GB
spring.servlet.multipart.max-request-size=5GB
app.upload-root=/seshat/uploads
app.output-root=/seshat/outputs
app.upload-root=@project.basedir@/files/uploads
app.output-root=@project.basedir@/files/outputs
app.onSuccess-homepage=/files/manage
# Whisper properties
whisper.activate-virtual-env-command=bash, -c, source activate
whisper.model-path=@project.basedir@/whisper-models
whisper.selected-model=medium
whisper.working-directory=${user.home}/git/python-whisper
whisper.selected-device=cpu
# Database properties (local development)
spring.datasource.url=jdbc:mariadb://localhost:3306/seshat
spring.datasource.username=myuser

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Management - Seshat App</title>
<title>Seshat Auido Transcriber</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.9.1/font/bootstrap-icons.min.css">