英語のsrtファイルを簡単に日本語翻訳する方法

今回は字幕用のファイルであるsrtファイルを英語から日本語に変換する方法について解説していきたいと思います.また,翻訳するのみではなくsrtファイルの形式を整えるファイルも作成したのでこれもお力になれるかと思います.それでは早速解説していきましょう.

はじめに

先日字幕対応ビデオプレイヤーのElmedia Playerを紹介したことかと思いますが今回はそんな字幕を英語から日本語に翻訳したい場合はどうすればいいかというお話についてです.やはり英語字幕で英語の映画を見るのもいいのですがたまには映画館の気持ちで日本語字幕版を見たいですよね.そんな要望に応えるべくネットの海を探し出してきましたので早速英語字幕を日本語訳する方法について解説していきましょう.
ちなみに全てのコードは以下のリポジトリにありますのでご覧ください.ちなみに先人の方のリポジトリをフォークして私が適宜書き換えたものとなります.
https://github.com/Takayamashi/SubtitleTranslate

ディレクトリ内のsrtファイルをフォーマット

というわけで日本語訳について語っていこうかと思ったんですが私のダウンロードしてきたsrtファイルがそのままでは翻訳に突っ込めなかったのでまずはsrtファイルのフォーマットをしていこうかと思います.ちなみに私がダウンロードしてきたsrtファイルは以下のような形式になっていましたので以下の形式を正しいsrtファイルの形式に変更するコードとなっています.ご了承ください.
0
1
00:00:00,360 --> 00:00:00,890
Hi guys.
1

2
00:00:00,900 --> 00:00:02,910
This is Angela from the app brewery.
2
というわけでこのような形式のファイルを以下のようなファイルに変更します.
1
00:00:00,360 --> 00:00:00,890
Hi guys.

2
00:00:00,900 --> 00:00:02,910
This is Angela from the app brewery.
このように変更するコードが以下になります.これはGithubリポジトリにも上がっていますのでそれを参考にしていただいても構いません.ちなみにこれはsrtファイルがあるディレクトリを再起的に検索して全てのsrtファイルに対して処理を行うようにしていますので脳死でpython formatter.py "dir_path"のように実行することでこのdir_path以下のsrtファイルを全て正しい形式にフォーマットすることができます.
import os
import sys

def check(file_path):
    # 処理を記述
    f = open(file_path)
    data = f.read()  # ファイル終端まで全て読んだデータを返す
    f.close()
    lines = data.split('\n')
    output = []
    # print(lines[0])
    if lines[0] == "0" or lines[0] == "":
        for i in range(len(lines)):
            if (i - 4) % 5 != 0 and i != 0:
                output.append(lines[i])
                if i != len(lines)-1:
                    output.append("\n")
    else:
        for i in range(len(lines)):
            output.append(lines[i])
            if i != len(lines)-1:
                output.append("\n")
    
    f = open(file_path, "w")
    f.writelines(output)
    f.close()

def file_check(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
            if filename.endswith('.srt'):
                print("Checking : ", pathname, filename)
                check(os.path.join(pathname,filename))

    print("finished")


def main():
    # Use like [python formatter.py "file_path"]
    ROOT_PATH = str(sys.argv[1])
    file_check(ROOT_PATH)


if __name__ == "__main__":
    main()
まぁ普通に最初の文字が0か何もない状態だったら4, 9, 14…の数列の行を削除していこうという感じです.これで翻訳部分に渡すことができるようになりました.早速翻訳して行っちゃいましょう.

ディレクトリ内のsrtファイルをまとめて翻訳

それでは翻訳に入りましょう.翻訳は先人の方が開発してくださったSubtitleTranslateを使用します.こちらは日本語訳にも対応している優れものであり,翻訳方式もGoogle翻訳を使用したもののようですので翻訳の信頼性もある程度はあるかと思います.というわけで肝心の翻訳部分ですが上記のコードに翻訳部分をくっつけたコードが以下になります.
import os
import sys
from utils import translate_and_compose

def check(file_path):
    # 処理を記述
    f = open(file_path)
    data = f.read()  # ファイル終端まで全て読んだデータを返す
    f.close()
    lines = data.split('\n')
    output = []
    # print(lines[0])
    if lines[0] == "0" or lines[0] == "":
        for i in range(len(lines)):
            if (i - 4) % 5 != 0 and i != 0:
                output.append(lines[i])
                if i != len(lines)-1:
                    output.append("\n")
    else:
        for i in range(len(lines)):
            output.append(lines[i])
            if i != len(lines)-1:
                output.append("\n")
    
    f = open(file_path, "w")
    f.writelines(output)
    f.close()


def translate(pathname, filename):
    translate_and_compose(os.path.join(pathname,filename), os.path.join(pathname,"ja_" + filename), 'en', 'ja')


def file_check(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
            if filename.endswith('.srt'):
                print("Checking : ", pathname, filename)
                check(os.path.join(pathname,filename))
    
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
            if filename.endswith('.srt'):
                print("Translating : ", pathname, filename)
                translate(pathname, filename)

    print("finished")


def main():
    # Use like [python formatter.py "file_path"]
    ROOT_PATH = str(sys.argv[1])
    file_check(ROOT_PATH)


if __name__ == "__main__":
    main()
これで脳死でpython formatter.py "dir_path"を実行することでdir_path以下のsrtファイルを全てフォーマットした後に翻訳することができます.

さいごに

今回は字幕ファイルを英語から日本語に翻訳する手法について解説いたしました.ついでに字幕ファイルのフォーマットについても書きましたがこれが使えるのは一部のファイルのみとなりますので注意してください.それではみなさんも良い字幕ライフをお過ごしください.

0 件のコメント :

コメントを投稿