[PYTHON] DeepL übersetzt den YouTube Live-Chat und zeigt ihn in Echtzeit an

Operationsbild

DeepL Übersetzen und in Echtzeit anzeigen. (Rechtes Fenster) メディア1.gif

Auslösen

  1. Ich möchte einen fremdsprachigen Chat auf YouTube Live übersetzen
  2. Wenn Sie mit der rechten Maustaste auf → In Japanisch ins Japanische übersetzen klicken, können Sie Google übersetzen, die Genauigkeit ist jedoch nicht gut.
  3. Die DeepL-Übersetzung scheint genauer zu sein als die Google-Übersetzung (siehe Grafik unten).
  4. Chats fließen von Moment zu Moment, daher ist es mühsam, sie einzeln zu kopieren und in die DeepL-Übersetzungsseite einzufügen.

Basierend auf dem oben Gesagten haben wir ein Programm erstellt, das YouTube Live-Chats tief übersetzt und in Echtzeit anzeigt. image.png https://www.deepl.com/quality.html

Wie benutzt man

image.png

Code

translate_youtube_live_chat_gui.py


#Laden Sie das Modul.
import requests  #HTTP-Kommunikationsbibliothek
import tkinter  # Tcl/Tk Python-Schnittstelle
import time

#Laden Sie die Funktion.
from tkinter import messagebox  #Meldungsfeld erstellen
from joblib import Parallel, delayed
from translator import deepl_translate  #DeepL Übersetzung

# ======================================================================================================================
#Legen Sie die API-URL fest.
YOUTUBE_API_VIDEO_URL = 'https://www.googleapis.com/youtube/v3/videos'  #YouTube-Video
YOUTUBE_API_CHAT_URL = 'https://www.googleapis.com/youtube/v3/liveChat/messages'  #YouTube-Chat

#Legen Sie das Chat-Ladeintervall fest.(Beachten Sie, dass ein Fehler auftritt, wenn Sie es zu kurz machen.)
UPDATE_TIME = 5000  #Millisekunde
# ======================================================================================================================


#Führt die Verarbeitung durch, wenn auf die Schaltfläche geklickt wird.
def click_button():
    #Informationen erhalten Sie über die GUI.
    youtube_live_url = edit_box1.get()  #YouTube Live URL
    youtube_api_key = edit_box2.get()  #YouTube-API-Schlüssel
    deepl_api_key = edit_box3.get()  #DeepL API-Schlüssel
    target_lang = variable.get()  #Übersetzte Sprache

    #Holen Sie sich die Video-ID von der YouTube Live-URL.
    video_id = youtube_live_url.replace('https://www.youtube.com/watch?v=', '')

    #Erfasst die Videodaten der angegebenen Video-ID.
    video_data = requests.get(
        YOUTUBE_API_VIDEO_URL, params={'key': youtube_api_key, 'id': video_id, 'part': 'liveStreamingDetails'}
    ).json()

    #Wenn es nicht YouTube Live ist, wird der Vorgang unterbrochen.
    if len(video_data['items']) == 0:
        messagebox.showerror('URL Error', 'Not Live')
        return  #Verarbeitung anhalten.
    elif 'liveStreamingDetails' not in video_data['items'][0].keys():
        messagebox.showerror('URL Error', 'Not Live')
        return  #Verarbeitung anhalten.
    elif 'activeLiveChatId' not in video_data['items'][0]['liveStreamingDetails'].keys():
        messagebox.showerror('URL Error', 'No Chat')
        return  #Verarbeitung anhalten.

    #Holen Sie sich eine Chat-ID.
    chat_id = video_data['items'][0]['liveStreamingDetails']['activeLiveChatId']

    #Fügen Sie dem Textfeld eine Nachricht hinzu.
    add_message(chat_id, None, youtube_api_key, deepl_api_key, target_lang)  #Setzen Sie den Anfangswert des Seitentokens auf Keine.


#Fügen Sie dem Textfeld eine Nachricht hinzu.
def add_message(chat_id, page_token, youtube_api_key, deepl_api_key, target_lang):
    #Fälle werden nach Vorhandensein oder Nichtvorhandensein von pageToken klassifiziert. Vermeiden Sie es, an Chats vorbei zu kommen.
    if type(page_token) == str:
        #Rufen Sie die Chat-Daten der angegebenen Chat-ID ab.
        chat_data = requests.get(
            YOUTUBE_API_CHAT_URL,
            params={'key': youtube_api_key, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails',
                    'pageToken': page_token}
        ).json()

        #Notieren Sie die Zeit unmittelbar nach der Verwendung der YouTube-API.
        start_time = time.time()

        messages = []
        user_names = []
        for chat_item in chat_data['items']:  #Wiederholen Sie so oft, wie es Chat-Elemente gibt.
            #Erstellen Sie eine Nachrichtenliste.
            messages.append(chat_item['snippet']['displayMessage'])

            #Erstellen Sie eine Benutzernamenliste.
            user_names.append(chat_item['authorDetails']['displayName'])

        #Mit DeepL übersetzen.
        trans_messages = Parallel(n_jobs=-1)(
            [delayed(deepl_translate)(message, target_lang, deepl_api_key) for message in messages]
        )

        for index, trans_message in enumerate(trans_messages):  #Wiederholen Sie diesen Vorgang für die Anzahl der Nachrichten.
            #Holen Sie sich den Benutzernamen.
            user_name = user_names[index]

            #Stellen Sie die Nachricht ein, die im Textfeld angezeigt werden soll.
            display_message = '[' + user_name + '] ' + trans_message  # [Nutzername]+ Übersetzte Nachricht

            #Fügen Sie dem Textfeld eine Nachricht hinzu.
            txt_box.insert(tkinter.END, display_message)
            txt_box.insert(tkinter.END, '\n')
            txt_box.insert(tkinter.END, '\n')

        #Bringen Sie die Bildlaufleiste nach unten.
        txt_box.see('end')

        #Aktualisieren Sie die Fensteranzeige.
        root.update()

    else:  #Wenn pageToken None ist
        #Rufen Sie die Chat-Daten der angegebenen Chat-ID ab.
        chat_data = requests.get(
            YOUTUBE_API_CHAT_URL,
            params={'key': youtube_api_key, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails'}
        ).json()

        #Notieren Sie die Zeit unmittelbar nach der Verwendung der YouTube-API.
        start_time = time.time()

    #Aktualisieren Sie das Seitentoken.
    page_token = chat_data['nextPageToken']

    #Notieren Sie die Zeit unmittelbar vor der Verwendung der YouTube-API.
    end_time = time.time()

    #Berechnen Sie die Zeit, in der Sie die YouTube-API nicht verwenden.
    elapsed_time_s = end_time - start_time  #Sekunden
    elapsed_time_ms = round(elapsed_time_s * 1000)  #Millisekunde

    #Stellen Sie die Wartezeit ein.
    wait_time = max({0, UPDATE_TIME - elapsed_time_ms})

    #Warten Sie auf die angegebene Zeit.
    root.after(wait_time, add_message, chat_id, page_token, youtube_api_key, deepl_api_key, target_lang)


# ======================================================================================================================


#Erstellen Sie ein Fenster.
root = tkinter.Tk()
root.title('YouTube Live Chat DeepL Translator')
root.geometry('600x650')
root.resizable(False, False)

#Erstellen Sie einen Rahmen.
frame = tkinter.Frame(root)
frame.pack()
frame.place(x=0, y=70)

#Erstellen Sie ein Textfeld.
txt_box = tkinter.Text(frame, font=('Arial', 10), width=82, height=29)
y_scroll = tkinter.Scrollbar(frame, orient=tkinter.VERTICAL, command=txt_box.yview)  #Vertikale Bildlaufleiste
y_scroll.pack(side=tkinter.RIGHT, fill='y')  #Vertikale Bildlaufleiste
txt_box['yscrollcommand'] = y_scroll.set  #Vertikale Bildlaufleiste
txt_box.pack()

#Erstellen Sie eine Schaltfläche.
button = tkinter.Button(root, text='Start', font=('Arial', 15), command=click_button)
button.pack()
button.place(x=500, y=20)

#Erstellen Sie ein Etikett.
label1 = tkinter.Label(root, text='YouTube Live URL', font=('Arial', 12))
label1.pack()
label1.place(x=20, y=5)

#Erstellen Sie ein Etikett.
label2 = tkinter.Label(root, text='YouTube API Key', font=('Arial', 10))
label2.pack()
label2.place(x=140, y=590)

#Erstellen Sie ein Etikett.
label3 = tkinter.Label(root, text='DeepL API Key', font=('Arial', 10))
label3.pack()
label3.place(x=370, y=590)

#Erstellen Sie ein Etikett.
label4 = tkinter.Label(root, text='Target Language', font=('Arial', 10))
label4.pack()
label4.place(x=10, y=590)

#Erstelle ein Bearbeitungsfeld, um die YouTube Live-URL einzugeben.
edit_box1 = tkinter.Entry(root, font=('Arial', 12), width=50)
edit_box1.pack()
edit_box1.place(x=20, y=30)

#Erstelle ein Bearbeitungsfeld, um den YouTube-API-Schlüssel einzugeben.
edit_box2 = tkinter.Entry(root, font=('Arial', 10), width=30, show='*')
edit_box2.pack()
edit_box2.place(x=140, y=610)

#Erstellen Sie ein Bearbeitungsfeld, um den DeepL-API-Schlüssel einzugeben.
edit_box3 = tkinter.Entry(root, font=('Arial', 10), width=30, show='*')
edit_box3.pack()
edit_box3.place(x=370, y=610)

#Erstellen Sie ein Pulldown-Menü, um die Übersetzungssprache auszuwählen.
option_list = [
    'German',      # DE
    'English',     # EN
    'French',      # FR
    'Italian',     # IT
    'Japanese',    # JA
    'Spanish',     # ES
    'Dutch',       # NL
    'Polish',      # PL
    'Portuguese',  # PT
    'Russian',     # RU
    'Chinese'      # ZH
]
variable = tkinter.StringVar(root)
variable.set(option_list[4])  # JA
pull_down_menu = tkinter.OptionMenu(root, variable, *option_list)
pull_down_menu.config(width=10, font=('Arial', 10))
pull_down_menu.pack()
pull_down_menu.place(x=10, y=610)

#Zeichne ein Fenster.
root.mainloop()

translator.py


#Laden Sie das Modul.
import requests  #HTTP-Kommunikationsbibliothek

# ======================================================================================================================
#Legen Sie die URL der DeepL-API fest.
DEEPL_API_URL = 'https://api.deepl.com/v2/translate'
# ======================================================================================================================


#Mit DeepL übersetzen.
def deepl_translate(src_text, target_lang, deepl_api_key):
    #Stellen Sie den Code der Übersetzungssprache ein.
    if target_lang == 'German':
        target_lang_code = 'DE'
    elif target_lang == 'English':
        target_lang_code = 'EN'
    elif target_lang == 'French':
        target_lang_code = 'FR'
    elif target_lang == 'Italian':
        target_lang_code = 'IT'
    elif target_lang == 'Japanese':
        target_lang_code = 'JA'
    elif target_lang == 'Spanish':
        target_lang_code = 'ES'
    elif target_lang == 'Dutch':
        target_lang_code = 'NL'
    elif target_lang == 'Polish':
        target_lang_code = 'PL'
    elif target_lang == 'Portuguese':
        target_lang_code = 'PT'
    elif target_lang == 'Russian':
        target_lang_code = 'RU'
    elif target_lang == 'Chinese':
        target_lang_code = 'ZH'
    else:
        target_lang_code = None

    deepl_trans_result = requests.post(
        DEEPL_API_URL, data={"auth_key": deepl_api_key, "text": src_text, "target_lang": target_lang_code}
    ).json()
    trans_text = deepl_trans_result["translations"][0]["text"]

    return trans_text

Recommended Posts

DeepL übersetzt den YouTube Live-Chat und zeigt ihn in Echtzeit an
Holen Sie sich YouTube Live-Chat-Felder in Echtzeit mit API
[Python] Zeigt die verstrichene Zeit in Stunden, Minuten und Sekunden an (00:00:00)
Ich habe den Chat von YouTube Live angezeigt und versucht zu spielen
So generieren Sie QR-Code und Barcode in Python und lesen ihn normal oder in Echtzeit mit OpenCV