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 ### ### VS Code ###
.vscode/ .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.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; 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.JobProcessorService;
import se.su.dsv.seshat.services.WhisperProperties;
@SpringBootApplication @SpringBootApplication
@EnableConfigurationProperties
@ConfigurationPropertiesScan
public class Application implements CommandLineRunner { public class Application implements CommandLineRunner {
@Autowired @Autowired

@ -23,6 +23,8 @@ import se.su.dsv.seshat.services.UserService;
import java.io.File; import java.io.File;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; 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); model.addAttribute("statuses", statuses);
return "file-management"; return "file-management";

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

@ -11,14 +11,22 @@ import java.io.IOException;
public class Transcriber { public class Transcriber {
private static final Logger logger = LoggerFactory.getLogger(Transcriber.class); private static final Logger logger = LoggerFactory.getLogger(Transcriber.class);
private static final String MODEL_PATH = System.getProperty("user.home") + "/playground/whisper.cpp/models"; private String modelPath;
private static final String WHISPER_WORKING_DIRECTORY = System.getProperty("user.home") + "/git/python-whisper/"; private String selectedModel;
private String workingDirectory;
ProcessBuilder startVirtualEnv;
private String selectedDevice;
String[] activateVirtualEnv = {"/bin/bash", "-c", "source activate"}; public Transcriber(WhisperProperties whisperProperties) {
ProcessBuilder startVirtualEnv = new ProcessBuilder(activateVirtualEnv); modelPath = whisperProperties.modelPath();
selectedModel = whisperProperties.selectedModel();
startVirtualEnv = new ProcessBuilder(whisperProperties.activateVirtualEnvCommand());
workingDirectory = whisperProperties.workingDirectory();
selectedDevice = whisperProperties.selectedDevice();
}
private void setStartVirtualEnv() { private void setStartVirtualEnv() {
startVirtualEnv.directory(new File(WHISPER_WORKING_DIRECTORY + "env/bin/")); startVirtualEnv.directory(new File(workingDirectory + "/env/bin/"));
startVirtualEnv.inheritIO(); startVirtualEnv.inheritIO();
try { try {
Process p = startVirtualEnv.start(); Process p = startVirtualEnv.start();
@ -33,9 +41,13 @@ public class Transcriber {
StringBuilder whisperCommandOptions = new StringBuilder("env/bin/whisper ") StringBuilder whisperCommandOptions = new StringBuilder("env/bin/whisper ")
.append(inputFilePath) .append(inputFilePath)
.append(" --model_dir ") .append(" --model_dir ")
.append(MODEL_PATH) .append(modelPath)
.append(" --model medium --output_dir ") .append(" --model ")
.append(outputDirectory); .append(selectedModel)
.append(" --output_dir ")
.append(outputDirectory)
.append(" --device ")
.append(selectedDevice);
if(language != null && !language.equalsIgnoreCase("auto")) { if(language != null && !language.equalsIgnoreCase("auto")) {
whisperCommandOptions.append(" --language ") whisperCommandOptions.append(" --language ")
.append(language); .append(language);
@ -44,7 +56,7 @@ public class Transcriber {
String[] whisperCommand = {"/bin/bash", "-c", whisperCommandOptions.toString()}; String[] whisperCommand = {"/bin/bash", "-c", whisperCommandOptions.toString()};
ProcessBuilder transcribeProcess = new ProcessBuilder(whisperCommand); ProcessBuilder transcribeProcess = new ProcessBuilder(whisperCommand);
transcribeProcess.directory(new File(WHISPER_WORKING_DIRECTORY)); transcribeProcess.directory(new File(workingDirectory));
transcribeProcess.inheritIO(); transcribeProcess.inheritIO();
try { try {
Process p = transcribeProcess.start(); 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-file-size=5GB
spring.servlet.multipart.max-request-size=5GB spring.servlet.multipart.max-request-size=5GB
app.upload-root=/seshat/uploads app.upload-root=@project.basedir@/files/uploads
app.output-root=/seshat/outputs app.output-root=@project.basedir@/files/outputs
app.onSuccess-homepage=/files/manage 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) # Database properties (local development)
spring.datasource.url=jdbc:mariadb://localhost:3306/seshat spring.datasource.url=jdbc:mariadb://localhost:3306/seshat
spring.datasource.username=myuser spring.datasource.username=myuser

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