はじめに
このBotを作った経緯としては、夜遅くなどどうしてもしゃべれない時間帯があるため、そうした時間帯でもVCで参加する方法が必要になり、このBotを作ってみました。
どうやら、既に喋太郎というBotがあるらしいですが、このBotを最初に作った時(2018年2月ぐらい)にはなかったのでご容赦ください。
似たようなことをしたい人の参考になれば良いなと思います。
ソースコード
GitHubにあります。
noriokun4649/Discord-TTS-Voice-channel-Bot
利用してるライブラリなどの依存関係はpackage.jsonに書いてありますが下記の通りです。
- Node.js v12.19.0
- @discordjs/opus : 0.3.2
- config : 3.3.2
- config-reloadable : 1.0.8
- discord.js : 12.4.0
- ffmpeg-static : 4.2.7
- voice-text : 0.1.2
開発してみての感想
VoiceTextのライブラリや、Discordのライブラリが用意されていたため、簡単に開発することができました。
躓いた点としては、VoiceTextのライブラリから返ってくるbufferをDiscord.jsのstreamに渡す方法に躓きました。
このBotを作った当初(2018年2月ごろ)の時点では、一度wavファイルに保存して、保存後wavファイルを読み取りDiscord.jsに渡すという糞みたいな処理をしてましたが、現在は直接bufferからstreamに変換して渡しています。
また、DiscordのAPI自体の仕様で、Discordのテキストチャネルで送信されるサーバ独自の絵文字やメンションなどが変わった形で送られてくるため、こうした絵文字やメンションの処理も少しだけ戸惑いましたが、最終的には正規表現で対応しました。
使い方
Node.jsで動くので通常どおりnpmのコマンドで使えます。
機能や設定、コマンドなど
機能はそんなに多くありませんが下記のような機能があります。
- コマンドの接頭語の変更機能
- エラー時の自動再起動する機能
- 読み上げ音声の変更機能
- 音声の種類変更
- 読み上げ音声の速度の変更
- 読み上げ音声の高さの変更
- ブラックリスト
- コマンドの接頭語別に読み上げ禁止にする機能
- ユーザー別に読み上げ禁止にする機能
- すべてのBotを読み上げ禁止にする機能
読み上げ音声の変更機能以外は、Configファイルで設定可能です。
Configファイルについて
configフォルダ内のdefault.jsonがコンフィグファイルです。
{
"Api": {
"discordToken": "",
"voiceTextApiKey": ""
},
"Prefix": "/",
"AutoRestart": true,
"ReadMe": false,
"Defalut": {
"apiType": 1,
"voiceType": "hikari"
},
"BlackLists": {
"memberIds": [
"381054450451742720"
],
"prefixes": [
"!",
"/"
],
"bots": true
}
}
項目 | 内容・説明 |
---|---|
discordToken | Discordのトークンを記入 |
voiceTextApiKey | VoiceTextのAPIキーを記入 |
Prefix | コマンドの接頭語を決めます |
AutoRestart | 予期せぬエラー時に自動でボイスチャンネルへ再接続すかどうか |
ReadMe | このBotが送るメッセージを読み上げるかどうか |
apiType | デフォルトのAPIを指定 (利用できるAPIが1になってしまったので無意味) |
voiceType | デフォルトのボイスを指定 |
memberIds | 読み上げから除外するユーザーのユーザーID |
prefixes | 読み上げから除外する接頭語 |
bots | Botを読み上げから除外する |
Botのコマンドについて
接頭語+α | 内容・説明 |
---|---|
join | ボイスチャンネルにBotを呼びます |
reconnect | ボイスチャンネルへ再接続します |
kill | ボイスチャンネルから切断します |
mode | 読み上げに利用するTTSのAPIを変更します |
type | APIで利用可能な音声タイプを一覧表示します |
voice | 音声タイプを変更します |
speed | 音声の速度を変更します(0~200の数値) |
pitch | 音声の高さを変更します(0~200の数値) |
reload | コンフィグを再読み込みします |
接頭語は、Configファイルで指定した接頭語を使います。
ToDo
一応まだ、開発のモチベーションがあるので今後の予定としては、ユーザーごとに読み上げ音声の種類を設定できるようにしたいと考えています。
聞き専の人が複数居ても、読み上げ音声の種類で人を区別できるようになるので利便性が上がると思います。
最後に
2018年2月頃に書いたプログラムをリファクタリングや機能の改善、バグ修正などしましたが、最終的には実用に足りる実装ができたと思います。
まだまだ、至らぬ点がありそうですが今後も開発出来たら良いなと思います。
最後まで見て頂きありがとうございます。
P.S.
書くの忘れていましたが、一応Dockerで動かせるようにDockerファイルとdocker-composeファイルも作ってあります。(別リポジトリですが)
noriokun4649/DiscordTTSBot-Docker-compose-setup
更にP.S.
DockerfileをGitHubのPackageにアップしたので下記のコマンドで使えるようになります。
docker pull ghcr.io/noriokun4649/discord-tts-bot:1.0.4