とらのメモ

IT関係やガジェットについての雑記

Discordで音声ファイルを読み上げるbotつくろう

はじめに

discordのチャットで送信された語録をボイスチャットでも読み上げてくれたら面白いのでは?と思って半年前くらいに作った。
音声素材はニコニコモンズなどから簡単に取得できます。

ソース

import discord
from discord.ext import commands
import asyncio
import os
import subprocess
import ffmpeg


client = commands.Bot(command_prefix='.')
voice_client = None

goroku = [
"やばいわよ",
"やばいですね",
]



@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.command()
async def join(ctx):
    # 送信者のVCを取得
    vc = ctx.author.voice.channel
    # Botが既に他のVCに参加しているか
    if ctx.voice_client:
        # 参加している場合は移動
        await ctx.voice_client.move_to(vc)
    else:
        # 参加していない場合はVCに接続
        await vc.connect()

@client.command()
async def start(ctx):
    vc = ctx.author.voice.channel
    ctx.voice_client.play(discord.FFmpegPCMAudio('output.wav'))

@client.command()
async def bye(ctx):
    await ctx.voice_client.disconnect()

@client.event
async def on_message(message):
    msgclient = message.guild.voice_client
    if message.content.startswith('.'):
        pass

    else:
        mcc = message.content
        print(mcc)
        if msgclient:
            if msgclient.is_playing():
                msgclient.stop()
                l_in = [s for s in goroku if mcc in s]
                source = discord.FFmpegPCMAudio("./voice/{}.wav".format(l_in[0]))
                msgclient.play(source)
            else:
                l_in = [s for s in goroku if mcc in s]
                source = discord.FFmpegPCMAudio("./voice/{}.wav".format(l_in[0]))
                msgclient.play(source)
        else:
            pass
    await client.process_commands(message)

client.run("YOUR-DISCORD-TOKEN")

使い方

Discordのチャットを読み上げるbotの作成 - Qiita これの応用みたいな感じです。ffmpegは導入必須だと思うのでいれてください。

同階層にvoiceフォルダ作ってそこのファイル名から部分一致したものを再生させてるだけな感じ。 cmdで実行して、.joinでボイスチャンネルに参加させるとテキストチャンネルの単語拾って再生されます

まとめ

身内で公開したときはウケてる印象だったから一発ネタとしてはいいんじゃないかなって思います。

追加素材はニコニコ動画とかネットの海に転がってるものを使えばずっと楽しめると思います。