【要約】discord.pyでボイスチャンネルの参加者を個別トラック録音するBotを作った [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
収録者が、複数人でのポッドキャスト収録時に、音声が1つのトラックに混ざる問題に直面した。これにより、個別の編集やノイズ除去が困難な状況となっていた。
- ・全員の声が1つのトラックに混ざり、編集の自由度が低い。
- ・特定メンバーのノイズが、全体の音声品質を低下させる。
- ・標準の
discord.pyには、個別音声受信APIがない。 - ・Opusデコードエラーによる、スレッド停止のリスクがある。
// Approach
開発者は、拡張ライブラリを用いて、ユーザーごとの音声データを分離・管理する仕組みを構築した。これにより、参加者が増えても自動で新しいトラックを追加できる構成を実現した。
- ・
discord-ext-voice-recvを使い、VoiceRecvClientで接続する。 - ・
PerUserSinkを実装し、user.idをキーにPCMデータを蓄積する。 - ・
waveモジュールを用いて、生のPCMデータをWAV形式へ変換する。 - ・
PacketRouterにモンキーパッチを適用し、エラーによるクラッシュを回避する。 - ・
aioboto3を使い、録音終了時にデータを Cloudflare R2 へ転送する。
// Result
開発者は、参加者が増えても自動でトラックを追加できる、実用的な録音Botを実現した。これにより、音声収録から編集、書き出しまでの一連のワークフローが効率化された。
- ・個別トラックの取得により、BGM挿入や文字起こし等の後処理が容易になった。
- ・
PodVoiceというサービスへ組み込まれ、ブラウザ編集画面との連携を実現した。 - ・
defer()の活用により、VC接続時のタイムアウト問題を解決した。 - ・メモリ管理とエラー回避策を講じ、安定した録音環境を構築した。
Senior Engineer Insight
> 技術責任者の視点で見ると、本実装は実運用を見据えた、極めて実践的なアプローチである。特に、ライブラリの脆弱性をモンキーパッチで回避する判断は、現場の知見を感じさせる。また、メモリ枯渇を防ぐためのR2へのオフロード戦略も評価できる。ただし、大規模な同時接続環境では、メモリ消費量とネットワークI/Oがボトルネックとなる。スケーラビリティ確保のためには、バッファリングをディスクやストリーミングへ移行すべきだ。