DiscordBotをしゃべらせる
DiscordBotをボイスチャットに参加させて特定のチャンネルの内容を話させる。Node.jsを利用。
処理の内容
開始のコマンドでボイスチャットに参戦させる
↓
開始コマンドを打ち込んだチャンネルの投稿を取得する
↓
VoiceTextWebAPIで文字を音声に変換する
↓
ボイスチャットに流す
↓
(繰り返し)
↓
終了コマンドでボイスチャットから出る
下準備
DiscordBot用のAPIKEYを取得しておく。
参照→簡単なDiscord Botの作り方(初心者向け)
VoiceTextWebAPI用のAPIKEYを取得しておく。
VoiceText Web API
ここから無料利用登録するとAPIKEYがメールで送られてきます。
ffmpegを導入しておく
Windowsだけ挙げておく
【windows】FFmpegをインストールする手順
npm等パッケージマネージャでeris,voice-textをインストールしておく
実際のコード
server.js
const eris = require("eris");
let bot = new eris("<DiscordのAPIKEY>");
const {VoiceText} = require("voice-text");
const vt = new VoiceText("<VoiceTextWebAPIのAPIKEY>");
const VOICE_CONNECTION = null;
const TtoV_CHANNEL = "";
bot.on("ready", () => {
console.log("bot is ready");
});
bot.on("messageCreate", (msg) => {
// botのメッセージは無視
if (msg.author.bot) return;
// ボイスチャンネルに入っているかどうか
let isConnection = !!VOICE_CONNECTION;
// 開始コマンド !startspeech
if(msg.content=="!startspeech"&&!isConnection)
{
const vc = msg.member.voiceState.channelID;
// メッセージを書いた人がボイチャにいるかどうか
if(!!vc)
{
// メッセージを書いた人のいるボイスチャットに入る
TtoV_CHANNEL = msg.channel.id;
bot.getChannel(vc).join().then(connection => {
VOICE_CONNECTION= connection;
bot.createMessage(TtoV_CHANNEL, "Start Speech");
});
}else{
bot.createMessage(msg.channel.id, "You must join a voice channel before you use it.");
}
}else if(msg.channel.id==TtoV_CHANNEL)
{
// 終了コマンド !endspeech
if(msg.content == "!endspeech")
{
if(!!isConnection){
VOICE_CONNECTION.disconnect();
VOICE_CONNECTION = null;
bot.createMessage(TtoV_CHANNEL, "End Speech");
return;
}
}else{
// ボイスで話している途中に追加で話されるとエラーが発生する。
// 対策としてはスタックにどんどんメッセージを入れるようにするなど
// ボイスが終了するイベントが取得できれば改善される(未実装)
try{
// APIの制限で200文字までしか話せない
let stream = vt.stream(msg.content.slice(0,200), {
speaker: "hikari"
});
const dispatcher = VOICE_CONNECTION.play(stream);
}catch(e){
bot.createMessage(TtoV_CHANNEL, "Wait until the end of the voice.");
}
}
}
});
bot.connect();
まとめ
かなり少ない行数で実装可能。
ただし、ボイスで話している途中に追加で話されるときに出るエラーの対策ができていないので注意。
対策したら追記します。