ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

AWSのEC2とPollyを使ってDiscordのテキスト読み上げBOTを作る

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ディレクトリが作成され、ここに設定が書き込まれる。このコマンドはプログラム実行ユーザで実施すること。

Discordアカウント作成

https://asamacs.wordpress.com/2016/06/22/discord-bot-%E3%81%AE-%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BD%9C%E3%82%8A%E6%96%B9/

こちらのページを参考にアカウント取得&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/