Programo, kiu ĉerpas subtitolojn de Jutubo skribitaj en python.

#### Programo, kiu ĉerpas subtitolojn de Jutubo skribitaj en python.
[日本語] (https://qiita.com/dauuricus/private/efcab7a2db9c6546ec6a) / [ENGLISH](https://qiita.com/dauuricus/items/75c10efbd0a1411a626e)

![qr-code (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/acaba396-ac0b-c9be-86fe-03af612093b2.png)
La URL de ĉi tiu paĝo estas kodita


Ekzemple vi volas akiri subtitolon de ĉi tiu YouTube-video
#### Minecraft 1.7: Modding Tutorial --Episode 1 --Development Environment!*
https://www.youtube.com/watch?v=0ULz-oCUbEg


```python:video_id
video_id = '0ULz-oCUbEg'
```

Se jes, video_id estas la lastaj 11 signoj.[^1]
youtube.com/watch?v=`0ULz-oCUbEg`

Se vi skribas kaj specifas ĉi tion en la programo, la subteksta dosiero estos elŝutita de la Youtube-klipo.

Antaŭ ol spekti la filmeton, vi devas antaŭe rigardi la subtitolojn kaj kontroli la enhavon en teksto.

[Google Colaboratory] (https://colab.research.google.com/) La sekva '**youtube-subtitle-trans.ipynb**'; pitona programo funkcias per interreta servo nomata Google Colaboratory. Vi devas krei konton por Google colab, sed vi povas uzi ĝin senpage. Ĝi funkciigas pitonan programon en retumilo.
Ĉi tiu programo ankaŭ funkcias en la retumilo.

Kopiu la suban kodon al la "ĉelo" de Google colab, algluu ĝin kaj premu ion kiel la ludbutono maldekstre por ekzekuti la kodon.

[YouTube: efektive uzanta](https://www.youtube.com/watch?v=m2DeTxK6_v0&feature=youtu.be)

Se vi funkcios ĉi tiujn du kaj la instalado sukcesos, la tria iomete pli longa kodo estas la programo por vidi subtitolojn, kaj ĝi funkcios.

#### Instalu du programajn modulojn
**googletrans==4.0.0-rc1**

```Python:GoogleColaboratory
pip install googletrans==4.0.0-rc1
```

**youtube_transcript_api**

```Python:GoogleColaboratory
pip install youtube_transcript_api
```

#### Programo por elŝuti subtekstojn

**youtube-subtitle-trans.ipynb**

```python: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](https://qiita.com/dauuricus/private/e1f63ed93c0bb9fc853e) 
![qr-code (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/6a674765-b373-2f4d-b7ba-74b1a09f8ee0.png)

#### googletrans Listo de subtenataj lingvoj
Ĝi estas por specifi la lingvon de subtekstoj programece.
La hebrea similas al ĉi tiuj du.

* **'iw':'hebrew'**
* **'he':'hebrew'**

En la supra kodo de la programo, ekzistas loko nomata `dest = 'ja'`, `'ja'` estas japana, mi pensas, ke se vi ŝanĝos ĉi tion al `'he'`,`'hebrew'` == hebreo, aŭ `'iw'`, ĝi estos tradukita en la hebrean.

Ankaŭ estas loko nomata `['en']` en la programo-kodo, ĝi signifas anglan ĉar apriora agordo en la programo-modulo 'googletrans' estas angla, se la originala subtitolo estas angla, ĝi estos tia, kia ĝi estas, se la subtitolo estas en alia lingvo, el la suba listo Elektu la deziratan lingvon kaj ŝanĝu ĝin.

Tamen, ĉe ĉi tiu punkto, la angla kaj la hispana ('es', 'spanish') ŝajnas aldoni subtitolojn aŭtomate, sed subtitoloj en aliaj lingvoj ŝajnas ne funkcii tre bone.

Provizore la originalaj subtekstoj estas en la angla kaj estas tradukitaj al la japana, do ĝi estas de `['en']` al `'ja'`.

Do provu python.

Se vi havas longan YouTube-filmeton, Google Translate donos eraron, sed la subtitola traduko montriĝos.
Krome la linio ĝis la fino de la jutuba filmeto montriĝas kiel aro de nombro kaj frazo, do vi povas kontroli ĝis kiom ĝi estis tradukita.

```python:Listo_de_subtenataj_lingvoj
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)
```

| Listo de subtenataj lingvoj |  |  |  |
| --- | --- | --- | --- |
|'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'|'tl': 'filipino'|
|'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'|

[^1]: programming code(https://qiita.com/dauuricus/private/9e70c4c25566fedb9c19)