Discord Voice Transcript is a self-hosted Discord voice recorder with DAVE receive, per-speaker audio tracks, and optional speech-to-text. It is built on Craig and works without a Whisper server, web UI, proxy, Python, or Node.js on the host when run with Docker.
- DAVE / MLS voice receive for regular Discord voice channels.
- One recording track per speaker.
- Docker-first installation with PostgreSQL and Redis included.
- Optional OpenAI-compatible STT, web apps, and HTTP proxy.
- Privacy controls for recording, speaker identity, and transcription.
Docker is the primary path. The host only needs Docker and Docker Compose.
git clone https://github.com/meanwebuser/discord-voice-transcript.git && \
cd discord-voice-transcript/craig-selfhost && \
cp -n install.config.example install.config && \
DISCORD_BOT_TOKEN='paste-token-here' DISCORD_APP_ID='paste-app-id-here' \
docker compose up -d --buildThis starts the Craig recorder, PostgreSQL, and Redis. Follow the bot log:
docker compose logs -f craigFor a safer setup, put DISCORD_BOT_TOKEN and DISCORD_APP_ID in a local
.env file instead of putting them in shell history.
This is the second and only other installation path. The installer handles Node.js, PostgreSQL, Redis, ffmpeg, build tools, and Craig configuration.
git clone https://github.com/meanwebuser/discord-voice-transcript.git
cd discord-voice-transcript/craig-selfhost
cp install.config.example install.config
$EDITOR install.config
./install.shOnly DISCORD_BOT_TOKEN and DISCORD_APP_ID are required for the recorder.
The script needs Linux and sudo. It creates the services and starts Craig.
The recorder is usable before any of these are installed.
| Feature | Enable with | What it adds |
|---|---|---|
| Speech-to-text | CRAIG_TRANSCRIBE_ENABLED=1 and WHISPER_BASE_URL=... |
Per-speaker transcripts |
| Craig web apps | CRAIG_ENABLE_WEB=1 |
Dashboard, downloads, cleanup tasks |
| Craig web recording | CRAIG_WEBAPP_ENABLED=1 |
Browser-based recording client |
| Discord proxy | DISCORD_PROXY_URL=http://proxy:3128 |
Proxy for Discord gateway, REST, and voice |
Craig sends audio to any OpenAI-compatible endpoint:
CRAIG_TRANSCRIBE_ENABLED=1
WHISPER_BASE_URL=http://stt-host:8000/v1
WHISPER_MODEL=whisper-1
WHISPER_LANGUAGE=ruWithout both required values, the /privacy transcription button is disabled
and recording continues normally. See docs/STT.md for the
endpoint contract and the Faster-Whisper recommendation.
The project instance can be used directly from Discord. A server admin can invite the hosted bot and use the recorder without opening a dashboard:
- Invite the bot and approve the requested permissions.
- Join a voice channel and run
/join. - Run
/stopwhen finished; use/recordingsto retrieve recent links.
The bot requires Manage Server for recording controls. Voice recordings and
optional transcripts are handled by the hosted instance; the web panel is not
part of this flow.
- Create a Discord application and bot.
- Put the bot token and application ID in
install.configor the container environment. - Invite the bot with
botandapplications.commandsscopes. - Use
/jointo start recording and/stopto finish. - Use
/privacyto control recording, identity, and transcription consent.
If web apps are disabled, recordings are still written to the configured Craig recordings volume. If STT is disabled, no audio is sent to an external server.
This is a sanitized two-speaker excerpt from a real Craig recording. Speaker identity, Discord IDs, and access keys are redacted; the JSON shape is the actual per-recording output used by the bot.
[01:31] Speaker 1: Пишутся моды интересные.
[01:34] Speaker 1: для майнкрафта.
[01:37] Speaker 1: скрипта загружается. Нет моды, которая не...
[01:40] Speaker 1: публические, а такие, которые...
[01:43] Speaker 1: Страшные они же не в кубическом.
See the anonymized two-speaker JSON example.
Discord DAVE audio is received by Craig, split into per-speaker tracks, and stored locally. An STT server is only the optional last step.
| Stack | Result from this project’s tests |
|---|---|
| Craig + Dysnomia | Full DAVE receive and per-speaker tracks |
discord.py + voice receive |
Partial audio on DAVE channels |
discord.js + davey |
Handshake, but no usable receive audio |
| DPP / JDA attempts | Handshake completed, receive was unusable |
Craig is the recorder core, not a hosted transcription service. This project adds the small self-hosted layer around it: optional STT, proxy support, and a simple Docker deployment.
No. Whisper is optional. Craig records DAVE voice and writes speaker tracks without an STT server.
No. Docker contains the Craig runtime and its dependencies. The native Linux installer is the only path that installs Node.js and system packages directly.
Yes. The project uses Craig’s Dysnomia-based receive path, which is the tested working path in this repository for DAVE-encrypted voice.
Recording voice may require participant consent. Use /privacy, announce
recording clearly, and set retention policies before running a public bot.
The Craig component is distributed under the MIT license.
See docs/DAVE-RESEARCH.md for compatibility notes.
