質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ChatGPT

ChatGPTは、OpenAI社の提供するインタラクティブなテキストコミュニケーションを行うことができるAIサービスまたは、そのアルゴリズムのモデル名です。

Q&A

解決済

1回答

1036閲覧

discordjs v14にてボイスチャットの音声を正しく受け取れない

re13

総合スコア1

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ChatGPT

ChatGPTは、OpenAI社の提供するインタラクティブなテキストコミュニケーションを行うことができるAIサービスまたは、そのアルゴリズムのモデル名です。

0グッド

0クリップ

投稿2023/03/29 03:53

実現したいこと

ボイスチャットにBOTを加入させて
他のユーザーの発言を文字起こしし
GPTに投げてその返答を音声化して喋らせたい

前提

環境:glitch
"discord.js": "^14.8.0",
"@discordjs/voice": "^0.15.0",

ボイスチャットの音声を文字起こしする事以外は出来た。
ボイスチャットを受信しPCMをWAVにエンコードした上で再生するとバチッと言う一瞬だけのノイズになってしまい
文字にならない

ボイスチャットにBOTを加入させてこちらの発言で発火する所までは出来たが
その内容が良くない。

該当のソースコード

node.js

1connection.receiver.speaking.on('start', (userId) => { 2 const audio = connection.receiver.subscribe(userId, { 3 end: { 4 behavior: EndBehaviorType.AfterSilence, 5 duration: 1000, 6 }, 7 }); 8 9 const audioChunks = []; 10 11 audio.on('data', (chunk) => { 12 audioChunks.push(chunk); 13 }); 14 15 audio.on('end', async () => { 16 17const audioBuffer = Buffer.concat(audioChunks); 18 console.log('audio ended'); 19console.log(audio) 20const pcmData = audioBuffer; 21// WAV ファイルに変換する 22const wavWriter = new wav.FileWriter('/tmp/output.wav', { 23 channels: 2, 24 sampleRate: 32000, 25 bitDepth: 16 26}); 27 28wavWriter.write(pcmData); 29wavWriter.end(); 30以下その他GPT系の処理等々

疑ってる所

const audioChunks = [];

audio.on('data', (chunk) => {
audioChunks.push(chunk);
});
でそもそもPCMの収集はあってるのか?
この収集があってないからWAVに変換してもバチッと言うノイズだけになってしまっているのではないか?

// WAV ファイルに変換する
const wavWriter = new wav.FileWriter('/tmp/output.wav', {
channels: 2,
sampleRate: 32000,
bitDepth: 16
});
wavへの変換のヘッダのパラメータ等が誤っているのではないか?
以上です。

是非お力を貸していただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2023/03/29 04:57

ちゃんとした回答じゃないのでこっちにぶら下げます。 ストリーム使った方が良いんじゃないですかね? https://scrapbox.io/discordjs-japan/%E9%9F%B3%E5%A3%B0%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B サンプルコードだとPCMで保存してるけど、このメソッドちゃんと調査したらダイレクトにwavで保存できるオプションあるんじゃないかな?しらんけど パイプで繋いだストリーム制御できねーよってなると思うんですけど 最近Promise対応の「stream.finished」が追加された事で、 ここでストリームの完了待ちたいなーってタイミングで「await stream.finished(st);」とやれば止められます。 https://nodejs.org/api/stream.html#streamfinishedstream-options StreamやPromiseの概念わかんねーってなったらChatGPTに質問攻めにすれば良いかと思います。
re13

2023/03/29 05:35

コメントありがとうございます。 そちらの添付して頂いた記事のリンク先が404になっているのでv14では廃止されているのでは?と思います。 また、自分で調べた限りですが基本的にはPCMのみの管理でwavで保存する事は出来ないようです。 var filename = '/tmp/'.concat(Date.now(), '-').concat(userId, '.txt'); var out = fs.createWriteStream(filename); stream.pipeline(audio, out, function (err) { if (err) { console.warn(`❌ Error recording file ${filename} - ${err.message}`); } else { console.log(`✅ Recorded ${filename}`); fs.readFile(filename, 'binary', (err, data) => { if (err) throw err; const audioBuffer = Buffer.from(data, 'binary'); const pcmData = audioBuffer; console.log('audio ended'); console.log(audioBuffer); // WAV ファイルに変換する const wavWriter = new wav.FileWriter('/tmp/output2.wav', { channels: 2, bitDepth: 16, sampleRate: 48000, clearInterval: 250, }); wavWriter.write(pcmData); wavWriter.end(); } ); } }); 一旦この様な形で修正してみましたがいぜん状況は変わらずでした。
guest

回答1

0

自己解決

無事解決したので、クローズします。
解決させた内容は記事にしました。
ただ他に問題も抱えているのでまた質問させていただくかもしれません。
よろしくお願いします。

https://zenn.dev/ss_2013/articles/ab3dfd73513afb

投稿2023/03/31 10:39

re13

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問