LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

YouTube subtitle translate example

Last updated at Posted at 2021-02-01

python で書いた YouTube から字幕を取り出すプログラムです。

このページのURL

もし友達とやろうということであれば、この記事を英語とエスペラント語に訳したものを用意したので、英語からヘブライ語、またはエスペラント語からヘブライ語に機械翻訳したらいいと思います。日本語から直接他の言語に訳して、まともに読めるのはトルコ語と韓国語くらいじゃないかという気がしますがどうなんでしょ。
(英語からエスペラント語に、そしてそれをトルコ語に翻訳して、それをまた日本語に翻訳したものを見ることができます。)

English ver.

Esperanta versio

たとえば字幕を取り出そうとする YouTube のタイトルが、

Minecraft 1.7: Modding Tutorial - Episode 1 - Development Environment!*

だとする場合は、 video_id は、最後の文字 11 字です。1
youtube.com/watch?v=0ULz-oCUbEg

video_id
video_id = '0ULz-oCUbEg'

プログラムの中で、こうやって書いて指定すると、Youtube クリップから字幕ファイルがダウンロードされるよ。

動画を見る前に、あらかじめ字幕をながめて、テキストで内容を見て確認したらいいと思います。

google colab グーグルコラボ という WEB サービスで以下の python プログラムが動きます。グーグルコラボはアカウントをつくらないといけないけど、無料で使えます。ブラウザの中で python プログラムを動かすものです。
このプログラムもブラウザの中で動きます。

グーグルコラボの「セル」ってとこに下のコード部分をコピーして、ペーストして、左側の再生ボタンみたいなのを押せば、コードが実行されます。

実際に使っているところ YouTube

この 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
qr-code (4).png

googletrans 対応言語リスト

字幕の言語をプログラムで指定するためのものです。
ヘブライ語はこの2つみたいだね。

  • 'iw': 'hebrew'
  • 'he': 'hebrew'

この上のプログラムの中で dest='ja' という箇所があるんだけど、'ja'ja
panese
で日本語のことなので、ここを、'he''hebrew'、または、'iw' にすればヘブライ語に翻訳されるとおもいます。

また、プログラムの中に ['en'] というところがありますが、english のことで英語ですから、もとの字幕が英語の場合はこのままで、字幕が他の言語だったらば、下のリストから目的の言語を選んで、変更したらいい。

ただ、いまの時点で英語とスペイン語( 'es' 'spanish' )だと上手に自動で字幕をつけてくれるようだけど、他の言語の字幕は自動ではあまりうまくいかないようだけど。

とりあえず、今の状態はもとの字幕が英語で、日本語に翻訳する設定になっているから['en'] から 'ja' です。

ということで python やってみてください。
時間の長いやつはグーグルの翻訳がエラーにはなりますが、YouTube 字幕の翻訳済みのところまでは表示されると思います。
また、番号と文章がセットで YouTube 動画の最後までのセリフが表示されるので、どこまで翻訳されたか確かめることができます。

Language_list

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'
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up