feat: split diarization UI into separate project folder
This commit is contained in:
1
.env.example
Normal file
1
.env.example
Normal file
@@ -0,0 +1 @@
|
||||
API_BASE=http://diarization-api:8093
|
||||
8
Dockerfile
Normal file
8
Dockerfile
Normal file
@@ -0,0 +1,8 @@
|
||||
FROM nginx:alpine
|
||||
|
||||
COPY index.html.template /usr/share/nginx/html/index.html.template
|
||||
COPY docker-entrypoint.sh /docker-entrypoint.sh
|
||||
RUN chmod +x /docker-entrypoint.sh
|
||||
|
||||
EXPOSE 80
|
||||
CMD ["/docker-entrypoint.sh"]
|
||||
20
README.md
Normal file
20
README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# diarization-ui
|
||||
|
||||
Separate UI container for the diarization/transcription API.
|
||||
|
||||
## Run
|
||||
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
UI will be available on `http://127.0.0.1:8094/`.
|
||||
|
||||
By default it calls API at `http://diarization-api:8093`.
|
||||
Set `API_BASE` in `.env` if needed.
|
||||
|
||||
## .env
|
||||
|
||||
```env
|
||||
API_BASE=http://diarization-api:8093
|
||||
```
|
||||
11
docker-compose.yml
Normal file
11
docker-compose.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
services:
|
||||
diarization-ui:
|
||||
build:
|
||||
context: ./web-ui
|
||||
dockerfile: Dockerfile
|
||||
container_name: diarization-ui
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8094:80"
|
||||
environment:
|
||||
- API_BASE=${API_BASE:-http://diarization-api:8093}
|
||||
7
docker-entrypoint.sh
Normal file
7
docker-entrypoint.sh
Normal file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
API_BASE="${API_BASE:-http://diarization-api:8093}"
|
||||
sed "s|__API_BASE__|${API_BASE}|g" /usr/share/nginx/html/index.html.template > /usr/share/nginx/html/index.html
|
||||
|
||||
exec nginx -g 'daemon off;'
|
||||
50
index.html.template
Normal file
50
index.html.template
Normal file
@@ -0,0 +1,50 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>Diarization + Whisper UI</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; max-width: 980px; margin: 24px auto; padding: 0 12px; }
|
||||
.row { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
|
||||
input[type=file] { padding:6px; }
|
||||
button { padding:8px 14px; cursor:pointer; }
|
||||
pre { white-space: pre-wrap; background:#111; color:#0f0; padding:12px; min-height:220px; border-radius:8px; }
|
||||
.muted { color:#666; font-size:13px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>Whisper + Sprechertrennung</h2>
|
||||
<p class="muted">API: <span id="api"></span></p>
|
||||
<div class="row">
|
||||
<input id="f" type="file" accept="audio/*" />
|
||||
<button onclick="go()">Verarbeiten</button>
|
||||
</div>
|
||||
<pre id="out"></pre>
|
||||
|
||||
<script>
|
||||
const API_BASE = "__API_BASE__";
|
||||
document.getElementById("api").textContent = API_BASE;
|
||||
|
||||
async function go() {
|
||||
const fi = document.getElementById('f');
|
||||
if (!fi.files.length) { alert('Bitte Datei wählen'); return; }
|
||||
const fd = new FormData();
|
||||
fd.append('file', fi.files[0]);
|
||||
const out = document.getElementById('out');
|
||||
out.textContent = 'Läuft...';
|
||||
try {
|
||||
const r = await fetch(`${API_BASE}/transcribe-diarize`, { method: 'POST', body: fd });
|
||||
const j = await r.json();
|
||||
if (!r.ok) {
|
||||
out.textContent = `Fehler (${r.status}):\n` + JSON.stringify(j, null, 2);
|
||||
return;
|
||||
}
|
||||
out.textContent = j.formatted_text || JSON.stringify(j, null, 2);
|
||||
} catch (e) {
|
||||
out.textContent = `Netzwerkfehler: ${e}`;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user