[PYTHON] DeepL traduit le chat en direct YouTube et l'affiche en temps réel

Image d'opération

DeepL Traduire et afficher en temps réel. (Fenêtre de droite) メディア1.gif

Déclencheur

  1. Je souhaite traduire un chat en langue étrangère sur YouTube Live
  2. Si vous faites un clic droit → Traduire en japonais sur Chrome, vous pouvez traduire Google, mais la précision n'est pas bonne.
  3. La traduction DeepL semble être plus précise que la traduction Google (voir graphique ci-dessous)
  4. Les discussions circulent d'instant en instant, il est donc difficile de copier et coller sur le site de traduction DeepL un par un.

Sur la base de ce qui précède, nous avons créé un programme qui traduit en profondeur les discussions YouTube Live et les affiche en temps réel. image.png https://www.deepl.com/quality.html

Comment utiliser

image.png

code

translate_youtube_live_chat_gui.py


#Chargez le module.
import requests  #Bibliothèque de communication HTTP
import tkinter  # Tcl/Interface Tk Python
import time

#Chargez la fonction.
from tkinter import messagebox  #Créer une boîte de message
from joblib import Parallel, delayed
from translator import deepl_translate  #Traduction DeepL

# ======================================================================================================================
#Définissez l'URL de l'API.
YOUTUBE_API_VIDEO_URL = 'https://www.googleapis.com/youtube/v3/videos'  #Vidéo Youtube
YOUTUBE_API_CHAT_URL = 'https://www.googleapis.com/youtube/v3/liveChat/messages'  #Chat YouTube

#Définissez l'intervalle de chargement du chat.(Notez que si vous le rendez trop court, une erreur se produira.)
UPDATE_TIME = 5000  #milliseconde
# ======================================================================================================================


#Effectue le traitement lorsque l'utilisateur clique sur le bouton.
def click_button():
    #Obtenez des informations à partir de l'interface graphique.
    youtube_live_url = edit_box1.get()  #URL YouTube en direct
    youtube_api_key = edit_box2.get()  #Clé API YouTube
    deepl_api_key = edit_box3.get()  #Clé API DeepL
    target_lang = variable.get()  #Langue traduite

    #Obtenez l'ID vidéo à partir de l'URL YouTube Live.
    video_id = youtube_live_url.replace('https://www.youtube.com/watch?v=', '')

    #Acquiert les données vidéo de l'ID vidéo spécifié.
    video_data = requests.get(
        YOUTUBE_API_VIDEO_URL, params={'key': youtube_api_key, 'id': video_id, 'part': 'liveStreamingDetails'}
    ).json()

    #S'il ne s'agit pas de YouTube Live, le processus sera interrompu.
    if len(video_data['items']) == 0:
        messagebox.showerror('URL Error', 'Not Live')
        return  #Suspendre le traitement.
    elif 'liveStreamingDetails' not in video_data['items'][0].keys():
        messagebox.showerror('URL Error', 'Not Live')
        return  #Suspendre le traitement.
    elif 'activeLiveChatId' not in video_data['items'][0]['liveStreamingDetails'].keys():
        messagebox.showerror('URL Error', 'No Chat')
        return  #Suspendre le traitement.

    #Obtenez un identifiant de chat.
    chat_id = video_data['items'][0]['liveStreamingDetails']['activeLiveChatId']

    #Ajoutez un message à la zone de texte.
    add_message(chat_id, None, youtube_api_key, deepl_api_key, target_lang)  #Définissez la valeur initiale du jeton de page sur Aucun.


#Ajoutez un message à la zone de texte.
def add_message(chat_id, page_token, youtube_api_key, deepl_api_key, target_lang):
    #Les cas sont classés en fonction de la présence ou de l'absence de pageToken. Évitez de passer les discussions.
    if type(page_token) == str:
        #Obtenez les données de discussion de l'ID de discussion spécifié.
        chat_data = requests.get(
            YOUTUBE_API_CHAT_URL,
            params={'key': youtube_api_key, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails',
                    'pageToken': page_token}
        ).json()

        #Enregistrez l'heure immédiatement après avoir utilisé l'API YouTube.
        start_time = time.time()

        messages = []
        user_names = []
        for chat_item in chat_data['items']:  #Répétez autant de fois qu'il y a d'éléments de chat.
            #Créez une liste de messages.
            messages.append(chat_item['snippet']['displayMessage'])

            #Créez une liste de noms d'utilisateurs.
            user_names.append(chat_item['authorDetails']['displayName'])

        #Traduisez avec DeepL.
        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):  #Répétez pour le nombre de messages.
            #Obtenez le nom d'utilisateur.
            user_name = user_names[index]

            #Définissez le message à afficher dans la zone de texte.
            display_message = '[' + user_name + '] ' + trans_message  # [Nom d'utilisateur]+ Message traduit

            #Ajoutez un message à la zone de texte.
            txt_box.insert(tkinter.END, display_message)
            txt_box.insert(tkinter.END, '\n')
            txt_box.insert(tkinter.END, '\n')

        #Amenez la barre de défilement vers le bas.
        txt_box.see('end')

        #Mettez à jour l'affichage de la fenêtre.
        root.update()

    else:  #Lorsque pageToken est None
        #Obtenez les données de discussion de l'ID de discussion spécifié.
        chat_data = requests.get(
            YOUTUBE_API_CHAT_URL,
            params={'key': youtube_api_key, 'liveChatId': chat_id, 'part': 'id,snippet,authorDetails'}
        ).json()

        #Enregistrez l'heure immédiatement après avoir utilisé l'API YouTube.
        start_time = time.time()

    #Mettez à jour le jeton de page.
    page_token = chat_data['nextPageToken']

    #Enregistrez l'heure immédiatement avant d'utiliser l'API YouTube.
    end_time = time.time()

    #Calculez le temps pendant lequel vous n'utilisez pas l'API YouTube.
    elapsed_time_s = end_time - start_time  #Secondes
    elapsed_time_ms = round(elapsed_time_s * 1000)  #milliseconde

    #Réglez le temps d'attente.
    wait_time = max({0, UPDATE_TIME - elapsed_time_ms})

    #Attendez l'heure spécifiée.
    root.after(wait_time, add_message, chat_id, page_token, youtube_api_key, deepl_api_key, target_lang)


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


#Créez une fenêtre.
root = tkinter.Tk()
root.title('YouTube Live Chat DeepL Translator')
root.geometry('600x650')
root.resizable(False, False)

#Créez un cadre.
frame = tkinter.Frame(root)
frame.pack()
frame.place(x=0, y=70)

#Créez une zone de texte.
txt_box = tkinter.Text(frame, font=('Arial', 10), width=82, height=29)
y_scroll = tkinter.Scrollbar(frame, orient=tkinter.VERTICAL, command=txt_box.yview)  #Barre de défilement verticale
y_scroll.pack(side=tkinter.RIGHT, fill='y')  #Barre de défilement verticale
txt_box['yscrollcommand'] = y_scroll.set  #Barre de défilement verticale
txt_box.pack()

#Créez un bouton.
button = tkinter.Button(root, text='Start', font=('Arial', 15), command=click_button)
button.pack()
button.place(x=500, y=20)

#Créez une étiquette.
label1 = tkinter.Label(root, text='YouTube Live URL', font=('Arial', 12))
label1.pack()
label1.place(x=20, y=5)

#Créez une étiquette.
label2 = tkinter.Label(root, text='YouTube API Key', font=('Arial', 10))
label2.pack()
label2.place(x=140, y=590)

#Créez une étiquette.
label3 = tkinter.Label(root, text='DeepL API Key', font=('Arial', 10))
label3.pack()
label3.place(x=370, y=590)

#Créez une étiquette.
label4 = tkinter.Label(root, text='Target Language', font=('Arial', 10))
label4.pack()
label4.place(x=10, y=590)

#Créez une zone d'édition pour saisir l'URL YouTube Live.
edit_box1 = tkinter.Entry(root, font=('Arial', 12), width=50)
edit_box1.pack()
edit_box1.place(x=20, y=30)

#Créez une zone d'édition pour saisir la clé API YouTube.
edit_box2 = tkinter.Entry(root, font=('Arial', 10), width=30, show='*')
edit_box2.pack()
edit_box2.place(x=140, y=610)

#Créez une zone d'édition pour saisir la clé d'API DeepL.
edit_box3 = tkinter.Entry(root, font=('Arial', 10), width=30, show='*')
edit_box3.pack()
edit_box3.place(x=370, y=610)

#Créez un menu déroulant pour sélectionner la langue de traduction.
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)

#Dessinez une fenêtre.
root.mainloop()

translator.py


#Chargez le module.
import requests  #Bibliothèque de communication HTTP

# ======================================================================================================================
#Définissez l'URL de l'API DeepL.
DEEPL_API_URL = 'https://api.deepl.com/v2/translate'
# ======================================================================================================================


#Traduisez avec DeepL.
def deepl_translate(src_text, target_lang, deepl_api_key):
    #Définissez le code de langue de traduction.
    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 traduit le chat en direct YouTube et l'affiche en temps réel
Obtenez des champs de chat en direct YouTube en temps réel avec l'API
[Python] Afficher le temps écoulé en heures, minutes et secondes (00:00:00)
J'ai affiché le chat de YouTube Live et essayé de jouer
Comment générer un code QR et un code à barres en Python et le lire normalement ou en temps réel avec OpenCV