2
1

More than 3 years have passed since last update.

HOYAのVoiceTextを使ってDiscordのテキストを読み上げるBotを作ってみた

Last updated at Posted at 2020-12-12

はじめに

この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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1