DeepL Übersetzen und in Echtzeit anzeigen. (Rechtes Fenster)
Basierend auf dem oben Gesagten haben wir ein Programm erstellt, das YouTube Live-Chats tief übersetzt und in Echtzeit anzeigt. https://www.deepl.com/quality.html
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