mirror of
https://gitlab.rlp.net/proj-wise2526-video2document/video2document.git
synced 2026-06-15 18:01:52 +02:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2900152945 | |||
| b89e5ec587 | |||
| fc041e1036 | |||
| b05537fa70 | |||
| 8e563187b0 | |||
| 95ac7256d4 | |||
| d47cf21e9f | |||
| 6cff6b9981 | |||
| 11f9a02778 | |||
| 41cd8065ba | |||
| c1e79b6603 | |||
| 0003d99041 | |||
| 6a94f88e86 | |||
| 30f73f7bb7 | |||
| 59ac104d69 | |||
| 74439d680e | |||
| 363ba2d1b5 |
@@ -19,8 +19,8 @@
|
||||
</label>
|
||||
|
||||
<nav class="menu1">
|
||||
<li class="li1">Help</li>
|
||||
<li class="li1">Language</li>
|
||||
<a href="index2.html" class="li1">Custom document</a>
|
||||
<a href="index3.html" class="li1">Help</a>
|
||||
</nav>
|
||||
</nav>
|
||||
</section>
|
||||
@@ -79,27 +79,27 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="step" id="step3" style="display:none;">
|
||||
<div class="step" id="step3" style="display:none;">
|
||||
<div class="checkbox-group">
|
||||
<label id="checkbox-label" for="checkbox-group">Choose prefered document style:</label>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name ="docFormat" id="docFormat" value="Meeting report">
|
||||
<input type="checkbox" name ="docFormat" id="docFormat" value="followup-report">
|
||||
<label id="label_format" for="docFormat">Follow-up Report</label>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary1" value="Summary with timestamps">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary1" value="agenda">
|
||||
<label id="label_summary" for="docFormatSummary">Agenda</label>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary2" value="Summary with timestamps">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary2" value="result-protocol">
|
||||
<label id="label_summary" for="docFormatSummary">Resultprotocol</label>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary3" value="Summary with timestamps">
|
||||
<input type="checkbox" name="docFormat" id="docFormatSummary3" value="sprint-planning">
|
||||
<label id="label_summary" for="docFormatSummary">Sprint Planning Note</label>
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<input type="checkbox" name="docFormat" id="docFormatCustom" value="Summary with timestamps">
|
||||
<input type="checkbox" name="docFormat" id="docFormatCustom" value="custom">
|
||||
<select name="ai_type" id="ai_type">
|
||||
<option>nichts</option>
|
||||
</select>
|
||||
|
||||
+8
-10
@@ -27,15 +27,13 @@ function checkBoxes() {
|
||||
if(testEndings.some(e => pathToLower.endsWith(e))){
|
||||
//assembly of the json for the main
|
||||
|
||||
const selectedStyles = [checkedCounter];
|
||||
var iter = 0;
|
||||
checkboxes.forEach(function(checkbox){
|
||||
if(checkbox.checked){
|
||||
console.log(checkbox.value);
|
||||
selectedStyles[iter] = {iter: checkbox.value};
|
||||
iter++;
|
||||
}
|
||||
});
|
||||
var typeCheckbox;
|
||||
if(document.getElementById("docFormat").checked) typeCheckbox = document.getElementById("docFormat").value;
|
||||
if(document.getElementById("docFormatSummary1").checked) typeCheckbox = document.getElementById("docFormatSummary1").value;
|
||||
if(document.getElementById("docFormatSummary2").checked) typeCheckbox = document.getElementById("docFormatSummary2").value;
|
||||
if(document.getElementById("docFormatSummary3").checked) typeCheckbox = document.getElementById("docFormatSummary3").value;
|
||||
if(document.getElementById("docFormatCustom").checked) typeCheckbox = document.getElementById("docFormatCustom").value;
|
||||
|
||||
document.getElementById("testy").style.visibility = "visible"
|
||||
document.getElementById("box1").style.backgroundColor = "red";
|
||||
document.getElementById("box2").style.backgroundColor = "red";
|
||||
@@ -55,7 +53,7 @@ function checkBoxes() {
|
||||
},
|
||||
"document": {
|
||||
"module":aiType.value,
|
||||
"styles": selectedStyles,
|
||||
"type": typeCheckbox,
|
||||
"outputType": outputType.value
|
||||
}
|
||||
};
|
||||
|
||||
@@ -177,10 +177,11 @@ input[type="file"] {
|
||||
.submit-btn {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 10px 20px;
|
||||
margin-left: 80px;
|
||||
margin-left: 300px;
|
||||
margin-top: 30px;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 70px;
|
||||
background-color: #007BFF;
|
||||
color: white;
|
||||
border: none;
|
||||
@@ -420,7 +421,6 @@ li {
|
||||
border-radius: 5px;
|
||||
background-color: #1C3B69;
|
||||
margin: 0;
|
||||
display: -ms-grid;
|
||||
display: grid;
|
||||
grid-template-rows: 1fr repeat(4, 0.5fr);
|
||||
grid-row-gap: 25px;
|
||||
@@ -436,19 +436,21 @@ li {
|
||||
-webkit-transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.menu1 li:first-child {
|
||||
.menu1 a:first-child {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.menu1 li:last-child {
|
||||
.menu1 a:last-child {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.li1 {
|
||||
color: #fff;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 10px 0;
|
||||
padding: 10px 0px;
|
||||
font: 700 20px 'Oswald', sans-serif;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.li1:hover {
|
||||
|
||||
@@ -131,11 +131,21 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
try {
|
||||
globalArgs = args
|
||||
let curstep = 0
|
||||
let totalsteps = 3 + args.document.styles.length
|
||||
|
||||
if(args.document.styles.length == 0)
|
||||
throw new Error("At least one Document Style needed");
|
||||
|
||||
let totalsteps = 4
|
||||
|
||||
const TEMPLATE_MAP = {
|
||||
"followup-report": "followup_report.txt",
|
||||
"agenda": "agenda.txt",
|
||||
"result-protocol": "result_protocol.txt",
|
||||
"sprint-planning": "sprint_planning_note.txt",
|
||||
"custom": "custom_document.txt"
|
||||
};
|
||||
|
||||
const templateFile = TEMPLATE_MAP[args.document.type];
|
||||
|
||||
if (!templateFile) {
|
||||
throw new Error("Unknown document type: " + args.document.type);
|
||||
}
|
||||
|
||||
console.log(args);
|
||||
let audiopath = ""
|
||||
@@ -184,10 +194,10 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
console.log("\n\n Running the LLM module");
|
||||
// TODO implement documentation module
|
||||
// This code handles the Text to Document processing module call
|
||||
for (let i = 0; i < args.document.styles.length; i++) {
|
||||
console.log(`\n\n Running the LLM for Document Style ${i+1}`);
|
||||
|
||||
await mapFunctions.get("module-handler").function(args.document.module, {inputTranscriptPath: transcriptpath, documentTypePath: "./storage/documentType/standard_meeting_report.txt", language: "en"}).then(resp => {
|
||||
console.log(`\n\n Running the LLM for Document Style ${args.document.type}`);
|
||||
|
||||
await mapFunctions.get("module-handler").function(args.document.module, { inputTranscriptPath: transcriptpath, documentTypePath: "./storage/documentType/" + templateFile, language: "en" }).then(resp => {
|
||||
console.log(resp);
|
||||
globalFinalHtmlPath = resp
|
||||
curstep++
|
||||
@@ -197,7 +207,12 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
await mapFunctions.get("extract-speaker-snippets").function({audioPath: audiopath, jsonPath: transcriptpath }).then(resp => {
|
||||
mainWindow.webContents.send("submitSpeaker", resp)
|
||||
console.log(resp)
|
||||
})
|
||||
|
||||
// TODO actually implement this functionality
|
||||
// Module to get the first few lines for each speaker to send to the frontend
|
||||
// await mapFunctions.get("speaker-getter-idfk").function(transcriptpath).then(resp => {
|
||||
@@ -210,7 +225,7 @@ electron.ipcMain.on("file_submit", async (event, args) => {
|
||||
// // speakerA: {source: "Pfad zur Audio File"},
|
||||
// // speakerB:.....
|
||||
// // }
|
||||
mainWindow.webContents.send("speakers", {speakerA:"pfad1", speakerB:"pfad2"})
|
||||
// mainWindow.webContents.send("speakers", {speakerA:"pfad1", speakerB:"pfad2"})
|
||||
// }).catch(err => {
|
||||
// mainWindow.webContents.send("error", err)
|
||||
// return
|
||||
@@ -257,4 +272,4 @@ let q1 = {
|
||||
{name:"abc", displayname:"ABC"},
|
||||
{name:"qeg", displayname:"aqghegahu"}
|
||||
]
|
||||
}
|
||||
}
|
||||
Generated
+5
-4
@@ -15,7 +15,7 @@
|
||||
"dotenv": "^17.2.3",
|
||||
"electron": "^39.1.1",
|
||||
"express": "^5.1.0",
|
||||
"ffmpeg-static": "^5.2.0",
|
||||
"ffmpeg-static": "^5.3.0",
|
||||
"fluent-ffmpeg": "^2.1.3",
|
||||
"html-to-docx": "^1.8.0",
|
||||
"mocha": "^11.7.5",
|
||||
@@ -1773,9 +1773,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ffmpeg-static": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz",
|
||||
"integrity": "sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA==",
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.3.0.tgz",
|
||||
"integrity": "sha512-H+K6sW6TiIX6VGend0KQwthe+kaceeH/luE8dIZyOP35ik7ahYojDuqlTV1bOrtEwl01sy2HFNGQfi5IDJvotg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "GPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
@@ -1832,6 +1832,7 @@
|
||||
"resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz",
|
||||
"integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==",
|
||||
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"async": "^0.2.9",
|
||||
"which": "^1.1.1"
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
"dotenv": "^17.2.3",
|
||||
"electron": "^39.1.1",
|
||||
"express": "^5.1.0",
|
||||
"ffmpeg-static": "^5.2.0",
|
||||
"ffmpeg-static": "^5.3.0",
|
||||
"fluent-ffmpeg": "^2.1.3",
|
||||
"html-to-docx": "^1.8.0",
|
||||
"mocha": "^11.7.5",
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
|
||||
const ffmpeg = require("fluent-ffmpeg");
|
||||
const ffmpegPath = require("ffmpeg-static");
|
||||
|
||||
ffmpeg.setFfmpegPath(ffmpegPath);
|
||||
|
||||
module.exports = {
|
||||
name: "extract-speaker-snippets",
|
||||
type: "audio",
|
||||
displayname: "Extract Speaker Snippets",
|
||||
|
||||
async function(parameter) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
|
||||
let output = {}
|
||||
|
||||
console.log("Extract Speaker Snippets\n");
|
||||
|
||||
// Pfade
|
||||
const AUDIO_PATH = parameter.audioPath; // Gesamt-Audio
|
||||
const JSON_PATH = parameter.jsonPath; // json summary
|
||||
const OUTPUT_DIR = path.join(__dirname, "/../../../storage/audio/speakerSnippets");
|
||||
|
||||
|
||||
if (!AUDIO_PATH || !JSON_PATH) {
|
||||
console.error("no audioPath or jsonPath available");
|
||||
return;
|
||||
}
|
||||
|
||||
// Output-Ordner
|
||||
if (!fs.existsSync(OUTPUT_DIR)) {
|
||||
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
||||
}
|
||||
|
||||
// JSON laden
|
||||
let entries;
|
||||
try {
|
||||
entries = JSON.parse(fs.readFileSync(JSON_PATH, "utf8"));
|
||||
} catch (err) {
|
||||
console.error("JSON reading failed", err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Array.isArray(entries)) {
|
||||
console.error("JSON is not an Array");
|
||||
return;
|
||||
}
|
||||
|
||||
// Pro Speaker genau EINEN Satz merken
|
||||
const speakerMap = {};
|
||||
|
||||
for (const item of entries) {
|
||||
if (!speakerMap[item.speaker]) {
|
||||
speakerMap[item.speaker] = item;
|
||||
}
|
||||
}
|
||||
|
||||
// FFmpeg pro Speaker ausführen (sequenziell)
|
||||
for (const speaker of Object.keys(speakerMap)) {
|
||||
const data = speakerMap[speaker];
|
||||
|
||||
// ms → Sekunden
|
||||
const startSec = data.start / 1000;
|
||||
const durationSec = (data.end - data.start) / 1000;
|
||||
|
||||
if (durationSec <= 0) {
|
||||
console.log(`invalid times for Speaker ${speaker}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const outFile = path.join(OUTPUT_DIR, `speaker_${speaker}.wav`);
|
||||
|
||||
await new Promise((res, rej) => {
|
||||
ffmpeg(AUDIO_PATH)
|
||||
.setStartTime(startSec)
|
||||
.setDuration(durationSec)
|
||||
.output(outFile)
|
||||
.on("end", () => {
|
||||
output[`speaker${speaker}`] = {src: outFile, name: `speaker${speaker}`}
|
||||
console.log(`Snippet erstellt: speaker_${speaker}.wav`);
|
||||
res();
|
||||
})
|
||||
.on("error", (err) => {
|
||||
console.error(`FFmpeg Fehler (${speaker})`, err.message);
|
||||
rej();
|
||||
})
|
||||
.run();
|
||||
});
|
||||
|
||||
}
|
||||
resolve(output)
|
||||
console.log("\nAlle Speaker-Snippets erstellt\n");
|
||||
})
|
||||
}
|
||||
};
|
||||
@@ -10,6 +10,7 @@ module.exports = {
|
||||
// let transcript = await mapFunctions.get("assembly").function('../../storage/audio/IMG_2978.wav');
|
||||
|
||||
// let summary = await mapFunctions.get("summarize-transcription").function({jsonPath:'/Users/santa/Proj25/video2document/storage/transcripts/IMG_2978.json'});
|
||||
// let snippets = await mapFunctions.get("extract-speaker-snippets").function({audioPath:'/Users/santa/Proj25/video2document/storage/audio/KittyKat.wav', jsonPath1: '/Users/santa/Proj25/video2document/storage/transcriptionSummaries/KittyKat-1765806474958.json' });
|
||||
|
||||
|
||||
|
||||
|
||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
Du bist ein erfahrener Moderator und Projektmanager.
|
||||
|
||||
AUFGABE:
|
||||
Erstelle eine sinnvolle Meeting-Agenda basierend auf dem folgenden Transkript.
|
||||
|
||||
ANFORDERUNGEN:
|
||||
- Rekonstruiere die tatsächlichen Themenblöcke
|
||||
- Ordne sie logisch und chronologisch
|
||||
- Fasse ähnliche Diskussionen zusammen
|
||||
- Keine irrelevanten Details aufnehmen
|
||||
|
||||
STRUKTUR:
|
||||
- Titel der Agenda
|
||||
- Ziel des Meetings (1–2 Sätze)
|
||||
- Agenda-Punkte (nummeriert)
|
||||
- Thema
|
||||
- Kurzbeschreibung
|
||||
- Ziel des Punktes (Information, Entscheidung, Diskussion)
|
||||
|
||||
STIL:
|
||||
- Klar, kompakt
|
||||
- Business-orientiert
|
||||
- Keine Sprecher- oder Zeitangaben
|
||||
- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
|
||||
|
||||
TRANSKRIPT:
|
||||
@@ -0,0 +1,22 @@
|
||||
Du bist ein intelligenter Dokumenten-Generator.
|
||||
|
||||
AUFGABE:
|
||||
Erstelle ein individuelles Dokument basierend auf:
|
||||
1) dem Meeting-Transkript
|
||||
2) der zusätzlichen Nutzeranweisung
|
||||
|
||||
WICHTIG:
|
||||
- Priorisiere die Nutzeranweisung
|
||||
- Nutze das Transkript als Wissensquelle
|
||||
- Struktur, Tonalität und Detailgrad anpassen
|
||||
- Inhalte logisch zusammenführen
|
||||
- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
|
||||
|
||||
FORMAT:
|
||||
- Passe Struktur und Stil an den Nutzerwunsch an
|
||||
- Klare Überschriften
|
||||
- Keine Sprecher- oder Zeitangaben
|
||||
|
||||
TRANSKRIPT & NUTZERANWEISUNG:
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
Du bist ein professioneller Meeting-Analyst und Business Writer.
|
||||
|
||||
AUFGABE:
|
||||
Erstelle einen strukturierten Follow-up Report basierend auf dem folgenden Meeting-Transkript.
|
||||
|
||||
ANFORDERUNGEN:
|
||||
- Fasse Inhalte sinngemäß zusammen
|
||||
- Entferne Redundanzen und Smalltalk
|
||||
- Formuliere klar, präzise und professionell
|
||||
- Verwende neutrale Business-Sprache
|
||||
- Keine Zeitstempel oder Sprecher-Namen zitieren
|
||||
- Leite Entscheidungen und Aufgaben logisch ab, wenn sie implizit sind
|
||||
- Markiere offene Punkte klar
|
||||
- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
|
||||
|
||||
STRUKTUR DES DOKUMENTS:
|
||||
1. Titel & Metadaten
|
||||
- Meetingtitel (ableiten)
|
||||
- Datum (falls im Transkript erwähnt, sonst „nicht angegeben“)
|
||||
- Teilnehmer (zusammengefasst)
|
||||
|
||||
2. Executive Summary (max. 5 Bullet Points)
|
||||
|
||||
3. Besprochene Themen
|
||||
- Thema
|
||||
- Kernaussagen
|
||||
- Relevante Erkenntnisse
|
||||
|
||||
4. Entscheidungen
|
||||
- Entscheidung
|
||||
- Kontext / Begründung
|
||||
|
||||
5. Action Items
|
||||
- Aufgabe
|
||||
- Verantwortlich (falls ableitbar)
|
||||
- Ziel / Zweck
|
||||
|
||||
6. Offene Fragen & Risiken
|
||||
|
||||
STIL:
|
||||
- Überschriften klar strukturiert
|
||||
- Bullet Points bevorzugen
|
||||
- Präzise, keine Umgangssprache
|
||||
|
||||
TRANSKRIPT:
|
||||
@@ -0,0 +1,27 @@
|
||||
Du bist ein professioneller Protokollführer.
|
||||
|
||||
AUFGABE:
|
||||
Erstelle ein Ergebnisprotokoll basierend auf dem Meeting-Transkript.
|
||||
|
||||
FOKUS:
|
||||
- Ergebnisse statt Diskussionen
|
||||
- Entscheidungen, Beschlüsse, Vereinbarungen
|
||||
- Klare, überprüfbare Aussagen
|
||||
|
||||
STRUKTUR:
|
||||
1. Meeting-Informationen
|
||||
2. Ergebnisse je Thema
|
||||
- Thema
|
||||
- Ergebnis / Beschluss
|
||||
3. Entscheidungen
|
||||
4. Aufgaben & Verantwortlichkeiten
|
||||
5. Offene Punkte
|
||||
|
||||
REGELN:
|
||||
- Keine Meinungen oder Spekulationen
|
||||
- Keine Zeit- oder Sprecherangaben
|
||||
- Sachlich, formal
|
||||
- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
|
||||
|
||||
|
||||
TRANSKRIPT:
|
||||
@@ -0,0 +1,35 @@
|
||||
Du bist ein erfahrener Scrum Master.
|
||||
|
||||
AUFGABE:
|
||||
Erstelle Sprint Planning Notes aus dem folgenden Meeting-Transkript.
|
||||
|
||||
FOKUS:
|
||||
- Sprint-Ziele
|
||||
- User Stories / Tasks
|
||||
- Abhängigkeiten
|
||||
- Risiken
|
||||
- Commitments
|
||||
|
||||
STRUKTUR:
|
||||
1. Sprint Overview
|
||||
- Sprint-Ziel
|
||||
- Zeitraum (falls erwähnt)
|
||||
|
||||
2. Geplante Arbeit
|
||||
- User Story / Task
|
||||
- Beschreibung
|
||||
- Akzeptanzkriterien (falls ableitbar)
|
||||
|
||||
3. Abhängigkeiten & Blocker
|
||||
|
||||
4. Risiken & Annahmen
|
||||
|
||||
5. Vereinbarungen / Team-Commitments
|
||||
|
||||
STIL:
|
||||
- Agile-konform
|
||||
- Klar & umsetzungsorientiert
|
||||
- Bullet Points bevorzugen
|
||||
- Namen aus dem Transkript speakerA, speakerB etc. sollen weiterhin bestehen bleiben wie sie sind und nicht im Dokument ersetzt werden
|
||||
|
||||
TRANSKRIPT:
|
||||
@@ -1,217 +0,0 @@
|
||||
Generate a structured meeting report in HTML using STRUCTURE and STYLE.
|
||||
Output ONLY the final .md document — no meta comments, no explanations.
|
||||
|
||||
Follow exactly the STRUCTURE defined below.
|
||||
Follow exactly the STYLE rules.
|
||||
Use timestamps in HH:MM:SS format.
|
||||
If information is missing, use: Unclear:<reason>.
|
||||
|
||||
==================== STRUCTURE & RULES ====================
|
||||
|
||||
{
|
||||
"FORMAT": "HTML",
|
||||
|
||||
"STRUCTURE": {
|
||||
"titlepage": [
|
||||
"title",
|
||||
"date",
|
||||
"start",
|
||||
"end",
|
||||
"duration",
|
||||
"location",
|
||||
"host",
|
||||
"participants"
|
||||
],
|
||||
|
||||
"toc": "[section](#anchor) — HH:MM:SS",
|
||||
|
||||
"section": {
|
||||
"h2": "<topic> — HH:MM:SS",
|
||||
"summary": "exactly 1 concise sentence",
|
||||
"key_points": "maximum 5 bullet points; quotes optional",
|
||||
"decisions": "list items formatted as: decision text | owner | due date",
|
||||
"actions": "HTML table: id | task | owner | due | status"
|
||||
},
|
||||
|
||||
"exec_summary": "exactly 3 short sentences",
|
||||
|
||||
"consolidated": [
|
||||
"decisions",
|
||||
"actions"
|
||||
],
|
||||
|
||||
"appendix": "optional"
|
||||
},
|
||||
|
||||
"STYLE": {
|
||||
"tone": "neutral, concise, professional",
|
||||
"ts_format": "HH:MM:SS",
|
||||
"no_meta": true
|
||||
},
|
||||
|
||||
"PROCESS": {
|
||||
"timestamps": "use transcript timestamps if present; otherwise estimate minimal",
|
||||
"speakers": "use names if available; else Speaker X",
|
||||
"long_transcripts": "split → summarize → merge",
|
||||
"unclear": "Unclear:<reason>"
|
||||
},
|
||||
|
||||
"PROMPT_SNIPPET": "Generate meeting report in HTML using STRUCTURE and STYLE. Output only the report."
|
||||
}
|
||||
|
||||
============================================================
|
||||
|
||||
Insert all generated content into the following HTML TEMPLATE:
|
||||
|
||||
# {{title}}
|
||||
|
||||
**Date:** {{date}}
|
||||
**Start:** {{start}}
|
||||
**End:** {{end}}
|
||||
**Duration:** {{duration}}
|
||||
**Location:** {{location}}
|
||||
**Host:** {{host}}
|
||||
**Participants:** {{participants}}
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
{{toc}}
|
||||
|
||||
---
|
||||
Generate a structured meeting report in HTML using STRUCTURE and STYLE.
|
||||
Output ONLY the final .md document — no meta comments, no explanations.
|
||||
|
||||
Follow exactly the STRUCTURE defined below.
|
||||
Follow exactly the STYLE rules.
|
||||
Use timestamps in HH:MM:SS format.
|
||||
If information is missing, use: UNKLAR:<reason>.
|
||||
|
||||
==================== STRUCTURE & RULES ====================
|
||||
|
||||
{
|
||||
"FORMAT": "HTML",
|
||||
|
||||
"STRUCTURE": {
|
||||
"titlepage": [
|
||||
"title",
|
||||
"date",
|
||||
"start",
|
||||
"end",
|
||||
"duration",
|
||||
"location",
|
||||
"host",
|
||||
"participants"
|
||||
],
|
||||
|
||||
"toc": "[section](#anchor) — HH:MM:SS",
|
||||
|
||||
"section": {
|
||||
"h2": "<topic> — HH:MM:SS",
|
||||
"summary": "exactly 1 concise sentence",
|
||||
"key_points": "maximum 5 bullet points; quotes optional",
|
||||
"decisions": "list items formatted as: decision text | owner | due date",
|
||||
"actions": "HTML table: id | task | owner | due | status"
|
||||
},
|
||||
|
||||
"exec_summary": "exactly 3 short sentences",
|
||||
|
||||
"consolidated": [
|
||||
"decisions",
|
||||
"actions"
|
||||
],
|
||||
|
||||
"appendix": "optional"
|
||||
},
|
||||
|
||||
"STYLE": {
|
||||
"tone": "neutral, concise, professional",
|
||||
"ts_format": "HH:MM:SS",
|
||||
"no_meta": true
|
||||
},
|
||||
|
||||
"PROCESS": {
|
||||
"timestamps": "use transcript timestamps if present; otherwise estimate minimal",
|
||||
"speakers": "use names if available; else Speaker X",
|
||||
"long_transcripts": "split → summarize → merge",
|
||||
"unclear": "UNKLAR:<reason>"
|
||||
},
|
||||
|
||||
"PROMPT_SNIPPET": "Generate meeting report in HTML using STRUCTURE and STYLE. Output only the report."
|
||||
}
|
||||
|
||||
============================================================
|
||||
|
||||
Insert all generated content into the following HTML TEMPLATE:
|
||||
|
||||
# {{title}}
|
||||
|
||||
**Date:** {{date}}
|
||||
**Start:** {{start}}
|
||||
**End:** {{end}}
|
||||
**Duration:** {{duration}}
|
||||
**Location:** {{location}}
|
||||
**Host:** {{host}}
|
||||
**Participants:** {{participants}}
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
{{toc}}
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
{{exec_summary}}
|
||||
|
||||
---
|
||||
|
||||
## Sections
|
||||
{{sections}}
|
||||
|
||||
---
|
||||
|
||||
## Consolidated Decisions
|
||||
{{consolidated_decisions}}
|
||||
|
||||
---
|
||||
|
||||
## Consolidated Actions
|
||||
{{consolidated_actions}}
|
||||
|
||||
---
|
||||
|
||||
## Appendix
|
||||
{{appendix}}
|
||||
|
||||
============================================================
|
||||
|
||||
Final Requirement:
|
||||
Output ONLY the completed HTML meeting report.
|
||||
## Executive Summary
|
||||
{{exec_summary}}
|
||||
|
||||
---
|
||||
|
||||
## Sections
|
||||
{{sections}}
|
||||
|
||||
---
|
||||
|
||||
## Consolidated Decisions
|
||||
{{consolidated_decisions}}
|
||||
|
||||
---
|
||||
|
||||
## Consolidated Actions
|
||||
{{consolidated_actions}}
|
||||
|
||||
---
|
||||
|
||||
## Appendix
|
||||
{{appendix}}
|
||||
|
||||
============================================================
|
||||
|
||||
Final Requirement:
|
||||
Output ONLY the completed HTML meeting report.
|
||||
Reference in New Issue
Block a user