【CentOS7】Discordの読み上げBotを作ってVPSで稼働させる

<h2>はじめに</H2>
Discord用の読み上げBotを作ってVPS（CentOS7）で稼働させました。

<h2>参考にさせてもらったサイト</H2>
CentOS 7.3 に Open JTalk 1.10 をインストールする
https://lab.unicast.ne.jp/2017/03/17/install-open-jtalk-1-10-on-centos-7-3/

【CentOS7】VPSを使ってDiscordにMusicBotを導入して自動起動させる方法【2020年版】
https://non-non-blog.com/pc-it/%e3%80%90centos7%e3%80%91vps%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6discord%e3%81%abmusicbot%e3%82%92%e5%b0%8e%e5%85%a5%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95%e3%80%902018%e5%b9%b4%e7%89%88%e3%80%91/ 

<h2>準備</H2>
さくらのVPSを利用させてもらいました。
https://vps.sakura.ad.jp/

<h2>導入</H2>

<h3>Python3のインストール</h3>

```.sh
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ vi ~/.bash_profile
```
bash_profileには以下を追記

```.bash:.bash_profile
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
追記できたら以下を入力

```.sh
$ source ~/.bash_profile
$ pyenv install 3.8.0
$ cd /home
$ pyenv local 3.8.0
$ pyenv rehash
```

インストールが無事完了したら以下のコマンドを入力します。

```.sh
$ python --version
```

Python3のバージョンが出てきたら成功です。

<h3>ffmpegのインストール</h3>


```.sh
$ rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
$ rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
$ yum install ffmpeg -y
```

インストールが無事完了したら以下のコマンドを入力します。

```.sh
$ ffmpeg -version
```

バージョン情報っぽいのがいっぱい出てきたら成功です。

<h3>hts_engine APIのインストール</H3>

```.sh
$ cd /usr/local/src/
$ sudo wget https://downloads.sourceforge.net/project/hts-engine/hts_engine%20API/hts_engine_API-1.10/hts_engine_API-1.10.tar.gz
$ sudo tar xvzf hts_engine_API-1.10.tar.gz
$ cd /usr/local/src/hts_engine_API-1.10
$ sudo ./configure
$ sudo make
$ sudo make install
```

<h3>Open JTalkのインストール</H3>

```.sh
$ cd /usr/local/src/
$ sudo wget https://downloads.sourceforge.net/project/open-jtalk/Open%20JTalk/open_jtalk-1.10/open_jtalk-1.10.tar.gz
$ sudo tar xvzf open_jtalk-1.10.tar.gz
$ cd /usr/local/src/open_jtalk-1.10
$ sudo yum -y groupinstall "Development Tools"
$ sudo ./configure --with-charset=UTF-8
$ sudo make
$ sudo make install
```
<h3>辞書ファイルのダウンロード</H3>

```.sh
$ cd /usr/local/src/
$ sudo wget http://downloads.sourceforge.net/open-jtalk/open_jtalk_dic_utf_8-1.10.tar.gz
$ sudo tar xvzf open_jtalk_dic_utf_8-1.10.tar.gz
$ sudo mkdir /usr/local/share/open_jtalk
$ sudo mv /usr/local/src/open_jtalk_dic_utf_8-1.10 /usr/local/share/open_jtalk/
```

<h3>MMDAgent 音声ファイルの入手</H3>
```.sh
$ sudo wget http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
$ sudo unzip MMDAgent_Example-1.7.zip
$ sudo mkdir /usr/local/share/hts_voice
$ sudo mv /usr/local/src/MMDAgent_Example-1.7/Voice/mei /usr/local/share/hts_voice/
```

これでOpen JTalkのインストールは完了です。

<h2>Discord用botを作る</h2>

Discordのボットの設定をしていきます。

以下のページに行きます。

Discord Developer Portal
https://discord.com/developers/applications

ログインを求められたら、Discordのアカウントでログインし、
右上のNew Applicationボタンを押しましょう。
アプリの名前を決めるウィンドウが出てくるので
とりあえず「read_bot」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896190/94565a81-1a9a-5382-16e1-2b7204e36ca8.png)

左のメニューにある「Bot」を押して「Add Bot」でボットを作ります。
Tokenのところの「Copy」ボタンを押してボットのトークンをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896190/70441f01-8c2c-d6d8-649f-798c1557142e.png)

そして以下のコードの「token=""」にトークンを入れます。

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

token=""
client = commands.Bot(command_prefix='.')
voice_client = None
@client.event
async def on_ready():
    print(client.user.name + ' 起動')

@client.command()
async def join(ctx):
    vc = ctx.author.voice.channel
    await vc.connect()
    mes = "読み上げを開始します"
    await ctx.send(mes)

@client.command()
async def bye(ctx):
    await ctx.voice_client.disconnect()
    await ctx.send("さようなら")

@client.event
async def on_message(message):
    if message.content.startswith('.'):
        pass
    elif message.author.bot:
        pass
    else:
        mes = message.content
        create_wav(mes)
        ffmpeg_audio_source = discord.FFmpegPCMAudio("open_jtalk.wav")
        message.guild.voice_client.play(ffmpeg_audio_source)
    await client.process_commands(message)

def create_wav(txt):
    open_jtalk=['open_jtalk']
    mech=['-x','/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.10']
    htsvoice=['-m','/usr/local/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(txt.encode('utf-8'))
    c.stdin.close()
    c.wait()

client.run(token)
```

read_bot.pyをhomeディレクトリ上に作成します。
以下のコマンドでファイルを作成し、上のコードを入力します。

```.sh
cd /home
vi read_bot.py
```
Discord Developer Portalに戻り、左のメニューにある「OAuth2」を押して「SCOPES」の中にある「bot」にチェックを入れます。
招待用URLが出てくるので、読み上げBOTを入れたいサーバーを選択します。

<h2>読み上げる</h2>

以下のコマンドを入力します。

```.sh
cd /home/
python read_bot.py
```
サーバー上でボットがオンラインになるので、
読み上げボットを入れたいボイスチャンネルにつなげたあと、
テキストチャンネルで「.join」と入力します。
ボットが同じボイスチャンネルに入ってきます。
これで入力したテキストチャットがbotにより読み上げられる状態になります。
（「.bye」で退出します）

<h2>常時起動させる</h2>

```.sh
$ cd /etc/systemd/system/
$ vi read_bot.service
```
以下を入力

```:read_bot.service
[Unit]
Description=readbot
After=network.target

[Service]
Type=simple
WorkingDirectory=/home
ExecStart=/root/.pyenv/versions/3.8.0/bin/python3.8 /home/read_bot.py

[Install]
WantedBy=multi-user.target
```

```.sh
$ cd /etc/systemd/system/
$ sudo chmod 644 read_bot.service
$ sudo systemctl enable read_bot
$ sudo systemctl daemon-reload
```

サーバーを再起動すれば常時ボットが稼働している状態になります。