自動翻訳Try

Python
import requests
from django.views import generic
import os
import time
from natsort import natsorted
from yt_dlp import YoutubeDL
import json
import pyautogui as pg
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
import chromedriver_binary
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import deepl
import whisper
import srt
import datetime


# 必要なデータ
url = "https://www.youtube.com/watch?v=vYZAoZ5Kycc&t=15s"
url2 = "https://www.youtube.com/watch?v=tCKGoND0pS0"
path = "C:/Users/9mlor/OneDrive/デスクトップ/"
language = "ko" # 中国語ならzh 日本語ならja
key = '46e84157-5483-4190-7a2c-463ed2cc3ea7:fx'

# 動画をDLする
# bilibili動画をDLしようとしたらRequested format is not available.のエラーが出た
# 開きたいのはhttps://www.bilibili.com/video/BV1bi42127af/?spm_id_ーーなのに
# 実際に開いたのはhttps://www.bilibili.com/video/BV1bi42127af?p=1だった
opt = {
    'format': 'best',
    'outtmpl': path + 'douga' + '.%(ext)s',
    #'writethumbnail': 'embed-thumbnail',
}
douga = YoutubeDL(opt).download([url])


# 音声を抽出する
option = {
    'format': 'bestaudio/best',
    'outtmpl': path + 'onsei' + '.%(ext)s',
    'postprocessors': [
        {'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192'},
        {'key': 'FFmpegMetadata'},
    ]
}
onsei = YoutubeDL(option).download([url])


# 音声認識
model = whisper.load_model('medium')
audio = whisper.load_audio(path + 'onsei' + '.mp3')
result = model.transcribe(audio, verbose=True, fp16=False)


# 中国語で書かれたSRTファイルの作成
subs = []
for data in result['segments']:
    index = data['id'] + 1
    start = data['start']
    end = data['end']
    text = data['text']
    sub = srt.Subtitle(
        index = 1,
        start = datetime.timedelta(
            seconds = datetime.timedelta(seconds=start).seconds,
            microseconds = datetime.timedelta(seconds=start).microseconds
        ),
        end = datetime.timedelta(
            seconds = datetime.timedelta(seconds=end).seconds,
            microseconds = datetime.timedelta(seconds=end).microseconds
        ),
        content = text,
        proprietary = ''
    )
    subs.append(sub)
with open(path + 'chinese' + '.srt', mode='w', encoding='utf-8') as f:
    f.write(srt.compose(subs))


# 翻訳(出力は英語のみ)
# 中国語の場合、Whisperの誤訳率は15%と日本語の5%よりかなり悪い(声調のせい?方言のせい?)
res = model.transcribe(audio, verbose=True, fp16=False, language=language, task='translate')
print(res['text'])

# 英語で書かれたSRTファイルの作成
subs = []
for data in res['segments']:
    index = data['id'] + 1
    start = data['start']
    end = data['end']
    text = data['text']
    sub = srt.Subtitle(
        index = 1,
        start = datetime.timedelta(
            seconds = datetime.timedelta(seconds=start).seconds,
            microseconds = datetime.timedelta(seconds=start).microseconds
        ),
        end = datetime.timedelta(
            seconds = datetime.timedelta(seconds=end).seconds,
            microseconds = datetime.timedelta(seconds=end).microseconds
        ),
        content = text,
        proprietary = ''
    )
    subs.append(sub)
with open(path + 'english' + '.srt', mode='w', encoding='utf-8') as f:
    f.write(srt.compose(subs))


# 英語から日本語への翻訳
# https://qiita.com/Yas_Suzuki/items/33fd5dba01bd8f8cc347

            ####################
            #TXTファイルの作成(中国語)
            ####################
            #f_txt = open(path + '.txt', mode='w', encoding='utf-8')
            #for sub in pysrt.open(path + '.srt'):
                #f_txt.write(sub.index)
                #f_txt.write(str(sub.start) + ' --> ' + str(sub.end))
                #f_txt.write(sub.text + '\n')
    
            ###########
            #DeepL翻訳
            ###########
            #translator = deepl.Translator(key)
            #with open(path + '.txt', mode='w', encoding='utf-8') as f_china:
            #    for line in f_china:
            #        jpn = translator.translate_text(line, target_lang='JA')
            #        print(jpn)
            
BACK