####python で書いた YouTube から字幕を取り出すプログラムです。
もし友達とやろうということであれば、この記事を英語とエスペラント語に訳したものを用意したので、英語からヘブライ語、またはエスペラント語からヘブライ語に機械翻訳したらいいと思います。日本語から直接他の言語に訳して、まともに読めるのはトルコ語と韓国語くらいじゃないかという気がしますがどうなんでしょ。
(英語からエスペラント語に、そしてそれをトルコ語に翻訳して、それをまた日本語に翻訳したものを見ることができます。)
####English ver.
####Esperanta versio
たとえば字幕を取り出そうとする YouTube のタイトルが、
####Minecraft 1.7: Modding Tutorial - Episode 1 - Development Environment!*
https://www.youtube.com/watch?v=0ULz-oCUbEg
だとする場合は、 video_id は、最後の文字 11 字です。1
youtube.com/watch?v=0ULz-oCUbEg
video_id = '0ULz-oCUbEg'
プログラムの中で、こうやって書いて指定すると、Youtube クリップから字幕ファイルがダウンロードされるよ。
動画を見る前に、あらかじめ字幕をながめて、テキストで内容を見て確認したらいいと思います。
google colab グーグルコラボ という WEB サービスで以下の python プログラムが動きます。グーグルコラボはアカウントをつくらないといけないけど、無料で使えます。ブラウザの中で python プログラムを動かすものです。
このプログラムもブラウザの中で動きます。
グーグルコラボの「セル」ってとこに下のコード部分をコピーして、ペーストして、左側の再生ボタンみたいなのを押せば、コードが実行されます。
この 2 つを実行して、インストールがうまくいけば、3番目の少し長いコードが字幕を見るためのプログラムなんだけど、それが動くようになります。
####インストール 2 つ
googletrans==4.0.0-rc1
pip install googletrans==4.0.0-rc1
youtube_transcript_api
pip install youtube_transcript_api
####字幕をダウンロードするプログラム
youtube-subtitle-trans.ipynb
from youtube_transcript_api import YouTubeTranscriptApi
from googletrans import Translator
video_id = '0ULz-oCUbEg' ## youtube video_id
line =[]
line[:] = YouTubeTranscriptApi.get_transcript(video_id,languages=['en'])
text_list = []
for l in line:
##print("text: ", l['text'])
##print("start:", l['start'])
##print("duration:", l['duration'])
l['text']=l['text'].strip()
l['text']=l['text'].rstrip('\n')
l['text']=l['text'].replace('\n',' ')
text_list.append(l['text'])
##print(line)
del line
##print(text_list)
print("@dauuricus")
print("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
print("YouTube captions")
print("- - - - - - - - - - - - - - - - - - - YouTube - - - - - - - - - - - - - - - - - - -")
print()
print()
line = YouTubeTranscriptApi.list_transcripts(video_id)
transcript = line.find_transcript(['en'])
##print(transcript.fetch())
for count, dict_obj in enumerate(transcript.fetch()):
print( count +1, dict_obj['text'] )
print()
print()
print("************************************************************************************")
print()
print("Youtube captions")
print("- - - - - - - - - - - - - - - - - - translated - - - - - - - - - - - - - - - - - - -")
print()
print()
translated = transcript.translate('ja')
for count, dict_obj in enumerate(translated.fetch()):
print( count+1, dict_obj['text'] )
print()
print("-----------------------------------------------------------------------------------")
print()
#print("google translate API")
#print("- - - - - - - - - - - - - - - - - googletrans - - - - - - - - - - - - - - - - - -")
print()
print()
####line_list = []
####for l in text_list:
#### line_list.append(l.replace('\n',' '))
##text_list[:] = [a for a in text_list if a != ' ']
##text_list[:] = [l.replace('\n',' ') for l in text_list]
text_compo = [] ##2 lines to 1 line
i = 0
txt = ''
for count,l in enumerate(text_list):
if i == 0:
txt += l
i = i + 1
text_compo.append(txt)
elif i == 1:
txt += ' ' +l
text_compo.pop()
text_compo.append(txt)
i = 0
txt = ''
#for count, l in enumerate(text_list):
# print(count+1,l)
print()
print("************************************************************************************")
print()
#print("google translate API")
#print("- - - - - - - - - - - - - - - - - translated - - - - - - - - - - - - - - - - - - -")
print()
print()
translator = Translator()
#for count, l in enumerate(text_list):
# translated = translator.translate(l, dest='ja')
# ##print(count+1, l)
# print(count+1, translated.text)
#num = 50
#obj_num = 1
#for count, l in enumerate(text_list):
# if count + 1 < num:
# translated = translator.translate(l, dest='ja')
# #print(count+1, l)
# print(count+1, translated.text)
# else:
# translated = translator.translate(l, dest='ja')
# print(count+1, translated.text)
# del translator
# num = num + 50
# obj_num = obj_num + 1
# #print("")
# #print("--- translator :", obj_num)
# #print("")
# translator = Translator()
print()
print("------------------------------------------------------------------------------------")
print()
print("google translate API")
print("- - - - - - - - - - - - - - - - - - 2 lines to 1 - - - - - - - - - - - - - - - - - -")
print()
print()
for count, l in enumerate(text_compo):
print(count+1,l)
print()
print("************************************************************************************")
print()
print("google translate API")
print("- - - - - - - - - - - - - - - - - - translated - - - - - - - - - - - - - - - - - - -")
print()
print()
#for count, l in enumerate(text_compo):
# translated = translator.translate(l, dest='ja')
# ##print(count+1, l)
# print(count+1, translated.text)
num = 30
#obj_num = 1
for count, l in enumerate(text_compo):
if count + 1 < num:
translated = translator.translate(l, dest='ja')
#print(count+1, l)
print(count+1, translated.text)
else:
translated = translator.translate(l, dest='ja')
print(count+1, translated.text)
del translator
num = num + 30
#obj_num = obj_num + 1
#print("")
#print("--- translator :", obj_num)
#print("")
translator = Translator()
print()
print()
print("************************************************************************************")
print()
print("Thank you.")
Cf. full comparison
youtube-VS-googletrans-2.py
####googletrans 対応言語リスト
字幕の言語をプログラムで指定するためのものです。
ヘブライ語はこの2つみたいだね。
- 'iw': 'hebrew'
- 'he': 'hebrew'
この上のプログラムの中で dest='ja'
という箇所があるんだけど、'ja'
は ja panese
で日本語のことなので、ここを、'he'
か'hebrew'
、または、'iw'
にすればヘブライ語に翻訳されるとおもいます。
また、プログラムの中に ['en']
というところがありますが、english のことで英語ですから、もとの字幕が英語の場合はこのままで、字幕が他の言語だったらば、下のリストから目的の言語を選んで、変更したらいい。
ただ、いまの時点で英語とスペイン語( 'es'
'spanish'
)だと上手に自動で字幕をつけてくれるようだけど、他の言語の字幕は自動ではあまりうまくいかないようだけど。
とりあえず、今の状態はもとの字幕が英語で、日本語に翻訳する設定になっているから['en']
から 'ja'
です。
ということで python やってみてください。
時間の長いやつはグーグルの翻訳がエラーにはなりますが、YouTube 字幕の翻訳済みのところまでは表示されると思います。
また、番号と文章がセットで YouTube 動画の最後までのセリフが表示されるので、どこまで翻訳されたか確かめることができます。
import googletrans
box =[]
for i in range(len(googletrans.LANGUAGES)):
box.append(googletrans.LANGUAGES.popitem())
box.reverse()
for num,language in enumerate(box):
print(num,language)
対応言語リスト | |||
---|---|---|---|
'af': 'afrikaans' | 'sq': 'albanian' | 'am': 'amharic' | 'ar': 'arabic' |
'hy': 'armenian' | 'az': 'azerbaijani' | 'eu': 'basque' | 'be': 'belarusian' |
'bn': 'bengali' | 'bs': 'bosnian' | 'bg': 'bulgarian' | 'ca': 'catalan' |
'ceb': 'cebuano' | 'ny': 'chichewa' | 'zh-cn': 'chinese (simplified)' | 'zh-tw': 'chinese (traditional)' |
'co': 'corsican' | 'hr': 'croatian' | 'cs': 'czech' | 'da': 'danish' |
'nl': 'dutch' | 'en': 'english' | 'eo': 'esperanto' | 'et': 'estonian' |
'fi': 'finnish' | 'fr': 'french' | 'fy': 'frisian' | 'gl': 'galician' |
'ka': 'georgian' | 'de': 'german' | 'el': 'greek' | 'gu': 'gujarati' |
'ht': 'haitian creole' | 'ha': 'hausa' | 'haw': 'hawaiian' | 'iw': 'hebrew' |
'he': 'hebrew' | 'hi': 'hindi' | 'hmn': 'hmong' | 'hu': 'hungarian' |
'is': 'icelandic' | 'ig': 'igbo' | 'id': 'indonesian' | 'ga': 'irish' |
'it': 'italian' | 'ja': 'japanese' | 'jw': 'javanese' | 'kn': 'kannada' |
'kk': 'kazakh' | 'km': 'khmer' | 'ko': 'korean' | 'ku': 'kurdish (kurmanji)' |
'ky': 'kyrgyz' | 'lo': 'lao' | 'la': 'latin' | 'lv': 'latvian' |
'lt': 'lithuanian' | 'lb': 'luxembourgish' | 'mk': 'macedonian' | mg': 'malagasy' |
'ms': 'malay' | 'ml': 'malayalam' | 'mt': 'maltese' | 'mi': 'maori' |
'mr': 'marathi' | 'mn': 'mongolian' | 'my': 'myanmar (burmese)' | 'ne': 'nepali' |
'no': 'norwegian' | 'or': 'odia' | 'ps': 'pashto' | 'fa': 'persian' |
'pl': 'polish' | 'pt': 'portuguese' | 'pa': 'punjabi' | 'ro': 'romanian' |
'ru': 'russian' | 'sm': 'samoan' | 'gd': 'scots gaelic' | 'sr': 'serbian' |
'st': 'sesotho' | 'sn': 'shona' | 'sd': 'sindhi' | 'si': 'sinhala' |
'sk': 'slovak' | 'sl': 'slovenian' | 'so': 'somali' | 'es': 'spanish' |
'su': 'sundanese' | 'sw': 'swahili' | 'sv': 'swedish' | 'tg': 'tajik' |
'ta': 'tamil' | 'te': 'telugu' | 'th': 'thai' | 'tr': 'turkish' |
'uk': 'ukrainian' | 'ur': 'urdu' | 'ug': 'uyghur' | 'uz': 'uzbek' |
'vi': 'vietnamese' | 'cy': 'welsh' | 'xh': 'xhosa' | 'yi': 'yiddish' |
'yo': 'yoruba'a | 'zu': 'zulu' |