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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

133閲覧

discordのbotがvcに接続しているにもかかわらず、discord.errors.ClientException: Not connected to voice.というエラーが出る

yaki_zakana

総合スコア0

Discord

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2023/11/27 14:32

編集2023/11/27 15:52

実現したいこと

discordのテキストチャットにメッセージを送ると、ボイスチャンネルで読み上げる

前提

pythonで、テキストチャットの内容を、voicevoxで音声合成してボイスチャットで読み上げるdiscordのbotを作ろうとしていました。
このエラーが発生したときは、/yjoinをテキストチャットに送信し、botがボイスチャットに参加している状態で、テキストチャットに何か(読み上げてほしい文章)を送信したときです。

発生している問題・エラーメッセージ

Task exception was never retrieved
future: <Task finished coro=<yomiage() done, defined at c:/Users/yuuki/Documents/python_work/discordbottest/var001.py:122> exception=ClientException('Not connected to voice.')>
Traceback (most recent call last):
File "c:/Users/yuuki/Documents/python_work/discordbottest/var001.py", line 143, in yomiage
this_guild.voice_client.play(source)#なんかした音声を再生する
File "C:\Users\yuuki\Documents\python_work\discordbottest\discordbot_kun\lib\site-packages\discord\voice_client.py", line 555, in play
raise ClientException('Not connected to voice.')
discord.errors.ClientException: Not connected to voice.

該当のソースコード

python

1#トークン メモ (discordのトークン) 2 3#下でインポートしているものに加えて、ffmpegとPyNaClをインストールする必要がある 4 5import discord#pip install discord.py 6import asyncio 7import json 8import requests#pip install requests 9import simpleaudio#pip install simpleaudio 10from discord.ext import commands 11 12intents = discord.Intents.all() 13client = discord.Client(intents=intents) 14 15input_sperker_id = 3#これはあとで自由に変えられるようにしたい 16 17#voicevoxの動作に必要な関数を定義する 18def text_2_wav(text, speaker_id=input_sperker_id, max_retry=20, filename='audio.wav'): 19 # 音声合成のための、クエリを作成 20 query_payload = {"text": text, "speaker": speaker_id} 21 for query_i in range(max_retry): 22 response = requests.post("http://localhost:50021/audio_query", 23 params=query_payload, 24 timeout=60) 25 if response.status_code == 200: 26 query_data = response.json() 27 break 28 else: 29 raise ConnectionError('リトライ回数が上限に到達しました。') 30 31 # 音声合成データの作成して、wavファイルに保存 32 synth_payload = {"speaker": speaker_id} 33 for synth_i in range(max_retry): 34 response = requests.post("http://localhost:50021/synthesis", 35 params=synth_payload, 36 data=json.dumps(query_data), 37 timeout=60) 38 if response.status_code == 200: 39 with open(filename, "wb") as fp: 40 fp.write(response.content) 41 break 42 else: 43 raise ConnectionError('リトライ回数が上限に到達しました。') 44 45def play_auido_by_filename(filename: str): 46 # 保存したwavファイルを、再生(つかってない) 47 wav_obj = simpleaudio.WaveObject.from_wave_file(filename) 48 play_obj = wav_obj.play() 49 play_obj.wait_done() 50 51 52#Botの準備ができた時の処理 53@client.event 54async def on_ready(): 55 client.loop.create_task(yomiage()) 56 print("準備完了") 57 58#いろんな変数やらリストの初期化場所 59readlist = []#読むべき内容を集めるリスト 60commandlist = ["/yjoin" , "/yleave"]#botの操作をするコマンドの一覧。 61 62 63#メッセージが送信されたときの処理 64@client.event 65async def on_message(message): 66 #もしBOTだったら無視する 67 if message.author.bot: 68 return 69 70 #yomiage()のために、読み上げるべきサーバーを取得しておく 71 global this_guild 72 this_guild = message.guild 73 print(this_guild) 74 75 #yomiage()のために、bot自身がvcに接続しているかを確認しておく 76 global vcniiru 77 if message.guild.voice_client is None: 78 vcniiru = False 79 else: 80 vcniiru = True 81 82 83 #読み上げる内容を決定するプログラム 84 #送信されたメッセージの情報を取得 85 mescontent = message.content 86 sousinysa = message.author.display_name 87 88 #読み上げる内容を決定 89 read_txt = sousinysa + "、" + mescontent 90 91 #読み上げリストに読み上げるべき内容を追加する 92 if mescontent not in commandlist:#もし送信されたメッセージがコマンドならリストに追加しない(処理を実行しない) 93 readlist.append(read_txt)#送信されたメッセージがコマンドじゃなかったらこれが実行される 94 95 print(readlist) 96 #await message.channel.send(read_txt)#テスト用。完成時は消す 97 98 99 #vc入室操作用 100 if message.content == "/yjoin": 101 #ボイスチャンネル接続コマンド実行者がVCに入ってないと実行を拒否 102 if message.author.voice is None: 103 await message.channel.send("このコマンドを実行した人が、このサーバーのボイスチャンネルに入っている必要があります") 104 return 105 106 # ボイスチャンネルに接続する 107 await message.author.voice.channel.connect() 108 109 await message.channel.send("接続しました。") 110 111#ボイスチャンネルから切断する 112 if message.content =="/yleave": 113 if message.guild.voice_client is None: 114 await message.channel.send("そもそも接続してねぇよ何言ってんだバーカ") 115 return 116 await message.guild.voice_client.disconnect() 117 118 await message.channel.send("切断しました。") 119 120 121#読み上げ用関数 122async def yomiage(): 123 while True: 124 #読み上げリストが空なら何もしない 125 if not readlist: 126 await asyncio.sleep(1) 127 #print("そこには何もなかった")#テスト用 128 129 130 #読み上げリストに何かあったのなら、リストの0番目を読んでリストから削除する 131 else: 132 print("読み上げの時間だ") 133 readcontent = readlist[0] 134 135 if __name__ == '__main__': 136 filename = 'audio.wav' # 音声データのファイル名 137 #play_auido_by_filename(filename) # 合成した音声をpcで再生。テスト用。完成時は消す 138 139 #bot自身がvcに入っている場合は実行する 140 if vcniiru: 141 text_2_wav(readcontent, filename=filename) # 読み上げリストの0番目を音声合成 142 source = discord.FFmpegPCMAudio('audio.wav')#合成した音声をなんかする 143 this_guild.voice_client.play(source)#なんかした音声を再生する 144 del readlist[0] 145 146 #bot自身がvcに参加していないときは、読み上げない 147 else: 148 print("vcに接続されていないと判定されています") 149 del readlist[0] 150 151 152 153#botを起動する 154client.run("discordのtトークン")

試したこと

pip install --upgrade discord.py
bot再起動したりvcに入れなおしたり
/yjoinを複数回したときに、discord.errors.ClientException: Already connected to a voice channel.のエラーメッセージが出ることを確認した

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問