[PYTHON] Einführung in discord.py (3) Verwenden von Stimme

Einführung

Ich betreibe einen inoffiziellen Server für discord.py (obwohl einige Entwickler). Fragen werden auch hier akzeptiert. Sie können auch einen persönlichen Kanal erstellen und dort Unterstützung für ** Personen erhalten, die langfristige Unterstützung ** wünschen. Wenn Sie persönliche Unterstützung erhalten möchten, geben Sie bitte über die unten stehende Einladungs-URL und DM an "@ Sumidora # 8931" ein. https://discord.gg/KPp2Wsu ** Bitte stellen Sie hier auch Fragen zu diesem Artikel **

Über diesen Artikel

Dieser Artikel ist eine schrittweise Untersuchung von discord.py. Zuerst lernen Sie die grundlegende Schreibmethode und dann den fortgeschrittenen Inhalt. 【Serie】

Einführung in discord.py (1) Einführung in discord.py (2) Einführung in discord.py (3)

Hinweis

** Dieser Artikel ist für Leute, die sogar ein wenig Python können. ** ** ** Sie können es jedoch nur durch Kopieren verwenden. Danach können Sie es jedoch nicht mehr schreiben. Wenn Sie also mehr individuelle Funktionen erstellen möchten, Es wird empfohlen, mit Büchern, Paiza-Lernen, Punktinstallation, Progate, Lehrbuch der Universität Kyoto zu lernen. Ich werde. Das Buch, das ich empfehle, ist Shingo Tsujis [Python Startbook](https://www.amazon.co.jp/Python Startbook-Augmented Revised Edition-Tsuji-Shingo / dp / 4774196436 /).

Die Betriebsumgebung des Autors

Python 3.8.3 Mac OS Catalina 10.15.5 discord.py-1.4.1

Über diesen Artikel

In diesem Artikel wird es sich um einen Artikel handeln, der der Verwendung in der richtigen Reihenfolge folgt, nicht dem System wie bei jeder bisherigen Einführung.

Installieren Sie discord.py mit Audio

Bisher haben Sie mit pip install discord.py installiert, die Bibliothek für Audio wird jedoch nicht installiert. Daher müssen Sie die Bibliothek auch für Sprache installieren.

pip install discord.py[voice]

Schreiben Sie abschließend "[voice]", um auch die Sprachbibliothek zu installieren.

Wenn Sie es bereits installiert haben, deinstallieren Sie es bitte zuerst mit pip uninstall discord.py.

Verbindung zur Sprache herstellen

Schreiben wir zunächst den Code, der die Verbindung zur Stimme herstellt.

Dieses Mal erstellen wir eine Funktion zum Verbinden durch Drücken von "! Join" und zum Trennen durch Trennen von "! Leave".

Stellen Sie fest, ob der Absender der Nachricht mit dem Sprachkanal verbunden ist

Wenn der Absender der Nachricht nicht mit einem Sprachkanal verbunden ist, wissen Sie nicht, mit welchem Sprachkanal eine Verbindung hergestellt werden soll.

Zuerst müssen wir feststellen, ob der Absender der Nachricht mit dem Sprachkanal verbunden ist.

Hier verwenden wir die Variable discord.Member.voice. Diese Variable gibt eine "discord.VoiceState" -Instanz zurück, wenn sie mit einem Sprachkanal verbunden war, und "None", wenn dies nicht der Fall war.

# in on_message

if message.content == "!join":
    if message.author.voice is None:
        await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
        return
    ...

Verbindung zum Sprachkanal herstellen

Nach der Beurteilung im obigen Abschnitt besteht der nächste Schritt darin, eine Verbindung zum Sprachkanal herzustellen. Sie können eine Verbindung mit der Collout-Funktion "discord.VoiceChannel.connect" herstellen, aber zuerst müssen Sie die Instanz "discord.VoiceChannel" abrufen.

Sie können dies auch mit der Funktion "discord.Client.get_channel" abrufen, aber Sie können auch die Variable "discord.VoiceState.channel" verwenden, da es sich auch um eine "VoiceChannel" -Instanz handelt.

# in on_message

if message.content == "!join":
    if message.author.voice is None:
        await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
        return
    #Verbindung zum Sprachkanal herstellen
    await message.author.voice.channel.connect()

    await message.channel.send("In Verbindung gebracht.")

Jetzt können Sie sich mit Ihrem Sprachkanal verbinden!

Trennen Sie die Verbindung zum Sprachkanal

Trennen Sie anschließend die Verbindung zum Sprachkanal. Dies erfordert eine etwas spezielle Methode.

Um die Verbindung zum Sprachkanal zu trennen, müssen Sie zuerst die Collout-Funktion "discord.VoiceClient.disconnect" ausführen, aber Sie müssen diese "discord.VoiceClient" -Instanz von "discord.Guild" abrufen.

voice_client = message.guild.voice_client

Dieser Wert ist "discord.VoiceClient", wenn eine Verbindung besteht, "None", wenn keine Verbindung besteht.

Mit diesem,


import discord


client = discord.Client()


@client.event
async def on_message(message: discord.Message):
    #Ignorieren Sie, wenn der Absender der Nachricht Bot ist
    if message.author.bot:
        return

    if message.content == "!join":
        if message.author.voice is None:
            await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
            return
        #Verbindung zum Sprachkanal herstellen
        await message.author.voice.channel.connect()
        await message.channel.send("In Verbindung gebracht.")

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

        #Trennen
        await message.guild.voice_client.disconnect()

        await message.channel.send("Ich habe die Verbindung getrennt.")

Sie können so schreiben.

Sprachkanal verschieben

Verwenden Sie die Collout-Funktion discord.VoiceClient.move_to. Übergeben Sie eine Instanz eines neuen Audiokanals an move_to.

#Gehen Sie zu dem Sprachkanal, in dem sich der Benutzer befindet, der die Nachricht gesendet hat
message.guild.voice_client.move_to(message.author.voice.channel)

Audio abspielen / anhalten

Lassen Sie uns nach dem Herstellen einer Verbindung zum Sprachkanal die Stimme abspielen. Hier nehmen wir an, dass Sie eine Datei namens "example.mp3" haben.

Sie benötigen auch etwas namens ffmpeg, fügen Sie es also bitte hinzu (suchen Sie danach und Sie werden viele Möglichkeiten finden, es einzugeben).

Versuchen Sie es zu spielen, indem Sie "! Play" eingeben.

Audio abspielen


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

Sie können damit spielen! Überraschenderweise ist die Wiedergabefunktion keine Collout-Funktion.

Stoppen Sie die Stimme

Sie können mit der Funktion discord.VoiceClient.pause pausieren.

Sie können auch mit der Funktion discord.VoiceClient.stop anhalten (nicht fortsetzen).

Setzen Sie die Audiowiedergabe fort

Die Wiedergabe kann mit der Funktion discord.VoiceClient.resume fortgesetzt werden.

Ändern Sie die Lautstärke der Stimme

Sie kann mit discord.PCMVolumeTransformer geändert werden.

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

message.guild.voice_client.play(source)

Sie können das Volumen für das Volumen angeben. Das ursprüngliche Volumen ist 1 und das niedrigste ist 0. (Die Hälfte bei 0,5)

Spielen Sie Youtube-Musik

Hinweis

** Der Inhalt von hier an kann mit den Nutzungsbedingungen von Youtube in Konflikt stehen. Bitte tun Sie dies auf eigenes Risiko. Hier wird nur ein Beispiel gezeigt. ** ** **

Sie können auf [hier] verweisen (https://github.com/Rapptz/discord.py/blob/master/examples/basic_voice.py), aber dieser Inhalt ist fortgeschritten (schwer selbst zu schreiben), daher ist es einfach. Ich werde vorstellen, was ich getan habe.

Führen Sie zuerst pip install youtube_dl in der Shell aus, um die Bibliothek youtube_dl zu installieren.

Dann schreiben Sie dies am Anfang der Datei:


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)

Dies ist unter https://github.com/Rapptz/discord.py/blob/master/examples/basic_voice.py.

Verwenden Sie es dann, um Musik auf Youtube abzuspielen.


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):
    #Ignorieren Sie, wenn der Absender der Nachricht Bot ist
    if message.author.bot:
        return

    if message.content == "!join":
        if message.author.voice is None:
            await message.channel.send("Sie sind nicht mit einem Sprachkanal verbunden.")
            return
        #Verbindung zum Sprachkanal herstellen
        await message.author.voice.channel.connect()
        await message.channel.send("In Verbindung gebracht.")

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

        #Trennen
        await message.guild.voice_client.disconnect()

        await message.channel.send("Ich habe die Verbindung getrennt.")
    elif message.content.startswith("!play "):
        if message.guild.voice_client is None:
            await message.channel.send("Nicht verbunden.")
            return
        #Spielen Sie nicht, wenn Sie spielen
        if message.guild.voice_client.is_playing():
            await message.channel.send("Spielen.")
            return

        url = message.content[6:]
        #Laden Sie Musik von YouTube herunter
        player = await YTDLSource.from_url(url, loop=client.loop)

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

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

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

        #Laufen Sie nicht, wenn Sie nicht spielen
        if not message.guild.voice_client.is_playing():
            await message.channel.send("Nicht spielen.")
            return

        message.guild.voice_client.stop()

        await message.channel.send("Es hat aufgehört.")

Am Ende

Wie war das. Ich erklärte, wie man Sprache benutzt. Wenn Sie weitere Punkte haben, die wir Ihnen erläutern sollen, hinterlassen Sie diese bitte in den Kommentaren oder auf dem Server.

Im nächsten Artikel möchte ich das Befehls-Framework erläutern.

Na dann.

Recommended Posts

Einführung in discord.py (3) Verwenden von Stimme
Einführung in discord.py (2)
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
Einführung in die diskrete Ereignissimulation mit Python # 1
[PyTorch] Einführung in die Dokumentklassifizierung mit BERT
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in discord.py (1. Tag) -Preparation for discord.py-
Einführung in Scrapy (4)
Einführung in die diskrete Ereignissimulation mit Python # 2
Einführung in Tornado (3): Entwicklung mit Vorlagen [Übung]
[PyTorch] Einführung in die Klassifizierung japanischer Dokumente mit BERT
Konvertieren Sie Sprache mit dem Azure Speech SDK in Text
Einführung in Tornado (2): Einführung in die Entwicklung mit Vorlagen - Dynamische Seitengenerierung -
Eine Einführung in die Sprachanalyse für Musik-Apps
Einführung in Scapy ② (ICMP, HTTP (TCP) -Übertragung mit Scapy)
Erste Schritte mit Web Scraping
Einführung in nichtparametrische Felder
Einführung in die Python-Sprache
Einführung in die TensorFlow-Bilderkennung
Einführung in OpenCV (Python) - (2)
Einführung in die Abhängigkeitsinjektion
Einführung in Private Chainer
Einführung in das maschinelle Lernen
[Einführung in Python] Wie stoppe ich die Schleife mit break?
[Einführung in cx_Oracle] (13.) Verbindung über Verbindungspool (Client-Seite)
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
[Technisches Buch] Einführung in die Datenanalyse mit Python -1 Kapitel Einführung-
AOJ Einführung in die Programmierung Thema Nr. 1, Thema Nr. 2, Thema Nr. 3, Thema Nr. 4
Einfache Einführung in Home Hack mit Raspberry Pi und discord.py
Einführung in das elektronische Papiermodul
Einführung in den Wörterbuch-Suchalgorithmus
[Lernmemorandum] Einführung in vim
Einführung in PyTorch (1) Automatische Differenzierung
opencv-python Einführung in die Bildverarbeitung
[Einführung in Python] Wie man bedingte Verzweigungen mit if-Anweisungen schreibt
Einführung in Python Django (2) Win
Eine Einführung in das maschinelle Lernen
[Einführung in cx_Oracle] Übersicht über cx_Oracle
Tag 67 [Einführung in Kaggle] Haben Sie versucht, Random Forest zu verwenden?
Einführung in die Anomalieerkennung 1 Grundlagen
Mit Python auf Twitter posten
[Einführung in Systre] Fibonacci Retracement ♬
Starten Sie mit Python zu Selen
Einführung in die nichtlineare Optimierung (I)
AOJ Einführung in die Programmierung Thema Nr. 5, Thema Nr. 6
Einführung in die Bayes'sche Modellierung mit pymc3 Bayesianische Modellierung in Python Japanische Übersetzung (Kapitel 0-2)
Einführung von Kaffee mit Pyenv
Einführung in Deep Learning ~ Lernregeln ~
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung