讓不同 Discord 伺服器留在自己的語音頻道裡聊天
Discord Voice Relay Bot 是一個自架式的跨伺服器語音橋接 Bot。
它解決的問題很直接:當兩個 Discord 社群想一起語音聊天時,通常需要其中一邊離開原本的伺服器,加入另一個共同頻道。這個專案嘗試讓雙方都留在自己熟悉的伺服器與語音頻道,再由同一個 Bot 在中間轉送聲音。
使用者不需要開啟另一個網站。只要在 Discord 裡建立一組短效配對碼,另一個伺服器便能加入橋接。
使用方式
基本流程只有幾個步驟:
- Server A 的使用者加入語音頻道,執行
/bridge create。 - Bot 回傳一組有效十分鐘的配對碼。
- Server B 的使用者在自己的語音頻道執行
/bridge join <code>。 - 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 社群留在自己的語音頻道裡對話」做成一條可以執行、測試並繼續擴充的技術路徑。