海外DVD 字幕の付け方 その3

2020年8月8日

前回の続きです。
ダウンロードしてきた、英語の字幕データは下のような感じです。

00:00:16,727 --> 00:00:19,230
He just looks
like another
ball player to me.

これをDeepLで訳すと

00:00:16,727 --> 00:00:19,230
彼はただ見ているだけ
別のように
私にとってのボールプレーヤー。

こんな感じになってしまいます。
これでは意味が分かりません
しかし、元の英語を下のようにすると

00:00:16,727 --> 00:00:19,230
He just looks like another ball player to me.

00:00:16,727 --> 00:00:19,230
彼は私には別の球児にしか見えない。

と翻訳してきます。
見てわかるようにこちらのほうが、意味が分かりやすいと思います。

つまり
英語の字幕は途中で改行しているため
翻訳ツールを使うと1行ずつ翻訳するので
意味が分かりにくくなるということです。

この複数行になっている部分を1行にして翻訳すると
わかりやすい日本語になりやすいということです。

ただし、文が長くなると日本語の字幕も長くなってしまい
画面上ではみ出してしまうことがあるので
長い分は適当なところで改行する必要が出てきます。

この日本語の長い分を開業する作業は1話の中に
それほどないので手作業でいいのですが

英文を1行にする作業はかなりの手間がかかります。
この超人ハルクの場合1話当たりセリフ以外のデータも含め約3000行の
データがあります。

これをひとつづつ手でするには根気がいるので
下のようなエクセルのマクロを作ってみました。
なお、表示幅が小さいので改行がおかしくなっています。
コピーしてメモ帳などに張り付けていただくと
見やすくなると思います。
Sub Sample1()

    '=======================================================================================
    '
    '  途中で改行しているデータを1行にして出力する
    '
    '=======================================================================================

    '===============================
    ' 使用変数の設定
    '===============================
                
    Dim buf                         As String                                   ' 入力ファイル用のワークエリア
    Dim buf2                        As String                                   ' 出力ファイル用のワークエリア
    Dim filename_w                  As String                                   ' 出力ファイル名用のワークエリア

    '===============================
    ' 入力ファイルを開きます
    '===============================
    
    Open Cells(2, 2) For Input As #1                                            ' 入力ファイル名をcells(2,2)に入れます。つまりB2のセルに
    
    '===============================
    ' 出力ファイル名を編集します
    '===============================
    
    filename_w = Mid(Cells(2, 2), 1, Len(Cells(2, 2)) - 4) & "_out" & Right(Cells(2, 2), 4)     ' 入力したファイル名の後ろに_outを付加する
    
    '===============================
    ' 出力ファイルを開きます
    '===============================
    
    Open filename_w For Output As #2
    
    '===============================
    ' メイン処理出力
    '===============================
    
    buf2 = ""                                                                   ' 出力用ワークエリアの初期化
    
    
    Do Until EOF(1)                                                             ' データがなくなるまで処理を繰り返す
        
        Line Input #1, buf                                                      ' 入力データを読み込みます
                
        If IsNumeric(Mid(buf, 1, 1)) = True And Len(buf) = 1 Then               ' 文字長が1で数字の時
            
            If Len(buf2) > 0 Then                                               ' 出力ワークエリアに値が入っていたら出力します。
               Print #2, buf2
               buf2 = ""
            End If
            Print #2, buf                                                       ' 読み込んだデータをそのまま出力します。
        
        Else
            If IsNumeric(Mid(buf, 1, 2)) = True And Len(buf) = 2 Then           ' 文字長が2で数字の時
                    
                If Len(buf2) > 0 Then                                           ' 出力ワークエリアに値が入っていたら出力します。
                    Print #2, buf2
                    buf2 = ""
                End If
                Print #2, buf                                                   ' 読み込んだデータをそのまま出力します。
        
            Else
                If IsNumeric(Mid(buf, 1, 3)) = True And Len(buf) = 3 Then       ' 文字長が3で数字の時
                    
                    If Len(buf2) > 0 Then                                       ' 出力ワークエリアに値が入っていたら出力します。
                        Print #2, buf2
                        buf2 = ""
                    End If
                    Print #2, buf                                               ' 読み込んだデータをそのまま出力します。
                
                Else
                    If IsNumeric(Mid(buf, 1, 4)) = True And Len(buf) = 4 Then   ' 文字長が4で数字の時
                    
                        If Len(buf2) > 0 Then                                   ' 出力ワークエリアに値が入っていたら出力します。
                            Print #2, buf2
                            buf2 = ""
                        End If
                        Print #2, buf                                           ' 読み込んだデータをそのまま出力します。
                    
                    Else
                    
                        If Len(buf) = 0 Then                                    ' 読み込んだデータがNULLの時
                        
                            If Len(buf2) > 0 Then                               ' 出力ワークエリアに値が入っていたら出力します。
                                Print #2, buf2
                                buf2 = ""
                            End If
                            Print #2, buf                                       ' 読み込んだデータをそのまま出力します。
                        
                        Else
                            
                            If InStr(1, buf, "-->") = 0 Then                    ' 読み込んだデータに"-->"が含まれないとき
                            
                                buf2 = buf2 & " " & buf                         ' 出力用ワークエリアにあるデータの後ろに空白を入れた後、入力ワークエリアのデータを加えます
                                
                                If Right(buf, 1) = "." Or Right(buf, 1) = "?" Or Right(buf, 1) = ")" Then   ' 読み込んだデータの最後の文字が「.」「?」「)」なら出力用ワークエリアを出力します。
                                    Print #2, buf2
                                    buf2 = ""
                                End If
                                
                            Else                                                ' 読み込んだデータに"-->"が含まれていたとき
                            
                                Print #2, buf                                   ' 読み込んだデータをそのまま出力します。
                                
                            End If
                        End If
                    End If
                End If
            End If
        End If
                            
                            
    Loop

    Close #1
    Close #2
    

    
End Sub
簡単に内容を書くと
エクセルのB2セルにファイルのパスとファイル名を入れます。
c:\翻訳\01.srt という感じです。

実行すると1行ずつ読んでいき「.」「?」「)」が分の最後に出てくるまで
文字を繋げます。文字と文字の間には空白を入れます。「.」「?」「)」が
出てきたら1行のデータとして出力します。
数字や空行、時間等はそのまま出力します。
処理が終わると元のファイル名に「_out」とついたファイルができます。
この場合だと「c:\翻訳\01_out.srt」というファイルができます

簡単なマクロなので例外的なデータがあった場合は上手く編集できないかも
しれませんが、今のところ問題なく使えています。

まあ、参考程度でご利用ください。
問題が発生しても関知いたしませんのでご容赦ください。
 なお、翻訳はあくまでも自分で購入した海外のDVD等の動画を個人で楽しむために翻訳するものであって、それを一般に公開する目的で翻訳してはいけません。
 実際、自分で日本未公開の映画を自分で翻訳してインターネットで公開した人が著作権違反で逮捕されています。くれぐれもそのようなことは行わないように。もし、この「海外DVD 字幕の付け方」の解説について問題等がございましたらコメントにてご連絡ください。削除もしくは非公開の対応をさせていただきます。
2020/8/5 追加
 上のマクロでは9999行までしか対応していません。
 もし、それ以上ある場合はマクロを修正してお使いください。