ついでにDiscordのAPIを使ってBotが簡単に作れるらしいのでちょっとTTS(text to speech)ボットを作ってみた。要はテキスト棒読みBot。
Discordはブラウザからも簡単に参加できてしまうので、その場で喋れない奴とかたまーにゲーム中に入ってきてもテキスト読めない問題を少しでも解決するために…。
サーバーは現状のLinux鯖を使いたかったので、Bot作成にはPythonのDiscord.pyを使用した。
喋る部分は棒読みちゃんとかを使いたかったんだけど、Linuxだとちょっと面倒だったので簡単に使えるOpen JTalkを使用した。
まずはOpen JTalkをPythonから使えるようにする。
こちらのサイトのjtalk.pyをPython3でも使えるようにちょっとだけ変更して使用した。
#coding: utf-8
import subprocess
def jtalk(t):
open_jtalk=['open_jtalk']
mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
speed=['-r','1.0']
outwav=['-ow','open_jtalk.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
c.stdin.write(t.encode('utf-8'))
c.stdin.close()
c.wait()
変更したのは音声は再生しないようにしたのとstdin.writeの部分をバージョンに合わせてちょっと変更。
あとはBot本体からこいつを呼び出すだけ。
#coding: utf-8
import discord
import jtalk
client = discord.Client()
@client.event
async def on_ready():
global player
global voice
print("-"*20)
print("user name:", client.user.name)
print("user id:", client.user.id)
print("-"*20)
channel = client.get_channel('参加させたいボイスチャンネルのID')
voice = await client.join_voice_channel(channel)
@client.event
async def on_message(message):
global player
global voice
# we do not want the bot to reply to itself
if message.author == client.user:
return
jtalk.jtalk(message.content)
player = voice.create_ffmpeg_player('open_jtalk.wav')
player.start()
client.run('トークンをこちらに')
とりあえずこんなもんで一応は動いてるっぽい。
テキストの流れが早かったりすると対応できないかもしれないし、チャンネル移動コマンドとか追加していきたい
0 件のコメント:
コメントを投稿