Skip to content

Repository files navigation

Discord Voice Transcript: DAVE voice recording, Craig speaker tracks, and optional Whisper transcription

Discord Voice Transcript, self-hosted Discord voice recorder

CI License DAVE Add to Discord

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.

What you get

  • 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.

Install with Docker

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 --build

This starts the Craig recorder, PostgreSQL, and Redis. Follow the bot log:

docker compose logs -f craig

For a safer setup, put DISCORD_BOT_TOKEN and DISCORD_APP_ID in a local .env file instead of putting them in shell history.

Install natively on Linux

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.sh

Only 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.

Optional features

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

Self-hosted Discord voice transcription

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=ru

Without 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.

Use it in Discord

Hosted bot, no web panel

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:

  1. Invite the bot and approve the requested permissions.
  2. Join a voice channel and run /join.
  3. Run /stop when finished; use /recordings to 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.

Run your own instance

  1. Create a Discord application and bot.
  2. Put the bot token and application ID in install.config or the container environment.
  3. Invite the bot with bot and applications.commands scopes.
  4. Use /join to start recording and /stop to finish.
  5. Use /privacy to 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.

Example transcript

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.

Two-speaker Discord transcript example

[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.

How it works

Discord DAVE audio is received by Craig, split into per-speaker tracks, and stored locally. An STT server is only the optional last step.

Why Craig

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.

FAQ

Does it need Whisper to record?

No. Whisper is optional. Craig records DAVE voice and writes speaker tracks without an STT server.

Does Docker need Node.js or Python on the host?

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.

Does it support ordinary Discord voice channels with DAVE?

Yes. The project uses Craig’s Dysnomia-based receive path, which is the tested working path in this repository for DAVE-encrypted voice.

Privacy and license

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.

Releases

Packages

Contributors

Languages