2017年12月23日土曜日

Discord用に簡単なTTS Botを使ってみた。

友人とゲームをするときにはよくTeamSpeak3を使っていたんだけど、最近Discordに乗り換える流れがあったので乗り換えてみた。

ついでに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 件のコメント:

コメントを投稿