mirror of
https://gitlab.rlp.net/proj-wise2526-video2document/video2document.git
synced 2026-06-15 18:01:52 +02:00
Compare commits
54 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 565caebdd8 | |||
| 9688cae537 | |||
| a953f3780b | |||
| b261019905 | |||
| b3fa931c4e | |||
| c201574fd9 | |||
| 14c89bfb17 | |||
| b56b7e04d6 | |||
| 56224d9c14 | |||
| ccc1002a59 | |||
| b7f4ae93ce | |||
| 2380dc6b3d | |||
| e9be536f29 | |||
| 31487d9c36 | |||
| 2627e5f44e | |||
| f0b5002c34 | |||
| bb0ad2b621 | |||
| feca906ab6 | |||
| 3d5265cdda | |||
| 73ed48d8c5 | |||
| 192ef447a6 | |||
| 2f5737d9bc | |||
| 55df227599 | |||
| 5c7b1ac5e9 | |||
| c202d3960b | |||
| ec64564a51 | |||
| c1efe77ec1 | |||
| f706dcaf79 | |||
| dacfa2094c | |||
| 49e2724ad3 | |||
| c43ec93894 | |||
| 5ab29e8423 | |||
| 36c0fde0b1 | |||
| 4ca0d46aa9 | |||
| e88e0c45c0 | |||
| 8341861ae2 | |||
| b6276b005e | |||
| 8f2024df14 | |||
| 0f548b3012 | |||
| 17479be27a | |||
| 7fbf0c59d1 | |||
| ef20a08d9f | |||
| 9a3f84efc8 | |||
| 6813b45c80 | |||
| 773e8b471c | |||
| 013c9b5f2c | |||
| 18e791d56e | |||
| 1ed386fcf4 | |||
| c98d7761b2 | |||
| d09b75a6cd | |||
| 0427056f65 | |||
| 8076fe92f5 | |||
| c2e6c4a186 | |||
| 826381d858 |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
+130
-10
@@ -4,7 +4,10 @@
|
||||
1. [How to run the Software](#how-to-run-the-software)
|
||||
2. [How it works](#how-it-works)
|
||||
3. [Modules](#modules)
|
||||
3. [IPC](#ipc)
|
||||
4. [IPC](#ipc)
|
||||
5. [Authentication](#authentication)
|
||||
6. [UI](#ui)
|
||||
7. [Storage](#storage)
|
||||
|
||||
## How to run the Software
|
||||
If you read the readme file, you will see the basic setup command in order to run the program.
|
||||
@@ -17,13 +20,9 @@ Next up you need to set up the .env file.
|
||||
The file must contain your keys for the modules you want to use.
|
||||
The .env file looks like this:
|
||||
```
|
||||
ASSEMBLYAI_API_KEY=wefhjhjakeghjkahejkghjkaegh
|
||||
GOOGLE_API_KEY=wefhjhjakeghjkahejkghjkaegh
|
||||
SAIA_API_KEY=wefhjhjakeghjkahejkghjkaegh
|
||||
auth_username=wefhjhjakeghjkahejkghjkaegh
|
||||
auth_password=wefhjhjakeghjkahejkghjkaegh
|
||||
```
|
||||
Note that if you write your module in the same format we did, then you will only need to supply the api keys to the individual services you will actually use.
|
||||
If you dont want to use Assembly AI, you can for example just leave this row out of your .env, and the program will just work fine.
|
||||
Only issue will be that it will throw an error if you do run the Assembly AI module anyways.
|
||||
Once that is done, you can run the command `npm start` to actually start the program.
|
||||
Alternatively you can double click the start.bat if you are on Windows for example.
|
||||
|
||||
@@ -39,7 +38,7 @@ The program iterates through all of the folders within `./services/modules`, and
|
||||
This map is available ANYWHERE in the backend code, even within a module, which means, you can call a module, from within a module, from within a module, from within yet another module.
|
||||
|
||||
## Modules
|
||||
Building a new module is super easy, any idiot can get it done.
|
||||
Building a new module is super easy, anyone can get it done.
|
||||
All you need to do is follow the previously mentioned structure.
|
||||
When you have created your module file, the `.js` file, you simply copy paste this code snippet into it.
|
||||
```js
|
||||
@@ -54,7 +53,7 @@ module.exports = {
|
||||
}
|
||||
}
|
||||
```
|
||||
If by this point, you cared enough to actually look at the code and the modules and so on, you might have spotted a file in `./services/modules/utility` called `example.js`.
|
||||
If you had a look at the code and the modules and so on, you might have spotted a file in `./services/modules/utility` called `example.js`.
|
||||
This is a template file that you can just copy paste and use as a base for your new module.
|
||||
It has the same exact code as mentioned right above.
|
||||
Now as for how the code works.
|
||||
@@ -113,4 +112,125 @@ As you can see in this JSON object, each part specifies which module is being us
|
||||
The module names are each the name field specified in the module itself.
|
||||
As for the rest of the fields, they are pretty self explanatory except `document.type`, that is a predefined report type.
|
||||
This is the minimum required setup for the currently implemented pipeline to work.
|
||||
You can always add fields to it, but dont remove the ones from above.
|
||||
You can always add fields to it, but dont remove the ones from above.
|
||||
|
||||
## Authentication
|
||||
Our Software uses a custom API key management System.
|
||||
This system itself is proprietary, and will as such not be delivered with the software.
|
||||
The way it works is simply via a HTTP request.
|
||||
In the current version, the main reads the username and password for authentication from the .env file, and then uses these in the header for the HTTP request.
|
||||
```
|
||||
hostname: "keyserver.dommymommy.xyz", // The URL to the key server
|
||||
port: 443, // The Port of the
|
||||
path: "/v1/auth", // The API Endpoint
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json", // The content type should be JSON
|
||||
"username": un, // the Username used to authenticate
|
||||
"password": pw // The password used to authenticate
|
||||
}
|
||||
```
|
||||
### The Important bit of this whole setup
|
||||
Once the HTTP request is made, it will return a JSON object with the API keys as fields.
|
||||
One such output could look like this:
|
||||
```json
|
||||
{
|
||||
"ASSEMBLYAI_API_KEY": "eajgjkhgahghahegoikh",
|
||||
"GOOGLE_API_KEY": "eajgjkhgahghahegoikh",
|
||||
"SAIA_API_KEY": "eajgjkhgahghahegoikh"
|
||||
}
|
||||
```
|
||||
The key for each entry is being used to store the key in memory.
|
||||
Specifically under `process.env`
|
||||
So, if everything in this request worked out, we will have:
|
||||
```js
|
||||
process.env.ASSEMBLYAI_API_KEY
|
||||
process.env.GOOGLE_API_KEY
|
||||
process.env.SAIA_API_KEY
|
||||
```
|
||||
These variables are accessible anywhere in the code and contain the API Keys, so make sure you dont add some untrusted modules that could steal these API Keys.
|
||||
|
||||
|
||||
## UI
|
||||
The UI has a simple, self-explanatory design, in white and blue.
|
||||
For easy handling and understanding, the UI is using 6 steps to guide the user through the process and offers a help page
|
||||
with more defined explanations regarding the steps of the GUI. All parts used in the GUI are stored in the directory `./electron/main`.
|
||||
|
||||
Files used for the UI:
|
||||
- index.html
|
||||
- style.css
|
||||
- script.js
|
||||
- renderer.js
|
||||
- preload.js
|
||||
- languages.js
|
||||
- package-lock.json
|
||||
- package.json
|
||||
|
||||
Folders used for the UI:
|
||||
- /flags
|
||||
- /icons
|
||||
- /node_modules
|
||||
|
||||
**index.html:**
|
||||
This file is the basic framework of our software. Comments in the code define the different UI sections.
|
||||
The comments are the headlines of the code below them.
|
||||
|
||||
**style.css:**
|
||||
Contains all the css code of the software used in the UI.
|
||||
|
||||
**script.js:**
|
||||
Stores all functions used in the UI.
|
||||
The code is separated by comments in their matching UI section.
|
||||
|
||||
**renderer.js:**
|
||||
Mainly contains every listener function used in the UI, which listens to any events occuring in the UI,
|
||||
to handle these events as intended.
|
||||
The code is separated by comments in their matching UI section.
|
||||
|
||||
**preload.js:**
|
||||
Contains IPC functions to allow communication between the UI and the main process.
|
||||
|
||||
**languages.js:**
|
||||
Holds one JSON, which is used to store the different language variables. These are used
|
||||
in the script.js for the change of the displayed language of the UI. Add languages here, if
|
||||
you want to add more options in the language selection.
|
||||
|
||||
How to add more languages:
|
||||
1. Add another language block, like an existing one in the file. (Note: Use every key, which is also used in the other sections,
|
||||
beside the first key like "eng". This first key should be always unique from the others)
|
||||
2. Assign the desired values to the keys in the new language section.
|
||||
|
||||
How to add more text which changes languages:
|
||||
1. Create the element in the html file with an unique id.
|
||||
2. Add this id to every language section and assign them a matching value.
|
||||
3. Add inside the `script.js` file, inside the `changeLanguage()` function a document call like the others. Except with our id.
|
||||
|
||||
**package-log.json:**
|
||||
It's an electron module file. No changes needed.
|
||||
|
||||
**package.json:**
|
||||
This is an electron base file. No changes needed.
|
||||
|
||||
**/flags:**
|
||||
This directory contains the flags used for the language selection dropdown menu.
|
||||
|
||||
**/icons:**
|
||||
Pictures for the document preview are stored here.
|
||||
|
||||
**/node_modules:**
|
||||
Contains nodes used by electron.
|
||||
|
||||
## Storage
|
||||
|
||||
In the root directory of the project you will find the `storage` folder.
|
||||
This directory is used to persist **all artifacts generated throughout the processing pipeline**, allowing each step to operate independently while still sharing results.
|
||||
|
||||
Each module is expected to **read from and write to this directory**, depending on its responsibility in the pipeline.
|
||||
|
||||
The storage folder contains the following sub folders:
|
||||
- **audio** stores the extracted audio from the video
|
||||
- **audio-snippets** store the individual speaker snippets for speaker identification
|
||||
- **documents** store the HTML files generated by the AI / LLM modules
|
||||
- **documentType** stores the premade prompt templates used for the AI calls
|
||||
- **transcriptionSummaries** store the transcripts after they have been transformed from word-level to sentence-level
|
||||
- **transcripts** store the raw transcripts returned by the transcription services
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Custom Document</title>
|
||||
<style>
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Manage document types</h1>
|
||||
|
||||
<label for="existingDocs">Vorhandene Dokumententypen auswählen (optional):</label>
|
||||
<!--Drop Down-->
|
||||
<select name="existingDocs" id="existingDocs">
|
||||
<option value="newDoc">-- Neuen Dokumententyp erstellen --</option>
|
||||
</select>
|
||||
|
||||
<div id="docNameWrapper">
|
||||
<label for="docName">Name des Dokumententyps:</label>
|
||||
<input type="text" id="docName" placeholder="Gib hier den Namen für den Dokumententyp ein">
|
||||
</div>
|
||||
|
||||
<label for="prompt">Dein Prompt:</label>
|
||||
<textarea id="prompt" placeholder="Schreibe hier den Prompt für dein Dokumententyp..."></textarea>
|
||||
|
||||
<div class="buttons">
|
||||
<a href="index.html">
|
||||
<button id="goBackBtn">Abbrechen</button>
|
||||
</a>
|
||||
<button id="deleteBtn">Dokumententyp löschen</button>
|
||||
<button id="generateBtn">Dokumententyp speichern</button>
|
||||
</div>
|
||||
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<script src="languages.js"></script>
|
||||
<script>
|
||||
const goBackBtn = document.getElementById("goBackBtn");
|
||||
const generateBtn = document.getElementById("generateBtn");
|
||||
const deleteBtn = document.getElementById("deleteBtn");
|
||||
const existingDocs = document.getElementById("existingDocs");
|
||||
const docNameInput = document.getElementById("docName");
|
||||
const promptInput = document.getElementById("prompt");
|
||||
const resultDiv = document.getElementById("result");
|
||||
const exampleText = "";
|
||||
|
||||
// dokumente speichern
|
||||
generateBtn.addEventListener("click", () => {
|
||||
const name = docNameInput.value.trim();
|
||||
const content = promptInput.value.trim();
|
||||
if (!name || !content) {
|
||||
resultDiv.textContent = "Bitte Name des Dokumententyps und Prompt ausfüllen.";
|
||||
setTimeout(() => {
|
||||
resultDiv.textContent = "";
|
||||
}, 3000);
|
||||
return;
|
||||
}
|
||||
window.api.saveTxtFile(name, content).then();
|
||||
resultDiv.textContent = "Dokumententyp erfolgreich gespeichert!";
|
||||
setTimeout(() => {
|
||||
resultDiv.textContent = "";
|
||||
}, 3000);
|
||||
reloadDocuments();
|
||||
|
||||
});
|
||||
|
||||
// dokumente löschen
|
||||
deleteBtn.addEventListener("click", () => {
|
||||
const name = docNameInput.value.trim();
|
||||
|
||||
if (!name) {
|
||||
resultDiv.textContent = "Bitte Name des Dokumententyps angeben.";
|
||||
setTimeout(() => {
|
||||
resultDiv.textContent = "";
|
||||
}, 3000);
|
||||
return;
|
||||
}
|
||||
|
||||
const confirmDelete = confirm(
|
||||
`Möchtest du den Dokumententyp "${name}" wirklich löschen?`
|
||||
);
|
||||
|
||||
if (!confirmDelete) return;
|
||||
|
||||
window.api.deleteTxtFile(name).then((success) => {
|
||||
if (success) {
|
||||
resultDiv.textContent = "Dokumententyp erfolgreich gelöscht!";
|
||||
reloadDocuments();
|
||||
existingDocs.value = "newDoc";
|
||||
existingDocs.dispatchEvent(new Event("change"));
|
||||
} else {
|
||||
resultDiv.textContent = "Dokumententyp konnte nicht gelöscht werden.";
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
resultDiv.textContent = "";
|
||||
}, 3000);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
//function to load existingDoc options to the drop down list
|
||||
const select = document.getElementById('existingDocs');
|
||||
|
||||
window.api.getTxtFiles().then(files => {
|
||||
reloadDocuments();
|
||||
});
|
||||
|
||||
//content anzeigen
|
||||
const docNameWrapper = document.getElementById("docNameWrapper");
|
||||
|
||||
existingDocs.addEventListener("change", async () => {
|
||||
const selected = existingDocs.value;
|
||||
|
||||
if (selected === "newDoc") {
|
||||
docNameWrapper.classList.remove("hidden");
|
||||
docNameInput.value = "";
|
||||
promptInput.value = exampleText;
|
||||
return;
|
||||
}
|
||||
docNameWrapper.classList.add("hidden");
|
||||
|
||||
const content = await window.api.readTxtFile(selected);
|
||||
promptInput.value = content;
|
||||
docNameInput.value = selected.replace(".txt", "");
|
||||
});
|
||||
|
||||
//reload drop down
|
||||
function reloadDocuments() {
|
||||
[...existingDocs.querySelectorAll('option:not([value="newDoc"])')]
|
||||
.forEach(o => o.remove());
|
||||
|
||||
window.api.getTxtFiles().then(files => {
|
||||
files.forEach(file => {
|
||||
const option = document.createElement('option');
|
||||
option.value = file;
|
||||
option.textContent = file
|
||||
.replace('.txt', '') // Endung entfernen
|
||||
.replace(/_/g, ' ') // Leerzeichen ersetzen
|
||||
.replace(/\b\w/g, c => c.toUpperCase()) // ersten Buchstaben groß
|
||||
existingDocs.appendChild(option);
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
@@ -17,302 +17,18 @@
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* ===== CONTAINER ===== */
|
||||
.container {
|
||||
background: white;
|
||||
width: 90%;
|
||||
max-width: 800px;
|
||||
height: 85vh;
|
||||
/* feste Höhe */
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* ===== FIXER TOP-BEREICH ===== */
|
||||
.top-bar {
|
||||
padding: 15px 20px;
|
||||
border-bottom: 1px solid #eee;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.back-btn,
|
||||
.toc-toggle {
|
||||
background: #007BFF;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 8px 14px;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.back-btn:hover,
|
||||
.toc-toggle:hover {
|
||||
background: #0056b3;
|
||||
}
|
||||
|
||||
/* ===== TOC ===== */
|
||||
.toc-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.toc {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 45px;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
|
||||
padding: 10px;
|
||||
min-width: 220px;
|
||||
display: none;
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
.toc a {
|
||||
display: block;
|
||||
padding: 8px 10px;
|
||||
color: #007BFF;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.toc a:hover {
|
||||
background: #f0f2f5;
|
||||
}
|
||||
|
||||
.toc.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* ===== SCROLLBEREICH ===== */
|
||||
.content {
|
||||
padding: 30px;
|
||||
overflow-y: auto;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* Inhalt */
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.step {
|
||||
margin-bottom: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.step h2 {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
.step h3 {
|
||||
color: #555;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.step p {
|
||||
color: #555;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.step img {
|
||||
width: 100%;
|
||||
max-height: 350px;
|
||||
object-fit: contain;
|
||||
border-radius: 8px;
|
||||
margin-top: 15px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<!-- FIXER OBERER TEIL -->
|
||||
<div class="top-bar">
|
||||
<a href="index.html">
|
||||
<button class="back-btn">Zurück</button>
|
||||
</a>
|
||||
|
||||
<h1>Programm Anleitung</h1>
|
||||
|
||||
|
||||
<div class="toc-wrapper">
|
||||
<button class="toc-toggle" onclick="toggleTOC()">Inhaltsverzeichnis</button>
|
||||
<div class="toc" id="toc">
|
||||
<a href="#convertVid" onclick="closeTOC()">Video zu Dokument umwandeln</a>
|
||||
<a href="#firstStep" onclick="closeTOC()">Schritt 1 - Video auswählen</a>
|
||||
<a href="#secondStep" onclick="closeTOC()">Schritt 2 - Konfiguration</a>
|
||||
<a href="#thirdStep" onclick="closeTOC()">Schritt 3 - Dokumententyp auswählen</a>
|
||||
<a href="#fourthStep" onclick="closeTOC()">Schritt 4 - Bestätigen</a>
|
||||
<a href="#fifthStep" onclick="closeTOC()">Schritt 5 - Sprecher identifizieren</a>
|
||||
<a href="#sixthStep" onclick="closeTOC()">Schritt 6 - Dokument speichern</a>
|
||||
<a href="#createDoc" onclick="closeTOC()">Dokumententyp erstellen</a>
|
||||
<a href="#editDoc" onclick="closeTOC()">Dokumententyp bearbeiten</a>
|
||||
<a href="#deleteDoc" onclick="closeTOC()">Dokumententyp löschen</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- NUR DIESER TEIL SCROLLT -->
|
||||
<div class="content">
|
||||
|
||||
<div class="step" id="convertVid">
|
||||
<h2>Video in ein Dokument umwandeln.</h2>
|
||||
|
||||
<div class="step" id="firstStep">
|
||||
<h3>Schritt 1 - Video auswählen</h3>
|
||||
<p id="firstStep">
|
||||
- Ziehe eine Videodatei in das Drag-and-Drop-Feld oder klicke auf <strong>„Video
|
||||
suchen“</strong>,<br>
|
||||
um eine Datei über deinen Dateibrowser auszuwählen.<br>
|
||||
- Klicke anschließend auf <strong>Schritt 2</strong> oder auf den blauen Pfeil rechts, um
|
||||
fortzufahren.
|
||||
</p>
|
||||
</div>
|
||||
<div class="step" id="secondStep">
|
||||
<h3>Schritt 2 - Konfiguration</h3>
|
||||
<p>
|
||||
- Wähle im ersten Auswahlmenü die zu verwendende <strong>KI</strong>.<br>
|
||||
- Wähle im zweiten Auswahlmenü das zu verwendende <strong>Transkriptions-Tool</strong>.<br>
|
||||
- Wähle im dritten Auswahlmenü das <strong>Dateiformat</strong> des zu erstellenden
|
||||
Dokuments.<br>
|
||||
- Wähle im vierten Auswahlmenü die <strong>Sprache</strong> des zu erstellenden Dokuments.<br>
|
||||
- Klicke anschließend auf <strong>Schritt 3</strong> oder auf den blauen Pfeil rechts, um
|
||||
fortzufahren.
|
||||
</p>
|
||||
</div>
|
||||
<div class="step" id="thirdStep">
|
||||
<h3>Schritt 3 - Dokumententyp auswählen</h3>
|
||||
<p>
|
||||
- Wähle einen Dokumententyp über die Checkbox oder einen zuvor erstellten Dokumententyp aus dem
|
||||
Dropdown-Menü aus.<br>
|
||||
- Klicke anschließend auf <strong>Schritt 4</strong> oder auf den blauen Pfeil rechts, um
|
||||
fortzufahren.
|
||||
</p>
|
||||
</div>
|
||||
<div class="step" id="fourthStep">
|
||||
<h3>Schritt 4 - Bestätigen</h3>
|
||||
<p>
|
||||
Klicke auf <strong>„Submit“</strong>, um die Dokumentengenerierung zu starten.<br>
|
||||
Während der Verarbeitung werden vier Statuspunkte angezeigt, die sich schrittweise von rot zu
|
||||
grün färben und den aktuellen Fortschritt darstellen:
|
||||
<br><br>
|
||||
Punkt 1: Upload und Vorbereitung der Videodatei.<br>
|
||||
Punkt 2: Transkription des Videoinhalts.<br>
|
||||
Punkt 3: KI-gestützte Verarbeitung und Dokumentenerstellung.<br>
|
||||
Punkt 4: Abschluss der Generierung und Bereitstellung des Dokuments.
|
||||
<br><br>
|
||||
Nach erfolgreichem Abschluss klicke auf <strong>Schritt 5</strong> oder auf den blauen Pfeil
|
||||
rechts, um fortzufahren.
|
||||
</p>
|
||||
</div>
|
||||
<div class="step" id="fifthStep">
|
||||
<h3>Schritt 5 - Sprecher identifizieren</h3>
|
||||
<p>
|
||||
Im Auswahlmenü kannst du einen erkannten Sprecher auswählen.<br>
|
||||
Über den Play-Button lässt sich ein gesprochener Satz anhören, um den Sprecher eindeutig zu
|
||||
identifizieren.<br>
|
||||
Mit dem Lautsprecher-Symbol kannst du die Lautstärke anpassen.<br>
|
||||
Über das Drei-Punkte-Menü lässt sich die Wiedergabegeschwindigkeit einstellen.<br><br>
|
||||
|
||||
Im Textfeld <strong>„Write name“</strong> gibst du den tatsächlichen Namen des Sprechers ein,
|
||||
damit dieser im Dokument
|
||||
anstelle von Platzhaltern wie z. B. „Sprecher A“ angezeigt wird.<br>
|
||||
Bestätige die Eingabe mit <strong>„Rename Speaker“</strong>.<br><br>
|
||||
|
||||
Mit dem Button <strong>„Rewrite Document“</strong> werden anschließend alle
|
||||
Sprecherbezeichnungen im Dokument ersetzt.<br><br>
|
||||
|
||||
Klicke danach auf <strong>Schritt 6</strong> oder auf den blauen Pfeil rechts, um fortzufahren.
|
||||
</p>
|
||||
</div>
|
||||
<div class="step" id="sixthStep">
|
||||
<h3>Schritt 6 - Dokument speichern</h3>
|
||||
<p>
|
||||
Klicke auf <strong>„Download“</strong>, um das Dokument zu speichern.<br>
|
||||
Es öffnet sich anschließend ein Dateiexplorer, in dem du den gewünschten Speicherort auswählen
|
||||
kannst.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="step" id="createDoc">
|
||||
<h2>Dokumententyp erstellen</h2>
|
||||
<p>
|
||||
- Öffne oben links das Burgermenü und wähle den Punkt <strong>„Dokumententypen
|
||||
verwalten“</strong>.<br>
|
||||
- Wähle anschließend im Auswahlmenü die Option <strong>„-- Neuen Dokumententyp erstellen
|
||||
--“</strong>.<br>
|
||||
- Vergib einen aussagekräftigen Namen für den neuen Dokumententyp.<br>
|
||||
- Formuliere den Prompt für die KI-gestützte Verarbeitung sorgfältig.<br>
|
||||
- Klicke auf <strong>Dokumententyp speichern</strong>.<br><br>
|
||||
<strong>Hinweis:</strong> <br>Der eingegebene Prompt wird unverändert an einen KI-Dienst
|
||||
übermittelt.
|
||||
Achte daher unbedingt auf die Einhaltung der geltenden Datenschutzrichtlinien und gib keine
|
||||
sensiblen oder personenbezogenen Daten ein.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="step" id="editDoc">
|
||||
<h2>Dokumententyp bearbeiten</h2>
|
||||
<p>
|
||||
- Öffne oben links das Burgermenü und wähle den Punkt <strong>„Dokumententypen
|
||||
verwalten“</strong>.<br>
|
||||
- Wähle anschließend im Auswahlmenü den zu bearbeitenden Dokumententyp aus.<br>
|
||||
- Überarbeite den bestehenden KI-Prompt oder formuliere einen neuen Prompt.<br>
|
||||
- Klicke abschließend auf <strong>„Dokumententyp speichern“</strong>.<br><br>
|
||||
|
||||
<strong>Hinweis:</strong><br>
|
||||
Der eingegebene Prompt wird unverändert an einen KI-Dienst übermittelt.
|
||||
Achte daher unbedingt auf die Einhaltung der geltenden Datenschutzrichtlinien und gib keine
|
||||
sensiblen oder personenbezogenen Daten ein.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="step" id="deleteDoc">
|
||||
<h2>Dokumententyp löschen</h2>
|
||||
<p> - Öffne oben links das Burgermenü und wähle den Punkt <strong>„Dokumententypen
|
||||
verwalten“</strong>.<br>
|
||||
- Wähle anschließend im Auswahlmenü den zu löschenden Dokumententyp aus.<br>
|
||||
- Klicke abschließend auf <strong>„Dokumententyp löschen“</strong>.<br><br>
|
||||
|
||||
<strong>Hinweis:</strong><br>
|
||||
Nach Bestätigung des Löschvorgangs kann der Dokumententyp nicht wiederhergestellt werden.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
function toggleTOC() {
|
||||
document.getElementById("toc").classList.toggle("show");
|
||||
}
|
||||
|
||||
|
||||
function closeTOC() {
|
||||
document.getElementById("toc").classList.remove("show");
|
||||
}
|
||||
|
||||
document.addEventListener("click", function (e) {
|
||||
const toc = document.getElementById("toc");
|
||||
const toggle = document.querySelector(".toc-toggle");
|
||||
|
||||
if (!toc.contains(e.target) && !toggle.contains(e.target)) {
|
||||
toc.classList.remove("show");
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 210 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 212 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 226 KiB |
+352
-178
@@ -1,223 +1,397 @@
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title id="title">Video to document</title>
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lc-select@1.3.0/themes/light.css">
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lc-select@1.3.0/themes/light.css" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="h1-wrapper">
|
||||
<section class="p-menu1">
|
||||
<nav id="navbar" class="navigation" role="navigation">
|
||||
<input id="toggle1" type="checkbox" />
|
||||
<label class="hamburger1" for="toggle1">
|
||||
<div class="top"></div>
|
||||
<div class="meat"></div>
|
||||
<div class="bottom"></div>
|
||||
</label>
|
||||
|
||||
<div id="h1-wrapper">
|
||||
<section class="p-menu1">
|
||||
<nav id="navbar" class="navigation" role="navigation">
|
||||
<input id="toggle1" type="checkbox" />
|
||||
<label class="hamburger1" for="toggle1">
|
||||
<div class="top"></div>
|
||||
<div class="meat"></div>
|
||||
<div class="bottom"></div>
|
||||
</label>
|
||||
|
||||
<nav class="menu1">
|
||||
<button id="customDocBtn" onclick="showCD()">Manage document types</button>
|
||||
<a href="help_page.html" class="li1">Help</a>
|
||||
<nav class="menu1">
|
||||
<button id="customDocBtn" onclick="showCD()">
|
||||
Manage document types
|
||||
</button>
|
||||
<button id="helpBtn" onclick="showHelp()">
|
||||
Help
|
||||
</button>
|
||||
</nav>
|
||||
</nav>
|
||||
</nav>
|
||||
</section>
|
||||
</section>
|
||||
<div class="main_h1">
|
||||
<h1 id="h1">Video to document</h1>
|
||||
</div>
|
||||
|
||||
<h1 id="h1">Video to document</h1>
|
||||
<div class="gui-language">
|
||||
<select name="language_option" id="language_option"></select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gui-language">
|
||||
<!-- to do: Ausprobieren mit li, a oder button, im Notfall ohne Flaggen Icons, kein hover-->
|
||||
<select name="language_option" id="language_option"></select>
|
||||
</div>
|
||||
<div class="step-nav">
|
||||
<div class="step-item active" data-step="1" id="step_nav1">1. Step</div>
|
||||
<div class="step-item" data-step="2" id="step_nav2">2. Step</div>
|
||||
<div class="step-item" data-step="3" id="step_nav3">3. Step</div>
|
||||
<div class="step-item" data-step="4" id="step_nav4">4. Step</div>
|
||||
<div class="step-item" data-step="5" id="step_nav5">5. Step</div>
|
||||
<div class="step-item" data-step="6" id="step_nav6">6. Step</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div id="middleContainerWrapper" class="middle-container-wrapper">
|
||||
<button id="prevBtn" class="navBtn" disabled>←</button>
|
||||
|
||||
<div class="step-nav">
|
||||
<div class="step-item active" data-step="1" id="step_nav1">1. Step</div>
|
||||
<div class="step-item" data-step="2" id="step_nav2">2. Step</div>
|
||||
<div class="step-item" data-step="3" id="step_nav3">3. Step</div>
|
||||
<div class="step-item" data-step="4" id="step_nav4">4. Step</div>
|
||||
<div class="step-item" data-step="5" id="step_nav5">5. Step</div>
|
||||
<div class="step-item" data-step="6" id="step_nav6">6. Step</div>
|
||||
</div>
|
||||
|
||||
<div id="middleContainerWrapper" class="middle-container-wrapper">
|
||||
<button id="prevBtn" class="navBtn" disabled>←</button>
|
||||
|
||||
<!-- Visible middle part-->
|
||||
<div class="mitte" id="mitte">
|
||||
|
||||
<!--Costum document section-->
|
||||
<div class="container" id="cdContainer" style="display:none;">
|
||||
<!-- Visible middle part-->
|
||||
<div class="mitte" id="mitte">
|
||||
<!--Costum document section-->
|
||||
<div class="container" id="cdContainer" style="display: none">
|
||||
<h1 id="cd_h1">Manage document types</h1>
|
||||
|
||||
<label for="existingDocs" id="cd_existingDocs">Select existing documents (optional):</label>
|
||||
<!--Drop Down-->
|
||||
<select name="existingDocs" id="existingDocs">
|
||||
<option value="newDoc" id="newDoc">-- Create new document --</option>
|
||||
<option value="newDoc" id="newDoc">
|
||||
-- Create new document --
|
||||
</option>
|
||||
</select>
|
||||
|
||||
<div id="docNameWrapper">
|
||||
<label for="docName" id="cd_docName">Document name:</label>
|
||||
<input type="text" id="docName" placeholder="Enter the document name here">
|
||||
<label for="docName" id="cd_docName">Document name:</label>
|
||||
<input type="text" id="docName" placeholder="Enter the document name here" />
|
||||
</div>
|
||||
|
||||
<label for="prompt" id="cd_promt">Your prompt:</label>
|
||||
<textarea id="prompt" placeholder="Type the prompt for your document here..."></textarea>
|
||||
|
||||
<div class="buttons">
|
||||
<button id="goBackBtn">Return</button>
|
||||
<button id="deleteBtn">Delete document</button>
|
||||
<button id="generateBtn">Save document</button>
|
||||
<button id="goBackBtn">Return</button>
|
||||
<button id="deleteBtn">Delete document</button>
|
||||
<button id="generateBtn">Save document</button>
|
||||
</div>
|
||||
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 1-->
|
||||
<div class="step" id="step1">
|
||||
<h2 class="h2">Upload your video here:</h2>
|
||||
<div class="upload-container" id="uploadContainer">
|
||||
<p id="p1">Drag and drop video file</p>
|
||||
<video id="previewThumbnail" autoplay="false">
|
||||
</video>
|
||||
<div class="file-name" id="fileName">No video chosen</div>
|
||||
<div id="thumbnailContainer">
|
||||
<img id="thumbnailImage" style="display:none;">
|
||||
</div>
|
||||
<button class="custom-btn" id="manualUploadBtn">Search video</button>
|
||||
<input type="file" id="videoUpload" accept="video/*">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 2-->
|
||||
<div class="step" id="step2" style="display:none;">
|
||||
<h2 class="h2">Choose your preferences:</h2>
|
||||
<div class="KI-wrapper">
|
||||
<label id="labelKI">Select ki:</label>
|
||||
<select name="ai_type" id="ai_type"></select>
|
||||
</div>
|
||||
|
||||
<div class="transcript-wrap">
|
||||
<label id="labelTranscription">Select transcription:</label>
|
||||
<select name="transkript_type" id="transkript_type"></select>
|
||||
</div>
|
||||
<!-- Here starts code from the helppage -->
|
||||
|
||||
<div class="type-wrapper">
|
||||
<label id="labelType">Select type:</label>
|
||||
<select name="output_type" id="output_type">
|
||||
<option value="pdf">.pdf</option>
|
||||
<option value="word">.docx</option>
|
||||
<option value="txt">.txt</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="containerHelp" id="helpContainer" style="display: none">
|
||||
<!-- FIXER OBERER TEIL -->
|
||||
<div class="top-bar" id="top_bar_help">
|
||||
<button class="back-btn" id="back_btn" onclick="showHelp()">Return</button>
|
||||
|
||||
<div class="language-wrapper">
|
||||
<label id="labelLanguage">Select language:</label>
|
||||
|
||||
<select name="document_language_option" id="document_language_option">
|
||||
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<h1 id="help_page_h1">Programm tutorial</h1>
|
||||
|
||||
<!-- Here starts code from step 3-->
|
||||
|
||||
<!-- Hover Effekt für Dokumentenvorschau, Fragezeichen hinter Text, drüber hoven zeigt Beispieldokument -->
|
||||
<div class="step" id="step3" style="display:none;">
|
||||
<div class="checkbox-group">
|
||||
<h2 class="h2">Choose prefered document style:</h2>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name ="docFormat" id="docFormat" value="followup-report">
|
||||
<label id="label_format" for="docFormat">Follow-up Report</label>
|
||||
<div class="figure1">
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png">
|
||||
<img class="img-hover1" src="flags/germany-flag-png-large.jpg">
|
||||
|
||||
<div class="toc-wrapper">
|
||||
<button class="toc-toggle" id="help_page_tableofcontents" onclick="toggleTOC()">Table of contents</button>
|
||||
<div class="toc" id="toc">
|
||||
<a href="#convertVid" id='hp_convertVid' onclick="closeTOC()">Convert video to document</a>
|
||||
<a href="#firstStep" id='hp_firstStep' onclick="closeTOC()">Step 1 - Select video</a>
|
||||
<a href="#secondStep" id='hp_secondStep' onclick="closeTOC()">Step 2 - Configuration</a>
|
||||
<a href="#thirdStep" id='hp_thirdStep' onclick="closeTOC()">Step 3 - Select document type</a>
|
||||
<a href="#fourthStep" id='hp_fourthStep' onclick="closeTOC()">Step 4 - Confirm</a>
|
||||
<a href="#fifthStep" id='hp_fifthStep' onclick="closeTOC()">Step 5 - Identify speakers</a>
|
||||
<a href="#sixthStep" id='hp_sixthStep' onclick="closeTOC()">Step 6 - Save document</a>
|
||||
<a href="#createDoc" id='hp_createDoc' onclick="closeTOC()">Create document type</a>
|
||||
<a href="#editDoc" id='hp_editDoc' onclick="closeTOC()">Edit document type</a>
|
||||
<a href="#deleteDoc" id='hp_deleteDoc' onclick="closeTOC()">Delete document type</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary1" value="agenda">
|
||||
<label id="label_summary" for="docFormatSummary">Agenda</label>
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png">
|
||||
|
||||
<!-- NUR DIESER TEIL SCROLLT -->
|
||||
<div class="content" id="content">
|
||||
|
||||
<div class="step_hp" id="convertVid">
|
||||
<h2 id="hp_convertVid_h2">Convert video to document.</h2>
|
||||
|
||||
<div class="step_hp" id="firstStep">
|
||||
<h3 id="hp_firstStep_h3">Step 1 - Select video</h3>
|
||||
<p id="hp_firstStep_p">
|
||||
- Drag a video file into the drag-and-drop field or click <strong>“Search video”</strong>,<br>to select
|
||||
a file using your file browser.<br>- Then click <strong>Step 2</strong> or the blue arrow on the right
|
||||
to continue.
|
||||
</p>
|
||||
</div>
|
||||
<div class="step_hp" id="secondStep">
|
||||
<h3 id="hp_secondStep_h3">Step 2 - Configuration</h3>
|
||||
<p id="hp_secondStep_p">
|
||||
- Select the <strong>AI</strong> to be used in the first dropdown menu.<br>- Select the
|
||||
<strong>transcription tool</strong> to be used in the second dropdown menu.<br>- Select the <strong>file
|
||||
format</strong> of the document to be created in the third dropdown menu.<br>- Select the
|
||||
<strong>language</strong> of the document to be created in the fourth dropdown menu.<br>- Then click
|
||||
<strong>Step 3</strong> or the blue arrow on the right to continue.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<div class="step_hp" id="thirdStep">
|
||||
<h3 id="hp_thirdStep_h3">Step 3 - Select document type</h3>
|
||||
<p id="hp_thirdStep_p">
|
||||
Select a document type using the checkbox or choose a previously created document type from the dropdown
|
||||
menu.<br>- Then click <strong>Step 4</strong> or the blue arrow on the right to continue.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<div class="step_hp" id="fourthStep">
|
||||
<h3 id="hp_fourthStep_h3">Step 4 - Confirm</h3>
|
||||
<p id="hp_fourthStep_p">
|
||||
Click <strong>“Submit”</strong> to start the document generation.<br>During processing, four status
|
||||
indicators are displayed that gradually change from red to green and show the current
|
||||
progress:<br><br>Indicator 1: Upload and preparation of the video file.<br>Indicator 2: Transcription of
|
||||
the video content.<br>Indicator 3: AI-based processing and document creation.<br>Indicator 4: Completion
|
||||
of generation and provision of the document.<br><br>After successful completion, click <strong>Step
|
||||
5</strong> or the blue arrow on the right to continue.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<div class="step_hp" id="fifthStep">
|
||||
<h3 id="hp_fifthStep_h3">Step 5 - Identify speakers</h3>
|
||||
<p id="hp_fifthStep_p">
|
||||
In the dropdown menu, you can select a recognized speaker.<br>Using the play button, you can listen to a
|
||||
spoken sentence to clearly identify the speaker.<br>With the speaker icon, you can adjust the
|
||||
volume.<br>Using the three-dot menu, you can set the playback speed.<br><br>In the text field
|
||||
<strong>“Write name”</strong>, enter the actual name of the speaker so that it is displayed in the
|
||||
document instead of placeholders such as “Speaker A”.<br>Confirm the entry with <strong>“Rename
|
||||
Speaker”</strong>.<br><br>With the <strong>“Rewrite Document”</strong> button, all speaker labels in
|
||||
the document are then replaced.<br><br>After that, click <strong>Step 6</strong> or the blue arrow on
|
||||
the right to continue.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<div class="step_hp" id="sixthStep">
|
||||
<h3 id="hp_sixthStep_h3">Step 6 - Save document</h3>
|
||||
<p id="hp_sixthStep_p">
|
||||
Click <strong>“Download”</strong> to save the document.<br>A file explorer will then open, where you can
|
||||
select the desired storage location.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="step_hp" id="createDoc">
|
||||
<h2 id="hp_createDoc_h2">Create document type</h2>
|
||||
<p id="hp_createDoc_p">
|
||||
- Open the burger menu at the top left and select <strong>“Manage document types”</strong>.<br>- Then
|
||||
select the option <strong>“-- Create new document type --”</strong> from the dropdown menu.<br>- Enter a
|
||||
descriptive name for the new document type.<br>- Carefully formulate the prompt for the AI-based
|
||||
processing.<br>- Click <strong>Save document type</strong>.<br><br><strong>Note:</strong><br>The entered
|
||||
prompt is transmitted unchanged to an AI service. Therefore, make sure to comply with applicable data
|
||||
protection regulations and do not enter any sensitive or personal data.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="step_hp" id="editDoc">
|
||||
<h2 id="hp_editDoc_h2">Edit document type</h2>
|
||||
<p id="hp_editDoc_p">
|
||||
- Open the burger menu at the top left and select <strong>“Manage document types”</strong>.<br>- Then
|
||||
select the document type to be edited from the dropdown menu.<br>- Revise the existing AI prompt or
|
||||
formulate a new prompt.<br>- Finally, click <strong>“Save document
|
||||
type”</strong>.<br><br><strong>Note:</strong><br>The entered prompt is transmitted unchanged to an AI
|
||||
service. Therefore, make sure to comply with applicable data protection regulations and do not enter any
|
||||
sensitive or personal data.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="step_hp" id="deleteDoc">
|
||||
<h2 id="hp_deleteDoc_h2">Delete document type</h2>
|
||||
<p id="hp_deleteDoc_p">
|
||||
- Open the burger menu at the top left and select <strong>“Manage document types”</strong>.<br>- Then
|
||||
select the document type to be deleted from the dropdown menu.<br>- Finally, click <strong>“Delete
|
||||
document type”</strong>.<br><br><strong>Note:</strong><br>After confirming the deletion process, the
|
||||
document type cannot be restored.
|
||||
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary2" value="result-protocol">
|
||||
<label id="label_summary" for="docFormatSummary">Resultprotocol</label>
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png">
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 1-->
|
||||
<div class="step" id="step1">
|
||||
<h2 class="h2" id="step1_h2">Upload your video here:</h2>
|
||||
<div class="upload-container" id="uploadContainer">
|
||||
<p id="p1">Drag and drop video file</p>
|
||||
<video id="previewThumbnail" autoplay="false"></video>
|
||||
<div class="file-name" id="fileName">No video chosen</div>
|
||||
<div id="thumbnailContainer">
|
||||
<img id="thumbnailImage" style="display: none" />
|
||||
</div>
|
||||
<button class="custom-btn" id="manualUploadBtn">
|
||||
Search video
|
||||
</button>
|
||||
<input type="file" id="videoUpload" accept="video/*" />
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary3" value="sprint-planning">
|
||||
<label id="label_summary" for="docFormatSummary">Sprint Planning Note</label>
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png">
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 2-->
|
||||
<div class="step" id="step2" style="display: none">
|
||||
<h2 class="h2" id="step2_h2">Choose your preferences:</h2>
|
||||
<div class="step2-form">
|
||||
<div class="KI-wrapper">
|
||||
<label id="labelKI">Select ki:</label>
|
||||
<select name="ai_type" id="ai_type"></select>
|
||||
</div>
|
||||
|
||||
<div class="transcript-wrap">
|
||||
<label id="labelTranscription">Select transcription:</label>
|
||||
<select name="transkript_type" id="transkript_type"></select>
|
||||
</div>
|
||||
|
||||
<div class="type-wrapper">
|
||||
<label id="labelType">Select type:</label>
|
||||
<select name="output_type" id="output_type">
|
||||
<option value="pdf">.pdf</option>
|
||||
<option value="docx">.docx</option>
|
||||
<option value="txt">.txt</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="language-wrapper">
|
||||
<label id="labelLanguage">Select language:</label>
|
||||
|
||||
<select name="document_language_option" id="document_language_option"></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatCustom" value="custom">
|
||||
<select name="customDocumentTypes" id="customDocumentTypes">
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 3-->
|
||||
|
||||
<!-- Hover Effekt für Dokumentenvorschau, Fragezeichen hinter Text, drüber hoven zeigt Beispieldokument -->
|
||||
<div class="step" id="step3" style="display: none">
|
||||
<div class="checkbox-group">
|
||||
<h2 class="h2" id="step3_h2">Choose prefered document style:</h2>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormat" value="followup-report" />
|
||||
<label id="label_format" for="docFormat">Follow-up Report</label>
|
||||
<div class="figure1">
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png" />
|
||||
<img class="img-hover1" src="icons/follow_up_report_example.png" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary1" value="agenda" />
|
||||
<label id="label_summary" for="docFormatSummary">Agenda</label>
|
||||
<div class="figure2">
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png" />
|
||||
<img class="img-hover2" src="icons/agenda_example.png" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary2" value="result-protocol" />
|
||||
<label id="label_summary_result" for="docFormatSummary">Resultprotocol</label>
|
||||
<div class="figure3">
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png" />
|
||||
<img class="img-hover3" src="icons/result_protocol_example.png" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary3" value="sprint-planning" />
|
||||
<label id="label_summary_note" for="docFormatSummary">Sprint Planning Note</label>
|
||||
<div class="figure4">
|
||||
<img class="img-icon" src="icons/question-mark-button-icon--free-clip-art-30.png" />
|
||||
<img class="img-hover4" src="icons/sprint_planning_note_example.png" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatCustom" value="custom" />
|
||||
<select name="customDocumentTypes" id="customDocumentTypes"></select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 4-->
|
||||
<div class="step" id="step4" style="display: none">
|
||||
<h2 class="h2" id="step4_h2">Click to submit:</h2>
|
||||
<button class="submit-btn" id="submitButton" onclick="checkBoxes()" disabled>
|
||||
Submit
|
||||
</button>
|
||||
|
||||
<div class="testy" id="testy">
|
||||
<div class="box2" id="box1"></div>
|
||||
<p id="box1_p1">---Starting---</p>
|
||||
<div class="box2" id="box2"></div>
|
||||
<p id="box2_p2">---Transkribing---</p>
|
||||
<div class="box2" id="box3"></div>
|
||||
<p id="box3_p3">---Document creation---</p>
|
||||
<div class="box2" id="box4"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 5-->
|
||||
<div class="step" id="step5" style="display: none">
|
||||
<h2 class="h2" id="step5_h2">Change names of the speakers:</h2>
|
||||
|
||||
<div class="speaker-container">
|
||||
<table class="speaker-table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label-cell">
|
||||
<label id="labelSpeaker" for="cur_speaker">Select Speaker:</label>
|
||||
</td>
|
||||
<td class="input-cell">
|
||||
<select name="cur_speaker" id="cur_speaker"></select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label-cell">
|
||||
<label id="labelSpeakerAudio">Speaker Audio:</label>
|
||||
</td>
|
||||
<td class="input-cell">
|
||||
<audio controls id="speakerAudioViewer">
|
||||
Currently there is no audio file here.
|
||||
</audio>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label-cell">
|
||||
<label id="labelSpeakerWriter" for="newSpeaker">New Name:</label>
|
||||
</td>
|
||||
<td class="input-cell">
|
||||
<input type="text" id="newSpeaker" placeholder="Enter new speaker name" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="speaker-button-group">
|
||||
<button id="speakerLocker" onclick="rewriteSpeakerName()">
|
||||
Rename Speaker
|
||||
</button>
|
||||
<button id="speakerResender" onclick="sendSpeakerPackages()">
|
||||
Rewrite Document
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 6-->
|
||||
<div class="step" id="step6" style="display: none">
|
||||
<h2 class="h2" id="step6_h2">Click to download your document:</h2>
|
||||
<button class="download-btn" id="downloadButton" onclick="fileDownload()">
|
||||
Download
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 4-->
|
||||
<div class="step" id="step4" style="display:none;">
|
||||
<h2 class="h2">Click to submit:</h2>
|
||||
<button class="submit-btn" id="submitButton" onclick="checkBoxes()" disabled>Submit</button>
|
||||
|
||||
<div class="testy" id="testy">
|
||||
<div class="box2" id="box1">
|
||||
</div>
|
||||
<p id="box1_p1">---Starting---</p>
|
||||
<div class="box2" id="box2">
|
||||
</div>
|
||||
<p id="box2_p2">---Transkribing---</p>
|
||||
<div class="box2" id="box3">
|
||||
</div>
|
||||
<p id="box3_p3">---Document creation---</p>
|
||||
<div class="box2" id="box4">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 5-->
|
||||
<div class="step" id="step5" style="display:none;">
|
||||
<h2 class="h2">Change names of the speakers:</h2>
|
||||
<div class="speakerView" id="speakerView">
|
||||
<label id="labelSpeaker">Select Speaker:</label>
|
||||
<select name="cur_speaker" id="cur_speaker">
|
||||
</select>
|
||||
</div>
|
||||
<div class="speakerAudio" id="speakerAutio">
|
||||
<label id="labelSpeakerAudio">Selected Speaker:</label>
|
||||
<audio controls id="speakerAudioViewer">
|
||||
Currently there is no audio file here.
|
||||
</audio>
|
||||
</div>
|
||||
<div class="speakerWrite" id="speakerWrite">
|
||||
<label id="labelSpeakerWriter">Write name:</label>
|
||||
<input type="text" id="newSpeaker">
|
||||
</div>
|
||||
<div class="speakerButton-group">
|
||||
<button id="speakerLocker" onclick="rewriteSpeakerName()">Rename Speaker</button>
|
||||
<button id="speakerResender" onclick="sendSpeakerPackages()">Rewrite document</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Here starts code from step 6-->
|
||||
<div class="step" id="step6" style="display:none;">
|
||||
<h2 class="h2">Klick to download your document:</h2>
|
||||
<button class="download-btn" id="downloadButton" onclick="fileDownload()">Download</button>
|
||||
</div>
|
||||
<button id="nextBtn" class="navBtn">→</button>
|
||||
</div>
|
||||
|
||||
<button id ="nextBtn" class="navBtn">→</button>
|
||||
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/lc-select@1.3.0/lc_select.min.js"></script>
|
||||
<script src="languages.js"></script>
|
||||
<script src="script.js"></script>
|
||||
<script src="./renderer.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/lc-select@1.3.0/lc_select.min.js"></script>
|
||||
<script src="languages.js"></script>
|
||||
<script src="script.js"></script>
|
||||
<script src="./renderer.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+346
-32
@@ -1,7 +1,7 @@
|
||||
var languageOptions = {
|
||||
"eng":{
|
||||
"flagPath": "flags/united-kingdom-flag-png-large.jpg",
|
||||
"labelKI": "Select ki:",
|
||||
"labelKI": "Select AI:",
|
||||
"labelTranscription": "Select transcription:",
|
||||
"labelLanguage": "Select language:",
|
||||
"title": "Video to document",
|
||||
@@ -9,9 +9,11 @@ var languageOptions = {
|
||||
"p1": "Drag and drop video file",
|
||||
"fileName": "No video chosen",
|
||||
"manualUploadBtn": "Search video",
|
||||
"checkbox_group": "Choose prefered document style:",
|
||||
"label_format": "Meeting report",
|
||||
"label_summary": "Summary with timestamps",
|
||||
"checkbox_group": "Choose preferred document style:",
|
||||
"label_format": "Follow-up Report",
|
||||
"label_summary": "Agenda",
|
||||
"label_summary_result": "Resultprotocol",
|
||||
"label_summary_note" : "Sprint Planning Note",
|
||||
"submitButton": "Submit",
|
||||
"step_nav1": "Step 1",
|
||||
"step_nav2": "Step 2",
|
||||
@@ -27,7 +29,7 @@ var languageOptions = {
|
||||
"speakerResender": "Rewrite document",
|
||||
"downloadButton": "Download",
|
||||
"box1_p1": "---Starting---",
|
||||
"box2_p2": "---Transkribing---",
|
||||
"box2_p2": "---Transcribing---",
|
||||
"box3_p3": "---Document creation---",
|
||||
"labelType": "Select document type:",
|
||||
|
||||
@@ -41,22 +43,69 @@ var languageOptions = {
|
||||
"goBackBtn": "Return",
|
||||
"deleteBtn": "Delete document",
|
||||
"generateBtn": "Save document",
|
||||
"newDoc": "-- Create new document --"
|
||||
"newDoc": "-- Create new document --",
|
||||
|
||||
"step1_h2" : "Upload your video here:",
|
||||
"step2_h2" : "Choose your preferences:",
|
||||
"step3_h2" : "Choose prefered document style:",
|
||||
"step4_h2" : "Click to submit:",
|
||||
"step5_h2" : "Change names of the speakers:",
|
||||
"step6_h2" : "Click to download your document:",
|
||||
|
||||
//help page
|
||||
"back_btn" : "Back",
|
||||
"help_page_h1" : "Programm tutorial",
|
||||
"help_page_tableofcontents" : "Table of contents",
|
||||
//Inhaltsverzeichnis
|
||||
"hp_convertVid" : "Convert video to document",
|
||||
"hp_firstStep" : "Step 1 - Select video",
|
||||
"hp_secondStep" : "Step 2 - Configuration",
|
||||
"hp_thirdStep" : "Step 3 - Select document type",
|
||||
"hp_fourthStep" : "Step 4 - Confirm",
|
||||
"hp_fifthStep" : "Step 5 - Identify speakers",
|
||||
"hp_sixthStep" : "Step 6 - Save document",
|
||||
"hp_createDoc" : "Create document type",
|
||||
"hp_editDoc" : "Edit document type",
|
||||
"hp_deleteDoc" : "Delete document type",
|
||||
//Ueberschriften
|
||||
"hp_convertVid_h2" : "Convert video to document.",
|
||||
"hp_firstStep_h3" : "Step 1 - Select video",
|
||||
"hp_secondStep_h3" : "Step 2 - Configuration",
|
||||
"hp_thirdStep_h3" : "Step 3 - Select document type",
|
||||
"hp_fourthStep_h3" : "Step 4 - Confirm",
|
||||
"hp_fifthStep_h3" : "Step 5 - Identify speakers",
|
||||
"hp_sixthStep_h3" : "Step 6 - Save document",
|
||||
"hp_createDoc_h2" : "Create document type",
|
||||
"hp_editDoc_h2" : "Edit document type",
|
||||
"hp_deleteDoc_h2" : "Delete document type",
|
||||
//Texte
|
||||
"hp_firstStep_p" : "- Drag a video file into the drag-and-drop field or click <strong>“Search video”</strong>,<br>to select a file using your file browser.<br>- Then click <strong>Step 2</strong> or the blue arrow on the right to continue.",
|
||||
"hp_secondStep_p" : "- Select the <strong>AI</strong> to be used in the first dropdown menu.<br>- Select the <strong>transcription tool</strong> to be used in the second dropdown menu.<br>- Select the <strong>file format</strong> of the document to be created in the third dropdown menu.<br>- Select the <strong>language</strong> of the document to be created in the fourth dropdown menu.<br>- Then click <strong>Step 3</strong> or the blue arrow on the right to continue.",
|
||||
"hp_thirdStep_p" : "- Select a document type using the checkbox or choose a previously created document type from the dropdown menu.<br>- Then click <strong>Step 4</strong> or the blue arrow on the right to continue.",
|
||||
"hp_fourthStep_p" : "Click <strong>“Submit”</strong> to start the document generation.<br>During processing, four status indicators are displayed that gradually change from red to green and show the current progress:<br><br>Indicator 1: Upload and preparation of the video file.<br>Indicator 2: Transcription of the video content.<br>Indicator 3: AI-based processing and document creation.<br>Indicator 4: Completion of generation and provision of the document.<br><br>After successful completion, click <strong>Step 5</strong> or the blue arrow on the right to continue.",
|
||||
"hp_fifthStep_p" : "In the dropdown menu, you can select a recognized speaker.<br>Using the play button, you can listen to a spoken sentence to clearly identify the speaker.<br>With the speaker icon, you can adjust the volume.<br>Using the three-dot menu, you can set the playback speed.<br><br>In the text field <strong>“Write name”</strong>, enter the actual name of the speaker so that it is displayed in the document instead of placeholders such as “Speaker A”.<br>Confirm the entry with <strong>“Rename Speaker”</strong>.<br><br>With the <strong>“Rewrite Document”</strong> button, all speaker labels in the document are then replaced.<br><br>After that, click <strong>Step 6</strong> or the blue arrow on the right to continue.",
|
||||
"hp_sixthStep_p" : "Click <strong>“Download”</strong> to save the document.<br>A file explorer will then open, where you can select the desired storage location.",
|
||||
"hp_createDoc_p" : "- Open the burger menu at the top left and select <strong>“Manage document types”</strong>.<br>- Then select the option <strong>“-- Create new document type --”</strong> from the dropdown menu.<br>- Enter a descriptive name for the new document type.<br>- Carefully formulate the prompt for the AI-based processing.<br>- Click <strong>Save document type</strong>.<br><br><strong>Note:</strong><br>The entered prompt is transmitted unchanged to an AI service. Therefore, make sure to comply with applicable data protection regulations and do not enter any sensitive or personal data.",
|
||||
"hp_editDoc_p" : "- Open the burger menu at the top left and select <strong>“Manage document types”</strong>.<br>- Then select the document type to be edited from the dropdown menu.<br>- Revise the existing AI prompt or formulate a new prompt.<br>- Finally, click <strong>“Save document type”</strong>.<br><br><strong>Note:</strong><br>The entered prompt is transmitted unchanged to an AI service. Therefore, make sure to comply with applicable data protection regulations and do not enter any sensitive or personal data.",
|
||||
"hp_deleteDoc_p" : "- Open the burger menu at the top left and select <strong>“Manage document types”</strong>.<br>- Then select the document type to be deleted from the dropdown menu.<br>- Finally, click <strong>“Delete document type”</strong>.<br><br><strong>Note:</strong><br>After confirming the deletion process, the document type cannot be restored."
|
||||
|
||||
|
||||
},
|
||||
"de":{
|
||||
"flagPath": "flags/germany-flag-png-large.jpg",
|
||||
"labelKI": "Waehle KI:",
|
||||
"labelTranscription": "Waehle Transkription:",
|
||||
"labelLanguage": "Waehle Sprache:",
|
||||
"labelKI": "Wähle KI:",
|
||||
"labelTranscription": "Wähle Transkription:",
|
||||
"labelLanguage": "Wähle Sprache:",
|
||||
"title": "Video zu Dokument",
|
||||
"h1": "Video zu Dokument",
|
||||
"p1": "Video per Drag & Drop ablegen",
|
||||
"fileName": "Kein Video ausgewaehlt",
|
||||
"fileName": "Kein Video ausgewählt",
|
||||
"manualUploadBtn": "Video suchen",
|
||||
"checkbox_group": "Bevorzugte Dokumentvarianten:",
|
||||
"label_format": "Meeting Bericht",
|
||||
"label_summary": "Zusammenfassung mit Zeitstempeln",
|
||||
"label_format": "Folgebericht",
|
||||
"label_summary": "Agenda",
|
||||
"label_summary_result": "Ergebnisprotokoll",
|
||||
"label_summary_note" : "Sprint-Planungshinweis",
|
||||
"submitButton": "Absenden",
|
||||
"step_nav1": "Schritt 1",
|
||||
"step_nav2": "Schritt 2",
|
||||
@@ -64,7 +113,7 @@ var languageOptions = {
|
||||
"step_nav4": "Schritt 4",
|
||||
"step_nav5": "Schritt 5",
|
||||
"step_nav6": "Schritt 6",
|
||||
"h2": "Uploade dein Video hier:",
|
||||
"h2": "Lade dein Video hier hoch:",
|
||||
"labelSpeaker": "Wähle Sprecher:",
|
||||
"labelSpeakerAudio": "Ausgewählter Sprecher:",
|
||||
"labelSpeakerWriter": "Schreib Namen:",
|
||||
@@ -72,36 +121,83 @@ var languageOptions = {
|
||||
"speakerResender": "Überschreibe Dokument",
|
||||
"downloadButton": "Download",
|
||||
"box1_p1": "---Startet---",
|
||||
"box2_p2": "---Transkribing---",
|
||||
"box3_p3": "---Dokument kreieren---",
|
||||
"labelType": "Wähle Dokumenttype:",
|
||||
"box2_p2": "---Transkribierung---",
|
||||
"box3_p3": "---Dokument erstellen---",
|
||||
"labelType": "Wähle Dokumenttyp:",
|
||||
|
||||
"customDocBtn": "Dokumenttypen verwalten",
|
||||
"cd_h1": "Dokumenttypen verwalten",
|
||||
"cd_existingDocs": "Vorhandene Dokumente auswählen (optional):",
|
||||
"cd_docName": "Dokument Name",
|
||||
"cd_docName": "Dokumentname",
|
||||
"docName": "Geben Sie hier den Dokumentnamen ein",
|
||||
"cd_promt": "Ihr Prompt:",
|
||||
"prompt": "Geben Sie hier die Eingabeaufforderung für Ihr Dokument ein...",
|
||||
"goBackBtn": "Zurück",
|
||||
"deleteBtn": "Lösche Dokument",
|
||||
"generateBtn": "Speicher Dokument",
|
||||
"newDoc": "-- Neues Dokument erstellen --"
|
||||
"generateBtn": "Speichere Dokument",
|
||||
"newDoc": "-- Neues Dokument erstellen --",
|
||||
|
||||
"step1_h2" : "Laden Sie Ihr Video hier hoch:",
|
||||
"step2_h2" : "Wählen Sie Ihre Präferenzen:",
|
||||
"step3_h2" : "Wählen Sie den gewünschten Dokumentstil:",
|
||||
"step4_h2" : "Zum Absenden klicken:",
|
||||
"step5_h2" : "Ändern Sie die Namen der Sprecher:",
|
||||
"step6_h2" : "Klicken Sie hier, um Ihr Dokument herunterzuladen:",
|
||||
|
||||
//help page
|
||||
"back_btn" : "Zurück",
|
||||
"help_page_h1" : "Programm Anleitung",
|
||||
"help_page_tableofcontents" : "Inhaltsverzeichnis",
|
||||
//Inhaltsverzeichnis
|
||||
"hp_convertVid" : "Video zu Dokument umwandeln",
|
||||
"hp_firstStep" : "Schritt 1 - Video auswählen",
|
||||
"hp_secondStep" : "Schritt 2 - Konfiguration",
|
||||
"hp_thirdStep" : "Schritt 3 - Dokumententyp auswählen",
|
||||
"hp_fourthStep" : "Schritt 4 - Bestätigen",
|
||||
"hp_fifthStep" : "Schritt 5 - Sprecher identifizieren",
|
||||
"hp_sixthStep" : "Schritt 6 - Dokument speichern",
|
||||
"hp_createDoc" : "Dokumententyp erstellen",
|
||||
"hp_editDoc" : "Dokumententyp bearbeiten",
|
||||
"hp_deleteDoc" : "Dokumententyp löschen",
|
||||
//Ueberschriften
|
||||
"hp_convertVid_h2" : "Video zu Dokument umwandeln.",
|
||||
"hp_firstStep_h3" : "Schritt 1 - Video auswählen",
|
||||
"hp_secondStep_h3" : "Schritt 2 - Konfiguration",
|
||||
"hp_thirdStep_h3" : "Schritt 3 - Dokumententyp auswählen",
|
||||
"hp_fourthStep_h3" : "Schritt 4 - Bestätigen",
|
||||
"hp_fifthStep_h3" : "Schritt 5 - Sprecher identifizieren",
|
||||
"hp_sixthStep_h3" : "Schritt 6 - Dokument speichern",
|
||||
"hp_createDoc_h2" : "Dokumententyp erstellen",
|
||||
"hp_editDoc_h2" : "Dokumententyp bearbeiten",
|
||||
"hp_deleteDoc_h2" : "Dokumententyp löschen",
|
||||
//Texte
|
||||
"hp_firstStep_p" : '- Ziehe eine Videodatei in das Drag-and-Drop-Feld oder klicke auf <strong>„Video suchen“</strong>,<br>um eine Datei über deinen Dateibrowser auszuwählen.<br>- Klicke anschließend auf <strong>Schritt 2</strong> oder auf den blauen Pfeil rechts, um fortzufahren.',
|
||||
"hp_secondStep_p" : '- Wähle im ersten Auswahlmenü die zu verwendende <strong>KI</strong>.<br>- Wähle im zweiten Auswahlmenü das zu verwendende <strong>Transkriptions-Tool</strong>.<br>- Wähle im dritten Auswahlmenü das <strong>Dateiformat</strong> des zu erstellenden Dokuments.<br>- Wähle im vierten Auswahlmenü die <strong>Sprache</strong> des zu erstellenden Dokuments.<br>- Klicke anschließend auf <strong>Schritt 3</strong> oder auf den blauen Pfeil rechts, um fortzufahren.',
|
||||
"hp_thirdStep_p" : '- Wähle einen Dokumententyp über die Checkbox oder einen zuvor erstellten Dokumententyp aus dem Dropdown-Menü aus.<br>- Klicke anschließend auf <strong>Schritt 4</strong> oder auf den blauen Pfeil rechts, um fortzufahren.',
|
||||
"hp_fourthStep_p" : 'Klicke auf <strong>„Submit“</strong>, um die Dokumentengenerierung zu starten.<br>Während der Verarbeitung werden vier Statuspunkte angezeigt, die sich schrittweise von rot zu grün färben und den aktuellen Fortschritt darstellen:<br><br>Punkt 1: Upload und Vorbereitung der Videodatei.<br>Punkt 2: Transkription des Videoinhalts.<br>Punkt 3: KI-gestützte Verarbeitung und Dokumentenerstellung.<br>Punkt 4: Abschluss der Generierung und Bereitstellung des Dokuments.<br><br>Nach erfolgreichem Abschluss klicke auf <strong>Schritt 5</strong> oder auf den blauen Pfeil rechts, um fortzufahren.',
|
||||
"hp_fifthStep_p" : 'Im Auswahlmenü kannst du einen erkannten Sprecher auswählen.<br>Über den Play-Button lässt sich ein gesprochener Satz anhören, um den Sprecher eindeutig zuidentifizieren.<br>Mit dem Lautsprecher-Symbol kannst du die Lautstärke anpassen.<br>Über das Drei-Punkte-Menü lässt sich die Wiedergabegeschwindigkeit einstellen.<br><br>Im Textfeld <strong>„Write name“</strong> gibst du den tatsächlichen Namen des Sprechers ein, damit dieser im Dokument anstelle von Platzhaltern wie z. B. „Sprecher A“ angezeigt wird.<br>Bestätige die Eingabe mit <strong>„Rename Speaker“</strong>.<br><br>Mit dem Button <strong>„Rewrite Document“</strong> werden anschließend alle Sprecherbezeichnungen im Dokument ersetzt.<br><br>Klicke danach auf <strong>Schritt 6</strong> oder auf den blauen Pfeil rechts, um fortzufahren.',
|
||||
"hp_sixthStep_p" : 'Klicke auf <strong>„Download“</strong>, um das Dokument zu speichern.<br>Es öffnet sich anschließend ein Dateiexplorer, in dem du den gewünschten Speicherort auswählen kannst.',
|
||||
"hp_createDoc_p" : '- Öffne oben links das Burgermenü und wähle den Punkt <strong>„Dokumententypen verwalten“</strong>.<br>- Wähle anschließend im Auswahlmenü die Option <strong>„-- Neuen Dokumententyp erstellen --“</strong>.<br>- Vergib einen aussagekräftigen Namen für den neuen Dokumententyp.<br>- Formuliere den Prompt für die KI-gestützte Verarbeitung sorgfältig.<br>- Klicke auf <strong>Dokumententyp speichern</strong>.<br><br><strong>Hinweis:</strong> <br>Der eingegebene Prompt wird unverändert an einen KI-Dienst übermittelt. Achte daher unbedingt auf die Einhaltung der geltenden Datenschutzrichtlinien und gib keine sensiblen oder personenbezogenen Daten ein.',
|
||||
"hp_editDoc_p" : '- Öffne oben links das Burgermenü und wähle den Punkt <strong>„Dokumententypen verwalten“</strong>.<br>- Wähle anschließend im Auswahlmenü den zu bearbeitenden Dokumententyp aus.<br>- Überarbeite den bestehenden KI-Prompt oder formuliere einen neuen Prompt.<br>- Klicke abschließend auf <strong>„Dokumententyp speichern“</strong>.<br><br><strong>Hinweis:</strong><br>Der eingegebene Prompt wird unverändert an einen KI-Dienst übermittelt. Achte daher unbedingt auf die Einhaltung der geltenden Datenschutzrichtlinien und gib keine sensiblen oder personenbezogenen Daten ein.',
|
||||
"hp_deleteDoc_p" : '- Öffne oben links das Burgermenü und wähle den Punkt <strong>„Dokumententypen verwalten“</strong>.<br>- Wähle anschließend im Auswahlmenü den zu löschenden Dokumententyp aus.<br>- Klicke abschließend auf <strong>„Dokumententyp löschen“</strong>.<br><br><strong>Hinweis:</strong><br>Nach Bestätigung des Löschvorgangs kann der Dokumententyp nicht wiederhergestellt werden.'
|
||||
|
||||
},
|
||||
"in":{
|
||||
"flagPath": "flags/india-flag-png-large.png",
|
||||
"labelKI": "की का चयन करें:",
|
||||
"labelKI": "KI का चयन करें:",
|
||||
"labelTranscription": "प्रतिलेखन चुनें:",
|
||||
"labelLanguage": "भाषा चुने:",
|
||||
"labelLanguage": "भाषा चुनें:",
|
||||
"title": "दस्तावेज़ के लिए वीडियो",
|
||||
"h1": "दस्तावेज़ के लिए वीडियो",
|
||||
"p1": "वीडियो फ़ाइल खींचें और छोड़ें",
|
||||
"fileName": "कोई वीडियो नहीं चुना गया",
|
||||
"manualUploadBtn": "वीडियो खोजें",
|
||||
"checkbox_group": "पसंदीदा दस्तावेज़ शैली चुनें:",
|
||||
"label_format": "बैठक रिपोर्ट",
|
||||
"label_summary": "टाइमस्टैम्प के साथ सारांश",
|
||||
"submitButton": "जमा करना",
|
||||
"label_format": "अनुवर्ती रिपोर्ट",
|
||||
"label_summary": "कार्यसूची",
|
||||
"label_summary_result": "परिणाम प्रोटोकॉल",
|
||||
"label_summary_note" : "स्प्रिंट योजना नोट",
|
||||
"submitButton": "जमा करें",
|
||||
"step_nav1": "स्टेप 1",
|
||||
"step_nav2": "स्टेप 2",
|
||||
"step_nav3": "स्टेप 3",
|
||||
@@ -110,11 +206,11 @@ var languageOptions = {
|
||||
"step_nav6": "स्टेप 6",
|
||||
"h2": "अपना वीडियो यहां अपलोड करें:",
|
||||
"labelSpeaker": "स्पीकर चुनें:",
|
||||
"labelSpeakerAudio": "चयनित वक्ता:",
|
||||
"labelSpeakerAudio": "चयनित स्पीकर:",
|
||||
"labelSpeakerWriter": "नाम लिखें:",
|
||||
"speakerLocker": "स्पीकर का नाम बदलें",
|
||||
"speakerResender": "दस्तावेज़ पुनः लिखें",
|
||||
"downloadButton": "डाउनलोड करना",
|
||||
"speakerResender": "दस्तावेज़ फिर से लिखें",
|
||||
"downloadButton": "डाउनलोड करें",
|
||||
"box1_p1": "---प्रारंभ---",
|
||||
"box2_p2": "---प्रतिलेखन---",
|
||||
"box3_p3": "---दस्तावेज़ निर्माण---",
|
||||
@@ -127,11 +223,229 @@ var languageOptions = {
|
||||
"docName": "यहां दस्तावेज़ का नाम दर्ज करें",
|
||||
"cd_promt": "आपका संकेत:",
|
||||
"prompt": "अपने दस्तावेज़ के लिए प्रॉम्प्ट यहां टाइप करें...",
|
||||
"goBackBtn": "वापस करना",
|
||||
"deleteBtn": "दस्तावेज़ हटाएँ",
|
||||
"goBackBtn": "वापस जाएं",
|
||||
"deleteBtn": "दस्तावेज़ हटाएं",
|
||||
"generateBtn": "दस्तावेज़ सहेजें",
|
||||
"newDoc": "-- नया दस्तावेज़ बनाएँ --"
|
||||
"newDoc": "-- नया दस्तावेज़ बनाएं --",
|
||||
|
||||
"step1_h2" : "अपना वीडियो यहां अपलोड करें:",
|
||||
"step2_h2" : "अपनी प्राथमिकताएँ चुनें:",
|
||||
"step3_h2" : "पसंदीदा दस्तावेज़ शैली चुनें:",
|
||||
"step4_h2" : "सबमिट करने के लिए क्लिक करें:",
|
||||
"step5_h2" : "वक्ताओं के नाम बदलें:",
|
||||
"step6_h2" : "अपना दस्तावेज़ डाउनलोड करने के लिए यहां क्लिक करें:",
|
||||
|
||||
//help page
|
||||
"back_btn" : "पीछे",
|
||||
"help_page_h1" : "प्रोग्राम ट्यूटोरियल",
|
||||
"help_page_tableofcontents" : "विषयसूची",
|
||||
//Inhaltsverzeichnis
|
||||
"hp_convertVid" : "वीडियो को दस्तावेज़ में बदलें",
|
||||
"hp_firstStep" : "चरण 1 - वीडियो चुनें",
|
||||
"hp_secondStep" : "चरण 2 - कॉन्फ़िगरेशन",
|
||||
"hp_thirdStep" : "चरण 3 - दस्तावेज़ प्रकार चुनें",
|
||||
"hp_fourthStep" : "चरण 4 - पुष्टि करें",
|
||||
"hp_fifthStep" : "चरण 5 - वक्ताओं की पहचान करें",
|
||||
"hp_sixthStep" : "चरण 6 - दस्तावेज़ सहेजें",
|
||||
"hp_createDoc" : "दस्तावेज़ प्रकार बनाएँ",
|
||||
"hp_editDoc" : "दस्तावेज़ प्रकार संपादित करें",
|
||||
"hp_deleteDoc" : "दस्तावेज़ प्रकार हटाएँ",
|
||||
//Ueberschriften
|
||||
"hp_convertVid_h2" : "वीडियो को दस्तावेज़ में बदलें.",
|
||||
"hp_firstStep_h3" : "चरण 1 - वीडियो चुनें",
|
||||
"hp_secondStep_h3" : "चरण 2 - कॉन्फ़िगरेशन",
|
||||
"hp_thirdStep_h3" : "चरण 3 - दस्तावेज़ प्रकार चुनें",
|
||||
"hp_fourthStep_h3" : "चरण 4 - पुष्टि करें",
|
||||
"hp_fifthStep_h3" : "चरण 5 - वक्ताओं की पहचान करें",
|
||||
"hp_sixthStep_h3" : "चरण 6 - दस्तावेज़ सहेजें",
|
||||
"hp_createDoc_h2" : "दस्तावेज़ प्रकार बनाएँ",
|
||||
"hp_editDoc_h2" : "दस्तावेज़ प्रकार संपादित करें",
|
||||
"hp_deleteDoc_h2" : "दस्तावेज़ प्रकार हटाएँ",
|
||||
//Texte
|
||||
"hp_firstStep_p" : "- किसी वीडियो फ़ाइल को ड्रैग-एंड-ड्रॉप फ़ील्ड में डालें या <strong>“वीडियो खोजें”</strong> पर क्लिक करें,<br>ताकि आप फ़ाइल ब्राउज़र के माध्यम से फ़ाइल चुन सकें।<br>- फिर आगे बढ़ने के लिए <strong>चरण 2</strong> या दाईं ओर नीले तीर पर क्लिक करें।",
|
||||
"hp_secondStep_p" : "- पहले ड्रॉपडाउन मेनू में उपयोग की जाने वाली <strong>AI</strong> चुनें।<br>- दूसरे ड्रॉपडाउन मेनू में उपयोग किया जाने वाला <strong>ट्रांसक्रिप्शन टूल</strong> चुनें।<br>- तीसरे ड्रॉपडाउन मेनू में बनाए जाने वाले दस्तावेज़ का <strong>फ़ाइल फ़ॉर्मेट</strong> चुनें।<br>- चौथे ड्रॉपडाउन मेनू में बनाए जाने वाले दस्तावेज़ की <strong>भाषा</strong> चुनें।<br>- फिर आगे बढ़ने के लिए <strong>चरण 3</strong> या दाईं ओर नीले तीर पर क्लिक करें।",
|
||||
"hp_thirdStep_p" : "- चेकबॉक्स का उपयोग करके किसी दस्तावेज़ प्रकार का चयन करें या ड्रॉपडाउन मेनू से पहले से बनाए गए दस्तावेज़ प्रकार को चुनें।<br>- फिर आगे बढ़ने के लिए <strong>चरण 4</strong> या दाईं ओर नीले तीर पर क्लिक करें।",
|
||||
"hp_fourthStep_p" : "<strong>“Submit”</strong> पर क्लिक करें ताकि दस्तावेज़ निर्माण शुरू हो सके।<br>प्रसंस्करण के दौरान चार स्थिति संकेतक दिखाए जाते हैं, जो धीरे-धीरे लाल से हरे रंग में बदलते हैं और वर्तमान प्रगति दर्शाते हैं:<br><br>संकेतक 1: वीडियो फ़ाइल का अपलोड और तैयारी।<br>संकेतक 2: वीडियो सामग्री का ट्रांसक्रिप्शन।<br>संकेतक 3: AI-आधारित प्रसंस्करण और दस्तावेज़ निर्माण।<br>संकेतक 4: निर्माण का समापन और दस्तावेज़ की उपलब्धता।<br><br>सफलतापूर्वक पूरा होने के बाद, आगे बढ़ने के लिए <strong>चरण 5</strong> या दाईं ओर नीले तीर पर क्लिक करें।",
|
||||
"hp_fifthStep_p" : "ड्रॉपडाउन मेनू में आप किसी पहचाने गए वक्ता का चयन कर सकते हैं।<br>प्ले बटन का उपयोग करके आप किसी बोले गए वाक्य को सुन सकते हैं ताकि वक्ता की स्पष्ट पहचान हो सके।<br>स्पीकर आइकन से आप वॉल्यूम समायोजित कर सकते हैं।<br>तीन-डॉट मेनू से आप प्लेबैक गति सेट कर सकते हैं।<br><br>टेक्स्ट फ़ील्ड <strong>“Write name”</strong> में वक्ता का वास्तविक नाम दर्ज करें ताकि दस्तावेज़ में “Speaker A” जैसे प्लेसहोल्डर के बजाय वही नाम दिखाया जाए।<br><strong>“Rename Speaker”</strong> के साथ प्रविष्टि की पुष्टि करें।<br><br><strong>“Rewrite Document”</strong> बटन से दस्तावेज़ में सभी वक्ता नामों को बदल दिया जाता है।<br><br>इसके बाद आगे बढ़ने के लिए <strong>चरण 6</strong> या दाईं ओर नीले तीर पर क्लिक करें।",
|
||||
"hp_sixthStep_p" : "<strong>“Download”</strong> पर क्लिक करें ताकि दस्तावेज़ सहेजा जा सके।<br>इसके बाद एक फ़ाइल एक्सप्लोरर खुलेगा, जहाँ आप इच्छित संग्रह स्थान चुन सकते हैं।",
|
||||
"hp_createDoc_p" : "- ऊपर बाएँ कोने में बर्गर मेनू खोलें और <strong>“दस्तावेज़ प्रकार प्रबंधित करें”</strong> चुनें।<br>- फिर ड्रॉपडाउन मेनू से <strong>“-- नया दस्तावेज़ प्रकार बनाएँ --”</strong> विकल्प चुनें।<br>- नए दस्तावेज़ प्रकार के लिए एक अर्थपूर्ण नाम दर्ज करें।<br>- AI-आधारित प्रसंस्करण के लिए प्रॉम्प्ट को सावधानीपूर्वक तैयार करें।<br>- <strong>दस्तावेज़ प्रकार सहेजें</strong> पर क्लिक करें।<br><br><strong>नोट:</strong><br>दर्ज किया गया प्रॉम्प्ट बिना किसी बदलाव के एक AI सेवा को भेजा जाता है। इसलिए लागू डेटा संरक्षण नियमों का पालन करें और कोई संवेदनशील या व्यक्तिगत डेटा दर्ज न करें।",
|
||||
"hp_editDoc_p" : "- ऊपर बाएँ कोने में बर्गर मेनू खोलें और <strong>“दस्तावेज़ प्रकार प्रबंधित करें”</strong> चुनें।<br>- फिर ड्रॉपडाउन मेनू से संपादित किए जाने वाले दस्तावेज़ प्रकार को चुनें।<br>- मौजूदा AI प्रॉम्प्ट को संशोधित करें या नया प्रॉम्प्ट तैयार करें।<br>- अंत में <strong>“दस्तावेज़ प्रकार सहेजें”</strong> पर क्लिक करें।<br><br><strong>नोट:</strong><br>दर्ज किया गया प्रॉम्प्ट बिना किसी बदलाव के एक AI सेवा को भेजा जाता है। इसलिए लागू डेटा संरक्षण नियमों का पालन करें और कोई संवेदनशील या व्यक्तिगत डेटा दर्ज न करें।",
|
||||
"hp_deleteDoc_p" : "- ऊपर बाएँ कोने में बर्गर मेनू खोलें और <strong>“दस्तावेज़ प्रकार प्रबंधित करें”</strong> चुनें।<br>- फिर ड्रॉपडाउन मेनू से हटाए जाने वाले दस्तावेज़ प्रकार को चुनें।<br>- अंत में <strong>“दस्तावेज़ प्रकार हटाएँ”</strong> पर क्लिक करें।<br><br><strong>नोट:</strong><br>हटाने की प्रक्रिया की पुष्टि करने के बाद, दस्तावेज़ प्रकार को पुनर्स्थापित नहीं किया जा सकता।"
|
||||
|
||||
|
||||
}
|
||||
|
||||
}/*,
|
||||
"cz":{
|
||||
"flagPath": "flags/czechia-flag-png-large.png",
|
||||
"labelKI": "Vyberte AI:",
|
||||
"labelTranscription": "Vyberte přepis:",
|
||||
"labelLanguage": "Vyberte jazyk:",
|
||||
"title": "Video na dokument",
|
||||
"h1": "Video na dokument",
|
||||
"p1": "Přetáhněte video pomocí Drag & Drop",
|
||||
"fileName": "Nebylo vybráno žádné video",
|
||||
"manualUploadBtn": "Vyhledat video",
|
||||
"checkbox_group": "Preferované varianty dokumentu:",
|
||||
"label_format": "Zpráva ze schůzky",
|
||||
"label_summary": "Shrnutí s časovými značkami",
|
||||
"submitButton": "Odeslat",
|
||||
"step_nav1": "Krok 1",
|
||||
"step_nav2": "Krok 2",
|
||||
"step_nav3": "Krok 3",
|
||||
"step_nav4": "Krok 4",
|
||||
"step_nav5": "Krok 5",
|
||||
"step_nav6": "Krok 6",
|
||||
"h2": "Nahrajte své video zde:",
|
||||
"labelSpeaker": "Vyberte mluvčího:",
|
||||
"labelSpeakerAudio": "Vybraný mluvčí:",
|
||||
"labelSpeakerWriter": "Zadejte jméno:",
|
||||
"speakerLocker": "Nahradit jména",
|
||||
"speakerResender": "Přepsat dokument",
|
||||
"downloadButton": "Stáhnout",
|
||||
"box1_p1": "---Spouští se---",
|
||||
"box2_p2": "---Přepis---",
|
||||
"box3_p3": "---Vytváření dokumentu---",
|
||||
"labelType": "Vyberte typ dokumentu:",
|
||||
|
||||
"customDocBtn": "Spravovat typy dokumentů",
|
||||
"cd_h1": "Spravovat typy dokumentů",
|
||||
"cd_existingDocs": "Vybrat existující dokumenty (volitelné):",
|
||||
"cd_docName": "Název dokumentu",
|
||||
"docName": "Zadejte zde název dokumentu",
|
||||
"cd_promt": "Váš prompt:",
|
||||
"prompt": "Zadejte zde pokyn pro váš dokument...",
|
||||
"goBackBtn": "Zpět",
|
||||
"deleteBtn": "Smazat dokument",
|
||||
"generateBtn": "Uložit dokument",
|
||||
"newDoc": "-- Vytvořit nový dokument --",
|
||||
|
||||
"step1_h2" : "Nahrajte své video zde:",
|
||||
"step2_h2" : "Vyberte své preference:",
|
||||
"step3_h2" : "Vyberte požadovaný styl dokumentu:",
|
||||
"step4_h2" : "Klikněte pro odeslání:",
|
||||
"step5_h2" : "Změňte jména mluvčích:",
|
||||
"step6_h2" : "Klikněte zde pro stažení dokumentu:",
|
||||
|
||||
//help page
|
||||
//Inhaltsverzeichnis
|
||||
"hp_convertVid" : "Převést video na dokument",
|
||||
"hp_firstStep" : "Krok 1 - Vybrat video",
|
||||
"hp_secondStep" : "Krok 2 - Konfigurace",
|
||||
"hp_thirdStep" : "Krok 3 - Vybrat typ dokumentu",
|
||||
"hp_fourthStep" : "Krok 4 - Potvrdit",
|
||||
"hp_fifthStep" : "Krok 5 - Identifikovat mluvčí",
|
||||
"hp_sixthStep" : "Krok 6 - Uložit dokument",
|
||||
"hp_createDoc" : "Vytvořit typ dokumentu",
|
||||
"hp_editDoc" : "Upravit typ dokumentu",
|
||||
"hp_deleteDoc" : "Smazat typ dokumentu",
|
||||
//Ueberschriften
|
||||
"hp_convertVid_h2" : "Převést video na dokument.",
|
||||
"hp_firstStep_h3" : "Krok 1 - Vybrat video",
|
||||
"hp_secondStep_h3" : "Krok 2 - Konfigurace",
|
||||
"hp_thirdStep_h3" : "Krok 3 - Vybrat typ dokumentu",
|
||||
"hp_fourthStep_h3" : "Krok 4 - Potvrdit",
|
||||
"hp_fifthStep_h3" : "Krok 5 - Identifikovat mluvčí",
|
||||
"hp_sixthStep_h3" : "Krok 6 - Uložit dokument",
|
||||
"hp_createDoc_h2" : "Vytvořit typ dokumentu",
|
||||
"hp_editDoc_h2" : "Upravit typ dokumentu",
|
||||
"hp_deleteDoc_h2" : "Smazat typ dokumentu",
|
||||
//Texte
|
||||
"hp_firstStep_p" : "- Přetáhněte video soubor do pole drag-and-drop nebo klikněte na <strong>„Vyhledat video“</strong>,<br>abyste vybrali soubor pomocí prohlížeče souborů.<br>- Poté klikněte na <strong>Krok 2</strong> nebo na modrou šipku vpravo pro pokračování.",
|
||||
"hp_secondStep_p" : "- V prvním rozbalovacím menu vyberte používanou <strong>AI</strong>.<br>- Ve druhém rozbalovacím menu vyberte používaný <strong>nástroj pro přepis</strong>.<br>- Ve třetím rozbalovacím menu vyberte <strong>formát souboru</strong> vytvářeného dokumentu.<br>- Ve čtvrtém rozbalovacím menu vyberte <strong>jazyk</strong> vytvářeného dokumentu.<br>- Poté klikněte na <strong>Krok 3</strong> nebo na modrou šipku vpravo pro pokračování.",
|
||||
"hp_thirdStep_p" : "- Vyberte typ dokumentu pomocí zaškrtávacího políčka nebo vyberte dříve vytvořený typ dokumentu z rozbalovacího menu.<br>- Poté klikněte na <strong>Krok 4</strong> nebo na modrou šipku vpravo pro pokračování.",
|
||||
"hp_fourthStep_p" : "Klikněte na <strong>„Submit“</strong> pro zahájení generování dokumentu.<br>Během zpracování se zobrazují čtyři stavové indikátory, které se postupně mění z červené na zelenou a zobrazují aktuální průběh:<br><br>Indikátor 1: Nahrání a příprava video souboru.<br>Indikátor 2: Přepis obsahu videa.<br>Indikátor 3: Zpracování pomocí AI a vytvoření dokumentu.<br>Indikátor 4: Dokončení generování a zpřístupnění dokumentu.<br><br>Po úspěšném dokončení klikněte na <strong>Krok 5</strong> nebo na modrou šipku vpravo pro pokračování.",
|
||||
"hp_fifthStep_p" : "V rozbalovacím menu můžete vybrat rozpoznaného mluvčího.<br>Pomocí tlačítka přehrávání si můžete poslechnout mluvenou větu pro jednoznačnou identifikaci mluvčího.<br>Pomocí ikony reproduktoru můžete upravit hlasitost.<br>Pomocí menu se třemi tečkami můžete nastavit rychlost přehrávání.<br><br>Do textového pole <strong>„Write name“</strong> zadejte skutečné jméno mluvčího, aby se v dokumentu zobrazovalo místo zástupných názvů jako „Speaker A“.<br>Potvrďte zadání pomocí <strong>„Rename Speaker“</strong>.<br><br>Tlačítkem <strong>„Rewrite Document“</strong> se následně nahradí všechna označení mluvčích v dokumentu.<br><br>Poté klikněte na <strong>Krok 6</strong> nebo na modrou šipku vpravo pro pokračování.",
|
||||
"hp_sixthStep_p" : "Klikněte na <strong>„Download“</strong> pro uložení dokumentu.<br>Následně se otevře průzkumník souborů, kde můžete vybrat požadované umístění.",
|
||||
"hp_createDoc_p" : "- Otevřete hamburger menu vlevo nahoře a vyberte položku <strong>„Spravovat typy dokumentů“</strong>.<br>- Poté v rozbalovacím menu vyberte možnost <strong>„-- Vytvořit nový typ dokumentu --“</strong>.<br>- Zadejte výstižný název pro nový typ dokumentu.<br>- Pečlivě formulujte prompt pro zpracování pomocí AI.<br>- Klikněte na <strong>Uložit typ dokumentu</strong>.<br><br><strong>Poznámka:</strong><br>Zadaný prompt je beze změny odeslán službě AI. Dbejte proto na dodržování platných předpisů o ochraně osobních údajů a nezadávejte žádná citlivá ani osobní data.",
|
||||
"hp_editDoc_p" : "- Otevřete hamburger menu vlevo nahoře a vyberte položku <strong>„Spravovat typy dokumentů“</strong>.<br>- Poté v rozbalovacím menu vyberte typ dokumentu, který chcete upravit.<br>- Upravte stávající AI prompt nebo vytvořte nový prompt.<br>- Nakonec klikněte na <strong>„Uložit typ dokumentu“</strong>.<br><br><strong>Poznámka:</strong><br>Zadaný prompt je beze změny odeslán službě AI. Dbejte proto na dodržování platných předpisů o ochraně osobních údajů a nezadávejte žádná citlivá ani osobní data.",
|
||||
"hp_deleteDoc_p" : "- Otevřete hamburger menu vlevo nahoře a vyberte položku <strong>„Spravovat typy dokumentů“</strong>.<br>- Poté v rozbalovacím menu vyberte typ dokumentu, který chcete smazat.<br>- Nakonec klikněte na <strong>„Smazat typ dokumentu“</strong>.<br><br><strong>Poznámka:</strong><br>Po potvrzení procesu smazání nelze typ dokumentu obnovit."
|
||||
|
||||
},
|
||||
"ru":{
|
||||
"flagPath": "flags/russia-flag-png-large.png",
|
||||
"labelKI": "Выберите ИИ:",
|
||||
"labelTranscription": "Выберите транскрипцию:",
|
||||
"labelLanguage": "Выберите язык:",
|
||||
"title": "Видео в документ",
|
||||
"h1": "Видео в документ",
|
||||
"p1": "Перетащите видео с помощью Drag & Drop",
|
||||
"fileName": "Видео не выбрано",
|
||||
"manualUploadBtn": "Найти видео",
|
||||
"checkbox_group": "Предпочтительные варианты документа:",
|
||||
"label_format": "Отчет о встрече",
|
||||
"label_summary": "Резюме с временными метками",
|
||||
"submitButton": "Отправить",
|
||||
"step_nav1": "Шаг 1",
|
||||
"step_nav2": "Шаг 2",
|
||||
"step_nav3": "Шаг 3",
|
||||
"step_nav4": "Шаг 4",
|
||||
"step_nav5": "Шаг 5",
|
||||
"step_nav6": "Шаг 6",
|
||||
"h2": "Загрузите ваше видео здесь:",
|
||||
"labelSpeaker": "Выберите говорящего:",
|
||||
"labelSpeakerAudio": "Выбранный говорящий:",
|
||||
"labelSpeakerWriter": "Введите имя:",
|
||||
"speakerLocker": "Заменить имена",
|
||||
"speakerResender": "Перезаписать документ",
|
||||
"downloadButton": "Скачать",
|
||||
"box1_p1": "---Запуск---",
|
||||
"box2_p2": "---Транскрибация---",
|
||||
"box3_p3": "---Создание документа---",
|
||||
"labelType": "Выберите тип документа:",
|
||||
|
||||
"customDocBtn": "Управление типами документов",
|
||||
"cd_h1": "Управление типами документов",
|
||||
"cd_existingDocs": "Выбрать существующие документы (необязательно):",
|
||||
"cd_docName": "Название документа",
|
||||
"docName": "Введите здесь название документа",
|
||||
"cd_promt": "Ваш запрос:",
|
||||
"prompt": "Введите здесь запрос для вашего документа...",
|
||||
"goBackBtn": "Назад",
|
||||
"deleteBtn": "Удалить документ",
|
||||
"generateBtn": "Сохранить документ",
|
||||
"newDoc": "-- Создать новый документ --",
|
||||
|
||||
"step1_h2" : "Загрузите ваше видео здесь:",
|
||||
"step2_h2" : "Выберите ваши предпочтения:",
|
||||
"step3_h2" : "Выберите желаемый стиль документа:",
|
||||
"step4_h2" : "Нажмите для отправки:",
|
||||
"step5_h2" : "Измените имена говорящих:",
|
||||
"step6_h2" : "Нажмите здесь, чтобы скачать документ:",
|
||||
|
||||
//help page
|
||||
//Inhaltsverzeichnis
|
||||
"hp_convertVid" : "Преобразовать видео в документ",
|
||||
"hp_firstStep" : "Шаг 1 - Выбрать видео",
|
||||
"hp_secondStep" : "Шаг 2 - Конфигурация",
|
||||
"hp_thirdStep" : "Шаг 3 - Выбрать тип документа",
|
||||
"hp_fourthStep" : "Шаг 4 - Подтвердить",
|
||||
"hp_fifthStep" : "Шаг 5 - Идентифицировать говорящих",
|
||||
"hp_sixthStep" : "Шаг 6 - Сохранить документ",
|
||||
"hp_createDoc" : "Создать тип документа",
|
||||
"hp_editDoc" : "Редактировать тип документа",
|
||||
"hp_deleteDoc" : "Удалить тип документа",
|
||||
|
||||
//Ueberschriften
|
||||
"hp_convertVid_h2" : "Преобразовать видео в документ.",
|
||||
"hp_firstStep_h3" : "Шаг 1 - Выбрать видео",
|
||||
"hp_secondStep_h3" : "Шаг 2 - Конфигурация",
|
||||
"hp_thirdStep_h3" : "Шаг 3 - Выбрать тип документа",
|
||||
"hp_fourthStep_h3" : "Шаг 4 - Подтвердить",
|
||||
"hp_fifthStep_h3" : "Шаг 5 - Идентифицировать говорящих",
|
||||
"hp_sixthStep_h3" : "Шаг 6 - Сохранить документ",
|
||||
"hp_createDoc_h2" : "Создать тип документа",
|
||||
"hp_editDoc_h2" : "Редактировать тип документа",
|
||||
"hp_deleteDoc_h2" : "Удалить тип документа",
|
||||
|
||||
//Texte
|
||||
"hp_firstStep_p" : "- Перетащите видеофайл в поле drag-and-drop или нажмите <strong>«Найти видео»</strong>,<br>чтобы выбрать файл через файловый браузер.<br>- Затем нажмите <strong>Шаг 2</strong> или синюю стрелку справа, чтобы продолжить.",
|
||||
"hp_secondStep_p" : "- В первом выпадающем меню выберите используемый <strong>ИИ</strong>.<br>- Во втором выпадающем меню выберите используемый <strong>инструмент транскрипции</strong>.<br>- В третьем выпадающем меню выберите <strong>формат файла</strong> создаваемого документа.<br>- В четвертом выпадающем меню выберите <strong>язык</strong> создаваемого документа.<br>- Затем нажмите <strong>Шаг 3</strong> или синюю стрелку справа, чтобы продолжить.",
|
||||
"hp_thirdStep_p" : "- Выберите тип документа с помощью флажка или выберите ранее созданный тип документа из выпадающего меню.<br>- Затем нажмите <strong>Шаг 4</strong> или синюю стрелку справа, чтобы продолжить.",
|
||||
"hp_fourthStep_p" : "Нажмите <strong>«Submit»</strong>, чтобы начать генерацию документа.<br>Во время обработки отображаются четыре индикатора состояния, которые постепенно меняют цвет с красного на зеленый и показывают текущий прогресс:<br><br>Индикатор 1: Загрузка и подготовка видеофайла.<br>Индикатор 2: Транскрибация содержимого видео.<br>Индикатор 3: Обработка с помощью ИИ и создание документа.<br>Индикатор 4: Завершение генерации и предоставление документа.<br><br>После успешного завершения нажмите <strong>Шаг 5</strong> или синюю стрелку справа, чтобы продолжить.",
|
||||
"hp_fifthStep_p" : "В выпадающем меню вы можете выбрать распознанного говорящего.<br>С помощью кнопки воспроизведения можно прослушать произнесенное предложение, чтобы однозначно идентифицировать говорящего.<br>С помощью значка динамика можно отрегулировать громкость.<br>С помощью меню с тремя точками можно установить скорость воспроизведения.<br><br>В текстовом поле <strong>«Write name»</strong> введите настоящее имя говорящего, чтобы в документе оно отображалось вместо заполнителей, таких как «Speaker A».<br>Подтвердите ввод с помощью <strong>«Rename Speaker»</strong>.<br><br>Кнопкой <strong>«Rewrite Document»</strong> затем заменяются все обозначения говорящих в документе.<br><br>После этого нажмите <strong>Шаг 6</strong> или синюю стрелку справа, чтобы продолжить.",
|
||||
"hp_sixthStep_p" : "Нажмите <strong>«Download»</strong>, чтобы сохранить документ.<br>Затем откроется файловый проводник, в котором вы можете выбрать желаемое место сохранения.",
|
||||
"hp_createDoc_p" : "- Откройте меню-бургер в левом верхнем углу и выберите пункт <strong>«Управление типами документов»</strong>.<br>- Затем в выпадающем меню выберите опцию <strong>«-- Создать новый тип документа --»</strong>.<br>- Введите понятное название для нового типа документа.<br>- Тщательно сформулируйте запрос для обработки с помощью ИИ.<br>- Нажмите <strong>Сохранить тип документа</strong>.<br><br><strong>Примечание:</strong><br>Введенный запрос без изменений передается службе ИИ. Поэтому обязательно соблюдайте действующие правила защиты данных и не вводите никакие чувствительные или персональные данные.",
|
||||
"hp_editDoc_p" : "- Откройте меню-бургер в левом верхнем углу и выберите пункт <strong>«Управление типами документов»</strong>.<br>- Затем в выпадающем меню выберите тип документа для редактирования.<br>- Измените существующий запрос ИИ или сформулируйте новый запрос.<br>- В конце нажмите <strong>«Сохранить тип документа»</strong>.<br><br><strong>Примечание:</strong><br>Введенный запрос без изменений передается службе ИИ. Поэтому обязательно соблюдайте действующие правила защиты данных и не вводите никакие чувствительные или персональные данные.",
|
||||
"hp_deleteDoc_p" : "- Откройте меню-бургер в левом верхнем углу и выберите пункт <strong>«Управление типами документов»</strong>.<br>- Затем в выпадающем меню выберите тип документа для удаления.<br>- В конце нажмите <strong>«Удалить тип документа»</strong>.<br><br><strong>Примечание:</strong><br>После подтверждения процесса удаления тип документа не может быть восстановлен."
|
||||
}
|
||||
*/
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
import { app, BrowserWindow, ipcMain, dialog } from 'electron';
|
||||
import { exec } from 'child_process';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
|
||||
let mainWindow;
|
||||
|
||||
function createWindow() {
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 800,
|
||||
height: 600,
|
||||
webPreferences: {
|
||||
nodeIntegration: false,
|
||||
contextIsolation: true,
|
||||
preload: path.join(__dirname, 'preload.js')
|
||||
}
|
||||
});
|
||||
|
||||
mainWindow.loadFile('main/index.html');
|
||||
}
|
||||
|
||||
app.whenReady().then(createWindow);
|
||||
|
||||
// Kommunikation vom Renderer (Frontend)
|
||||
ipcMain.handle('convert-video', async (event, filePath) => {
|
||||
const output = path.join(path.dirname(filePath), 'converted.mp4');
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
exec(`ffmpeg -i "${filePath}" -vcodec libx264 "${output}"`, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.error('Fehler beim Konvertieren:', error);
|
||||
reject(error);
|
||||
} else {
|
||||
console.log('Konvertierung abgeschlossen:', output);
|
||||
resolve(output);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,31 +1,39 @@
|
||||
/*
|
||||
This file contains the ipc communication methos between the ui and the gui
|
||||
*/
|
||||
|
||||
const { contextBridge, ipcRenderer, webUtils } = require('electron')
|
||||
|
||||
try {
|
||||
//For file lookup on drop
|
||||
contextBridge.exposeInMainWorld("explorer", {
|
||||
onFileDrop: (file) => webUtils.getPathForFile(file)
|
||||
})
|
||||
//For sending the specifications to the main
|
||||
contextBridge.exposeInMainWorld("submit", {
|
||||
submit: (meeting_specifications) => { ipcRenderer.send("file_submit", meeting_specifications) }
|
||||
})
|
||||
//For file lookup on search
|
||||
contextBridge.exposeInMainWorld("electronAPI", {
|
||||
getFilePath: (file) => { return webUtils.getPathForFile(file) }
|
||||
})
|
||||
|
||||
//Gets all information from the main process
|
||||
contextBridge.exposeInMainWorld("onStartup", {
|
||||
getModuleNames: () => ipcRenderer.invoke('get-module-names')
|
||||
})
|
||||
|
||||
//Calls from the main process regarding the progress
|
||||
contextBridge.exposeInMainWorld('electron', {
|
||||
progress: (callback) => ipcRenderer.on('progress', callback)
|
||||
})
|
||||
|
||||
//For getting the speaker audios and names from the main
|
||||
contextBridge.exposeInMainWorld('audios', {
|
||||
speakerAudios: (callback) => ipcRenderer.on('speakerAudios', callback)
|
||||
})
|
||||
//For sending the new speaker names to the main process
|
||||
contextBridge.exposeInMainWorld("submitSpeaker", {
|
||||
speaker_submit: (speaker_names) => { ipcRenderer.send("speaker_submit", speaker_names) }
|
||||
})
|
||||
|
||||
//For downloading the finished document
|
||||
contextBridge.exposeInMainWorld("download", {
|
||||
file_download: () => { ipcRenderer.send("file_download") }
|
||||
})
|
||||
|
||||
+135
-114
@@ -27,7 +27,6 @@ language_option.addEventListener('change', (e) => {
|
||||
console.log("Error in the language_option change listener in the renderer.js");
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
stepButtons.forEach(btn => {
|
||||
@@ -36,7 +35,7 @@ stepButtons.forEach(btn => {
|
||||
const step = parseInt(btn.dataset.step);
|
||||
showStep(step);
|
||||
} catch (error) {
|
||||
|
||||
console.log(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -46,7 +45,7 @@ prevBtn.addEventListener("click", () => {
|
||||
try {
|
||||
if (currentStep > 1) showStep(currentStep - 1);
|
||||
} catch (error) {
|
||||
|
||||
console.log(error);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -55,7 +54,7 @@ nextBtn.addEventListener("click", () => {
|
||||
try {
|
||||
if (currentStep < totalSteps) showStep(currentStep + 1);
|
||||
} catch (error) {
|
||||
|
||||
console.log(error);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -73,7 +72,6 @@ uploadContainer.addEventListener("dragover", (e) => {
|
||||
} catch (error) {
|
||||
console.log("Error in renderer.js dragover listener function")
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
//listener for when a file get dropped on the drag&drop field
|
||||
@@ -91,12 +89,11 @@ uploadContainer.addEventListener("drop", (e) => {
|
||||
} else {
|
||||
alert('The given file is not compatible. These are the available types: [".mp4", ".mov", ".avi", ".mkv"].');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log("Error in renderer.js with the listerner for the drop function");
|
||||
console.log(error);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
//listener for the file explorer search when something got selected
|
||||
videoUpload.addEventListener("change", () => {
|
||||
@@ -133,24 +130,7 @@ Listeners for Step 3
|
||||
|
||||
*/
|
||||
|
||||
window.api.getTxtFiles().then(files => {
|
||||
var menu = document.getElementById('customDocumentTypes');
|
||||
var l = document.getElementById('customDocumentTypes').options.length - 1;
|
||||
for (i = l; i >= 0; i--) {
|
||||
menu.remove(i);
|
||||
}
|
||||
files.forEach(file => {
|
||||
const option = document.createElement('option');
|
||||
option.value = file;
|
||||
option.textContent = file
|
||||
.replace('.txt', '') // Endung entfernen
|
||||
.replace(/_/g, ' ') // Leerzeichen ersetzen
|
||||
.replace(/\b\w/g, c => c.toUpperCase()) // ersten Buchstaben groß
|
||||
menu.appendChild(option);
|
||||
});
|
||||
});
|
||||
|
||||
//Checkboxlistener so that only one can be selected at a time
|
||||
//Checkboxlistener so that only one checkbox can be selected at a time
|
||||
docFormat.addEventListener("change", (e) => {
|
||||
try {
|
||||
if (docFormat.checked) {
|
||||
@@ -160,9 +140,10 @@ docFormat.addEventListener("change", (e) => {
|
||||
docFormatCustom.checked = false;
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
//Checkboxlistener so that only one checkbox can be selected at a time
|
||||
docFormatSummary1.addEventListener("change", (e) => {
|
||||
try {
|
||||
if (docFormatSummary1.checked) {
|
||||
@@ -172,9 +153,10 @@ docFormatSummary1.addEventListener("change", (e) => {
|
||||
docFormatCustom.checked = false;
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
//Checkboxlistener so that only one checkbox can be selected at a time
|
||||
docFormatSummary2.addEventListener("change", (e) => {
|
||||
try {
|
||||
if (docFormatSummary2.checked) {
|
||||
@@ -184,9 +166,10 @@ docFormatSummary2.addEventListener("change", (e) => {
|
||||
docFormatCustom.checked = false;
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
//Checkboxlistener so that only one checkbox can be selected at a time
|
||||
docFormatSummary3.addEventListener("change", (e) => {
|
||||
try {
|
||||
if (docFormatSummary3.checked) {
|
||||
@@ -196,9 +179,10 @@ docFormatSummary3.addEventListener("change", (e) => {
|
||||
docFormatCustom.checked = false;
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
//Checkboxlistener so that only one checkbox can be selected at a time
|
||||
docFormatCustom.addEventListener("change", (e) => {
|
||||
try {
|
||||
if (docFormatCustom.checked) {
|
||||
@@ -208,7 +192,7 @@ docFormatCustom.addEventListener("change", (e) => {
|
||||
docFormat.checked = false;
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
|
||||
@@ -217,19 +201,25 @@ docFormatCustom.addEventListener("change", (e) => {
|
||||
Listeners for Step 4
|
||||
|
||||
*/
|
||||
//Functions the the displayed progress in the progressbar can be changed out of the main process
|
||||
|
||||
//Functions for the displayed progress in the progressbar so it can be changed out of the main process
|
||||
window.electron.progress((event, arg) => {
|
||||
if (arg.curstep == 1) {
|
||||
setCircleOne();
|
||||
} else if (arg.curstep == 2) {
|
||||
setCircleZwo();
|
||||
} else if (arg.curstep == 3) {
|
||||
setCircleThree();
|
||||
} else if (arg.curstep == 4) {
|
||||
setCircleFour();
|
||||
try {
|
||||
if (arg.curstep == 1) {
|
||||
setCircleOne();
|
||||
} else if (arg.curstep == 2) {
|
||||
setCircleZwo();
|
||||
} else if (arg.curstep == 3) {
|
||||
setCircleThree();
|
||||
} else if (arg.curstep == 4) {
|
||||
setCircleFour();
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
|
||||
//All for are for setting the corresponding progress section to green (or red)
|
||||
function setCircleOne() {
|
||||
try {
|
||||
if (document.getElementById("box1").style.backgroundColor == "green") {
|
||||
@@ -238,8 +228,8 @@ function setCircleOne() {
|
||||
document.getElementById("box1").style.backgroundColor = "green";
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
};
|
||||
function setCircleZwo() {
|
||||
try {
|
||||
@@ -249,9 +239,8 @@ function setCircleZwo() {
|
||||
document.getElementById("box2").style.backgroundColor = "green";
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
};
|
||||
function setCircleThree() {
|
||||
try {
|
||||
@@ -261,9 +250,8 @@ function setCircleThree() {
|
||||
document.getElementById("box3").style.backgroundColor = "green";
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
};
|
||||
function setCircleFour() {
|
||||
try {
|
||||
@@ -273,7 +261,7 @@ function setCircleFour() {
|
||||
document.getElementById("box4").style.backgroundColor = "green";
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -283,109 +271,142 @@ Listeners for Step 5
|
||||
|
||||
*/
|
||||
|
||||
//Speaker change listener
|
||||
//Speaker change listener, changes the previewed audio snippet
|
||||
cur_speaker.addEventListener("change", (e) => {
|
||||
try {
|
||||
document.getElementById("speakerAudioViewer").src = speakerAudios[document.getElementById("cur_speaker").value].src;
|
||||
} catch (error) {
|
||||
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
|
||||
//Function so the main process can give the gui a json with the speakers and their audio
|
||||
window.audios.speakerAudios((event, arg) => {
|
||||
loadSpeakerOptions(arg);
|
||||
setSpeakerAudiosValue(arg);
|
||||
try {
|
||||
loadSpeakerOptions(arg);
|
||||
setSpeakerAudiosValue(arg);
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Listeners for the costum documents section
|
||||
|
||||
*/
|
||||
|
||||
//Listener for closing the custom document section again
|
||||
goBackBtn.addEventListener("click", () => {
|
||||
showCD();
|
||||
try {
|
||||
showCD();
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
|
||||
// dokumente speichern
|
||||
//Listener for the save button in the custom document section
|
||||
generateBtn.addEventListener("click", () => {
|
||||
const name = docName.value.trim();
|
||||
const content = document.getElementById("prompt").value.trim();
|
||||
if (!name || !content) {
|
||||
result.textContent = "Bitte Dokumentname und Prompt ausfüllen.";
|
||||
console.log(name + " " + content);
|
||||
try {
|
||||
const name = docName.value.trim();
|
||||
const content = document.getElementById("prompt").value.trim();
|
||||
if (!name || !content) {
|
||||
result.textContent = "Bitte Dokumentname und Prompt ausfüllen.";
|
||||
setTimeout(() => {
|
||||
result.textContent = "";
|
||||
}, 3000);
|
||||
return;
|
||||
}
|
||||
window.api.saveTxtFile(name, content).then();
|
||||
result.textContent = "Dokument erfolgreich gespeichert!";
|
||||
setTimeout(() => {
|
||||
result.textContent = "";
|
||||
}, 3000);
|
||||
return;
|
||||
reloadDocuments();
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
window.api.saveTxtFile(name, content).then();
|
||||
result.textContent = "Dokument erfolgreich gespeichert!";
|
||||
setTimeout(() => {
|
||||
result.textContent = "";
|
||||
}, 3000);
|
||||
reloadDocuments();
|
||||
|
||||
});
|
||||
|
||||
// dokumente löschen
|
||||
//Used for deleting documents in the costum document section
|
||||
deleteBtn.addEventListener("click", () => {
|
||||
const name = docName.value.trim();
|
||||
try {
|
||||
const name = docName.value.trim();
|
||||
|
||||
if (!name) {
|
||||
result.textContent = "Bitte Dokumentname angeben.";
|
||||
setTimeout(() => {
|
||||
result.textContent = "";
|
||||
}, 3000);
|
||||
return;
|
||||
}
|
||||
|
||||
const confirmDelete = confirm(
|
||||
`Möchtest du das Dokument "${name}" wirklich löschen?`
|
||||
);
|
||||
|
||||
if (!confirmDelete) return;
|
||||
|
||||
window.api.deleteTxtFile(name).then((success) => {
|
||||
if (success) {
|
||||
result.textContent = "Dokument erfolgreich gelöscht!";
|
||||
reloadDocuments();
|
||||
existingDocs.value = "newDoc";
|
||||
existingDocs.dispatchEvent(new Event("change"));
|
||||
} else {
|
||||
result.textContent = "Dokument konnte nicht gelöscht werden.";
|
||||
if (!name) {
|
||||
result.textContent = "Bitte Dokumentname angeben.";
|
||||
setTimeout(() => {
|
||||
result.textContent = "";
|
||||
}, 3000);
|
||||
return;
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
result.textContent = "";
|
||||
}, 3000);
|
||||
});
|
||||
var success = true;
|
||||
window.api.deleteTxtFile(name).then((success) => {
|
||||
if (success) {
|
||||
result.textContent = "Dokument erfolgreich gelöscht!";
|
||||
reloadDocuments();
|
||||
existingDocs.dispatchEvent(new Event("change"));
|
||||
} else {
|
||||
result.textContent = "Dokument konnte nicht gelöscht werden.";
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//function to load existingDoc options to the drop down list
|
||||
|
||||
window.api.getTxtFiles().then(files => {
|
||||
reloadDocuments();
|
||||
});
|
||||
|
||||
//content anzeigen
|
||||
existingDocs.addEventListener("change", async () => {
|
||||
const existingDocsed = existingDocs.value;
|
||||
const exampleText = "";
|
||||
|
||||
if (existingDocsed === "newDoc") {
|
||||
docNameWrapper.classList.remove("hidden");
|
||||
docName.value = "";
|
||||
prompt.value = exampleText;
|
||||
return;
|
||||
try {
|
||||
reloadDocuments();
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
docNameWrapper.classList.add("hidden");
|
||||
|
||||
const content = await window.api.readTxtFile(existingDocsed);
|
||||
prompt.value = content;
|
||||
docName.value = existingDocsed.replace(".txt", "");
|
||||
});
|
||||
|
||||
//Shows the content inside the big textarea inside the costume dokument section
|
||||
existingDocs.addEventListener("change", async () => {
|
||||
try {
|
||||
const existingDocsed = existingDocs.value;
|
||||
const exampleText = "";
|
||||
if (existingDocsed === "newDoc") {
|
||||
docNameWrapper.classList.remove("hidden");
|
||||
docName.value = "";
|
||||
document.getElementById("prompt").value = exampleText;
|
||||
document.getElementById("prompt").textContent = exampleText;
|
||||
return;
|
||||
}
|
||||
docNameWrapper.classList.add("hidden");
|
||||
document.getElementById("prompt").textContent = "";
|
||||
document.getElementById("prompt").value = "";
|
||||
|
||||
const content = await window.api.readTxtFile(existingDocsed);
|
||||
document.getElementById("prompt").value = content;
|
||||
document.getElementById("prompt").textContent = content;
|
||||
docName.value = existingDocsed.replace(".txt", "");
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
/*
|
||||
|
||||
Listeners for the help page
|
||||
|
||||
*/
|
||||
|
||||
//For the help page dropdown list
|
||||
document.addEventListener("click", function (e) {
|
||||
try {
|
||||
const toc = document.getElementById("toc");
|
||||
const toggle = document.querySelector(".toc-toggle");
|
||||
|
||||
if (!toc.contains(e.target) && !toggle.contains(e.target)) {
|
||||
toc.classList.remove("show");
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
});
|
||||
|
||||
+185
-45
@@ -5,39 +5,74 @@ let currentVideoPath = null;
|
||||
Functions used in the setup or affect most of the gui
|
||||
|
||||
*/
|
||||
//For managing the displaying of the costum document section
|
||||
var showCDValue = 0;
|
||||
function showCD() {
|
||||
if(showCDValue == 0){
|
||||
document.getElementById('cdContainer').style.display = "block";
|
||||
document.getElementById('step1').style.display ="none";
|
||||
document.getElementById('step2').style.display ="none";
|
||||
document.getElementById('step3').style.display ="none";
|
||||
document.getElementById('step4').style.display ="none";
|
||||
document.getElementById('step5').style.display ="none";
|
||||
document.getElementById('step6').style.display ="none";
|
||||
showCDValue = 1;
|
||||
} else {
|
||||
currentStep = 1;
|
||||
showCDValue = 0;
|
||||
document.getElementById('cdContainer').style.display = "none";
|
||||
showStep(1);
|
||||
try {
|
||||
if(showCDValue == 0){
|
||||
document.getElementById('cdContainer').style.display = "block";
|
||||
document.getElementById('helpContainer').style.display = "none";
|
||||
document.getElementById('step1').style.display ="none";
|
||||
document.getElementById('step2').style.display ="none";
|
||||
document.getElementById('step3').style.display ="none";
|
||||
document.getElementById('step4').style.display ="none";
|
||||
document.getElementById('step5').style.display ="none";
|
||||
document.getElementById('step6').style.display ="none";
|
||||
showCDValue = 1;
|
||||
showHelpValue = 0;
|
||||
} else {
|
||||
currentStep = 1;
|
||||
showCDValue = 0;
|
||||
document.getElementById('cdContainer').style.display = "none";
|
||||
showStep(1);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var showHelpValue = 0;
|
||||
function showHelp() {
|
||||
try {
|
||||
if(showHelpValue == 0){
|
||||
document.getElementById('helpContainer').style.display = "flex";
|
||||
document.getElementById('cdContainer').style.display = "none";
|
||||
document.getElementById('step1').style.display ="none";
|
||||
document.getElementById('step2').style.display ="none";
|
||||
document.getElementById('step3').style.display ="none";
|
||||
document.getElementById('step4').style.display ="none";
|
||||
document.getElementById('step5').style.display ="none";
|
||||
document.getElementById('step6').style.display ="none";
|
||||
showHelpValue = 1;
|
||||
} else {
|
||||
currentStep = 1;
|
||||
showHelpValue = 0;
|
||||
showCDValue = 0;
|
||||
document.getElementById('helpContainer').style.display = "none";
|
||||
showStep(1);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//language changing feature => changes the language of every displayed text
|
||||
function changeLanguage(language) {
|
||||
try {
|
||||
//document.getElementById('labelLanguageFlag').src = languageOptions[language].flagPath;
|
||||
document.getElementById('labelKI').textContent = languageOptions[language].labelKI;
|
||||
document.getElementById('labelTranscription').textContent = languageOptions[language].labelTranscription;
|
||||
document.getElementById('labelLanguage').textContent = languageOptions[language].labelLanguage;
|
||||
document.getElementById('title').textContent = languageOptions[language].title;
|
||||
//document.getElementById('h1').textContent = languageOptions[language].h1;
|
||||
document.getElementById('h1').textContent = languageOptions[language].h1;
|
||||
document.getElementById('p1').textContent = languageOptions[language].p1;
|
||||
document.getElementById('fileName').textContent = languageOptions[language].fileName;
|
||||
document.getElementById('manualUploadBtn').textContent = languageOptions[language].manualUploadBtn;
|
||||
document.getElementById('label_format').textContent = languageOptions[language].label_format;
|
||||
document.getElementById('label_summary').textContent = languageOptions[language].label_summary;
|
||||
document.getElementById('label_summary_result').textContent = languageOptions[language].label_summary_result;
|
||||
document.getElementById('label_summary_note').textContent = languageOptions[language].label_summary_note;
|
||||
document.getElementById('submitButton').textContent = languageOptions[language].submitButton;
|
||||
document.getElementById('step_nav1').textContent = languageOptions[language].step_nav1;
|
||||
document.getElementById('step_nav2').textContent = languageOptions[language].step_nav2;
|
||||
@@ -45,7 +80,6 @@ function changeLanguage(language) {
|
||||
document.getElementById('step_nav4').textContent = languageOptions[language].step_nav4;
|
||||
document.getElementById('step_nav5').textContent = languageOptions[language].step_nav5;
|
||||
document.getElementById('step_nav6').textContent = languageOptions[language].step_nav6;
|
||||
//document.getElementById('h2').textContent = languageOptions[language].h2;
|
||||
document.getElementById('labelSpeaker').textContent = languageOptions[language].labelSpeaker;
|
||||
document.getElementById('labelSpeakerAudio').textContent = languageOptions[language].labelSpeakerAudio;
|
||||
document.getElementById('labelSpeakerWriter').textContent = languageOptions[language].labelSpeakerWriter;
|
||||
@@ -69,6 +103,47 @@ function changeLanguage(language) {
|
||||
document.getElementById('generateBtn').textContent = languageOptions[language].generateBtn;
|
||||
document.getElementById('newDoc').textContent = languageOptions[language].newDoc;
|
||||
|
||||
document.getElementById("step1_h2").textContent = languageOptions[language].step1_h2;
|
||||
document.getElementById("step2_h2").textContent = languageOptions[language].step2_h2;
|
||||
document.getElementById("step3_h2").textContent = languageOptions[language].step3_h2;
|
||||
document.getElementById("step4_h2").textContent = languageOptions[language].step4_h2;
|
||||
document.getElementById("step5_h2").textContent = languageOptions[language].step5_h2;
|
||||
document.getElementById("step6_h2").textContent = languageOptions[language].step6_h2;
|
||||
|
||||
document.getElementById("back_btn").textContent = languageOptions[language].back_btn;
|
||||
document.getElementById("help_page_h1").textContent = languageOptions[language].help_page_h1;
|
||||
document.getElementById("help_page_tableofcontents").textContent = languageOptions[language].help_page_tableofcontents;
|
||||
document.getElementById("hp_convertVid").textContent = languageOptions[language].hp_convertVid;
|
||||
document.getElementById("hp_firstStep").textContent = languageOptions[language].hp_firstStep;
|
||||
document.getElementById("hp_secondStep").textContent = languageOptions[language].hp_secondStep;
|
||||
document.getElementById("hp_thirdStep").textContent = languageOptions[language].hp_thirdStep;
|
||||
document.getElementById("hp_fourthStep").textContent = languageOptions[language].hp_fourthStep;
|
||||
document.getElementById("hp_fifthStep").textContent = languageOptions[language].hp_fifthStep;
|
||||
document.getElementById("hp_sixthStep").textContent = languageOptions[language].hp_sixthStep;
|
||||
document.getElementById("hp_createDoc").textContent = languageOptions[language].hp_createDoc;
|
||||
document.getElementById("hp_editDoc").textContent = languageOptions[language].hp_editDoc;
|
||||
document.getElementById("hp_deleteDoc").textContent = languageOptions[language].hp_deleteDoc;
|
||||
document.getElementById("hp_convertVid_h2").textContent = languageOptions[language].hp_convertVid_h2;
|
||||
document.getElementById("hp_firstStep_h3").textContent = languageOptions[language].hp_firstStep_h3;
|
||||
document.getElementById("hp_secondStep_h3").textContent = languageOptions[language].hp_secondStep_h3;
|
||||
document.getElementById("hp_thirdStep_h3").textContent = languageOptions[language].hp_thirdStep_h3;
|
||||
document.getElementById("hp_fourthStep_h3").textContent = languageOptions[language].hp_fourthStep_h3;
|
||||
document.getElementById("hp_fifthStep_h3").textContent = languageOptions[language].hp_fifthStep_h3;
|
||||
document.getElementById("hp_sixthStep_h3").textContent = languageOptions[language].hp_sixthStep_h3;
|
||||
document.getElementById("hp_createDoc_h2").textContent = languageOptions[language].hp_createDoc_h2;
|
||||
document.getElementById("hp_editDoc_h2").textContent = languageOptions[language].hp_editDoc_h2;
|
||||
document.getElementById("hp_deleteDoc_h2").textContent = languageOptions[language].hp_deleteDoc_h2;
|
||||
document.getElementById("hp_firstStep_p").textContent = languageOptions[language].hp_firstStep_p;
|
||||
document.getElementById("hp_secondStep_p").textContent = languageOptions[language].hp_secondStep_p;
|
||||
document.getElementById("hp_thirdStep_p").textContent = languageOptions[language].hp_thirdStep_p;
|
||||
document.getElementById("hp_fourthStep_p").textContent = languageOptions[language].hp_fourthStep_p;
|
||||
document.getElementById("hp_fifthStep_p").textContent = languageOptions[language].hp_fifthStep_p;
|
||||
document.getElementById("hp_sixthStep_p").textContent = languageOptions[language].hp_sixthStep_p;
|
||||
document.getElementById("hp_createDoc_p").textContent = languageOptions[language].hp_createDoc_p;
|
||||
document.getElementById("hp_editDoc_p").textContent = languageOptions[language].hp_editDoc_p;
|
||||
document.getElementById("hp_deleteDoc_p").textContent = languageOptions[language].hp_deleteDoc_p;
|
||||
|
||||
|
||||
} catch (error) {
|
||||
console.log("Error in script.js changeLanguage function");
|
||||
console.log(error);
|
||||
@@ -89,6 +164,14 @@ let currentStep = 1;
|
||||
const totalSteps = steps.length;
|
||||
|
||||
function showStep(stepNumber) {
|
||||
if(showCDValue == 1){
|
||||
showCDValue = 0;
|
||||
document.getElementById('cdContainer').style.display = "none";
|
||||
}
|
||||
if(showHelpValue == 1){
|
||||
showHelpValue = 0;
|
||||
document.getElementById('helpContainer').style.display = "none";
|
||||
}
|
||||
if (stepNumber < 1 || stepNumber > totalSteps) {
|
||||
console.error("StepNumber out of Bounds", stepNumber);
|
||||
return;
|
||||
@@ -432,19 +515,30 @@ function setSpeakerAudiosValue(valy) {
|
||||
//Function to rewrite the speaker name in the json
|
||||
function rewriteSpeakerName() {
|
||||
try {
|
||||
var tempy = document.getElementById("cur_speaker").value;
|
||||
speakerAudios[tempy].name = document.getElementById("newSpeaker").value;
|
||||
loadSpeakerOptions(speakerAudios);
|
||||
const select = document.getElementById("cur_speaker");
|
||||
const newName = document.getElementById("newSpeaker").value.trim();
|
||||
|
||||
if (!newName) {
|
||||
alert("Please enter a new speaker name");
|
||||
return;
|
||||
}
|
||||
|
||||
const selectedIndex = select.selectedIndex;
|
||||
const selectedValue = select.value;
|
||||
|
||||
// Update speakerAudios data
|
||||
speakerAudios[selectedValue].name = newName;
|
||||
|
||||
// Update the specific option text and keep value
|
||||
select.options[selectedIndex].text = newName;
|
||||
select.options[selectedIndex].value = selectedValue;
|
||||
|
||||
// Keep it selected
|
||||
select.selectedIndex = selectedIndex;
|
||||
|
||||
console.log("Speaker renamed:", newName);
|
||||
} catch (error) {
|
||||
console.log("\n\n\n" + error + "\n\n\n")
|
||||
}
|
||||
}
|
||||
//Function to send the json with the given names back to the program to rewrite the document file
|
||||
function sendSpeakerPackages() {
|
||||
try {
|
||||
window.submitSpeaker.speaker_submit(speakerAudios);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
console.log("Error renaming speaker:", error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -462,10 +556,6 @@ function fileDownload() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Functions for the custom document section
|
||||
@@ -474,18 +564,68 @@ Functions for the custom document section
|
||||
|
||||
//reload drop down
|
||||
function reloadDocuments() {
|
||||
[...existingDocs.querySelectorAll('option:not([value="newDoc"])')]
|
||||
.forEach(o => o.remove());
|
||||
try{
|
||||
[...existingDocs.querySelectorAll('option:not([value="newDoc"])')]
|
||||
.forEach(o => o.remove());
|
||||
[...customDocumentTypes.querySelectorAll('option:not([value="newDoc"])')]
|
||||
.forEach(o => o.remove());
|
||||
|
||||
window.api.getTxtFiles().then(files => {
|
||||
files.forEach(file => {
|
||||
const option = document.createElement('option');
|
||||
option.value = file;
|
||||
option.textContent = file
|
||||
.replace('.txt', '') // Endung entfernen
|
||||
.replace(/_/g, ' ') // Leerzeichen ersetzen
|
||||
.replace(/\b\w/g, c => c.toUpperCase()) // ersten Buchstaben groß
|
||||
existingDocs.appendChild(option);
|
||||
window.api.getTxtFiles().then(files => {
|
||||
files.forEach(file => {
|
||||
var option = document.createElement('option');
|
||||
option.value = file;
|
||||
option.textContent = file
|
||||
.replace('.txt', '') // Endung entfernen
|
||||
.replace(/_/g, ' ') // Leerzeichen ersetzen
|
||||
.replace(/\b\w/g, c => c.toUpperCase()); // ersten Buchstaben groß
|
||||
existingDocs.appendChild(option);
|
||||
var option2 = document.createElement('option');
|
||||
option2.value = file;
|
||||
option2.name = file;
|
||||
option2.textContent = file
|
||||
.replace('.txt', '') // Endung entfernen
|
||||
.replace(/_/g, ' ') // Leerzeichen ersetzen
|
||||
.replace(/\b\w/g, c => c.toUpperCase()); // ersten Buchstaben groß
|
||||
customDocumentTypes.appendChild(option2);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
catch(error){
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function sendSpeakerPackages() {
|
||||
try {
|
||||
window.submitSpeaker.speaker_submit(speakerAudios);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
|
||||
window.sendSpeakerPackages = sendSpeakerPackages;
|
||||
|
||||
/*
|
||||
|
||||
Functions for the help page
|
||||
|
||||
*/
|
||||
|
||||
//Function to show the dropdown list in the help page
|
||||
function toggleTOC() {
|
||||
try {
|
||||
document.getElementById("toc").classList.toggle("show");
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
|
||||
//Function to hide the dropdown list in the help page
|
||||
function closeTOC() {
|
||||
try {
|
||||
document.getElementById("toc").classList.remove("show");
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
+326
-44
@@ -10,13 +10,13 @@ body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#h1 {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
.main_h1 {
|
||||
position: static;
|
||||
transform: none;
|
||||
margin: 0;
|
||||
z-index: 20;
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#h1-wrapper {
|
||||
@@ -30,6 +30,23 @@ body {
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.gui-language {
|
||||
right: 20px;
|
||||
z-index: 100;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
#language_option {
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ccc;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.upload-container {
|
||||
@@ -85,7 +102,6 @@ body {
|
||||
#previewThumbnail {
|
||||
width: 150px;
|
||||
height: 100px;
|
||||
/*border: 1px dashed black;*/
|
||||
}
|
||||
|
||||
.custom-btn {
|
||||
@@ -108,8 +124,9 @@ body {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
|
||||
#step2 {
|
||||
gap: 25px;
|
||||
.step h2 {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.KI-wrapper {
|
||||
@@ -186,14 +203,16 @@ input[type="file"] {
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
/* Hover effects for all different document options (with placeholders)*/
|
||||
|
||||
.figure1 {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.img-hover1 {
|
||||
position: absolute;
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
width: auto;
|
||||
height: 700px;
|
||||
top: 0;
|
||||
right: 40%;
|
||||
left: 0;
|
||||
@@ -201,12 +220,79 @@ input[type="file"] {
|
||||
object-fit: contain;
|
||||
display: none;
|
||||
transition: opacity .2s;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.figure1:hover .img-hover1 {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.figure2 {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.img-hover2 {
|
||||
position: absolute;
|
||||
width: auto;
|
||||
height: 700px;
|
||||
top: 0;
|
||||
right: 40%;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
object-fit: contain;
|
||||
display: none;
|
||||
transition: opacity .2s;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.figure2:hover .img-hover2 {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.figure3 {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.img-hover3 {
|
||||
position: absolute;
|
||||
width: auto;
|
||||
height: 700px;
|
||||
top: 0;
|
||||
right: 40%;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
object-fit: contain;
|
||||
display: none;
|
||||
transition: opacity .2s;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.figure3:hover .img-hover3 {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.figure4 {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.img-hover4 {
|
||||
position: absolute;
|
||||
width: auto;
|
||||
height: 700px;
|
||||
top: 0;
|
||||
right: 40%;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
object-fit: contain;
|
||||
display: none;
|
||||
transition: opacity .2s;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.figure4:hover .img-hover4 {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.img-icon {
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
@@ -236,7 +322,7 @@ input[type="file"] {
|
||||
background-color: #FFF;
|
||||
display: flex;
|
||||
width: 780px;
|
||||
height: 500px;
|
||||
height: 550px;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
@@ -245,6 +331,7 @@ input[type="file"] {
|
||||
border-style: solid;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1);
|
||||
padding-top: 70px;
|
||||
}
|
||||
|
||||
.progressbar {
|
||||
@@ -286,7 +373,10 @@ input[type="file"] {
|
||||
#ai_type,
|
||||
#transkript_type,
|
||||
#language_option {
|
||||
padding: 3px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ccc;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.labelDiv {
|
||||
@@ -334,7 +424,6 @@ input[type="file"] {
|
||||
.step {
|
||||
margin-top: 40px;
|
||||
margin-bottom: 40px;
|
||||
;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 425px;
|
||||
@@ -403,8 +492,8 @@ li {
|
||||
}
|
||||
|
||||
.p-menu1 {
|
||||
margin-left: 20px;
|
||||
z-index: 10;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
.hamburger1 {
|
||||
@@ -449,7 +538,7 @@ li {
|
||||
}
|
||||
|
||||
#toggle1:checked~.menu1 {
|
||||
height: 150px;
|
||||
height: 170px;
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
@@ -459,6 +548,7 @@ li {
|
||||
top: 55px;
|
||||
left: 20px;
|
||||
width: 240px;
|
||||
height: 0px;
|
||||
border-radius: 5px;
|
||||
background-color: #1C3B69;
|
||||
margin: 0;
|
||||
@@ -470,31 +560,28 @@ li {
|
||||
clear: both;
|
||||
width: auto;
|
||||
text-align: center;
|
||||
height: 0px;
|
||||
overflow: hidden;
|
||||
transition: height 0.3s ease, width 0.3s ease;
|
||||
z-index: 9999;
|
||||
-webkit-transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.menu1 a:first-child {
|
||||
#customDocBtn, #helpBtn {
|
||||
border: none;
|
||||
background-color:#1C3B69;
|
||||
font: 700 20px 'Oswald', sans-serif;
|
||||
border-radius: 0%;
|
||||
}
|
||||
|
||||
.menu1 button:first-child {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.menu1 a:last-child {
|
||||
.menu1 button:last-child {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.li1 {
|
||||
color: #fff;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 10px 0px;
|
||||
font: 700 20px 'Oswald', sans-serif;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.li1:hover {
|
||||
#customDocBtn:hover, #helpBtn:hover{
|
||||
background-color: #FFF;
|
||||
color: rgb(61, 61, 61);
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||
@@ -502,7 +589,25 @@ li {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#step2,
|
||||
#step2 {
|
||||
font-size: larger;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.step2-form {
|
||||
width: 100%;
|
||||
max-width: 420px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 24px; /* DAS ist dein Spacing */
|
||||
}
|
||||
|
||||
.step2-row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
#step3,
|
||||
#step5 {
|
||||
font-size: larger;
|
||||
@@ -513,7 +618,7 @@ li {
|
||||
}
|
||||
|
||||
#step5 {
|
||||
align-items: flex-start;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.button-group {
|
||||
@@ -537,35 +642,89 @@ li {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.h2 {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
|
||||
.speaker-container {
|
||||
width: 100%;
|
||||
max-width: 700px;
|
||||
}
|
||||
|
||||
.speaker-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.speaker-table tbody tr {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
margin-bottom: 25px;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.label-cell {
|
||||
flex: 0 0 150px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.label-cell label {
|
||||
font-weight: 400;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.input-cell {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
#cur_speaker,
|
||||
#newSpeaker {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #ccc;
|
||||
font-size: 14px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#speakerAudioViewer {
|
||||
width: 100%;
|
||||
height: 35px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.speaker-button-group {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
#speakerLocker,
|
||||
#speakerResender {
|
||||
padding: 10px 20px;
|
||||
margin: 20px auto;
|
||||
padding: 12px 25px;
|
||||
background-color: #007BFF;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.h2 {
|
||||
font-size: 25px;
|
||||
}
|
||||
|
||||
.speakerView,
|
||||
.speakerAudio,
|
||||
.speakerWrite {
|
||||
margin-top: auto;
|
||||
margin-bottom: auto;
|
||||
#speakerLocker:hover,
|
||||
#speakerResender:hover {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
|
||||
.container {
|
||||
background: white;
|
||||
padding: 30px;
|
||||
margin-top: 50px;
|
||||
padding: 10px;
|
||||
margin-top: 30px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
||||
width: 90%;
|
||||
max-width: 650px;
|
||||
}
|
||||
@@ -626,4 +785,127 @@ button:hover {
|
||||
margin-top: 20px;
|
||||
color: #333;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.container input,
|
||||
.container textarea,
|
||||
.container select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
/* help page */
|
||||
|
||||
/* ===== CONTAINER ===== */
|
||||
.containerHelp {
|
||||
background: white;
|
||||
width: 90%;
|
||||
max-width: 800px;
|
||||
height: 85vh;
|
||||
/* feste Höhe */
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* ===== FIXER TOP-BEREICH ===== */
|
||||
.top-bar {
|
||||
padding: 15px 20px;
|
||||
border-bottom: 1px solid #eee;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.back-btn,
|
||||
.toc-toggle {
|
||||
background: #007BFF;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 8px 14px;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.back-btn:hover,
|
||||
.toc-toggle:hover {
|
||||
background: #0056b3;
|
||||
}
|
||||
|
||||
/* ===== TOC ===== */
|
||||
.toc-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.toc {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 45px;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
|
||||
padding: 10px;
|
||||
min-width: 220px;
|
||||
display: none;
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
.toc a {
|
||||
display: block;
|
||||
padding: 8px 10px;
|
||||
color: #007BFF;
|
||||
text-decoration: none;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.toc a:hover {
|
||||
background: #f0f2f5;
|
||||
}
|
||||
|
||||
.toc.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* ===== SCROLLBEREICH ===== */
|
||||
.content {
|
||||
padding: 30px;
|
||||
overflow-y: auto;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* Inhalt */
|
||||
#help_page_h1 {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.step_hp {
|
||||
margin-bottom: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.step_hp h2 {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
.step_hp h3 {
|
||||
color: #555;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.step_hp p {
|
||||
color: #555;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.step_hp img {
|
||||
width: 100%;
|
||||
max-height: 350px;
|
||||
object-fit: contain;
|
||||
border-radius: 8px;
|
||||
margin-top: 15px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
@@ -168,9 +168,39 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
throw new Error("Unknown document type: " + args.document.type);
|
||||
}
|
||||
|
||||
console.log(args);
|
||||
let audiopath = "";
|
||||
let transcriptpath = "";
|
||||
electron.ipcMain.on("file_download", async (event) => {
|
||||
try {
|
||||
if (!globalFinalHtmlPath) {
|
||||
throw new Error("No document generated yet");
|
||||
}
|
||||
|
||||
const format = String(globalArgs?.document?.outputType || "")
|
||||
.replace('.', '')
|
||||
.toLowerCase();
|
||||
|
||||
if (!format) {
|
||||
throw new Error("No output format selected");
|
||||
}
|
||||
|
||||
const outputPath = await mapFunctions
|
||||
.get("htmlDocumentConverter")
|
||||
.convert({
|
||||
inputPath: globalFinalHtmlPath,
|
||||
format,
|
||||
showDialog: true
|
||||
});
|
||||
|
||||
event.sender.send("download_success", {
|
||||
path: outputPath,
|
||||
format
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.error("file_download failed:", err);
|
||||
|
||||
event.sender.send("error", err.message || String(err));
|
||||
}
|
||||
});
|
||||
|
||||
console.log("\n\n Running the Video to Audio Extractor");
|
||||
// This code handles the Video to Audio extraction module call
|
||||
@@ -253,7 +283,7 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
.function(args.document.module, {
|
||||
inputTranscriptPath: transcriptpath,
|
||||
documentTypePath: "./storage/documentType/" + templateFile,
|
||||
language: args.document.outputLanguage
|
||||
language: "en",
|
||||
})
|
||||
.then((resp) => {
|
||||
console.log(resp);
|
||||
@@ -286,16 +316,6 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
}
|
||||
});
|
||||
|
||||
electron.ipcMain.on("file_download", async () => {
|
||||
await mapFunctions
|
||||
.get("htmlDocumentConverter")
|
||||
.convert({
|
||||
inputPath: globalFinalHtmlPath,
|
||||
format: globalArgs.document.outputType,
|
||||
showDialog: true,
|
||||
});
|
||||
});
|
||||
|
||||
electron.ipcMain.on("speaker_submit", async (event, args) => {
|
||||
console.log("\n\n\nJa also hier kam was an \n\n\n");
|
||||
console.log(args);
|
||||
@@ -365,4 +385,4 @@ electron.ipcMain.handle('delete-txt-file', (event, fileName) => {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
});
|
||||
+195
-156
@@ -1,35 +1,37 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const puppeteer = require('puppeteer');
|
||||
const htmlToDocx = require('html-to-docx');
|
||||
const { execSync } = require('child_process');
|
||||
const os = require('os');
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const puppeteer = require("puppeteer");
|
||||
const htmlToDocx = require("html-to-docx");
|
||||
const { execSync } = require("child_process");
|
||||
const os = require("os");
|
||||
|
||||
const outputDir = path.join(__dirname, "../../../storage/documents");
|
||||
|
||||
if (!fs.existsSync(outputDir)) {
|
||||
fs.mkdirSync(outputDir, { recursive: true });
|
||||
fs.mkdirSync(outputDir, { recursive: true });
|
||||
}
|
||||
|
||||
async function showSaveDialog(defaultName, format) {
|
||||
const platform = os.platform();
|
||||
|
||||
if (platform === 'darwin') {
|
||||
// macOS
|
||||
const applescript = `
|
||||
const platform = os.platform();
|
||||
|
||||
if (platform === "darwin") {
|
||||
// macOS
|
||||
const applescript = `
|
||||
set defaultName to "${defaultName}.${format}"
|
||||
set theFile to choose file name with prompt "Dokument speichern als:" default name defaultName
|
||||
POSIX path of theFile
|
||||
`;
|
||||
|
||||
try {
|
||||
const result = execSync(`osascript -e '${applescript}'`, { encoding: 'utf8' });
|
||||
return result.trim();
|
||||
} catch (err) {
|
||||
if (err.status === 1) return null; // User canceled
|
||||
throw err;
|
||||
}
|
||||
} else if (platform === 'win32') {
|
||||
|
||||
try {
|
||||
const result = execSync(`osascript -e '${applescript}'`, {
|
||||
encoding: "utf8",
|
||||
});
|
||||
return result.trim();
|
||||
} catch (err) {
|
||||
if (err.status === 1) return null; // User canceled
|
||||
throw err;
|
||||
}
|
||||
} else if (platform === "win32") {
|
||||
const safeName = decodeURIComponent(defaultName);
|
||||
|
||||
const powershell = `
|
||||
@@ -43,155 +45,192 @@ async function showSaveDialog(defaultName, format) {
|
||||
`;
|
||||
|
||||
try {
|
||||
const result = execSync(
|
||||
`powershell -NoProfile -Command "${powershell.replace(/\r?\n/g, ' ')}"`,
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
return result.trim() || null;
|
||||
const result = execSync(
|
||||
`powershell -NoProfile -Command "${powershell.replace(/\r?\n/g, " ")}"`,
|
||||
{ encoding: "utf8" },
|
||||
);
|
||||
return result.trim() || null;
|
||||
} catch (err) {
|
||||
if (err.status === 1) return null; // User cancelled
|
||||
throw new Error("Save dialog failed: " + err.message);
|
||||
if (err.status === 1) return null; // User cancelled
|
||||
throw new Error("Save dialog failed: " + err.message);
|
||||
}
|
||||
} else {
|
||||
// Linux - zenity oder kdialog
|
||||
try {
|
||||
const result = execSync(
|
||||
`zenity --file-selection --save --confirm-overwrite --filename="${defaultName}.${format}"`,
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
return result.trim();
|
||||
} catch (err) {
|
||||
try {
|
||||
const result = execSync(
|
||||
`kdialog --getsavefilename . "${defaultName}.${format}"`,
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
return result.trim();
|
||||
} catch (err2) {
|
||||
// Fallback
|
||||
return path.join(os.homedir(), 'Downloads', `${defaultName}.${format}`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Linux - zenity oder kdialog
|
||||
try {
|
||||
const result = execSync(
|
||||
`zenity --file-selection --save --confirm-overwrite --filename="${defaultName}.${format}"`,
|
||||
{ encoding: "utf8" },
|
||||
);
|
||||
return result.trim();
|
||||
} catch (err) {
|
||||
try {
|
||||
const result = execSync(
|
||||
`kdialog --getsavefilename . "${defaultName}.${format}"`,
|
||||
{ encoding: "utf8" },
|
||||
);
|
||||
return result.trim();
|
||||
} catch (err2) {
|
||||
// Fallback
|
||||
return path.join(os.homedir(), "Downloads", `${defaultName}.${format}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const module_exports = {
|
||||
name: "htmlDocumentConverter",
|
||||
type: "converter",
|
||||
displayname: "HTML Document Converter",
|
||||
description: "Converts LLM-generated HTML to PDF, DOCX, TXT, or HTML",
|
||||
name: "htmlDocumentConverter",
|
||||
type: "converter",
|
||||
displayname: "HTML Document Converter",
|
||||
description: "Converts LLM-generated HTML to PDF, DOCX, TXT, or HTML",
|
||||
|
||||
/**
|
||||
* Main conversion function
|
||||
* @param {Object} options
|
||||
* @param {string} options.inputPath - Path to the HTML input
|
||||
* @param {string} options.format - 'pdf' | 'docx' | 'html' | 'txt'
|
||||
* @param {string} [options.outputName] - Optional output filename (without extension)
|
||||
* @param {boolean} [options.showDialog] - Show save dialog (default: false in module mode, true in CLI mode)
|
||||
*/
|
||||
async convert({ inputPath, format = 'pdf', outputName, showDialog = false }) {
|
||||
if (!fs.existsSync(inputPath)) {
|
||||
throw new Error(`Input file not found: ${inputPath}`);
|
||||
}
|
||||
/**
|
||||
* Main conversion function
|
||||
* @param {Object} options
|
||||
* @param {string} options.inputPath - Path to the HTML input
|
||||
* @param {string} options.format - 'pdf' | 'docx' | 'html' | 'txt'
|
||||
* @param {string} [options.outputName] - Optional output filename (without extension)
|
||||
* @param {boolean} [options.showDialog] - Show save dialog (default: false in module mode, true in CLI mode)
|
||||
*/
|
||||
async convert({ inputPath, format = "pdf", outputName, showDialog = false }) {
|
||||
format = format.toLowerCase().replace(".", ""); // <-- FIX
|
||||
|
||||
const ext = path.extname(inputPath).toLowerCase();
|
||||
const baseName = outputName || path.basename(inputPath, ext);
|
||||
|
||||
let outputFile;
|
||||
|
||||
if (showDialog) {
|
||||
// Zeige nativen Dialog
|
||||
outputFile = await showSaveDialog(baseName, format);
|
||||
if (!outputFile) {
|
||||
console.log('Speichervorgang abgebrochen.');
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
// Nutze Standard-Ausgabeverzeichnis
|
||||
outputFile = path.join(outputDir, `${baseName}.${format.toLowerCase()}`);
|
||||
}
|
||||
|
||||
let htmlContent = fs.readFileSync(inputPath, 'utf8');
|
||||
|
||||
// Remove <think> tags if present
|
||||
htmlContent = htmlContent.replace(/<think>[\s\S]*?<\/think>/gi, '');
|
||||
|
||||
switch (format.toLowerCase()) {
|
||||
case 'html':
|
||||
fs.writeFileSync(outputFile, htmlContent, 'utf8');
|
||||
break;
|
||||
case 'pdf':
|
||||
await this.htmlToPDF(htmlContent, outputFile);
|
||||
break;
|
||||
case 'docx':
|
||||
await this.htmlToDOCX(htmlContent, outputFile);
|
||||
break;
|
||||
case 'txt':
|
||||
fs.writeFileSync(outputFile, this.htmlToTXT(htmlContent), 'utf8');
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unsupported format: ${format}`);
|
||||
}
|
||||
|
||||
console.log(`Erfolgreich gespeichert: ${outputFile}`);
|
||||
return outputFile;
|
||||
},
|
||||
|
||||
// HTML → PDF
|
||||
async htmlToPDF(html, outputPath) {
|
||||
const browser = await puppeteer.launch({
|
||||
headless: true,
|
||||
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
||||
});
|
||||
const page = await browser.newPage();
|
||||
await page.setContent(html, { waitUntil: 'networkidle0' });
|
||||
await page.pdf({
|
||||
path: outputPath,
|
||||
format: 'A4',
|
||||
printBackground: true,
|
||||
margin: { top: '20mm', right: '20mm', bottom: '20mm', left: '20mm' }
|
||||
});
|
||||
await browser.close();
|
||||
},
|
||||
|
||||
// HTML → DOCX
|
||||
async htmlToDOCX(html, outputPath) {
|
||||
const buffer = await htmlToDocx(html);
|
||||
fs.writeFileSync(outputPath, buffer);
|
||||
},
|
||||
|
||||
// HTML → TXT (rudimentär)
|
||||
htmlToTXT(html) {
|
||||
return html.replace(/<[^>]*>/g, '').replace(/\s+\n/g, '\n').trim();
|
||||
if (!["pdf", "docx", "html", "txt"].includes(format)) {
|
||||
throw new Error(`Unsupported format: ${format}`);
|
||||
}
|
||||
if (!fs.existsSync(inputPath)) {
|
||||
throw new Error(`Input file not found: ${inputPath}`);
|
||||
}
|
||||
|
||||
const ext = path.extname(inputPath).toLowerCase();
|
||||
const baseName = outputName || path.basename(inputPath, ext);
|
||||
|
||||
let outputFile;
|
||||
|
||||
if (showDialog) {
|
||||
// Zeige nativen Dialog
|
||||
outputFile = await showSaveDialog(baseName, format);
|
||||
if (!outputFile) {
|
||||
console.log("Speichervorgang abgebrochen.");
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
// Nutze Standard-Ausgabeverzeichnis
|
||||
outputFile = path.join(outputDir, `${baseName}.${format.toLowerCase()}`);
|
||||
}
|
||||
|
||||
let htmlContent = fs.readFileSync(inputPath, "utf8");
|
||||
|
||||
// Remove <think> tags if present
|
||||
htmlContent = htmlContent.replace(/<think>[\s\S]*?<\/think>/gi, "");
|
||||
|
||||
switch (format.toLowerCase()) {
|
||||
case "html":
|
||||
fs.writeFileSync(outputFile, htmlContent, "utf8");
|
||||
break;
|
||||
case "pdf":
|
||||
await this.htmlToPDF(htmlContent, outputFile);
|
||||
break;
|
||||
case "docx":
|
||||
await this.htmlToDOCX(htmlContent, outputFile);
|
||||
break;
|
||||
case "txt":
|
||||
fs.writeFileSync(outputFile, this.htmlToTXT(htmlContent), "utf8");
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unsupported format: ${format}`);
|
||||
}
|
||||
|
||||
console.log(`Erfolgreich gespeichert: ${outputFile}`);
|
||||
return outputFile;
|
||||
},
|
||||
|
||||
// HTML → PDF
|
||||
async htmlToPDF(html, outputPath) {
|
||||
let browser;
|
||||
try {
|
||||
browser = await puppeteer.launch({
|
||||
headless: true,
|
||||
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
||||
});
|
||||
|
||||
const page = await browser.newPage();
|
||||
await page.setContent(html, { waitUntil: "networkidle0" });
|
||||
await page.pdf({
|
||||
path: outputPath,
|
||||
format: "A4",
|
||||
printBackground: true,
|
||||
margin: {
|
||||
top: "20mm",
|
||||
right: "20mm",
|
||||
bottom: "20mm",
|
||||
left: "20mm",
|
||||
},
|
||||
});
|
||||
} finally {
|
||||
if (browser) {
|
||||
await browser.close();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// HTML → DOCX
|
||||
async htmlToDOCX(html, outputPath) {
|
||||
try {
|
||||
// html‑to‑docx library converts HTML string into a Word .docx buffer
|
||||
// Usage from html‑to‑docx docs:
|
||||
// await HTMLtoDOCX(htmlString, headerHTMLString, documentOptions, footerHTMLString) [oai_citation:0‡GitHub](https://github.com/privateOmega/html-to-docx?utm_source=chatgpt.com)
|
||||
const buffer = await htmlToDocx(html, null, {
|
||||
table: { row: { cantSplit: true } },
|
||||
});
|
||||
fs.writeFileSync(outputPath, buffer);
|
||||
} catch (err) {
|
||||
throw new Error(`DOCX conversion failed: ${err.message}`);
|
||||
}
|
||||
},
|
||||
|
||||
// HTML → TXT
|
||||
htmlToTXT(html) {
|
||||
// A decent plain text conversion: strip tags and collapse whitespace
|
||||
// If you want more advanced extraction consider using a library like `html-to-text` or `strip-html` [oai_citation:1‡GitHub](https://github.com/html-to-text/node-html-to-text?utm_source=chatgpt.com)
|
||||
return (
|
||||
html
|
||||
// Remove all tags
|
||||
.replace(/<[^>]+>/g, "")
|
||||
// Convert multiple whitespace into single spaces
|
||||
.replace(/\s+/g, " ")
|
||||
.trim()
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = module_exports;
|
||||
|
||||
// CLI usage mit Dialog
|
||||
if (require.main === module) {
|
||||
(async () => {
|
||||
const args = process.argv.slice(2);
|
||||
if (args.length < 1) {
|
||||
console.log('Usage: node htmlDocumentConverter.js <input.html> [format]');
|
||||
console.log('Formats: pdf (default), docx, html, txt');
|
||||
console.log('');
|
||||
console.log('Ein nativer "Speichern unter" Dialog wird automatisch geöffnet.');
|
||||
process.exit(1);
|
||||
}
|
||||
(async () => {
|
||||
const args = process.argv.slice(2);
|
||||
if (args.length < 1) {
|
||||
console.log("Usage: node htmlDocumentConverter.js <input.html> [format]");
|
||||
console.log("Formats: pdf (default), docx, html, txt");
|
||||
console.log("");
|
||||
console.log(
|
||||
'Ein nativer "Speichern unter" Dialog wird automatisch geöffnet.',
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const inputPath = args[0];
|
||||
const format = args[1] || 'pdf';
|
||||
const inputPath = args[0];
|
||||
const format = args[1] || "pdf";
|
||||
|
||||
try {
|
||||
await module_exports.convert({
|
||||
inputPath,
|
||||
format,
|
||||
showDialog: true
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('Konvertierung fehlgeschlagen:', err.message);
|
||||
process.exit(1);
|
||||
}
|
||||
})();
|
||||
}
|
||||
try {
|
||||
await module_exports.convert({
|
||||
inputPath,
|
||||
format,
|
||||
showDialog: true,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("Konvertierung fehlgeschlagen:", err.message);
|
||||
process.exit(1);
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
// const fs = require('fs');
|
||||
// const path = require('path');
|
||||
|
||||
const e = require("express");
|
||||
|
||||
const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory
|
||||
|
||||
if (!fs.existsSync(outputDir)) {
|
||||
@@ -42,14 +40,6 @@ const module_exports = {
|
||||
createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
|
||||
return new Promise(async(resolve, reject) => {
|
||||
try {
|
||||
if (language.toLowerCase() === "de") {
|
||||
language = "German"
|
||||
}else if (language.toLowerCase() === "in") {
|
||||
language = "Indish"
|
||||
} else {
|
||||
language = "English"
|
||||
}
|
||||
|
||||
const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
|
||||
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
|
||||
|
||||
@@ -40,14 +40,6 @@ const module_exports = {
|
||||
createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
|
||||
return new Promise(async(resolve, reject) => {
|
||||
try {
|
||||
if (language.toLowerCase() === "de") {
|
||||
language = "German"
|
||||
}else if (language.toLowerCase() === "in") {
|
||||
language = "Indish"
|
||||
} else {
|
||||
language = "English"
|
||||
}
|
||||
|
||||
const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
|
||||
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
|
||||
|
||||
@@ -40,14 +40,6 @@ const module_exports = {
|
||||
createDocumentFromTranscript: async function(transcriptPath, documentTypePath, language = "en") { // default language is English
|
||||
return new Promise(async(resolve, reject) => {
|
||||
try {
|
||||
if (language.toLowerCase() === "de") {
|
||||
language = "German"
|
||||
}else if (language.toLowerCase() === "in") {
|
||||
language = "Indish"
|
||||
} else {
|
||||
language = "English"
|
||||
}
|
||||
|
||||
const transcript = await fs.promises.readFile(transcriptPath, "utf-8"); //read transcript file from Path
|
||||
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
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
// -----------------------------------------------------------
|
||||
// Parakeet (Step 3A: spawn Python minimal integration)
|
||||
// -----------------------------------------------------------
|
||||
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const { spawn } = require("child_process");
|
||||
|
||||
module.exports = {
|
||||
name: "parakeet",
|
||||
type: "transcription",
|
||||
displayname: "NVIDIA Parakeet",
|
||||
|
||||
async function(audioFilePath) {
|
||||
console.log("🦜 [Parakeet] Starting test integration (spawn only)...");
|
||||
console.log("🦜 Input audio:", audioFilePath);
|
||||
|
||||
// Check audio exists
|
||||
if (!fs.existsSync(audioFilePath)) {
|
||||
throw new Error("Audio file does not exist: " + audioFilePath);
|
||||
}
|
||||
|
||||
// Output path in storage/transcripts
|
||||
const sessionId = path.basename(audioFilePath).replace(/\.[^.]+$/, "");
|
||||
const outputDir = path.join(__dirname, "../../../storage/transcripts");
|
||||
fs.mkdirSync(outputDir, { recursive: true });
|
||||
|
||||
const outputPath = path.join(outputDir, `${sessionId}.json`);
|
||||
|
||||
// -------------------------------------------------------
|
||||
// SPAWN PYTHON SCRIPT (step 3A — dummy script)
|
||||
// -------------------------------------------------------
|
||||
return new Promise((resolve, reject) => {
|
||||
const python310 = "C:\\Users\\smith\\AppData\\Local\\Programs\\Python\\Python310\\python.exe";
|
||||
const py = spawn(python310, [
|
||||
path.join(__dirname, "parakeet_transcribe.py"),
|
||||
audioFilePath,
|
||||
outputPath
|
||||
]);
|
||||
|
||||
py.stdout.on("data", data => console.log("🦜 [Python]", data.toString().trim()));
|
||||
py.stderr.on("data", data => console.error("🦜 [Python ERR]", data.toString().trim()));
|
||||
|
||||
py.on("close", code => {
|
||||
if (code === 0) {
|
||||
console.log("🦜 [Parakeet] Done (spawn test). Output:", outputPath);
|
||||
resolve(outputPath);
|
||||
} else {
|
||||
reject(new Error("Python script failed with exit code " + code));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -1,71 +0,0 @@
|
||||
# -----------------------------------------------------------
|
||||
# Parakeet Real Transcriber (NVIDIA NeMo + PyTorch GPU)
|
||||
# -----------------------------------------------------------
|
||||
|
||||
import sys
|
||||
import json
|
||||
import soundfile as sf
|
||||
import torch
|
||||
from nemo.collections.asr.models import ASRModel
|
||||
|
||||
# Args:
|
||||
# sys.argv[1] = input audio path
|
||||
# sys.argv[2] = output JSON path
|
||||
|
||||
audio_path = sys.argv[1]
|
||||
output_path = sys.argv[2]
|
||||
|
||||
print("🔥 Starting Parakeet model...")
|
||||
device = "cuda" if torch.cuda.is_available() else "cpu"
|
||||
print("🔥 Using device:", device)
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# Load Parakeet model (NVIDIA pretrained ASR)
|
||||
# -----------------------------------------------------------
|
||||
model = ASRModel.from_pretrained(model_name="nvidia/parakeet-ctc-0.6b")
|
||||
model = model.to(device)
|
||||
model.eval()
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# Load audio
|
||||
# -----------------------------------------------------------
|
||||
print("🎧 Loading audio:", audio_path)
|
||||
audio, sr = sf.read(audio_path)
|
||||
|
||||
# model expects mono float32
|
||||
if len(audio.shape) > 1:
|
||||
audio = audio.mean(axis=1)
|
||||
|
||||
audio = audio.astype("float32")
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# Run inference
|
||||
# -----------------------------------------------------------
|
||||
print("🧠 Running inference...")
|
||||
with torch.no_grad():
|
||||
hyp = model.transcribe([audio])[0]
|
||||
|
||||
# Extract only the text
|
||||
if hasattr(hyp, "text"):
|
||||
transcript = hyp.text
|
||||
else:
|
||||
# fallback: convert to string (rare)
|
||||
transcript = str(hyp)
|
||||
|
||||
print("📄 Transcript:", transcript)
|
||||
|
||||
# -----------------------------------------------------------
|
||||
# Save JSON format compatible with V2D pipeline
|
||||
# -----------------------------------------------------------
|
||||
result = {
|
||||
"id": output_path.split("/")[-1].replace(".json", ""),
|
||||
"tool": "nemo_parakeet",
|
||||
"status": "completed",
|
||||
"text": transcript,
|
||||
"words": [] # Parakeet XS doesn’t return word timestamps
|
||||
}
|
||||
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
json.dump(result, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print("✔ JSON saved at:", output_path)
|
||||
Reference in New Issue
Block a user