DeepL Traduire et afficher en temps réel. (Fenêtre de droite)
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. https://www.deepl.com/quality.html
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