mirror of
https://gitlab.rlp.net/proj-wise2526-video2document/video2document.git
synced 2026-06-15 18:01:52 +02:00
Merge branch 'feature/38-sprecher-audio-snippets-s4-11' into 'develop'
extract speaker snippets mit main verknüpft. See merge request proj-wise2526-video2document/video2document!60
This commit is contained in:
@@ -197,7 +197,12 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
|||||||
return
|
return
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: transcriptpath }).then(resp => {
|
||||||
|
mainWindow.webContents.send("submitSpeaker", resp)
|
||||||
|
console.log(resp)
|
||||||
|
})
|
||||||
|
|
||||||
// TODO actually implement this functionality
|
// TODO actually implement this functionality
|
||||||
// Module to get the first few lines for each speaker to send to the frontend
|
// 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 => {
|
// await mapFunctions.get("speaker-getter-idfk").function(transcriptpath).then(resp => {
|
||||||
@@ -210,7 +215,7 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
|||||||
// // speakerA: {source: "Pfad zur Audio File"},
|
// // speakerA: {source: "Pfad zur Audio File"},
|
||||||
// // speakerB:.....
|
// // speakerB:.....
|
||||||
// // }
|
// // }
|
||||||
mainWindow.webContents.send("speakers", {speakerA:"pfad1", speakerB:"pfad2"})
|
// mainWindow.webContents.send("speakers", {speakerA:"pfad1", speakerB:"pfad2"})
|
||||||
// }).catch(err => {
|
// }).catch(err => {
|
||||||
// mainWindow.webContents.send("error", err)
|
// mainWindow.webContents.send("error", err)
|
||||||
// return
|
// return
|
||||||
|
|||||||
Generated
+5
-4
@@ -15,7 +15,7 @@
|
|||||||
"dotenv": "^17.2.3",
|
"dotenv": "^17.2.3",
|
||||||
"electron": "^39.1.1",
|
"electron": "^39.1.1",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"ffmpeg-static": "^5.2.0",
|
"ffmpeg-static": "^5.3.0",
|
||||||
"fluent-ffmpeg": "^2.1.3",
|
"fluent-ffmpeg": "^2.1.3",
|
||||||
"html-to-docx": "^1.8.0",
|
"html-to-docx": "^1.8.0",
|
||||||
"mocha": "^11.7.5",
|
"mocha": "^11.7.5",
|
||||||
@@ -1773,9 +1773,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ffmpeg-static": {
|
"node_modules/ffmpeg-static": {
|
||||||
"version": "5.2.0",
|
"version": "5.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.3.0.tgz",
|
||||||
"integrity": "sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA==",
|
"integrity": "sha512-H+K6sW6TiIX6VGend0KQwthe+kaceeH/luE8dIZyOP35ik7ahYojDuqlTV1bOrtEwl01sy2HFNGQfi5IDJvotg==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -1832,6 +1832,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz",
|
||||||
"integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==",
|
"integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==",
|
||||||
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
|
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^0.2.9",
|
"async": "^0.2.9",
|
||||||
"which": "^1.1.1"
|
"which": "^1.1.1"
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
"dotenv": "^17.2.3",
|
"dotenv": "^17.2.3",
|
||||||
"electron": "^39.1.1",
|
"electron": "^39.1.1",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"ffmpeg-static": "^5.2.0",
|
"ffmpeg-static": "^5.3.0",
|
||||||
"fluent-ffmpeg": "^2.1.3",
|
"fluent-ffmpeg": "^2.1.3",
|
||||||
"html-to-docx": "^1.8.0",
|
"html-to-docx": "^1.8.0",
|
||||||
"mocha": "^11.7.5",
|
"mocha": "^11.7.5",
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
|
||||||
|
const ffmpeg = require("fluent-ffmpeg");
|
||||||
|
const ffmpegPath = require("ffmpeg-static");
|
||||||
|
|
||||||
|
ffmpeg.setFfmpegPath(ffmpegPath);
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: "extract-speaker-snippets",
|
||||||
|
type: "audio",
|
||||||
|
displayname: "Extract Speaker Snippets",
|
||||||
|
|
||||||
|
async function(parameter) {
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
|
||||||
|
let output = {}
|
||||||
|
|
||||||
|
console.log("Extract Speaker Snippets\n");
|
||||||
|
|
||||||
|
// Pfade
|
||||||
|
const AUDIO_PATH = parameter.audioPath; // Gesamt-Audio
|
||||||
|
const JSON_PATH = parameter.jsonPath; // json summary
|
||||||
|
const OUTPUT_DIR = path.join(__dirname, "/../../../storage/audio/speakerSnippets");
|
||||||
|
|
||||||
|
|
||||||
|
if (!AUDIO_PATH || !JSON_PATH) {
|
||||||
|
console.error("no audioPath or jsonPath available");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output-Ordner
|
||||||
|
if (!fs.existsSync(OUTPUT_DIR)) {
|
||||||
|
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON laden
|
||||||
|
let entries;
|
||||||
|
try {
|
||||||
|
entries = JSON.parse(fs.readFileSync(JSON_PATH, "utf8"));
|
||||||
|
} catch (err) {
|
||||||
|
console.error("JSON reading failed", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Array.isArray(entries)) {
|
||||||
|
console.error("JSON is not an Array");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pro Speaker genau EINEN Satz merken
|
||||||
|
const speakerMap = {};
|
||||||
|
|
||||||
|
for (const item of entries) {
|
||||||
|
if (!speakerMap[item.speaker]) {
|
||||||
|
speakerMap[item.speaker] = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FFmpeg pro Speaker ausführen (sequenziell)
|
||||||
|
for (const speaker of Object.keys(speakerMap)) {
|
||||||
|
const data = speakerMap[speaker];
|
||||||
|
|
||||||
|
// ms → Sekunden
|
||||||
|
const startSec = data.start / 1000;
|
||||||
|
const durationSec = (data.end - data.start) / 1000;
|
||||||
|
|
||||||
|
if (durationSec <= 0) {
|
||||||
|
console.log(`invalid times for Speaker ${speaker}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const outFile = path.join(OUTPUT_DIR, `speaker_${speaker}.wav`);
|
||||||
|
|
||||||
|
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");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -10,6 +10,7 @@ module.exports = {
|
|||||||
// let transcript = await mapFunctions.get("assembly").function('../../storage/audio/IMG_2978.wav');
|
// let transcript = await mapFunctions.get("assembly").function('../../storage/audio/IMG_2978.wav');
|
||||||
|
|
||||||
// let summary = await mapFunctions.get("summarize-transcription").function({jsonPath:'/Users/santa/Proj25/video2document/storage/transcripts/IMG_2978.json'});
|
// let summary = await mapFunctions.get("summarize-transcription").function({jsonPath:'/Users/santa/Proj25/video2document/storage/transcripts/IMG_2978.json'});
|
||||||
|
// let snippets = await mapFunctions.get("extract-speaker-snippets").function({audioPath:'/Users/santa/Proj25/video2document/storage/audio/KittyKat.wav', jsonPath1: '/Users/santa/Proj25/video2document/storage/transcriptionSummaries/KittyKat-1765806474958.json' });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user