[PYTHON] Introduction à discord.py (3) Utilisation de la voix

introduction

Je lance un serveur non officiel pour discord.py (bien que certains développeurs). Les questions sont également acceptées ici. Vous pouvez également créer une chaîne personnelle et obtenir une assistance pour ** les personnes qui souhaitent une assistance à long terme **. Si vous souhaitez recevoir une assistance personnalisée, veuillez entrer à partir de l'url d'invitation ci-dessous et DM à «@ Sumidora # 8931». https://discord.gg/KPp2Wsu ** Veuillez également poser des questions sur cet article ici **

À propos de cet article

Cet article est une étude étape par étape de discord.py. Vous apprendrez d'abord la méthode d'écriture de base, puis vous apprendrez le contenu avancé. 【séries】

Présentation de discord.py (1) Présentation de discord.py (2) Présentation de discord.py (3)

Mise en garde

** Cet article est destiné aux personnes qui peuvent même faire un peu de Python. ** ** Cependant, vous pouvez l'utiliser simplement en le copiant, mais vous ne pourrez plus l'écrire après cela, donc si vous souhaitez créer plus de fonctions individuelles, Il est recommandé d'étudier en utilisant des livres, l'apprentissage de paiza, l'installation de points, Progate et Manuel de l'Université de Kyoto. Je vais. Le livre que je recommande est le [Python Startbook] de Shingo Tsuji (https://www.amazon.co.jp/Python Startbook-Augmented Revised Edition-Tsuji-Shingo / dp / 4774196436 /).

L'environnement d'exploitation de l'auteur

Python 3.8.3 Mac OS Catalina 10.15.5 discord.py-1.4.1

À propos de cet article

Dans cet article, ce sera un article qui suivra l'utilisation dans l'ordre, pas le système comme chaque introduction jusqu'à présent.

Installez discord.py avec audio

Jusqu'à présent, vous avez installé pip install discord.py, mais cela n'installe pas la bibliothèque pour l'audio. Par conséquent, vous devez également installer la bibliothèque pour la voix.

pip install discord.py[voice]

Enfin, écrivez [voice] pour installer également la bibliothèque vocale.

Si vous l'avez déjà installé, veuillez le désinstaller d'abord avec pip uninstall discord.py.

Connectez-vous à la voix

Tout d'abord, écrivons le code qui se connecte à la voix.

Cette fois, nous allons créer une fonction pour se connecter en appuyant sur ! Join et nous déconnecter en appuyant sur! Quitter.

Déterminer si l'expéditeur du message est connecté au canal vocal

Si l'expéditeur du message n'est pas connecté à un canal vocal, vous ne saurez pas à quel canal vocal vous connecter.

Nous devons donc d'abord déterminer si l'expéditeur du message est connecté au canal vocal.

Ici, nous utilisons la variable discord.Member.voice. Cette variable renvoie une instance discord.VoiceState si elle était connectée à un canal vocal, et" None "si ce n'était pas le cas.

# in on_message

if message.content == "!join":
    if message.author.voice is None:
        await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
        return
    ...

Connectez-vous au canal vocal

Après avoir jugé dans la section ci-dessus, l'étape suivante consiste à se connecter au canal vocal. Vous pouvez vous connecter avec la fonction de collout discord.VoiceChannel.connect, mais vous devez d'abord obtenir l'instance discord.VoiceChannel.

Vous pouvez également l'obtenir avec la fonction discord.Client.get_channel, mais vous pouvez utiliser la variable discord.VoiceState.channel car c'est aussi une instance de VoiceChannel.

# in on_message

if message.content == "!join":
    if message.author.voice is None:
        await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
        return
    #Connectez-vous au canal vocal
    await message.author.voice.channel.connect()

    await message.channel.send("Connecté.")

Vous pouvez maintenant vous connecter à votre canal vocal!

Se déconnecter du canal vocal

Ensuite, déconnectez-vous du canal vocal. Cela nécessite une méthode légèrement spéciale.

Tout d'abord, pour vous déconnecter du canal vocal, vous devez exécuter la fonction de collout discord.VoiceClient.disconnect, mais vous devez obtenir cette instance discord.VoiceClient de discord.Guild.

voice_client = message.guild.voice_client

Cette valeur sera discord.VoiceClient si connecté, None si non connecté.

Avec ça,


import discord


client = discord.Client()


@client.event
async def on_message(message: discord.Message):
    #Ignorer si l'expéditeur du message est un bot
    if message.author.bot:
        return

    if message.content == "!join":
        if message.author.voice is None:
            await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
            return
        #Connectez-vous au canal vocal
        await message.author.voice.channel.connect()
        await message.channel.send("Connecté.")

    elif message.content == "!leave":
        if message.guild.voice_client is None:
            await message.channel.send("Pas connecté.")
            return

        #Déconnecter
        await message.guild.voice_client.disconnect()

        await message.channel.send("Je me suis déconnecté.")

Vous pouvez écrire comme ça.

Déplacer le canal vocal

Utilisez la fonction de collout discord.VoiceClient.move_to. Passez une instance d'un nouveau canal audio à move_to.

#Accédez au canal vocal où se trouve l'utilisateur qui a envoyé le message
message.guild.voice_client.move_to(message.author.voice.channel)

Lecture / pause audio

Après vous être connecté au canal vocal, jouons la voix. Ici, nous supposons que vous avez un fichier appelé «exemple.mp3».

Vous aurez également besoin de quelque chose appelé ffmpeg, veuillez donc l'inclure (recherchez-le et vous trouverez de nombreuses façons de le saisir).

Essayez de le lire en tapant «! Play».

Lire l'audio


if message.content == "!play":
    if message.guild.voice_client is None:
        await message.channel.send("Pas connecté.")
        return
    message.guild.voice_client.play(discord.FFmpegPCMAudio("example.mp3"))

Vous pouvez jouer avec ça! Étonnamment, la fonction de lecture n'est pas une fonction collout.

Arrête la voix

Vous pouvez faire une pause avec la fonction discord.VoiceClient.pause.

Vous pouvez également arrêter (ne peut pas reprendre) avec la fonction discord.VoiceClient.stop.

Reprendre la lecture audio

La lecture peut être reprise avec la fonction discord.VoiceClient.resume.

Changer le volume de la voix

Il peut être modifié en utilisant discord.PCMVolumeTransformer.

source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio("example.mp3"), volume=0.5)

message.guild.voice_client.play(source)

Vous pouvez spécifier le volume pour le volume. Le volume d'origine est 1 et le plus bas est 0. (La moitié à 0,5)

Écouter de la musique Youtube

Mise en garde

** Le contenu à partir d'ici peut entrer en conflit avec les conditions d'utilisation de Youtube, veuillez donc le faire à vos propres risques. Seul un exemple est montré ici. ** **

Vous pouvez vous référer à ici, mais ce contenu est avancé (difficile à écrire par vous-même), donc c'est facile. Je vais vous présenter ce que j'ai fait.

Tout d'abord, lancez pip install youtube_dl dans le shell pour installer la bibliothèque youtube_dl.

Puis écrivez ceci au début du fichier:


import asyncio

import discord
import youtube_dl
# Suppress noise about console usage from errors
youtube_dl.utils.bug_reports_message = lambda: ''

ytdl_format_options = {
    'format': 'bestaudio/best',
    'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0' # bind to ipv4 since ipv6 addresses cause issues sometimes
}

ffmpeg_options = {
    'options': '-vn'
}

ytdl = youtube_dl.YoutubeDL(ytdl_format_options)


class YTDLSource(discord.PCMVolumeTransformer):
    def __init__(self, source, *, data, volume=0.5):
        super().__init__(source, volume)

        self.data = data

        self.title = data.get('title')
        self.url = data.get('url')

    @classmethod
    async def from_url(cls, url, *, loop=None, stream=False):
        loop = loop or asyncio.get_event_loop()
        data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream))

        if 'entries' in data:
            # take first item from a playlist
            data = data['entries'][0]

        filename = data['url'] if stream else ytdl.prepare_filename(data)
        return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)

C'est à l'adresse https://github.com/Rapptz/discord.py/blob/master/examples/basic_voice.py.

Ensuite, utilisez-le pour lire de la musique sur youtube.


import asyncio

import discord
import youtube_dl
# Suppress noise about console usage from errors
youtube_dl.utils.bug_reports_message = lambda: ''

ytdl_format_options = {
    'format': 'bestaudio/best',
    'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0' # bind to ipv4 since ipv6 addresses cause issues sometimes
}

ffmpeg_options = {
    'options': '-vn'
}

ytdl = youtube_dl.YoutubeDL(ytdl_format_options)


class YTDLSource(discord.PCMVolumeTransformer):
    def __init__(self, source, *, data, volume=0.5):
        super().__init__(source, volume)

        self.data = data

        self.title = data.get('title')
        self.url = data.get('url')

    @classmethod
    async def from_url(cls, url, *, loop=None, stream=False):
        loop = loop or asyncio.get_event_loop()
        data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream))

        if 'entries' in data:
            # take first item from a playlist
            data = data['entries'][0]

        filename = data['url'] if stream else ytdl.prepare_filename(data)
        return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)


client = discord.Client()


@client.event
async def on_message(message: discord.Message):
    #Ignorer si l'expéditeur du message est un bot
    if message.author.bot:
        return

    if message.content == "!join":
        if message.author.voice is None:
            await message.channel.send("Vous n'êtes pas connecté à un canal vocal.")
            return
        #Connectez-vous au canal vocal
        await message.author.voice.channel.connect()
        await message.channel.send("Connecté.")

    elif message.content == "!leave":
        if message.guild.voice_client is None:
            await message.channel.send("Pas connecté.")
            return

        #Déconnecter
        await message.guild.voice_client.disconnect()

        await message.channel.send("Je me suis déconnecté.")
    elif message.content.startswith("!play "):
        if message.guild.voice_client is None:
            await message.channel.send("Pas connecté.")
            return
        #Ne jouez pas si vous jouez
        if message.guild.voice_client.is_playing():
            await message.channel.send("En jouant.")
            return

        url = message.content[6:]
        #Télécharger de la musique sur YouTube
        player = await YTDLSource.from_url(url, loop=client.loop)

        #Reproduire
        await message.guild.voice_client.play(player)

        await message.channel.send('{}Jouer.'.format(player.title))

    elif message.content == "!stop":
        if message.guild.voice_client is None:
            await message.channel.send("Pas connecté.")
            return

        #Ne courez pas si vous ne jouez pas
        if not message.guild.voice_client.is_playing():
            await message.channel.send("Ne joue pas.")
            return

        message.guild.voice_client.stop()

        await message.channel.send("Cela s'est arrêté.")

À la fin

Comment était-ce. J'ai expliqué comment utiliser la voix. Si vous avez d'autres points que vous souhaiteriez que nous expliquions, veuillez les laisser dans les commentaires ou sur le serveur.

Dans le prochain article, j'espère expliquer le cadre des commandes.

Eh bien.

Recommended Posts

Introduction à discord.py (3) Utilisation de la voix
Introduction à discord.py (2)
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Introduction à la simulation d'événements discrets à l'aide de Python # 1
[PyTorch] Introduction à la classification de documents à l'aide de BERT
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction à discord.py (1er jour) -Préparation pour discord.py-
Introduction à Scrapy (4)
Introduction à la simulation d'événements discrets à l'aide de Python # 2
Introduction à Tornado (3): Développement à l'aide de modèles [Pratique]
[PyTorch] Introduction à la classification des documents japonais à l'aide de BERT
Convertir la voix en texte à l'aide du SDK Azure Speech
Introduction à Tornado (2): Introduction au développement à l'aide de modèles - Génération de pages dynamiques -
Une introduction à l'analyse vocale pour les applications musicales
Introduction à Scapy ② (transmission ICMP, HTTP (TCP) avec Scapy)
Premiers pas avec le Web Scraping
Introduction aux baies non paramétriques
Introduction au langage Python
Introduction à la reconnaissance d'image TensorFlow
Introduction à OpenCV (python) - (2)
Introduction à l'injection de dépendances
Introduction à Private Chainer
Introduction à l'apprentissage automatique
[Introduction à Python] Comment arrêter la boucle en utilisant break?
[Introduction à cx_Oracle] (13e) Connexion utilisant le pool de connexions (côté client)
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
[Livre technique] Introduction à l'analyse de données avec Python -1 Chapitre Introduction-
AOJ Introduction à la programmation Sujet 1, Sujet 2, Sujet 3, Sujet 4
Introduction facile au piratage domestique avec Raspberry Pi et discord.py
Introduction au module de papier électronique
Introduction à l'algorithme de recherche de dictionnaire
[Mémorandum d'apprentissage] Introduction à vim
Introduction à PyTorch (1) Différenciation automatique
opencv-python Introduction au traitement d'image
[Introduction à Python] Comment écrire des branches conditionnelles en utilisant des instructions if
Introduction à Python Django (2) Win
Une introduction à l'apprentissage automatique
[Introduction à cx_Oracle] Présentation de cx_Oracle
Jour 67 [Introduction à Kaggle] Avez-vous essayé d'utiliser Random Forest?
Introduction à la détection des anomalies 1 principes de base
Publier sur Twitter en utilisant Python
[Introduction au système] Retracement de Fibonacci ♬
Commencez à Selenium en utilisant python
Introduction à l'optimisation non linéaire (I)
AOJ Introduction à la programmation Sujet n ° 5, Sujet n ° 6
Introduction à la modélisation bayésienne à l'aide de la traduction japonaise pymc3 de modélisation bayésienne en Python (chapitre 0-2)
Introduction de caffe en utilisant pyenv
Introduction au Deep Learning ~ Règles d'apprentissage ~
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python