こんにちは、神乃木です。
私が投稿しているゆっくり実況動画シリーズは英語にも対応していて、非日本語話者の方に英語での字幕提供をしています。
これにより視聴者層の幅が広がり、海外からのコメントなども付くようになりました。
とはいえ毎回英語字幕を作るために翻訳していたのでは日が暮れるので、翻訳についてはDeepLのAPIサービスを利用し、字幕ファイル(SRTファイル)の行を自動で解析するスクリプトを使って翻訳しています。
この自動変換により、SRT形式の日本語字幕ファイルさえ用意できれば、一文一文を翻訳することなく自動で多言語対応の字幕ファイルを簡単に作成できます。
Linux上でRuby実行環境を整える
本記事はLinux環境の初歩的な知識(コマンドの実行、パッケージのインストール等)が必要です。
この記事で解説している変換スクリプトはRubyを利用しています。またLinux環境でしか動作を確認していないため、可能ならLinux環境を使うことをおすすめします。
なおWindows上でLinuxが実行可能な「WSL」という仕組みがあり、Microsoft StoreからUbuntuをダウンロードすると使えるようになったりもします。
「WSL Ubuntu」でググってUbuntuを起動後、「Ubuntu Ruby インストール」などでぐぐってRubyの実行環境を整えてください。
この辺の記事が参考になると思います。
WindowsでWSL、Ubuntu、Rubyをインストール
ゆっくりムービーメーカーからの出力
※ゆっくりムービーメーカーを利用していない方は読み飛ばしてください。
ゆっくりムービーメーカー(YMM4)は、動画出力時に .sub というファイルを生成できます。このファイルは字幕のタイムコードと字幕の内容が記されたものですが、残念ながら国際準拠している .srt ファイルではないためそのままでは利用できません。このため、以下のスクリプトを使って .subを .srtに変換します。
sub2srt.rb
#!/usr/bin/ruby input = "" begin File.open(ARGV[0]) do |f| input = f.read end rescue print "Failed to open file\n" return end block = input.split("\r\n\r\n") block_number = 1 buffer = "" block.each do | b | lines = b.split("\r\n") # 時刻フォーマット変更 lines[0] = lines[0].gsub(/\.([0-9][0-9][0-9])[0-9][0-9][0-9][0-9]/,".\\1") #ミリ秒切り捨て lines[0] = lines[0].gsub(/([0-9][0-9]:[0-9][0-9]:[0-9][0-9])$/,"\\1\.000") #後半部 小数点なしの場合は付け加える lines[0] = lines[0].gsub(/^([0-9][0-9]:[0-9][0-9]:[0-9][0-9]),/,"\\1\.000,") #前半部 小数点なしの場合は付け加える lines[0] = lines[0].gsub(","," --> ") # コンマ変換 lines[0] = lines[0].gsub(".",",") #ドットをカンマに buffer += block_number.to_s + "\r\n" lines.each do | l | buffer += l + "\r\n" end buffer += "\r\n" block_number += 1 end File.open(ARGV[0]+".srt", mode = "w") do |f| f.write(buffer) end
本ファイルをコピーしたら、 sub2srt.rb というファイル名でLinux環境のファイルに保存します。
あとは `./sub2srt.rb hogehoge.sub` とコマンドを打てば、 hogehoge.sub.srt というファイルが生成され、srt形式になります。
srt形式のファイルを翻訳済にする
.srt形式のファイルは、動画製作業界で広く一般に使われる字幕ファイルです。多くの動画編集ソフトが対応しているので、srtで書き出すことができれば字幕として取り扱うことができます。
まずは以下のスクリプトをコピーし、 srt2deepl.rb というファイル名で保存してください。
次に Ruby で DeepLを利用するために deepl-rb というライブラリをインストールします。 gem install deepl-rb をコマンドで実行します。
#!/usr/bin/ruby require 'deepl' # gem install "deepl-rb" DEEPL_API_KEY = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX:Xx" DeepL.configure do |config| config.auth_key = DEEPL_API_KEY config.host = 'https://api-free.deepl.com' end # ファイル読み込み input ="" begin File.open(ARGV[0]) do |f| input = f.read end rescue print "Failed to open file\n" return end # 改行2連続でブロック分け block = input.split("\r\n\r\n") buffer = "" block.each do | b | lines = b.split("\r\n") translation_target = lines[2..].join(" ") print "処理中:" + translation_target response = DeepL.translate translation_target, 'JA', 'EN' buffer += [lines[0],lines[1], response.text].join("\r\n") buffer += "\r\n" buffer += "\r\n" end File.open(ARGV[0]+"_en.srt", mode = "w") do |f| f.write(buffer) end
DeepLのアカウントを作成してAPIキーを取得
保存したら、スクリプト上部の「 DEEPL_API_KEY 」の部分の「XXXX」を、DeepLのAPIキーに置き換えます。DeepLに開発者アカウント登録をすると、「DeepL APIで使用する認証キー」という項目でAPIキーを参照できるようになります。登録は無料です。
https://www.deepl.com/pro?cta=menu-login-signup/
上記URLから「無料で登録する」を選んで登録を進めましょう。
srtファイルを自動翻訳する
APIキーまで記載したら、あとは実行するだけです。
./srt2deepl.rb hogehoge.srt
とコマンドを打ちます。
するとこんな感じで処理中の文字列が出力されるので、処理が終わるまでじっと待ちます。
後は hogehoge_en.srt というファイルが同じディレクトリに生成されます。
念の為このsrtファイルを動画に読み込んで、字幕のタイミングが正しくあっているかを確認してください。また、機械翻訳である以上翻訳の結果は微妙なことも多いので、必要に応じて修正してください。
なおDeepLのAPIサーバの機嫌が悪かったりすると途中でうまく行かない場合もあります。その時は諦めてリトライしましょう。
翻訳する言語を英語以外に変えたいときは?
対応言語を変えたいときは、スクリプト後半の
response = DeepL.translate translation_target, ‘JA’, ‘EN’
とある部分について、「EN」を「ZH」に変更すれば中国語になります。記号の一覧は以下のページに記載されています。
https://www.deepl.com/docs-api/other-functions/
機械翻訳の結果をより良くするためのポイント
字幕ファイルを機械翻訳するとうまく翻訳できないことも多いです。以下に対応方法を記載します。
固有名詞が上手く翻訳できない
例えば間岩市の場合、「間岩市」はDeepLでは正しく翻訳できません。だいたいは「Ma-Iwa City」とかひどければ「Maziwa」とかになったりします。このため、固有名詞はカタカナにしておくのがおすすめです。翻訳前の.srtファイルを開いて「間岩市」を「マイワ市」などに予め変換しておきましょう。
改行が入っていると文意が正しく伝わらない
日本語の字幕ファイルは可読性を上げるために改行していることも多いと思いますが、本スクリプトでは改行されると1行ずつの翻訳となり、全文で見たときに意味が伝わりづらくなることがあります。
このため、翻訳前のsrtファイルからは改行を取り除いておきましょう。
相槌やくだけた表現に注意
「うむ」「せやな」などのくだけた表現や、ミーム、ダジャレ、特有の構文などはうまく翻訳できない場合が多いので、予め「はい」「そうだね」など、一般的な日本語に直してから翻訳にかけましょう。
コメントを残す