前提・実現したいこと
discord.pyで単語登録機能などを備えた簡易的な読み上げBotを作成しています
単語登録機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
<discord.voice_client.VoiceClient object at 0x0000021E9C457130> #message.content:discord Ignoring exception in on_message Traceback (most recent call last): File "C:\Users\oboro\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\client.py", line 333, in _run_event await coro(*args, **kwargs) File "C:\open_jtalk\bin\read_bot.py", line 65, in on_message creat_WAV(message.content) File "C:\open_jtalk\bin\voice_generator.py", line 85, in creat_WAV inputText = user_custam(inputText) # ユーザ登録した文字を読み替える File "C:\open_jtalk\bin\voice_generator.py", line 60, in user_custam text = text.replace(pattern[0], pattern[1]) IndexError: list index out of range
該当のソースコード
Python
1import discord 2from discord.ext import commands 3import asyncio 4import os 5import subprocess 6import ffmpeg 7from voice_generator import creat_WAV 8 9client = commands.Bot(command_prefix='.!') 10voice_client = None 11 12 13@client.event 14async def on_ready(): 15 print('Logged in as') 16 print(client.user.name) 17 print(client.user.id) 18 print('------') 19 20 21@client.command() 22async def join(ctx): 23 print('#join') 24 print('#voicechannelを取得') 25 vc = ctx.author.voice.channel 26 print('#voicechannelに接続') 27 await vc.connect() 28 29@client.command() 30async def end(ctx): 31 print('#end') 32 print('#切断') 33 await ctx.voice_client.disconnect() 34 35@client.command() 36async def ad(ctx, arg1, arg2): 37 with open('C:/open_jtalk/bin/dic.txt', mode='a') as f: 38 f.write('\n'+ arg1 + ',' + arg2) 39 print('dic.txtに書き込み:''\n'+ arg1 + ',' + arg2) 40 await ctx.send('`' + arg1+'` を `'+arg2+'` として登録しました') 41 42@client.event 43async def on_voice_state_update(member, before, after): 44 server_id_test = "サーバーID" 45 text_id_test = "通知させたいテキストチャンネルID" 46 47 48 if member.guild.id == server_id_test: # サーバーid 49 text_ch = client.get_channel(text_id_test) # 通知させたいTEXTチャンネルid 50 if before.channel is None: 51 msg = f'【VC参加ログ】{member.name} が {after.channel.name} に参加しました。' 52 await text_ch.send(msg) 53 54@client.event 55async def on_message(message): 56 print('---on_message_start---') 57 msgclient = message.guild.voice_client 58 print(msgclient) 59 if message.content.startswith('.'): 60 pass 61 62 else: 63 if message.guild.voice_client: 64 print('#message.content:'+ message.content) 65 creat_WAV(message.content) 66 source = discord.FFmpegPCMAudio("output.wav") 67 message.guild.voice_client.play(source) 68 else: 69 pass 70 await client.process_commands(message) 71 print('---on_message_end---') 72 73 74client.run("discordtoken")
voice_generatorのコード
import subprocess import re # ************************************************ # remove_custom_emoji # 絵文字IDは読み上げない # ************************************************ def remove_custom_emoji(text): #pattern = r'<:[a-zA-Z0-9_]+:[0-9]+>' # カスタム絵文字のパターン pattern = r'<:' # カスタム絵文字のパターン text = re.sub(pattern,'',text) # 置換処理 pattern = r':[0-9]+>' # カスタム絵文字のパターン return re.sub(pattern,'',text) # 置換処理 # ************************************************ # url_shouryaku # URLなら省略 # ************************************************ def url_shouryaku(text): pattern = "https?://[\w/:%#$&?()~.=+\-]+" return re.sub(pattern,'URLは省略するのデス!',text) # 置換処理 # ************************************************ # remove_picture # 画像ファイルなら読み上げない # ************************************************ def remove_picture(text): pattern = r'.*(.jpg|.jpeg|.gif|.png|.bmp)' return re.sub(pattern,'',text) # 置換処理 # ************************************************ # remove_command # コマンドは読み上げない # ************************************************ def remove_command(text): pattern = r'^\!.*' return re.sub(pattern,'',text) # 置換処理 # ************************************************ # remove_log # 参加ログは読み上げない # ************************************************ def remove_log(text): pattern = r'(\【VC参加ログ\】.*)' return re.sub(pattern,'',text) # 置換処理 # ************************************************ # user_custam # ユーザ登録した文字を読み替える # ************************************************ def user_custam(text): f = open('C:/open_jtalk/bin/dic.txt', 'r') line = f.readline() while line: pattern = line.strip().split(',') if pattern[0] in text: text = text.replace(pattern[0], pattern[1]) print('置換後のtext:'+text) break else: line = f.readline() f.close() return text # ************************************************ # creat_WAV # message.contentをテキストファイルと音声ファイルに書き込む # 引数:inputText # 書き込みファイル:input.txt、output.wav # ************************************************ def creat_WAV(inputText): # message.contentをテキストファイルに書き込み inputText = remove_custom_emoji(inputText) # 絵文字IDは読み上げない inputText = remove_command(inputText) # コマンドは読み上げない inputText = url_shouryaku(inputText) # URLなら省略 inputText = remove_picture(inputText) # 画像なら読み上げない inputText = remove_log(inputText) # 参加ログなら読み上げない inputText = user_custam(inputText) # ユーザ登録した文字を読み替える input_file = 'input.txt' with open(input_file,'w',encoding='shift_jis') as file: file.write(inputText) command = 'C:/open_jtalk/bin/open_jtalk -x {x} -m {m} -r {r} -ow {ow} {input_file}' #辞書のPath x = 'C:/open_jtalk/bin/dic' #ボイスファイルのPath #m = 'C:/open_jtalk/bin/nitech_jp_atr503_m001.htsvoice' #m = 'C:/open_jtalk/bin/mei/mei_sad.htsvoice' #m = 'C:/open_jtalk/bin/mei/mei_angry.htsvoice' m = 'C:/open_jtalk/bin/mei/mei_bashful.htsvoice' #m = 'C:/open_jtalk/bin/mei/mei_happy.htsvoice' #m = 'C:/open_jtalk/bin/mei/mei_normal.htsvoice' #発声のスピード #r = '2.0' r = '1.2' #出力ファイル名 and Path ow = 'output.wav' args= {'x':x, 'm':m, 'r':r, 'ow':ow, 'input_file':input_file} cmd= command.format(**args) print(cmd) subprocess.run(cmd) return True if __name__ == '__main__': creat_WAV('テスト')
補足情報(FW/ツールのバージョンなど)
PythonバージョンはPython 3.9.0です
Open JTalkで読み上げさせています。
また、辞書登録をせずに辞書登録先テキストファイルを削除すれば
読み上げは正常に動作します
改造したと思われるvoice_generator.pyのコードがほしいです。
ご指摘ありがとうございます
追記致しました
回答1件
あなたの回答
tips
プレビュー