前提・実現したいこと
discord.js(v13)を使用して音声録音botを作成しています。
具体的には以下のようなものです。
- ボイスチャンネルにメンバーが参加(1人以上)
- botがボイスチャンネルの人数を検知し参加
- ボイスチャンネルにメンバーが参加(2人以上)
- botが自動で録音を開始
- ボイスチャンネルのメンバーが退出(1人)
- botが自動退出
以下のコード
https://github.com/discordjs/voice/tree/main/examples/recorder
を参考にして1~6のように動作するbotを作成できました。
発生している問題
4の録音の動作で問題が発生しています。
現状、録音された音声が特定のユーザのもので一つのファイルとして保存されてしまうのですが、
私としては、ユーザごとではなくボイスチャンネルごとの音声(複数人の発言)を一つのファイルとして保存したいと考えています。
音声の受け取りでuseridを指定しているためそのuseridに該当するユーザのみの音声を拾って保存しているのだと思います。
以下が、該当箇所のソースコードとなります。
createListeningStream関数の引数の説明
receiver : getVoiceConnection('ボイスチャンネルid').receiver
userId : ユーザID
recordable : new Set
user : ユーザ名
import { EndBehaviorType, VoiceConnection, VoiceReceiver } from '@discordjs/voice' import { User, Client, Intents } from 'discord.js' import { createWriteStream } from 'fs' import { opus } from 'prism-media' import { pipeline } from 'stream' function getDisplayName (userId: string, user?: User) { return user ? `${user.username}_${user.discriminator}` : userId } export async function createListeningStream (receiver: VoiceReceiver, userId: string, recordable: Set<string>, user?: User) { if (!recordable.has('recorded')) { // =======================ここから========================== receiver.subscribe(userId) const opusStream = receiver.subscribe(userId, { end: { behavior: EndBehaviorType.Manual } }) // =======================ここまで========================== const oggStream = new opus.OggLogicalBitstream({ opusHead: new opus.OpusHead({ channelCount: 2, sampleRate: 48000 }), pageSizeControl: { maxPackets: 10 } }) const filename = `./recordings/${Date.now()}-${getDisplayName(userId, user)}.ogg` const out = createWriteStream(filename) console.log(`???? Started recording ${filename}`) await pipeline(opusStream, oggStream, out, (err) => { if (err) { console.warn(`❌ Error recording file ${filename} - ${err.message}`) } else { console.log(`✅ Recorded ${filename}`) } }) } recordable?.add('recorded') }
discord.jsのdocumentやdiscordjs/voiceのdocument、Qiitaなどを確認して見たのですが、
録音は特定のユーザに対してのみのものがほとんどでした。
どのようにボイスチャンネル全体の録音をするのか実装のヒントを教えていただけないでしょうか。
ソースコード
https://github.com/takumi-pro/discord_recorder
補足情報(FW/ツールのバージョンなど)
@discordjs/voice : 0.6.0
discord.js : 13.1.0
typescript : 4.4.4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/05 10:18