見様見真似でDiscordのチャット読み上げbotを作った

#はじめに
Discordで使ってるチャット読み上げbotが一時的に使えなくなってしまったので臨時で自作しました。
[Discordのチャットを読み上げるbotの作成](https://qiita.com/9610r/items/d04bd91d373d31d9c3f3)を参考に一部コード書き換えて作ってます。

#事前準備
bot作成と環境構築は下記を見ながらやりました。

- [Discord bot作成チュートリアル](https://ikayome.hateblo.jp/entry/2019/07/03/Discord_bot%E4%BD%9C%E6%88%90%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)
- [Windowsで音声合成Open JTalk](https://qiita.com/mkgask/items/0bf9c26dc96e7b0b45ac)
- [windowsにffmpegをインストールする](https://web.plus-idea.net/2015/11/windows-ffmpeg/)

`ffmpeg`は解凍したファイルを`C:\open_jtalk\bin`に配置してます。
`Path`の設定をわすれずに…

#botのソースコード

一番下の行の`bot作成時の時にコピーしたトークン`の箇所は各々botのトークンを書き換えてください。
[GitGubはこちら](https://github.com/Nemy-z2z/readBot.git)（ちょっとずつ改修してます。）


```read_bot.py
import discord
from discord.ext import commands
import asyncio
import os
import subprocess
import ffmpeg
from voice_generator import creat_WAV

client = commands.Bot(command_prefix='.')
voice_client = None


@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')


@client.command()
async def join(ctx):
    print('#voicechannelを取得')
    vc = ctx.author.voice.channel
    print('#voicechannelに接続')
    await vc.connect()

@client.command()
async def bye(ctx):
    print('#切断')
    await ctx.voice_client.disconnect()

@client.event
async def on_message(message):
    msgclient = message.guild.voice_client
    if message.content.startswith('.'):
        pass

    else:
        if message.guild.voice_client:
            print(message.content)
            creat_WAV(message.content)
            source = discord.FFmpegPCMAudio("output.wav")
            message.guild.voice_client.play(source)
        else:
            pass
    await client.process_commands(message)


client.run("bot作成時の時にコピーしたトークン")
```
[](read_bot.py)

#音声ファイルのソースコード

ボイスファイルのパスのところにいろいろコメントアウトして書いてあるんですけど、[MMDAgent](http://www.mmdagent.jp/)にある`Sample Script`の`Source code`をダウンロードしてもらうと女性声に変更できます。
（解凍したファイルの`Voice/mei`ディレクトリの`htsvoiceファイル`があるので`meiディレクトリ`をソースコードと同じ階層に配置してください）

```voice_generator.py
import subprocess
import re

# remove_custom_emoji
# 絵文字IDは読み上げない
def remove_custom_emoji(text):
    pattern = r'<:[a-zA-Z0-9_]+:[0-9]+>'    # カスタム絵文字のパターン
    return re.sub(pattern,'',text)   # 置換処理

# urlAbb
# URLなら省略
def urlAbb(text):
    pattern = "https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"
    return re.sub(pattern,'URLは省略するのデス！',text)   # 置換処理

# creat_WAV
# message.contentをテキストファイルに書き込み
def creat_WAV(inputText):
        # message.contentをテキストファイルに書き込み

    inputText = remove_custom_emoji(inputText)   # 絵文字IDは読み上げない
    inputText = urlAbb(inputText)   # URLなら省略
    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 = '1.0'

    #出力ファイル名　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('テスト')
```
#ディレクトリ構成

構成としてはこんなかんじです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208609/657dbe41-c372-52fe-334d-00e30338d9a2.png)


#使い方

botを招待するところまでは記載があったのですが使い方については書かれていなかったので適当に書いておきます。

###コマンドプロンプト起動

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208609/aebb13e9-a3a0-6d38-9970-eb08c14f468e.png)

###C:\open_jtalk\binの「read_bot.py」をコマンドプロンプトにドラッグアンドドロップしてEnter

![タイトルなし2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208609/d3ae9212-7352-6cf0-a98d-8431614a0125.png)

するとbotがログインしてくれます

![タイトルなし3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208609/088ad18b-41c4-6d54-cfb5-286fcc1665c2.png)

###ボイスチャンネルに呼ぶ

まず自分がボイチャに入ります。
（このbotは基本的にボイチャに呼んだ人のところに入ってきます。）
呼ぶコマンドは`.join`です

![タイトルなし4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208609/f1d56105-4341-3005-1c61-d0decf35fad5.png)

###しゃべらせる
適当にチャットすれば読んでくれます。
絵文字とかカスタム絵文字は読んでくれません…
あと、URLは省略するようにしてます。

###退出させる
ボイスチャンネルからbotを退出させるコマンドは`.bye`です

![タイトルなし5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208609/8505181b-d0b1-7680-17fb-81de2e7fd6ae.png)

###後片付け
コマンドプロンプトは`Ctrl + C`かウィンドウを閉じましょう。

#おわり
簡単な英語も割とアルファベットで読まれちゃう感じがあるので、辞書登録機能とか追加できたらいいなーって思いますね。

まあそれはそのうちやります。たぶん