Compare commits

..

1 Commits

Author SHA1 Message Date
MikeHughes-BIN 2900152945 rename 2025-12-16 19:11:11 +01:00
10 changed files with 83 additions and 145 deletions
-1
View File
@@ -24,5 +24,4 @@ job-test:
- npm install
- echo "ASSEMBLYAI_API_KEY=$apikey_assembly" > .env
- echo "GOOGLE_API_KEY=$apikey_gemini" >> .env
- echo "SAIA_API_KEY=$apikey_saia" >> .env
- npm test
+1 -1
View File
@@ -302,7 +302,7 @@ function setSpeakerAudiosValue(valy){
try {
speakerAudios = valy;
speakerRewriten = valy;
document.getElementById("speakerAudioViewer").src = valy.speakerA.src;
document.getElementById("speakerAudioViewer").src = valy.speakerA.source;
} catch (error) {
}
+1 -1
View File
@@ -469,7 +469,7 @@ li {
display: flex;
justify-content: center;
padding: 10px 20px;
margin-left: 10px;
margin-left: 80px;
margin-top: 30px;
margin-bottom: 10px;
background-color: #007BFF;
+35 -18
View File
@@ -132,7 +132,7 @@ electron.ipcMain.on("file_submit", async (event, args) => {
globalArgs = args
let curstep = 0
let totalsteps = 4
const TEMPLATE_MAP = {
"followup-report": "followup_report.txt",
"agenda": "agenda.txt",
@@ -140,9 +140,9 @@ electron.ipcMain.on("file_submit", async (event, args) => {
"sprint-planning": "sprint_planning_note.txt",
"custom": "custom_document.txt"
};
const templateFile = TEMPLATE_MAP[args.document.type];
if (!templateFile) {
throw new Error("Unknown document type: " + args.document.type);
}
@@ -196,25 +196,42 @@ electron.ipcMain.on("file_submit", async (event, args) => {
// This code handles the Text to Document processing module call
console.log(`\n\n Running the LLM for Document Style ${args.document.type}`);
await mapFunctions.get("module-handler").function(args.document.module, { inputTranscriptPath: transcriptpath, documentTypePath: "./storage/documentType/" + templateFile, language: "en" }).then(resp => {
console.log(resp);
globalFinalHtmlPath = resp
curstep++
mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
}).catch(err => {
mainWindow.webContents.send("error", err)
return
})
console.log(resp);
globalFinalHtmlPath = resp
curstep++
mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
}).catch(err => {
mainWindow.webContents.send("error", err)
return
})
}
await mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: transcriptpath }).then(resp => {
mainWindow.webContents.send("submitSpeaker", resp)
console.log(resp)
}).catch(err => {
mainWindow.webContents.send("error", err)
return
mainWindow.webContents.send("submitSpeaker", resp)
console.log(resp)
})
// TODO actually implement this functionality
// Module to get the first few lines for each speaker to send to the frontend
// await mapFunctions.get("speaker-getter-idfk").function(transcriptpath).then(resp => {
// console.log(resp);
// transcriptpath = resp
// curstep++
// mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps})
// // {
// // speakerA: {source: "Pfad zur Audio File"},
// // speakerB:.....
// // }
// mainWindow.webContents.send("speakers", {speakerA:"pfad1", speakerB:"pfad2"})
// }).catch(err => {
// mainWindow.webContents.send("error", err)
// return
// })
} catch (error) {
console.log(error);
}
+4 -1
View File
@@ -450,6 +450,7 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz",
"integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==",
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
@@ -1305,7 +1306,8 @@
"version": "0.0.1534754",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz",
"integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==",
"license": "BSD-3-Clause"
"license": "BSD-3-Clause",
"peer": true
},
"node_modules/diff": {
"version": "4.0.2",
@@ -4204,6 +4206,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"devOptional": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -14,7 +14,7 @@ module.exports = {
let output = {}
// console.log("Extract Speaker Snippets\n");
console.log("Extract Speaker Snippets\n");
// Pfade
const AUDIO_PATH = parameter.audioPath; // Gesamt-Audio
@@ -23,8 +23,7 @@ module.exports = {
if (!AUDIO_PATH || !JSON_PATH) {
// console.error("no audioPath or jsonPath available");
reject(new Error("no audioPath or jsonPath available"));
console.error("no audioPath or jsonPath available");
return;
}
@@ -38,14 +37,12 @@ module.exports = {
try {
entries = JSON.parse(fs.readFileSync(JSON_PATH, "utf8"));
} catch (err) {
// console.error("JSON reading failed", err);
reject(new Error(err));
console.error("JSON reading failed", err);
return;
}
if (!Array.isArray(entries)) {
// console.error("JSON is not an Array");
reject(new Error("JSON is not an Array"));
console.error("JSON is not an Array");
return;
}
@@ -67,36 +64,32 @@ module.exports = {
const durationSec = (data.end - data.start) / 1000;
if (durationSec <= 0) {
// console.log(`invalid times for Speaker ${speaker}`);
console.log(`invalid times for Speaker ${speaker}`);
continue;
}
const outFile = path.join(OUTPUT_DIR, `speaker_${speaker}.wav`);
try {
await new Promise((res, rej) => {
ffmpeg(AUDIO_PATH)
.setStartTime(startSec)
.setDuration(durationSec)
.output(outFile)
.on("end", () => {
output[`speaker${speaker}`] = {src: outFile, name: `speaker${speaker}`}
// console.log(`Snippet erstellt: speaker_${speaker}.wav`);
res();
})
.on("error", (err) => {
// console.error(`FFmpeg Fehler (${speaker})`, err.message);
rej(err);
return
})
.run();
});
} catch (error) {
reject(error)
return
}
await new Promise((res, rej) => {
ffmpeg(AUDIO_PATH)
.setStartTime(startSec)
.setDuration(durationSec)
.output(outFile)
.on("end", () => {
output[`speaker${speaker}`] = {src: outFile, name: `speaker${speaker}`}
console.log(`Snippet erstellt: speaker_${speaker}.wav`);
res();
})
.on("error", (err) => {
console.error(`FFmpeg Fehler (${speaker})`, err.message);
rej();
})
.run();
});
}
resolve(output)
// console.log("\nAlle Speaker-Snippets erstellt\n");
console.log("\nAlle Speaker-Snippets erstellt\n");
})
}
};
+2 -3
View File
@@ -1,5 +1,5 @@
// const fs = require('fs');
// const path = require('path');
const fs = require('fs');
const path = require('path');
const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory
@@ -43,7 +43,6 @@ const module_exports = {
const documentType = await fs.promises.readFile(documentTypePath, "utf-8"); //read document type from Path
const promptText = `${documentType}, in language ${language}, transcript:\n\n${transcript}`; //combine doc type, language and transcript - Change prompt here if needed
// return
// --- REST CALL ---
const response = await fetch(SAIA_URL, { //safe model response in variable
method: "POST",
+16 -89
View File
@@ -21,7 +21,6 @@ let audiopath
let transcriptPath
let summarizePath
let llmpath
let speakers
describe("Unit Tests", function() {
@@ -35,7 +34,7 @@ describe("Unit Tests", function() {
// console.log(resp);
done()
}).catch(err => {
done(err);
throw err;
})
})
it('Extract .mp4 to .flac', function (done) {
@@ -44,7 +43,7 @@ describe("Unit Tests", function() {
// console.log(resp);
done()
}).catch(err => {
done(err);
throw err;
})
})
it('Extracting to a nonexistant format', function (done) {
@@ -87,7 +86,7 @@ describe("Unit Tests", function() {
transcriptPath = resp
done()
}).catch(err => {
done(err)
throw err
})
})
@@ -112,7 +111,7 @@ describe("Unit Tests", function() {
mapFunctions.get("summarize-transcription").function(transcriptPath).then(resp => {
done()
}).catch(err => {
done(err)
throw err
})
})
@@ -129,7 +128,7 @@ describe("Unit Tests", function() {
summarizePath = resp
done()
}).catch(err => {
done(err)
throw err
})
})
@@ -146,92 +145,20 @@ describe("Unit Tests", function() {
this.slow(30000)
this.timeout(120000)
it("ChatGPT", function (done){
mapFunctions.get("llm-saia_openai_gpt").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/followup_report.txt", language: "en"}).then(resp => {
// it("ChatGPT", function (done){
// mapFunctions.get("chatgpt").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/meetingReport.json", language: "en"}).then(resp => {
// done()
// }).catch(err => {
// throw err
// })
// })
it("Gemini", function (done){
mapFunctions.get("llm-gemini").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/meetingReport.json", language: "en"}).then(resp => {
llmpath = resp
done()
}).catch(err => {
done(err)
})
})
it("Gemini", function (done){
mapFunctions.get("llm-gemini").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/followup_report.txt", language: "en"}).then(resp => {
done()
}).catch(err => {
if(err.includes("(503)")){done()} // Error 503 is gemini overload, so an Error that they can at any time throw at us which would crash the pipeline, so we just ignore it and we just imagine that the test passed
else{
console.log(err);
done(err)
}
})
})
it("Qwen3", function (done){
mapFunctions.get("qwen3-235b-a22b").function({inputTranscriptPath: summarizePath, documentTypePath: "./storage/documentType/followup_report.txt", language: "en"}).then(resp => {
done()
}).catch(err => {
done(err)
})
})
it("ChatGPT (Nonexistant Type File)", function (done){
mapFunctions.get("llm-saia_openai_gpt").function({inputTranscriptPath: summarizePath, documentTypePath: "a", language: "en"}).then(resp => {
done("Didnt crash")
}).catch(err => {
done()
})
})
it("Gemini (Nonexistant Type File)", function (done){
mapFunctions.get("llm-gemini").function({inputTranscriptPath: summarizePath, documentTypePath: "a", language: "en"}).then(resp => {
done("Didnt crash")
}).catch(err => {
done()
})
})
it("Qwen3 (Nonexistant Type File)", function (done){
mapFunctions.get("qwen3-235b-a22b").function({inputTranscriptPath: summarizePath, documentTypePath: "a", language: "en"}).then(resp => {
done("Didnt crash")
}).catch(err => {
done()
})
})
})
describe("Audio Snippet", function() {
this.slow(1000)
this.timeout(5000)
// transcriptPath = "A:\\programing\\@projects\\video2document\\storage\\transcriptionSummaries\\testvideo-1765900665001.json"
// audiopath = "A:\\programing\\@projects\\video2document\\storage\\audio\\testvideo.mp3"
it("Audio Snipper Generator", function (done){
mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: summarizePath }).then(resp => {
speakers = resp
done()
}).catch(err => {
done(err)
})
})
it("Audio Snipper Generator (Nonexistant Transcript File)", function (done){
mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: "a" }).then(resp => {
speakers = resp
done("Didnt crash")
}).catch(err => {
done()
})
})
it("Audio Snipper Generator (Nonexistant Audio File)", function (done){
mapFunctions.get("extract-speaker-snippets").function({audioPath: "a", jsonPath: summarizePath }).then(resp => {
speakers = resp
done("Didnt crash")
}).catch(err => {
done()
throw err
})
})
})