あらすじ
先輩にBuildのセッションの動画が無料で見れるから勉強のために気になるの見ておくといいよとアドバイスを貰って意気揚々と休日に動画を見ようとする新入社員。
しかし、そこに立ちはだかるのは英語と字幕の壁。
「英語を聞くのが精一杯。内容が頭に入ってこない。発表しているスライド見つつ字幕読むなんて器用なことはできない。末尾"ai"で韻を踏むのは案外できるなー」
現実逃避で落とした視線の先に見えた一筋の光、「Download closed captions」。
その光指すURLの先にあったものは──。
本編
導入
こんにちは。 前回の「HubSpotのラッパー便利」記事を書いたら、同期にラッパー推しでキャラ作ってけと言われた佐藤です。
5月初頭に開催されたMicrosoft Build。
そのセッションがオンデマンドで公開されています。
そこには、セッションの字幕がダウンロードできるページへのリンクが貼られています(赤枠)。
リンクの先はこのように表示される時間と英文がセットになって公開されています。
研究やデータ分析などに使いやすそうな一方で、Google翻訳などの翻訳機に入力すると誤訳が多くなるため、Pythonで途切れ途切れの字幕を文書にするプログラムの作成を行いました。
環境とライブラリ
- Python3
- requests
- beautifulsoup4
- lxml
コード
import requests
from bs4 import BeautifulSoup
import re
#半角英字
alphaReg = re.compile(r'^[a-zA-Z]+')
def isalpha(s):
return alphaReg.match(s) is not None
def main():
video_caption_url = "https://mediusprodstatic.studios.ms/video-19286/TOS-en.vtt?sv=2015-07-08&sr=c&sig=EMVwqmg3Vw%2BZQHDqQ9MP66NPVqCpwP561SyyTfDUAEI%3D&se=2024-05-08T23%3A54%3A12Z&sp=r"
request = requests.get(video_caption_url)
soup = BeautifulSoup(request.text, 'lxml')
body_content_list = soup.body.string.split("\n")[1:]
all_text_list = []
for text in body_content_list:
if isalpha(text):
all_text_list.append(text.replace("\r", ""))
all_text = " ".join(all_text_list)
all_text = all_text.replace(">>", "")
all_sentence_list = all_text.split(".")
video_name = video_caption_url.split("/")[3]
with open(video_name + ".txt", "w")as f:
for sentence in all_sentence_list:
sentence = sentence.replace(" ", " ")
if sentence[0] == " ":
sentence = sentence[1:]
sentence = sentence.lower().capitalize() + ".\n"
f.write(sentence)
if __name__ == "__main__":
main()
実行結果
このように1文ずつに分割することができました。
これにより翻訳機の誤訳が減り、英語と字幕が苦手な私でも発表が聞けそうです。
参考文献
https://qiita.com/matsu0228/items/edf7dbba9b0b0246ef8f https://qiita.com/fujiy/items/f738aa9d0bb7427e07a4
次回予告
途切れ途切れの字幕を1文にしたことで慢心した新入社員。
「Google翻訳に入力して、ざっと読んでから聞けば完璧。Copy, paste, and pray!!」
しかし、その祈りは届かない。
「カンマや接続詞で文章を長くなるような話し言葉は、私にとっては少し難しいです」
そんな雰囲気を纏った翻訳結果に戸惑う新入社員。
「"絶対逃がさない"という英語からの熱い"ai"を感じる。あー、英語から愛されすぎて困っちゃいますねー」
引きつる頬を抑えながら、頑張って読んで視聴した結果とは――?