discord.pyでdiscordとYouTubeを読み上げるdiscordBOT(Linux用)

※2022年1月1日21時追記:まだバグあるので直しながら使ってます

もはや解説してもわかる人は少ないであろうソースコード
Pythonわかる人は読んだらわかる・・・かも・・・
一通りテストしたつもりだけどまだバグあるかも
コードはもっときれいに書いたほうがいいぞ小森ィ!

前提:
discordbotの作り方の知識

VOICEVOXのインストール&VOICEVOXの起動
Python3のインストール(Ubuntuとかだと最初から入ってるかも)

pip3 install discord.py[voice]
pip3 install requests
pip3 install pytchat

コード一番下のtokenのところは自分のdiscordbotのトークンに置き換えてください。

import discord
import json
import requests
import wave
from discord.ext import tasks
import pytchat
from datetime import datetime

class VoicevoxConnect():
    async def generate_wav_file(self, text, speaker, filepath):
        audio_query = requests.post(f'http://127.0.0.1:50021/audio_query?text={text}&speaker={speaker}')
        headers = {'Content-Type': 'application/json',}
        synthesis = requests.post(
            f'http://127.0.0.1:50021/synthesis?speaker={speaker}',
            headers=headers,
            data=json.dumps(audio_query.json())
        )
        wf = wave.open(filepath, 'wb')
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)
        wf.writeframes(synthesis.content)
        wf.close()

# guild_id, livechat, filepath, voice_client
livechatdata = []

# guild_id, message_channel
voice_channel_data = []

# guild_id, speaker
guild_speaker = []

voicevoxConnect = None

# チェンジスピーカーフラグ
cs_flag = 0

# ボイスの種類
speakers = [ "0:四国めたん、あまあま"
            ,"1:ずんだもん、あまあま"
            ,"2:四国めたん、ノーマル"
            ,"3:ずんだもん、ノーマル"
            ,"4:四国めたん、セクシー"
            ,"5:ずんだもん、セクシー"
            ,"6:四国めたん、ツンツン"
            ,"7:ずんだもん、ツンツン"
            ,"8:春日部つむぎ、ノーマル"
            ,"9:波音リツ、ノーマル"
            ]
@tasks.loop(seconds=5)
async def youtube_text_to_speech():
    for i in range(len(livechatdata)):
        livechat = livechatdata[i][1]
        speaker = 0
        for j in range(len(guild_speaker)):
            if guild_speaker[j][0] == livechatdata[i][0]:
                speaker = guild_speaker[j][1]
                break
        filepath = livechatdata[i][2]
        voice_client = livechatdata[i][3]
        if livechat.is_alive():
            # チャットデータの取得
            chatdata = livechat.get()
            for c in chatdata.items:
                print(f"{c.datetime} {c.author.name} {c.message} {c.amountString}")
                await voicevoxConnect.generate_wav_file(c.author.name + "、" + c.message, speaker, filepath)
                source = await discord.FFmpegOpusAudio.from_probe(filepath, before_options="-channel_layout mono")
                try:
                    voice_client.play(source)
                except Exception as e:
                    print(datetime.now().strftime("%Y/%m/%d %H:%M:%S - ") + str(e))
        else:
            livechatdata.pop(i)
            return

class MyClient(discord.Client):
    @youtube_text_to_speech.before_loop
    async def before_youtube_text_to_speech():
        print('waiting...')
        await client.wait_until_ready()

    async def on_ready(self):
        global voicevoxConnect
        print(f'{self.user}がログインしました。')
        voicevoxConnect = VoicevoxConnect()

    async def on_message(self, message):
        global voicevoxConnect
        global livechatdata
        global voice_channel_data
        global cs_flag

        if message.author.bot:
            return
        if message.content == 'つむぎちゃんおいで':
            if message.author.voice is None:
                await message.channel.send('ボイスチャンネルに入ってから呼んでね!')
            else:
                if message.guild.voice_client is None:
                    await message.author.voice.channel.connect()
                    voice_channel_data.append([message.guild.id, message.channel])
                    guild_speaker.append([message.guild.id, 8])
                    await message.channel.send("はーい、ボイスチャンネル入るね")
                else:
                    await message.channel.send("もうボイスチャンネルに入ってるよ?")
            return

        if message.content == 'つむぎちゃんばいばい':
            if message.guild.voice_client is None:
                await message.channel.send("ボイスチャンネル入ってないよ?")
                return
            else:
                for i in range(len(voice_channel_data)):
                    if voice_channel_data[i][0] == message.guild.id:
                        voice_channel_data.pop(i)
                        await message.guild.voice_client.disconnect()
                        await message.channel.send("ボイスチャンネル抜けるねー!")
                        return
                return

        if cs_flag == 1:
            if len(message.content) == 1:
                if message.content.isdecimal():
                    speaker = int(message.content)
                    for i in range(len(guild_speaker)):
                        if guild_speaker[i][0] == message.guild.id:
                            guild_speaker[i][1] = speaker
                            await message.channel.send("ボイスを「" + speakers[speaker] + "」に変えたよ")
                            cs_flag = 0
                            return
                    await message.channel.send("ボイスチャットに入っていないからボイスは変えられないよ")
                    return
                else:
                    await message.channel.send("1桁の数字で入力してね")
                    return
            else:
                await message.channel.send("1桁の数字で入力してね")
                return

        # チェンジスピーカー、ボイスを変更したい時
        if message.content == 'cs':
            for i in range(len(guild_speaker)):
                if guild_speaker[i][0] == message.guild.id:
                    if cs_flag == 0:
                        cs_flag = 1
                        await message.channel.send(
                            speakers[0] + "\n"
                            + speakers[1] + "\n"
                            + speakers[2] + "\n"
                            + speakers[3] + "\n"
                            + speakers[4] + "\n"
                            + speakers[5] + "\n"
                            + speakers[6] + "\n"
                            + speakers[7] + "\n"
                            + speakers[8] + "\n"
                            + speakers[9] + "\n"
                            + "どれにするか数字で選んでね"
                             )
                        return
            await message.channel.send("ボイスチャットに入っていないからボイスは変えられないよ")
            return

        # YouTube読み上げ開始
        if message.content.startswith("https://www.youtube.com/watch?v="):
            message.content = message.content.replace('https://www.youtube.com/watch?v=', '')
            if len(message.content) != 11:
                await message.channel.send("YouTubeのリンクがおかしいです")
                return
            else:
                guild_id = message.guild.id
                livechat = pytchat.create(video_id = message.content)
                filepath = message.content + '.wav'
                voice_client = message.guild.voice_client
                livechatdata.append([guild_id, livechat, filepath, voice_client])
                await message.channel.send("YouTube読み上げを開始します")
            return

        # YouTube読み上げ停止
        if message.content == 'すとっぷ' or message.content == 'ストップ' or message.content == 'stop':
            for i in range(len(livechatdata)):
                if livechatdata[i][0] == message.guild.id:
                    await message.channel.send("YouTube読み上げを停止します")
                    livechatdata.pop(i)
                    return
            await message.channel.send("YouTube読み上げは現在行われていません")
            return

        # YouTube読み上げ中はdiscordのチャットに反応しない
        for i in range(len(livechatdata)):
            if livechatdata[i][0] == message.guild.id:
                return

        # ボイスチャットに入っていない場合はdiscordのチャットに反応しない
        if message.guild.voice_client is None:
            return
        else:
            # ボイスチャットに入っている場合はdiscordのチャットに反応する
            for i in range(len(voice_channel_data)):
                if voice_channel_data[i][0] == message.guild.id:
                    if voice_channel_data[i][1] == message.channel:
                        for i in range(len(guild_speaker)):
                            if guild_speaker[i][0] == message.guild.id:
                                speaker = guild_speaker[i][1]
                                filepath = str(message.guild.id) + '.wav'
                                if (message.guild.voice_client.is_playing()):
                                    return
                                await voicevoxConnect.generate_wav_file(message.content, speaker, filepath)
                                source = await discord.FFmpegOpusAudio.from_probe(filepath, before_options="-channel_layout mono")
                                try:
                                    message.guild.voice_client.play(source)
                                except Exception as e:
                                    print(datetime.now().strftime("%Y/%m/%d %H:%M:%S - ") + str(e))
                                return

client = MyClient()
youtube_text_to_speech.start()
client.run('token')

BOTの使い方説明!

自分がボイスチャンネルに入って「つむぎちゃんおいで」と打つと
ボイスチャンネルに入ってきます。
「つむぎちゃんばいばい」って言うと出ていきます。

つむぎちゃんがボイスチャンネルに入っている状態でつむぎちゃんを呼ぶのに使ったテキストチャンネルで発言するとそのテキストを読み上げてくれます。

「cs」って打つとボイスが変更できます。今のところ10種類くらいから選べるみたいです。

テキストチャンネルに配信中のYouTubeのリンクを貼るとそのコメント欄を読み上げてくれるようになります。
例:https://www.youtube.com/watch?v=WCDTV3JggZE

「すとっぷ」「ストップ」「stop」のどれかを打つとYouTubeの読み上げを停止します。YouTubeのコメント読み上げ中はdiscordのチャットを読み上げてくれなくなります。

配信に使う時とかの注意:
概要欄にクレジット表記が必要です。

四国めたん・ずんだもんの音声ライブラリを用いて生成した音声は、 「VOICEVOX:四国めたん」「VOICEVOX:ずんだもん」とそれぞれクレジットを記載すれば、商用・非商用で利用可能です。

春日部つむぎの音声ライブラリを用いて生成した音声は、 「VOICEVOX:春日部つむぎ」とクレジットを記載すれば、商用・非商用で利用可能です。

波音リツの音声ライブラリを用いて生成した音声は、 「VOICEVOX:波音リツ」とクレジットを記載すれば、商用・非商用で利用可能です。

こんなもんかな?・・・
気がついたことがあったらあとで追記するかも。

14件のコメント

  1. 初めまして!
    すみません!!
    こちらを試してみたのですが、起動まではできたのですが
    喋ってくれないです。
    ご教授お願い致します。
    import discord
    import json
    import requests
    import asyncio
    import wave
    from discord.ext import tasks
    import pytchat
    from datetime import datetime

    # client = discord.Client(intents=discord.Intents.all())

    class VoicevoxConnect():
    async def generate_wav_file(self, text, speaker, filepath):
    audio_query = requests.post(f’http://127.0.0.1:50021/audio_query?text={text}&speaker={speaker}’)
    headers = {‘Content-Type’: ‘application/json’,}
    synthesis = requests.post(
    f’http://127.0.0.1:50021/synthesis?speaker={speaker}’,
    headers=headers,
    data=json.dumps(audio_query.json())
    )
    wf = wave.open(filepath, ‘wb’)
    wf.setnchannels(1)
    wf.setsampwidth(2)
    wf.setframerate(24000)
    wf.writeframes(synthesis.content)
    wf.close()

    # guild_id, livechat, filepath, voice_client
    livechatdata = []

    # guild_id, message_channel
    voice_channel_data = []

    # guild_id, speaker
    guild_speaker = []

    voicevoxConnect = None

    # チェンジスピーカーフラグ
    cs_flag = 0

    # ボイスの種類
    speakers = [ “0:四国めたん、あまあま”
    ,”1:ずんだもん、あまあま”
    ,”2:四国めたん、ノーマル”
    ,”3:ずんだもん、ノーマル”
    ,”4:四国めたん、セクシー”
    ,”5:ずんだもん、セクシー”
    ,”6:四国めたん、ツンツン”
    ,”7:ずんだもん、ツンツン”
    ,”8:春日部つむぎ、ノーマル”
    ,”9:波音リツ、ノーマル”
    ]

    @tasks.loop(seconds=5)
    async def youtube_text_to_speech():
    for i in range(len(livechatdata)):
    livechat = livechatdata[i][1]
    speaker = 0
    for j in range(len(guild_speaker)):
    if guild_speaker[j][0] == livechatdata[i][0]:
    speaker = guild_speaker[j][1]
    break
    filepath = livechatdata[i][2]
    voice_client = livechatdata[i][3]
    if livechat.is_alive():
    # チャットデータの取得
    chatdata = livechat.get()
    for c in chatdata.items:
    print(f”{c.datetime} {c.author.name} {c.message} {c.amountString}”)
    await voicevoxConnect.generate_wav_file(c.author.name + “、” + c.message, speaker, filepath)
    source = await discord.FFmpegOpusAudio.from_probe(filepath, before_options=”-channel_layout mono”)
    try:
    voice_client.play(source)
    except Exception as e:
    print(datetime.now().strftime(“%Y/%m/%d %H:%M:%S – “) + str(e))

    else:
    livechatdata.pop(i)
    return

    class MyClient(discord.Client):
    @youtube_text_to_speech.before_loop
    async def before_youtube_text_to_speech():
    print(‘waiting…’)
    await client.wait_until_ready()

    async def on_ready(self):
    global voicevoxConnect
    print(f'{self.user}がログインしました。’)
    voicevoxConnect = VoicevoxConnect()

    async def on_message(self, message):
    global voicevoxConnect
    global livechatdata
    global voice_channel_data
    global cs_flag

    if message.author.bot:
    return
    if message.content == ‘つむぎちゃんおいで’:
    if message.author.voice is None:
    await message.channel.send(‘ボイスチャンネルに入ってから呼んでね!’)
    else:
    if message.guild.voice_client is None:
    await message.author.voice.channel.connect()
    voice_channel_data.append([message.guild.id, message.channel])
    guild_speaker.append([message.guild.id, 8])
    await message.channel.send(“はーい、ボイスチャンネル入るね”)
    else:
    await message.channel.send(“もうボイスチャンネルに入ってるよ?”)
    return

    if message.content == ‘つむぎちゃんばいばい’:
    if message.guild.voice_client is None:
    await message.channel.send(“ボイスチャンネル入ってないよ?”)
    return
    else:
    for i in range(len(voice_channel_data)):
    if voice_channel_data[i][0] == message.guild.id:
    voice_channel_data.pop(i)
    await message.guild.voice_client.disconnect()
    await message.channel.send(“ボイスチャンネル抜けるねー!”)
    return
    return

    if cs_flag == 1:
    if len(message.content) == 1:
    if message.content.isdecimal():
    speaker = int(message.content)
    for i in range(len(guild_speaker)):
    if guild_speaker[i][0] == message.guild.id:
    guild_speaker[i][1] = speaker
    await message.channel.send(“ボイスを「” + speakers[speaker] + “」に変えたよ”)
    cs_flag = 0
    return
    await message.channel.send(“ボイスチャットに入っていないからボイスは変えられないよ”)
    return
    else:
    await message.channel.send(“1桁の数字で入力してね”)
    return
    else:
    await message.channel.send(“1桁の数字で入力してね”)
    return

    # チェンジスピーカー、ボイスを変更したい時
    if message.content == ‘cs’:
    for i in range(len(guild_speaker)):
    if guild_speaker[i][0] == message.guild.id:
    if cs_flag == 0:
    cs_flag = 1
    await message.channel.send(
    speakers[0] + “\n”
    + speakers[1] + “\n”
    + speakers[2] + “\n”
    + speakers[3] + “\n”
    + speakers[4] + “\n”
    + speakers[5] + “\n”
    + speakers[6] + “\n”
    + speakers[7] + “\n”
    + speakers[8] + “\n”
    + speakers[9] + “\n”
    + “どれにするか数字で選んでね”
    )
    return
    await message.channel.send(“ボイスチャットに入っていないからボイスは変えられないよ”)
    return

    # YouTube読み上げ開始
    if message.content.startswith(“https://www.youtube.com/watch?v=”):
    message.content = message.content.replace(‘https://www.youtube.com/watch?v=’, ”)
    if len(message.content) != 11:
    await message.channel.send(“YouTubeのリンクがおかしいです”)
    return
    else:
    guild_id = message.guild.id
    livechat = pytchat.create(video_id = message.content)
    filepath = message.content + ‘.wav’
    voice_client = message.guild.voice_client
    livechatdata.append([guild_id, livechat, filepath, voice_client])
    await message.channel.send(“YouTube読み上げを開始します”)
    return

    # YouTube読み上げ停止
    if message.content == ‘すとっぷ’ or message.content == ‘ストップ’ or message.content == ‘stop’:
    for i in range(len(livechatdata)):
    if livechatdata[i][0] == message.guild.id:
    await message.channel.send(“YouTube読み上げを停止します”)
    livechatdata.pop(i)
    return
    await message.channel.send(“YouTube読み上げは現在行われていません”)
    return

    # YouTube読み上げ中はdiscordのチャットに反応しない
    for i in range(len(livechatdata)):
    if livechatdata[i][0] == message.guild.id:
    return

    # ボイスチャットに入っていない場合はdiscordのチャットに反応しない
    if message.guild.voice_client is None:
    return
    else:
    # ボイスチャットに入っている場合はdiscordのチャットに反応する
    for i in range(len(voice_channel_data)):
    if voice_channel_data[i][0] == message.guild.id:
    if voice_channel_data[i][1] == message.channel:
    for i in range(len(guild_speaker)):
    if guild_speaker[i][0] == message.guild.id:
    speaker = guild_speaker[i][1]
    filepath = str(message.guild.id) + ‘.wav’
    if (message.guild.voice_client.is_playing()):
    return
    await voicevoxConnect.generate_wav_file(message.content, speaker, filepath)
    source = await discord.FFmpegOpusAudio.from_probe(filepath, before_options=”-channel_layout mono”)
    try:
    message.guild.voice_client.play(source)
    except Exception as e:
    print(datetime.now().strftime(“%Y/%m/%d %H:%M:%S – “) + str(e))
    return

    client = MyClient(intents=discord.Intents.all())
    @client.event
    async def on_ready():
    youtube_text_to_speech.start()

    client.run(‘トークン’)

  2. エラーはこちらです
    Traceback (most recent call last):
    File “C:\Users\hopef\PycharmProjects\discordbot\venv\lib\site-packages\discord\client.py”, line 441, in _run_event

      1. ご返信ありがとうございます。
        pycharmっていうツールとvpsサーバーで実行したところ同じエラーでした。

        1. 詳細なエラーメッセージがないとわからないですが
          discord.py[voice]とVoiceVoxはインストール済みで動かない感じですか?
          pycharmはIDEなのでエラーとは関係無いかもです

          1. すみません!まだVoiceVoxはインストールしてなかったです!
            vpsでのインストール方法などはわかりますでしょうか。
            windowsでのインストール方法は出てくるのですが。。。

          2. VoiceVoxの公式サイトからLinux用のshファイルをダウンロードしてください

            必要となるものをインストールする
            sudo apt install curl p7zip fuse libfuse2

            VoiceVoxをインストールする
            bash VOICEVOX.Installer.0.14.7.Linux.sh

            VoiceVoxを起動する
            ~/.voicevox/VOICEVOX.AppImage

            試していないですがこの手順でできるはずです

          3. 以下のようにvpsサーバーで行いました。
            ご確認お願い致します。
            sudo apt install curl

            curl -fsSL https://raw.githubusercontent.com/VOICEVOX/voicevox/0.14.7/build/installer_linux.sh >tmp_voicevox_installer.sh
            VERSION=0.14.7 NAME=linux-nvidia-appimage bash tmp_voicevox_installer.sh
            rm tmp_voicevox_installer.sh

            ubuntu@os3-388-27077:~/DiscordBot$ python3 ~/DiscordBot/yomiage.py
            2023-06-11 19:49:38 INFO discord.client logging in using static token
            2023-06-11 19:49:39 INFO discord.gateway Shard ID None has connected to Gateway (Session ID: a7f762f31fdcdbbe03c017b64256cf1b).
            2023-06-11 19:49:46 INFO discord.voice_client Connecting to voice…
            2023-06-11 19:49:46 INFO discord.voice_client Starting voice handshake… (connection attempt 1)
            2023-06-11 19:49:46 INFO discord.voice_client Voice handshake complete. Endpoint found japan3259.discord.media
            2023-06-11 19:50:46 WARNING discord.gateway Shard ID None has stopped responding to the gateway. Closing and restarting.

            [+] Downloading https://github.com/VOICEVOX/voicevox/releases/download/0.14.7/linux-nvidia-appimage.7z.txt
            % Total % Received % Xferd Average Speed Time Time Time Current
            Dload Upload Total Spent Left Speed
            0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0
            100 205 100 205 0 0 298 0 –:–:– –:–:– –:–:– 298

            [+] Listing of split archives…

            0. VOICEVOX.AppImage.7z.001 1073741824 FFC59402BD3E845AE21F2FA012144FE8
            1. VOICEVOX.AppImage.7z.002 1073741824 A47E0F37C6D4A0D389A672263D3917AA
            2. VOICEVOX.AppImage.7z.003 63884142 AF530D024B961DD2E7BADFA001382FF4

            [+] Downloading https://github.com/VOICEVOX/voicevox/releases/download/0.14.7/VOICEVOX.AppImage.7z.001
            ** Resuming transfer from byte position 960208896
            % Total % Received % Xferd Average Speed Time Time Time Current
            Dload Upload Total Spent Left Speed
            0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0
            100 108M 100 108M 0 0 10.6M 0 0:00:10 0:00:10 –:–:– 11.3M
            [+] Verifying size == 1073741824…
            [-] Size OK
            [+] Verifying hash == FFC59402BD3E845AE21F2FA012144FE8…
            [-] Hash OK
            [+] Downloading https://github.com/VOICEVOX/voicevox/releases/download/0.14.7/VOICEVOX.AppImage.7z.002
            % Total % Received % Xferd Average Speed Time Time Time Current
            Dload Upload Total Spent Left Speed
            0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0
            100 1024M 100 1024M 0 0 11.2M 0 0:01:31 0:01:31 –:–:– 11.3M
            [+] Verifying size == 1073741824…
            [-] Size OK
            [+] Verifying hash == A47E0F37C6D4A0D389A672263D3917AA…
            [-] Hash OK
            [+] Downloading https://github.com/VOICEVOX/voicevox/releases/download/0.14.7/VOICEVOX.AppImage.7z.003
            % Total % Received % Xferd Average Speed Time Time Time Current
            Dload Upload Total Spent Left Speed
            0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0
            100 60.9M 100 60.9M 0 0 9.9M 0 0:00:06 0:00:06 –:–:– 11.3M
            [+] Verifying size == 63884142…
            [-] Size OK
            [+] Verifying hash == AF530D024B961DD2E7BADFA001382FF4…
            [-] Hash OK
            [+] Extracting archive…

            7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
            p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs Intel Core Processor (Broadwell) (306D2),ASM,AES-NI)

            Scanning the drive for archives:
            1 file, 1073741824 bytes (1024 MiB)

            Extracting archive: VOICEVOX.AppImage.7z.001

            Path = VOICEVOX.AppImage.7z.001
            Type = Split
            Physical Size = 1073741824
            Volumes = 3
            Total Physical Size = 2211367790
            —-
            Path = VOICEVOX.AppImage.7z
            Size = 2211367790

            Path = VOICEVOX.AppImage.7z
            Type = 7z
            Physical Size = 2211367790
            Headers Size = 138
            Method = LZMA2:24
            Solid = –
            Blocks = 1

            Everything is Ok

            Size: 2220201174
            Compressed: 2211367790
            [+] Dumping version…
            [+] Creating uninstaller…
            [+] Removing split archives…
            [+] Removing VOICEVOX.AppImage.7z.001…
            [+] Removing VOICEVOX.AppImage.7z.002…
            [+] Removing VOICEVOX.AppImage.7z.003…
            [+] Removing archive list (list.txt)…
            [+] Extacting desktop entry…
            squashfs-root/voicevox.desktop
            squashfs-root/usr/share/icons/hicolor
            squashfs-root/usr/share/icons/hicolor/0x0
            squashfs-root/usr/share/icons/hicolor/0x0/apps
            squashfs-root/usr/share/icons/hicolor/0x0/apps/voicevox.png
            squashfs-root/voicevox.png
            [+] Installing desktop entry…
            [+] Installing icon…
            [+] Registering file association…
            [+] Updating file association database…
            [+] Updating desktop file database…
            [-] Skipped: Command ‘update-desktop-database’ not found
            [+] Removing temporal directory…
            [+] All done! VOICEVOX 0.14.7 has been installed under ‘/home/ubuntu/.voicevox’.ubuntu@os3-388-27077:~/DiscordBot$ rm tmp_voicevox_installer.sh

            実行したら以下のようにでました。
            ubuntu@os3-388-27077:~/DiscordBot$ python3 ~/DiscordBot/yomiage.py
            2023-06-11 19:49:38 INFO discord.client logging in using static token
            2023-06-11 19:49:39 INFO discord.gateway Shard ID None has connected to Gateway (Session ID: a7f762f31fdcdbbe03c017b64256cf1b).
            2023-06-11 19:49:46 INFO discord.voice_client Connecting to voice…
            2023-06-11 19:49:46 INFO discord.voice_client Starting voice handshake… (connection attempt 1)
            2023-06-11 19:49:46 INFO discord.voice_client Voice handshake complete. Endpoint found japan3259.discord.media
            2023-06-11 19:50:46 WARNING discord.gateway Shard ID None has stopped responding to the gateway. Closing and restarting.

          4. これはVoiceVoxをインストールまではしたけど
            VoiceVoxの起動をしていないですよね?

  3. 起動コマンド気づかず、すみません。
    起動コマンドを試したところ、以下のメッセージが出てきました。
    ご確認お願い致します。
    VoiceVoxを起動する
    ~/.voicevox/VOICEVOX.AppImage

    configMigration014: >=0.14 /home/ubuntu/.config/voicevox/config.json exists, do nothing
    [1489344:0613/063554.795211:ERROR:ozone_platform_x11.cc(247)] Missing X server or $DISPLAY
    [1489344:0613/063554.795344:ERROR:env.cc(226)] The platform failed to initialize. Exiting.
    Segmentation fault (core dumped)

    1. 1. X11サーバーをインストールする。
      sudo apt-get install xorg

      2. ローカルディスプレイ環境を設定する。
      export DISPLAY=:0

      ここまでやってVoiceVoxが起動しなかったらまた聞いてください
      でも私の書いたコードへの質問ではなく「VoiceVoxが起動しない」のが問題であるならばVoiceVox公式のサポートに聞いたほうが解決が早いかもしれません。

      1. やってみましたがダメでした。
        ubuntu@os3-388-27077:~/DiscordBot$ 2023-06-14 20:28:59 INFO discord.client logging in using static token
        2023-06-14 20:29:00 INFO discord.gateway Shard ID None has connected to Gateway (Session ID: 70fe25c0b5124888ea88dabc9e4ea85e).
        2023-06-14 20:29:10 INFO discord.voice_client Connecting to voice…
        2023-06-14 20:29:10 INFO discord.voice_client Starting voice handshake… (connection attempt 1)
        2023-06-14 20:29:10 INFO discord.voice_client Voice handshake complete. Endpoint found japan2873.discord.media

      2. 2023-06-14 20:30:10 WARNING discord.gateway Shard ID None has stopped responding to the gateway. Closing and restarting.

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です