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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

3381閲覧

discord.pyでの読み上げBotで辞書登録後にエラーが発生する

退会済みユーザー

退会済みユーザー

総合スコア0

Discord

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

Python 3.x

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

0グッド

0クリップ

投稿2020/12/03 21:04

編集2020/12/03 21:58

前提・実現したいこと

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で読み上げさせています。
また、辞書登録をせずに辞書登録先テキストファイルを削除すれば
読み上げは正常に動作します

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

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

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

sevenc-nanashi

2020/12/03 21:52

改造したと思われるvoice_generator.pyのコードがほしいです。
退会済みユーザー

退会済みユーザー

2020/12/03 21:59

ご指摘ありがとうございます 追記致しました
guest

回答1

0

ベストアンサー

おそらくdic.txtに不純物(行末の改行とか)が混ざっています。

python

1 pattern = line.strip().split(',') 2 if pattern[0] in text and len(pattern) >= 2: 3 text = text.replace(pattern[0], pattern[1]) 4 print('置換後のtext:'+text) 5 break 6 else: 7 line = f.readline()

のように、ちゃんと読み込まれているかチェックし、だめだったら無視しましょう。

投稿2020/12/04 08:46

編集2020/12/04 11:26
sevenc-nanashi

総合スコア643

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

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

退会済みユーザー

退会済みユーザー

2020/12/04 10:38

該当部分を、MNoNamer様の記載されたように置き換えたら 正常に動作しました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

同じタグがついた質問を見る

Discord

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

Python 3.x

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