AI Transcription¶
AI transcription is available in beta. When enabled, a recording session is automatically transcribed and the result is delivered to a LaSuite Docs instance, where the room owner can read and edit the transcript.
Prerequisite: Transcription requires the Recording feature to be fully set up and working first. Transcription uses the same LiveKit Egress, MinIO, and webhook infrastructure.
Known limitations:
- Participant identification is not implemented. Speakers are labeled generically (e.g.,
SPEAKER_00,SPEAKER_01) - Transcription relies on WhisperX, which does not provide an OpenAI-compatible API
Hard dependency: LaSuite Docs
Transcription output is sent to a LaSuite Docs instance (POST /create-for-owner). Without a running LaSuite Docs service, transcription cannot deliver its results. This is a hard dependency of the current implementation.
How it works¶
sequenceDiagram
participant Backend as Backend API
participant Summary as Summary Service
participant Celery as Celery Worker (transcribe-queue)
participant MinIO as MinIO (Object Storage)
participant STT as WhisperX API
participant Docs as LaSuite Docs
Backend->>Summary: POST /api/v1/tasks/ (bearer token)
Note right of Backend: Payload: owner_id, filename, email, sub, room, recording_date, recording_time
Summary->>Celery: Register task (transcribe-queue)
Celery->>MinIO: Fetch audio file
Celery->>STT: Transcribe audio (WhisperX)
STT-->>Celery: Segmented transcript
Celery->>Celery: Format transcript
Celery->>Docs: POST /create-for-owner (title, content, email, sub, api token)
Docs-->>Celery: Acknowledgement
Docker Compose setup¶
Step 1: Configure the summary service¶
The summary service is the FastAPI application that handles transcription tasks. It is published on Docker Hub as lasuite/meet-summary.
Create its environment file env.d/summary:
# Redis (dedicated instance for the summary service)
REDIS_URL=redis://redis-summary:6379/0
# MinIO/S3 (to download audio recordings)
AWS_S3_ENDPOINT_URL=http://minio:9000
AWS_S3_ACCESS_KEY_ID=minioadmin
AWS_S3_SECRET_ACCESS_KEY=minioadmin123
AWS_STORAGE_BUCKET_NAME=meet-media-storage
AWS_S3_SECURE_ACCESS=False
# Meet backend (to report transcription results)
WEBHOOK_URL=https://meet.example.com/api/v1/tasks/callback/
WEBHOOK_API_TOKEN=internal-api-token
# WhisperX STT API
WHISPERX_BASE_URL=https://your-whisperx-instance.example.com
WHISPERX_ASR_MODEL=large-v3
WHISPERX_API_KEY=your-api-key
You need a running WhisperX instance. An Open Source implementation combining WhisperX and FastAPI is available at github.com/suitenumerique/meet-whisperx.
Step 2: Add to compose.yml¶
redis-summary:
image: redis:7
restart: unless-stopped
networks:
- internal
app-summary:
image: lasuite/meet-summary:latest
restart: unless-stopped
env_file:
- env.d/summary
depends_on:
- redis-summary
networks:
- internal
celery-summary-transcribe:
image: lasuite/meet-summary:latest
restart: unless-stopped
command: celery -A summary.core.celery_worker worker --pool=solo -Q transcribe-queue
env_file:
- env.d/summary
depends_on:
- redis-summary
- minio
networks:
- internal
Step 3: Connect the Meet backend to the summary service¶
Add to your .env:
SUMMARY_SERVICE_ENDPOINT=http://app-summary:8000/api/v1/tasks/
SUMMARY_SERVICE_API_TOKEN=internal-api-token
Restart the backend:
Step 4: Configure the WhisperX STT backend¶
The summary service connects to a WhisperX API for speech-to-text. Point it to your WhisperX instance in env.d/summary:
WHISPERX_BASE_URL=https://your-whisperx-instance.example.com
WHISPERX_ASR_MODEL=large-v3
WHISPERX_API_KEY=your-api-key
For production, a GPU-enabled WhisperX instance is strongly recommended. Transcription on CPU is very slow for anything beyond short recordings.
Kubernetes setup¶
Transcription in Kubernetes uses the summary service and Celery workers included in the Meet Helm chart. The recording infrastructure (MinIO, Egress, ingressMedia) must be set up first. See Recording: Kubernetes setup.
Step 1: Enable the summary service¶
Add to your values.yaml:
summary:
replicas: 1
envVars:
REDIS_URL: "redis://redis-master:6379/1"
AWS_S3_ENDPOINT_URL: "http://minio:9000"
AWS_S3_ACCESS_KEY_ID: "minioadmin"
AWS_S3_SECRET_ACCESS_KEY: "minioadmin123"
AWS_STORAGE_BUCKET_NAME: "meet-media-storage"
AWS_S3_SECURE_ACCESS: "False"
WEBHOOK_URL: "https://meet.example.com/api/v1/tasks/callback/"
WEBHOOK_API_TOKEN: "internal-api-token"
WHISPERX_BASE_URL: "https://your-whisperx-instance.example.com"
WHISPERX_ASR_MODEL: "large-v3"
WHISPERX_API_KEY: "your-api-key"
You need a running WhisperX instance reachable from within the cluster. For production, a GPU-enabled instance is strongly recommended.
Step 2: Enable the Celery transcribe worker¶
Step 3: Connect the Meet backend to the summary service¶
Add to backend.envVars in your values.yaml:
backend:
envVars:
SUMMARY_SERVICE_ENDPOINT: "http://meet-summary:8000/api/v1/tasks/"
SUMMARY_SERVICE_API_TOKEN: "internal-api-token"
Apply the updated chart:
Full configuration reference¶
| Option | Type | Default | Description |
|---|---|---|---|
app_name |
String | "summary" |
Internal service name used for API routing. Must be "summary" — using any other value causes routing errors. |
app_api_token |
Secret | — | API token for authenticating requests to the summary service |
celery_broker_url |
String | "redis://redis/0" |
Celery broker URL |
celery_result_backend |
String | "redis://redis/0" |
Celery result backend URL |
celery_max_retries |
Integer | 1 |
Maximum retries for Celery tasks |
transcribe_queue |
String | "transcribe-queue" |
Name of the Celery queue for transcription tasks |
aws_storage_bucket_name |
String | — | S3/MinIO bucket name |
aws_s3_endpoint_url |
String | — | S3/MinIO endpoint URL |
aws_s3_access_key_id |
String | — | S3/MinIO access key |
aws_s3_secret_access_key |
Secret | — | S3/MinIO secret key |
aws_s3_secure_access |
Boolean | True |
Use HTTPS for S3/MinIO requests |
whisperx_api_key |
Secret | — | API key for WhisperX |
whisperx_base_url |
String | "https://api.whisperx.com/v1" |
Base URL for the WhisperX API |
whisperx_asr_model |
String | "whisper-1" |
ASR model for transcription |
whisperx_max_retries |
Integer | 0 |
Maximum retries for WhisperX requests |
webhook_url |
String | — | URL the summary service posts results to (the Meet backend) |
webhook_api_token |
Secret | — | Token to authenticate webhook requests |
webhook_max_retries |
Integer | 2 |
Maximum retries for webhook requests |
webhook_status_forcelist |
List[Int] | [502, 503, 504] |
HTTP status codes that trigger webhook retry |
webhook_backoff_factor |
Float | 0.1 |
Exponential backoff factor for webhook retries |
recording_max_duration |
Integer | None |
Max audio duration in milliseconds; longer recordings are ignored |
document_default_title |
String | "Transcription" |
Default title for generated documents |
document_title_template |
String | 'Réunion "{room}" du {room_recording_date} à {room_recording_time}' |
Template for document title |
sentry_is_enabled |
Boolean | False |
Enable Sentry error tracking |
sentry_dsn |
String | None |
Sentry DSN |
Supported audio formats¶
The summary service accepts: .mp4, .webm, .wav, .mp3, .ogg.
LLM summarization (optional, separate feature)¶
Summarization (generating a written summary from the transcript using an LLM) is a separate optional feature, not part of basic transcription. It requires an additional Celery worker and LLM API access. Refer to the upstream summarization documentation for setup details.