A simple and elegant web application for audio transcription using Whisper AI. Record audio directly from your microphone or upload WAV files to get instant transcriptions.
- ποΈ Audio Recording: Record audio directly from your browser
- π File Upload: Upload existing WAV files
- π Language Selection: Choose the audio language for better transcription accuracy
- β¨ AI Transcription: Powered by OpenAI-compatible Whisper API
- π AI Summarization: Get concise summaries of transcribed text using LLM
- π¨ Modern UI: Clean, responsive design with great UX
- π³ Container-Ready: Easy deployment with Podman/Docker
- Backend: Go server (standard library only, ~300 lines)
- Serves static files
- Acts as a gateway to the transcription API
- Acts as a gateway to the LLM API for summarization
- Frontend: Pure JavaScript with PatternFly UI
- Red Hat PatternFly design system for professional UI
- Audio recording with MediaRecorder API
- WAV file conversion and upload
- Real-time transcription display
- AI-powered summarization
- Podman or Docker
- An OpenAI-compatible Whisper API endpoint (e.g., faster-whisper, whisper.cpp)
- An OpenAI-compatible LLM API endpoint (e.g., vLLM, Ollama, OpenAI API)
export AUDIO_INFERENCE_URL=http://your-whisper-server:8000
export AUDIO_MODEL_NAME=whisper-1 # Optional, defaults to whisper-1
export LLM_INFERENCE_URL=http://your-llm-server:8000
export LLM_MODEL_NAME=gpt-3.5-turbo # Optional, defaults to gpt-3.5-turbomake buildmake runThe application will be available at http://localhost:8080
| Command | Description |
|---|---|
make build |
Build the container image |
make run |
Run the application |
make stop |
Stop and remove the container |
make clean |
Stop container and remove image |
make logs |
Show application logs |
make restart |
Restart the application |
make help |
Show available commands |
-
AUDIO_INFERENCE_URL (required): URL of the OpenAI-compatible Whisper API server
- Example:
http://localhost:8000 - The server expects the API to be available at
/v1/audio/transcriptions
- Example:
-
AUDIO_MODEL_NAME (optional): Model name to use for transcription
- Default:
whisper-1 - Example:
whisper-large-v3,whisper-medium, etc.
- Default:
-
LLM_INFERENCE_URL (required): URL of the OpenAI-compatible LLM API server
- Example:
http://localhost:8001 - The server expects the API to be available at
/v1/chat/completions
- Example:
-
LLM_MODEL_NAME (optional): LLM model name to use for summarization
- Default:
gpt-3.5-turbo - Example:
gpt-4,llama3,mistral, etc.
- Default:
-
PORT (optional): Port for the application (default: 8080)
- Click "Start Recording" to begin capturing audio
- Click "Stop Recording" when finished
- Review the recording using the playback controls
- Optionally select the audio language from the dropdown (or leave as "Auto-detect")
- Click "Transcribe Audio" to get the transcription
- Click "Choose WAV File"
- Select a WAV file from your computer
- Optionally select the audio language from the dropdown (or leave as "Auto-detect")
- Click "Transcribe Audio" to get the transcription
The language dropdown serves as an optional hint to improve transcription accuracy:
- Auto-detect (default): Whisper automatically detects and transcribes in the original language
- Specific language: Provide a hint about the audio's spoken language for better accuracy
Important:
- This parameter does NOT translate the audio
- The transcription will always be in the same language as the audio
- Whisper can only translate TO English (not implemented in this app)
- The language hint simply helps Whisper recognize the correct language faster and more accurately
- The transcription appears in a text box (plain text format)
- Click "Summarize" to generate an AI summary of the transcription
- The summary displays with rich Markdown formatting:
- Bold text, italic text
- Headers and subheaders
- Bullet lists and numbered lists
- Inline code formatting
- Click "Copy to Clipboard" to copy the transcription text
- Click "Copy Summary" to copy the summary text (plain text)
- Click "New Transcription" to start over
The Go server exposes the following endpoints:
GET /- Main application pageGET /static/*- Static files (CSS, JS)POST /transcribe- Transcription endpoint (proxy to Whisper API)POST /summarize- Summarization endpoint (proxy to LLM API)
transcript-app/
βββ Dockerfile # Multi-stage Docker build with Red Hat UBI9
βββ Makefile # Build and run commands
βββ README.md # This file
βββ prompt.md # Application specification
βββ server.go # Go backend server
βββ static/
βββ index.html # Web interface
βββ style.css # Styling
βββ app.js # Frontend logic
If you want to run the Go server locally without containers:
# Install Go 1.23+
# Set environment variables
export AUDIO_INFERENCE_URL=http://localhost:8000
export AUDIO_MODEL_NAME=whisper-1 # Optional
export LLM_INFERENCE_URL=http://localhost:8001
export LLM_MODEL_NAME=gpt-3.5-turbo # Optional
# Run the server
go run server.goYou can use various Whisper API implementations:
- faster-whisper: High-performance implementation
- whisper.cpp: C++ implementation with HTTP server
- OpenAI Whisper API: Official OpenAI API
Make sure your API is compatible with the OpenAI transcription endpoint format:
POST /v1/audio/transcriptions
Content-Type: multipart/form-data
file: <audio.wav>
model: whisper-1You can use various LLM API implementations:
- vLLM: High-performance LLM serving
- Ollama: Local LLM with OpenAI-compatible API
- LM Studio: Local LLM with API server
- OpenAI API: Official OpenAI API
Make sure your API is compatible with the OpenAI chat completions endpoint format:
POST /v1/chat/completions
Content-Type: application/json
{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "system", "content": "You are a helpful assistant..."},
{"role": "user", "content": "Summarize this text..."}
]
}- Uses only Go standard library
- Handles multipart form uploads
- Proxies requests to Whisper API
- Serves static files efficiently
- Pure vanilla JavaScript (no dependencies)
- MediaRecorder API for audio capture
- WAV encoding for browser compatibility
- Modern async/await patterns
- Multi-stage build with Red Hat UBI9 images
- Build stage:
registry.access.redhat.com/ubi9/go-toolset:1.23 - Runtime stage:
registry.access.redhat.com/ubi9/ubi-minimal:latest
- Build stage:
- Handles UBI9 non-root user permissions correctly (UID 1001)
- Go 1.23 toolset for building
- Minimal runtime image for production
- No local Go development required
- Chrome/Edge: β Full support
- Firefox: β Full support
- Safari: β Full support (may need HTTPS for microphone)
Note: Microphone access requires HTTPS in production environments.
Make sure to set the required environment variables before running:
export AUDIO_INFERENCE_URL=http://your-whisper-server:8000
export LLM_INFERENCE_URL=http://your-llm-server:8001
make run- Check browser permissions for microphone access
- Ensure you're using HTTPS (required by most browsers)
- Try a different browser
- Verify the Whisper API is running and accessible
- Check the API endpoint format is correct
- Review logs with
make logs
- Verify the LLM API is running and accessible
- Check that the LLM API endpoint supports the OpenAI chat completions format
- Ensure the LLM_URL is correctly set
- Review logs with
make logs
- Ensure the file is in WAV format
- Check file size (limit: 500MB)
- Verify the API server is responding
MIT License - Feel free to use and modify as needed.
This is a simple application built with standard libraries only. Feel free to fork and customize for your needs!