0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Eris+VoiceTextWebAPIでしゃべるDiscordBot

Posted at

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();

まとめ

かなり少ない行数で実装可能。
ただし、ボイスで話している途中に追加で話されるときに出るエラーの対策ができていないので注意。
対策したら追記します。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?