AbsoluteJS

@absolutejs/meeting-discord

@absolutejs/meeting-discordv0.0.1-beta.17betaVoice & Media

Discord voice source adapter for @absolutejs/meeting — a bot joins a Discord voice channel and streams per-participant audio (speakers known, no diarization needed) into the meeting core for live transcription + analysis

#Installation

BASH
bun add @absolutejs/meeting-discord

#Capabilities

Overview

The hosted AbsoluteJS.ai platform uses createDiscordMeetingSourceFactory to bind the bot and guild configuration once. Each governed Meeting session supplies its voice channel id dynamically, so installation never logs in or joins a channel.

Discord voice source adapter for @absolutejs/meeting. A bot joins a Discord voice channel and streams each participant's audio into the meeting core, so the @absolutejs/voice scribe can transcribe the conversation live.

Discord gives one audio stream per user, so speakers are known exactly — each transcript turn is labelled with the real Discord user, no diarization needed.

How it works

@discordjs/voice exposes a per-user Opus stream for everyone speaking. This adapter subscribes to each, decodes Opus → PCM (48 kHz stereo) and downmixes to mono pcm_s16le, and emits it as audio tagged with the Discord user id.

Usage

Pass a pre-built, logged-in client instead of token to share one Discord client across features.

API

createDiscordMeetingSource(options) → MeetingSource.

start() logs in (if given a token), joins the voice channel, and

subscribes to each speaker.

Show 3 more

stop() leaves the channel + destroys the client it created.

DISCORD_AUDIO_FORMAT — the mono 48 kHz pcm_s16le format it emits.

stereoToMono(buf) — the downmix helper (exported for reuse/testing).

Outcomes

What you can build

Build on the supported package contract

Use @absolutejs/meeting-discord through its supported public entry points.

Hardening checklist

Production guidance

Make every external boundary explicitPin the deployed @absolutejs/meeting-discord version, replace example or memory-backed dependencies with durable implementations, bound external calls, protect credentials, and emit enough evidence to retry or recover safely.

Follow in order

Troubleshooting path

1
Trace from the first failed boundary
Reproduce the smallest canonical @absolutejs/meeting-discord example, confirm the supported entry point and version in the API explorer, then inspect the first boundary that did not produce its documented result.

#Usage

Partial snippet

Working example for Usage.

TS
import { createMeeting } from "@absolutejs/meeting";
import { createDiscordMeetingSource } from "@absolutejs/meeting-discord";
import { deepgram } from "@absolutejs/voice-deepgram";

const source = createDiscordMeetingSource({
  token: process.env.DISCORD_BOT_TOKEN!,
  guildId: "123…", // server id
  channelId: "456…", // voice channel id
});

const meeting = await createMeeting({
  source,
  stt: deepgram({ apiKey: process.env.DEEPGRAM_API_KEY! }),
  sessionId: crypto.randomUUID(),
});
meeting.on("turn", (turn) => console.log(turn.participant?.name, turn.text));

await meeting.start(); // bot joins the channel + starts listening
// …
await meeting.stop(); // bot leaves

#How it works

Partial snippet

@discordjs/voice exposes a per-user Opus stream for everyone speaking. This adapter subscribes to each, decodes Opus → PCM (48 kHz stereo) and downmixes to mono pcm_s16le, and emits it as audio tagged with the Discord user id.

TXT
Discord voice channel ──(per-user Opus)──▶ adapter (decode + downmix) ──▶ @absolutejs/meeting ──▶ scribe ──▶ per-speaker turns

#Public entry points

Supported entry points declared by this package manifest.

Package entry point declared in package.json.

@absolutejs/meeting-discord@absolutejs/meeting-discord/compile@absolutejs/meeting-discord/manifest@absolutejs/meeting-discord/manifest.json

#Package commands

Scripts declared by this package manifest.

bun run buildrm -rf dist && bun build ./src/index.ts ./src/compile.ts ./src/manifest.ts --outdir dist --root src --target bun --external @absolutejs/manifest --external '@absolutejs/manifest/*' --external @absolutejs/meeting --external '@absolutejs/meeting/*' --external @absolutejs/voice --external '@absolutejs/voice/*' --external @discordjs/voice --external '@discordjs/voice/*' --external @sinclair/typebox --external '@sinclair/typebox/*' --external discord.js --external 'discord.js/*' --external prism-media --external 'prism-media/*' --external '@snazzah/*' && tsc --emitDeclarationOnly --project tsconfig.json && absolute-manifest emit
bun run check:packagebun run format && bun run typecheck && bun run test && bun run verify-package && bun run build && bun run verify-package --artifacts
bun run formatprettier --write "./**/*.{js,ts,json,md}"
bun run testbun test
bun run typecheckbun run tsc --noEmit

#API reference

Search the declarations exported by the current package type files. Expand a symbol to inspect its source-backed signature.

6 symbols
createDiscordMeetingSourceexportPermalinkSource
TS
createDiscordMeetingSource
Exported from @absolutejs/meeting-discord