Integrate custom Web GUI assets, templates, and config.yaml; adapt for LocalAI
Mirror and run GitLab CI / build (push) Has been cancelled

This commit is contained in:
admin
2026-06-13 21:48:35 +00:00
parent 1eb88d27ba
commit d854d498cd
13 changed files with 791 additions and 9 deletions
+14 -9
View File
@@ -5,9 +5,9 @@ FROM python:3.11-slim
LABEL maintainer="Jacob Schmieder" LABEL maintainer="Jacob Schmieder"
LABEL email="Jacob.Schmieder@dbfz.de" LABEL email="Jacob.Schmieder@dbfz.de"
LABEL version="0.1.1.dev" LABEL version="0.1.1.dev"
LABEL description="Scraibe: LocalAI-backed transcription and diarization client with summarization. \ LABEL description="Scraibe: LocalAI-backed transcription and diarization client with summarization and custom Web GUI. \
Sends audio to a LocalAI server running vibevoice.cpp and uses a second LLM for summarization." Sends audio to a LocalAI server running vibevoice.cpp and uses a second LLM for summarization."
LABEL url="https://github.com/JSchmie/ScrAIbe" LABEL url="https://git.optimex.systems/admin/scribe"
# Install system dependencies (ffmpeg required) # Install system dependencies (ffmpeg required)
RUN apt update -y && \ RUN apt update -y && \
@@ -16,27 +16,32 @@ RUN apt update -y && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Working directory # Working directory
WORKDIR /app WORKDIR /app/src
# Environment variables for LocalAI (transcription/diarization) # Environment variables for LocalAI (transcription/diarization)
# Set these via docker run -e or docker-compose
ENV LOCALAI_API_URL=http://localhost:8080 ENV LOCALAI_API_URL=http://localhost:8080
ENV LOCALAI_API_KEY= ENV LOCALAI_API_KEY=
ENV LOCALAI_MODEL=vibevoice-diarize ENV LOCALAI_MODEL=vibevoice-cpp-asr
# Environment variables for Summarizer LLM # Environment variables for Summarizer LLM
ENV SUMMARIZER_API_URL=http://localhost:8080 ENV SUMMARIZER_API_URL=http://localhost:8080
ENV SUMMARIZER_API_KEY= ENV SUMMARIZER_API_KEY=
ENV SUMMARIZER_MODEL=llama-3.1-8b-instruct ENV SUMMARIZER_MODEL=qwen3-14b
# Gradio / Web GUI
ENV GRADIO_SERVER_NAME=0.0.0.0
# Copy and install Python dependencies # Copy and install Python dependencies
COPY requirements.txt /app/requirements.txt COPY requirements.txt /app/src/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt RUN pip install --no-cache-dir -r requirements.txt
# Copy application code # Copy application code
COPY scraibe /app/scraibe COPY scraibe /app/src/scraibe
# Expose port (if UI is served) # Copy custom Web GUI assets (header, footer, templates, logos, config)
COPY misc /app/src/misc
# Expose port (for Web GUI)
EXPOSE 7860 EXPOSE 7860
# Run the application # Run the application
+101
View File
@@ -0,0 +1,101 @@
## Custom configuration for A.P.Strom Transcription (LocalAI-backed)
## Lines that start with ## are comment lines.
interface_type: async # async or simple (one does transcriptions, requires Email setup)
launch:
## Gradio launch options (if using WebUI)
# server_port: null
# server_name: "A.P.Strom Transcription"
# inline: false
# inbrowser: false
# share: false
# debug: false
max_threads: 18
# quiet: false
# auth: null # tuple of username and password
# auth_message: null
# prevent_thread_lock: false
# show_error: false
# height: 500
# width: 100%
favicon_path: /app/src/misc/logo.png
# ssl_keyfile: null
# ssl_certfile: null
# ssl_keyfile_password: null
# ssl_verify: false
# show_api: false
# allowed_paths:
# blocked_paths: null
# root_path: null
# app_kwargs: null
# state_session_capacity: 10000
# share_server_address: null
# share_server_protocol: null
# max_file_size: null
# enable_monitoring: null
queue:
## Queue configuration
# status_update_rate: 'auto'
# api_open: null
max_size: 10
# default_concurrency_limit:
layout:
show_settings: false
header: /app/src/misc/header.html
header_format_options:
header_logo_url: https://apstrom.ca/
header_logo_src: /app/src/misc/logo.png
footer: /app/src/misc/footer.html
footer_format_options:
# footer_css_path: /app/src/misc/footer_style.css
footer_scraibe_webui_version: "0.1.1-dev"
scraibe_params:
## LocalAI (transcription + diarization)
localai_api_url: http://localhost:8080
localai_api_key: ""
localai_model: vibevoice-cpp-asr
## Summarizer LLM (for transcript_and_summarize)
summarizer_api_url: http://localhost:8080
summarizer_api_key: ""
summarizer_model: qwen3-14b
## Legacy Whisper/Pyannote fields (ignored by LocalAI client; kept for compatibility)
whisper_model: large-v3
whisper_type: whisper
dia_model: null
use_auth_token: null
device: cpu
num_threads: 18
mail:
sender_email: scribe@apstrom.ca
smtp_server: mail.apstrom.ca
smtp_port: 587
sender_password: ""
connection_type: TLS # 'SSL', 'TLS', or 'PLAIN'
context: default
default_subject: "A.P.Strom audio transcription"
error_template: /app/src/misc/error_notification_template.html
error_subject: "error"
error_format_options:
## exception is mandatory for your html; will be set to the related exception in the Code
contact_email: support@apstrom.ca
success_template: /app/src/misc/success_template.html
success_subject: "ready"
success_format_options:
contact_email: info@apstrom.ca
upload_notification_template: /app/src/misc/upload_notification_template.html
upload_subject: "upload successful"
upload_notification_format_options:
queue_position: null
contact_email: info@apstrom.ca
# mail_css_path: /app/src/misc/mail_style.css
advanced:
keep_model_alive: false # for sync interface only; keeps the model alive during a session
concurrent_workers_async: 2 # number of concurrent working threads in the async interface
+87
View File
@@ -0,0 +1,87 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Error Notification</title>
<link rel="stylesheet" type="text/css" href="{css_path}">
<style>
body {{
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}}
.container {{
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}}
h1 {{
font-size: 1.5em;
margin-top: 0;
}}
p {{
margin: 10px 0;
font-size: 1em;
}}
.error-message, .success-message {{
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}}
.error-message {{
color: #721c24;
}}
.success-message {{
color: #7C6DA0;
}}
.contact {{
margin-top: 15px;
font-size: 1em;
color: #333;
}}
.contact a {{
color: #0056b3;
text-decoration: none;
}}
.contact a:hover {{
text-decoration: underline;
}}
.disclaimer {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
.signature {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
</style>
</head>
<body>
<div class="container">
<h1 style="color: #7C6DA0;">Error Notification</h1>
<p>Dear user:</p>
<p>An error occurred while processing your audio file. This means that something went wrong during the processing of your file, and it could not be completed successfully.</p>
<p class="error-message">Error details: {exception}</p>
<p>Please check the file and try again. If the problem persists, our support team is here to help.</p>
<div class="contact">
<p>You can contact our support team at <a href="mailto:{contact_email}">{contact_email}</a>. They are available to assist with any questions or issues you may have.</p>
</div>
<div class="disclaimer">
<p>Please note that our support team does not have the ability to fix processing errors directly or access the files you have uploaded. They can provide guidance and help troubleshoot any issues you may encounter.</p>
</div>
<div class="signature">
<p>Thank you for using our transcription service!</p>
<p>A.P.Strom</p>
</div>
</div>
</body>
</html>
+119
View File
@@ -0,0 +1,119 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Footer</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
/* Styles from footer_style.css */
/* Resetting margins and paddings */
html, body {{
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}}
body {{
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
justify-content: space-between; /* Ensures footer stays at the bottom */
}}
.footer {{
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
/* Removed background-color to inherit from parent */
font-size: 16px;
color: #333;
width: 100%; /* Ensure footer is full width */
box-sizing: border-box; /* Padding is included in the width */
}}
.footer > div:first-child {{
margin-left: -20px;
padding-left: 0; /* Adjust if necessary */
}}
.footer div, .footer a {{
margin: 0 5px;
}}
.footer div {{
text-align: left;
}}
.footer a {{
color: #333;
transition: color 0.3s ease;
}}
.footer a:hover {{
color: #50AF31;
}}
.foot-text {{
text-align: center;
width: 80%;
margin-bottom: 15px;
font-size: 14px;
color: #333;
}}
.github-section {{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}}
.github-icon a {{
display: flex;
align-items: center;
justify-content: center;
width: 50px;
height: 50px;
border-radius: 50%;
background-color: transparent; /* Ensure transparency */
text-decoration: none !important;
color: white;
transition: background-color 0.3s ease, transform 0.3s ease;
}}
.github-icon i {{
font-size: 24px;
}}
.github-icon a:hover, .github-icon a:focus {{
background-color: #50AF31;
transform: scale(1.1);
text-decoration: none;
}}
.github-icon a, .github-icon a:hover, .github-icon a:active, .github-icon a:visited {{
text-decoration: none;
}}
.build-version {{
margin-top: 8px;
color: white; /* Adjust as needed */
font-size: 12px;
}}
/* Removed dark mode media query to let Gradio handle theming */
</style>
</head>
<body>
<div class="footer">
<div class="foot-text">
<h2 style="font-weight: bold; color: #7C6DA0;">Disclaimer</h2>
<p>The transcription completed by this application may contain errors.</p>
<p>Users must take care to review transcripts before circulating to ensure that they are error-free and complete.</p>
<p>The transcripts produced by this application do not replace a court reporter's transcription. The transcripts completed by this application are for the user's convenience only.</p>
<h2 style="font-weight: bold; color: #7C6DA0;">Data retention</h2>
<p>Audio or video files uploaded to this application are only retained for the time that it takes to complete the transcription. All transcripts are deleted after they are transmitted to the user.</p>
</div>
<div class="github-section">
<div class="github-icon">
<a href="https://github.com/JSchmie/ScrAIbe-WebUI" aria-label="GitHub">
<i class="fab fa-github"></i>
</a>
</div>
</div>
<div class="build-version">Build-Version: {footer_scraibe_webui_version}</div>
</div>
</body>
</html>
+100
View File
@@ -0,0 +1,100 @@
/* footer_style.css */
/* Resetting margins and paddings */
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
justify-content: space-between; /* Ensures footer stays at the bottom */
}
.footer {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px; /* Adjusted for demonstration */
background-color: #F9FAFB; /* Fixed background color */
font-size: 16px;
color: #333;
width: 100%; /* Ensure footer is full width */
box-sizing: border-box; /* Padding is included in the width */
}
.footer > div:first-child {
margin-left: -20px;
padding-left: 0; /* Reducing or eliminating left padding if it's causing the shift */
}
.footer div, .footer a {
margin: 0 5px;
}
.footer div {
text-align: left;
}
.footer a {
color: #333;
transition: color 0.3s ease;
}
.footer a:hover {
color: #50AF31;
}
.github-section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}
.github-icon a {
display: flex;
align-items: center;
justify-content: center;
width: 50px;
height: 50px;
border-radius: 50%;
background-color: none;
text-decoration: none !important; /* Removes underline */
color: white;
transition: background-color 0.3s ease, transform 0.3s ease;
}
.github-icon i {
font-size: 24px;
}
.github-icon a:hover, .github-icon a:focus {
background-color: #50AF31;
transform: scale(1.1);
text-decoration: none; /* Removes underline */
}
.github-icon a, .github-icon a:hover, .github-icon a:active, .github-icon a:visited {
text-decoration: none;
}
.build-version {
margin-top: 8px; /* Adjust spacing between the icon and the text as needed */
color: white; /* Adjust text color as needed */
font-size: 12px; /* Adjust font size as needed */
}
/* Dark mode styles */
@media (prefers-color-scheme: dark) {
body {
background-color: #121212;
color: #FFFFFF;
}
.footer {
background-color: transparent; /* Make footer background transparent */
color: #FFFFFF;
}
.footer a {
color: #FFFFFF;
}
.footer a:hover {
color: #50AF31;
}
.build-version {
color: #CCCCCC; /* Adjust text color for better contrast in dark mode */
}
}
+83
View File
@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>A.P.Strom Transcription</title>
<!-- Importing Cormorant Garamond font from Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;700&display=swap" rel="stylesheet">
<style>
.header-container {{
display: flex;
align-items: center;
justify-content: center;
position: relative;
padding-top: 30px;
}}
.logo-container {{
position: absolute;
top: 50%;
right: 20px;
transform: translateY(-50%);
width: 300px;
}}
.logo {{
width: 35%;
height: auto;
}}
.header-title {{
font-family: 'Cormorant Garamond', serif;
font-size: 50px !important;
font-weight: bold;
color: #7C6DA0;
margin: 0;
position: relative;
padding: 0.5em 0;
}}
.header-title::before, .header-title::after {{
content: "";
position: absolute;
height: 2px;
width: 80%;
background-color: #7C6DA0;
left: 10%;
}}
.header-title::before {{
top: 0.5em;
}}
.header-title::after {{
bottom: 0.5em;
}}
p, h2 {{
font-size: 16px;
margin: 10px 0;
line-height: 1.4;
}}
</style>
</head>
<body>
<div class="header-container">
<h1 class="header-title">A.P.Strom Transcription</h1>
<div class="logo-container">
<a href="{header_logo_url}">
<img src="./gradio_api/file={header_logo_src}" alt="A.P.Strom Logo" class="logo">
</a>
</div>
</div>
<div style="text-align: center; padding: 20px 10%;">
<p>
Upload, record, or provide a video with audio for transcription. Our toolkit is designed to transcribe content from multiple languages accurately. The integrated speaker diarisation feature identifies different speakers, ensuring a smooth transcription experience. For optimal results, indicate the number of speakers and the original language of the content.
</p>
<h2 style="font-weight: bold; color: #7C6DA0;">Start your transcription below.</h2>
</div>
</body>
</html>
+58
View File
@@ -0,0 +1,58 @@
/* header_style.css */
/* Importing Cormorant Garamond font from Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;700&display=swap');
.header-container {
display: flex;
align-items: center;
justify-content: center;
position: relative;
padding-top: 30px;
}
.logo-container {
position: absolute;
top: 50%;
right: 20px;
transform: translateY(-50%);
width: 300px;
}
.logo {
width: 100%;
height: auto;
}
h1 {
font-family: 'Cormorant Garamond', serif;
font-size: 50px !important; /* Increased font size */
font-weight: bold;
color: #50AF31;
margin: 0;
position: relative;
padding: 0.5em 0;
}
h1::before, h1::after {
content: "";
position: absolute;
height: 2px;
width: 80%;
background-color: #50AF31;
left: 10%;
}
h1::before {
top: 0.5em;
}
h1::after {
bottom: 0.5em;
}
p, h2 {
font-size: 16px;
margin: 10px 0;
line-height: 1.4;
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

+57
View File
@@ -0,0 +1,57 @@
body {
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}
.container {
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}
h1 {
font-size: 1.5em;
margin-top: 0;
}
p {
margin: 10px 0;
font-size: 1em;
}
.error-message, .success-message {
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}
.error-message {
color: #721c24;
}
.success-message {
color: #155724;
}
.contact {
margin-top: 15px;
font-size: 0.9em;
color: #555;
}
.contact a {
color: #0056b3;
text-decoration: none;
}
.contact a:hover {
text-decoration: underline;
}
.disclaimer {
margin-top: 20px;
font-size: 0.8em;
color: #777;
}
.signature {
margin-top: 20px;
font-size: 0.8em;
color: #555;
}
+86
View File
@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transcript Ready</title>
<link rel="stylesheet" type="text/css" href="{css_path}">
<style>
body {{
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}}
.container {{
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}}
h1 {{
font-size: 1.5em;
margin-top: 0;
}}
p {{
margin: 10px 0;
font-size: 1em;
}}
.error-message, .success-message {{
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}}
.error-message {{
color: #721c24;
}}
.success-message {{
color: #7C6DA0;
}}
.contact {{
margin-top: 15px;
font-size: 1em;
color: #333;
}}
.contact a {{
color: #0056b3;
text-decoration: none;
}}
.contact a:hover {{
text-decoration: underline;
}}
.disclaimer {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
.signature {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
</style>
</head>
<body>
<div class="container">
<h1 style="color: #7C6DA0;">Transcript Ready</h1>
<p>Dear user:</p>
<p>Your file has been successfully processed, and the transcript is now ready. The transcript of your audio or video file is attached to this email.</p>
<p>We hope you find the transcript useful. If you have any questions or need further assistance, please do not hesitate to contact our support team.</p>
<div class="contact">
<p>You can reach our support team at <a href="mailto:{contact_email}">{contact_email}</a>. They are available to help with any questions or issues you may have.</p>
</div>
<div class="disclaimer">
<p>Please note that our support team cannot modify the content of the transcript. They can assist with any other questions or concerns you may have.</p>
</div>
<div class="signature">
<p>Thank you for using our transcription service!</p>
<p>A.P.Strom</p>
</div>
</div>
</body>
</html>
+86
View File
@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload Successful</title>
<style>
body {{
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}}
.container {{
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}}
h1 {{
font-size: 1.5em;
margin-top: 0;
}}
p {{
margin: 10px 0;
font-size: 1em;
}}
.error-message, .success-message {{
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}}
.error-message {{
color: #721c24;
}}
.success-message {{
color: #7C6DA0;
}}
.contact {{
margin-top: 15px;
font-size: 1em;
color: #333;
}}
.contact a {{
color: #0056b3;
text-decoration: none;
}}
.contact a:hover {{
text-decoration: underline;
}}
.disclaimer {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
.signature {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
</style>
</head>
<body>
<div class="container">
<h1 style="color: #7C6DA0;">Upload Successful</h1>
<p>Dear user:</p>
<p>Your file has been successfully uploaded and is now in our processing queue. This means that our system has received your file, and it is waiting to be processed. We will handle your file as soon as possible.</p>
<p class="success-message">Your current position in the queue is: {queue_position}. This is the order in which your file will be processed. We appreciate your patience as we work through the queue.</p>
<p>We will notify you once your file has been processed. If you have any urgent needs or further questions, feel free to reach out to our support team.</p>
<div class="contact">
<p>You can contact our support team at <a href="mailto:{contact_email}">{contact_email}</a>. Please note that our support team is here to help with any questions or issues you might have.</p>
</div>
<div class="disclaimer">
<p>Please note that our support team does not have the ability to change your position in the queue or access the files you have uploaded. They are here to provide assistance and answer any questions you might have about the process.</p>
</div>
<div class="signature">
<p>Thank you for using our transcription service!</p>
<p>A.P.Strom</p>
</div>
</div>
</body>
</html>