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

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

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行までしか対応していません。
 もし、それ以上ある場合はマクロを修正してお使いください。

  • Related Posts

    学生を生成AIで作ろうとしているが….

    生成AIでいろいろと試し中