Discordでマイクなしの聞き専の方向けに、テキストチャットをボイスチャンネルで読み上げてくれるBotの作り方。今回は登録して1年間は色んなサービスが無料で使えるAWSを利用。EC2(仮想サーバ)とPolly(音声読み上げサービス)を使って構築。
EC2インスタンス作成
https://qiita.com/tuboc/items/38da97cb96b2ebc69f88
この辺を参考にインスタンス作成。OSはUbuntuの最新版を選択。登録して1年間は無料枠のサービスであればタダで使えます。Amazonさんマジカッケー。
環境準備
rubyとかもろもろインストール
apt-get update apt-get upgrade apt-get install -y vim curl wget apt-get install -y ruby ruby-dev rbenv ruby-bulid apt-get install -y awscli
音声系の処理で使うパッケージをインストール
apt-get install -y libsodium-dev libopus0 ffmpeg libopus-dev
gem経由でdiscordrbとaws-sdk取得
gem install discordrb --platform=ruby gem install aws-sdk
AWS設定
aws configure
- AWS Access Key ID : 「EC2インスタンス作成」で作成したIAMのAccess Key
- AWS Secret Access Key : 「EC2インスタンス作成」で作成したIAMのSecret Key
- Default region name : ap-northeast-1
- Default output format : そのままEnter
コマンド実行ユーザのホームディレクト配下に.aws
ディレクトリが作成され、ここに設定が書き込まれる。このコマンドはプログラム実行ユーザで実施すること。
Discordアカウント作成
こちらのページを参考にアカウント取得&BOTの登録。
Botの詳細ページが出てくるので Create a Bot User をクリック。 Client ID と token をコピーしてメモ帳にでも貼り付けておきます。
この詳細ページの上部にSecretといういかにもトークンっぽい文字列があるがこれはトークンではないので注意。
botプログラム作成・実行
プログラム実行用ディレクトリ作成
mkdir /discord cd /discord mkdir data vim tts.rb
require 'discordrb' require 'aws-sdk' polly = Aws::Polly::Client.new SampleRate = "16000" bot = Discordrb::Commands::CommandBot.new token: 'ここにDiscordBotのトークを入れる', prefix: '!' bot.command(:connect) do |event| channel = event.user.voice_channel path = "data/#{event.server.name}/#{event.channel.name}" FileUtils.mkdir_p(path) unless FileTest.exist?(path) next "ボイスチャンネルに接続されていません" unless channel bot.voice_connect(channel) "ボイスチャンネル「 #{channel.name}」に接続しました。利用後は「!destroy」でボットを切断してください" end bot.command(:destroy) do |event| channel = event.user.voice_channel next "ボイスチャンネルに接続されていません" unless channel bot.voice_destroy(channel) "ボイスチャンネル「 #{channel.name}」から切断されました" end bot.message(in: ["ここに読み上げたい対象チャンネルを入れる"]) do |event| channel = event.channel server = event.server voice_bot = event.voice if voice_bot != nil then polly.synthesize_speech({ response_target: "data/#{server.name}/#{channel.name}/speech.mp3", output_format: "mp3", sample_rate: SampleRate, text: "<speak>#{event.user.name}いわく、#{event.message}</speak>", text_type: "ssml", voice_id: "Takumi", }) voice_bot.play_file("data/#{server.name}/#{channel.name}/speech.mp3") end end bot.run
実行
ruby tts.rb
動きはするがたまに落ちたり、エラーが結構でてるので今後修正が必要。
使い方
ボイスチャンネルに接続してテキストチャンネルで!connect
。自動で切断されないので使い終わったら!destroy
で切断。
その他参考にしたサイト
https://dev.classmethod.jp/cloud/aws/amazon-polly-using-ruby/ https://github.com/meew0/discordrb#installation https://asamacs.wordpress.com/2017/04/20/discordrb%E3%81%A7%E9%9F%B3%E5%A3%B0%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/