讓不同 Discord 伺服器留在自己的語音頻道裡聊天

Discord Voice Relay Bot 是一個自架式的跨伺服器語音橋接 Bot。

它解決的問題很直接:當兩個 Discord 社群想一起語音聊天時,通常需要其中一邊離開原本的伺服器,加入另一個共同頻道。這個專案嘗試讓雙方都留在自己熟悉的伺服器與語音頻道,再由同一個 Bot 在中間轉送聲音。

使用者不需要開啟另一個網站。只要在 Discord 裡建立一組短效配對碼,另一個伺服器便能加入橋接。

使用方式

基本流程只有幾個步驟:

  1. Server A 的使用者加入語音頻道,執行 /bridge create
  2. Bot 回傳一組有效十分鐘的配對碼。
  3. Server B 的使用者在自己的語音頻道執行 /bridge join <code>
  4. Bot 加入兩邊的語音頻道,開始雙向轉送聲音。

使用者也可以透過 /bridge status 查看連線狀態,或用 /bridge leave 結束橋接。當頻道內已經沒有非 Bot 使用者時,系統會自動停止或調整連線,避免 Bot 持續佔用語音頻道。

除了預設的兩端點模式,專案也包含一個預設關閉的實驗性群組模式。啟用後,第三個 Discord 伺服器可以使用同一組尚未過期的配對碼加入橋接。

我實作的重點

這個專案最核心的工作是處理 Discord 語音,而不只是斜線指令。

Bot 必須同時維持多個 voice connection,接收每個頻道的 Opus 音訊,混合多位發言者,再把結果送到其他端點。它也需要避免把 Bot 自己播放的聲音重新送回橋接,並處理使用者離開、Bot 被移動或語音連線中斷等情況。

目前已實作的功能包括:

  • 不同 Discord 伺服器之間的雙向語音轉送
  • 短效配對碼與 Discord 原生斜線指令
  • 同一方向多位發言者的音訊混合
  • 多組互不相關的 bridge 同時運行
  • 空頻道自動清理
  • 基本的斷線、移動與 rejoin 處理
  • 可選的伺服器、語音頻道、使用者與角色 allowlist
  • 實驗性的三端點群組橋接
  • JSON 格式的生命週期與錯誤日誌

為什麼採用模組化架構

我沒有把所有功能都寫進一個大型 Bot 檔案,而是使用 npm workspaces 將責任拆開:

  • bridge-core 管理 bridge 的生命週期與音訊路由。
  • discord-adapter 處理 Discord 指令、語音連線與音訊收發。
  • config-provider-local 載入本機設定與權限規則。
  • state-store-local 保存 bridge 狀態與配對碼。
  • self-hosted-bot 負責組合這些模組並啟動服務。

這樣的拆分讓音訊核心不需要知道設定來自 .env、JSON 或其他儲存系統。未來若要更換資料庫、權限模型或部署方式,不必重新實作整條語音橋接流程。

專案使用 Node.js、discord.js@discordjs/voice。音訊會被解碼成 PCM、進行混音,再重新編碼為 Opus 傳送到其他 Discord 語音頻道。

自架,而不是託管平台

Discord Voice Relay Bot 的定位是讓使用者自行部署。Repo 提供 Dockerfile 與 Docker Compose 設定,執行時的 bridge state 和配對碼則保存在本機 JSON 檔案中。

本機管理者可以限制哪些 Discord 伺服器、語音頻道、使用者或角色能操作 bridge。配對碼與詳細錯誤預設使用 ephemeral response,避免把連線資訊留在公開文字頻道。

專案目前採用 MIT License,讓其他開發者可以使用、修改與整合程式碼。專案名稱、Logo、網域與其他品牌資產則不因程式碼授權而自動開放使用。

目前進度

目前的程式碼已形成可執行的 self-hosted MVP。

截至 2026 年 7 月 13 日,Repo 的 JavaScript 語法檢查、17 個自動化測試及 Docker Compose 設定驗證皆通過。測試涵蓋一般配對碼、實驗性群組配對、過期與重複加入,以及 bridge topology 和本機 state store。

不過,這個專案仍在開發中。Repo 目前沒有公開產品網址或正式 release tag,也沒有可以引用的延遲、CPU 使用量或長時間穩定性數據。Discord voice gateway 與實際音訊品質仍需要透過真實伺服器進一步驗證。

目前尚未提供的功能包括 Dashboard、公開伺服器探索、錄音、轉錄、Stage Channel,以及同一 Discord 伺服器內的跨頻道橋接。

這個專案現階段最重要的成果,是把「讓不同 Discord 社群留在自己的語音頻道裡對話」做成一條可以執行、測試並繼續擴充的技術路徑。