【VBAで正規表現】テキストや字幕の文字列を正規表現で修正、正規表現で手作業の100倍以上速い

正規表現、1時間の作業が1秒で終わった!


動画でExcel正規表現

【VBAで正規表現】テキストや字幕の文字列を正規表現で修正、正規表現で手作業の100倍以上速い、マクロ中級151回

自動で入る動画の字幕って、日本語の場合はとても精度が低いですね。 そういう時の対処は今まで、手作業の修正でした。とても時間がかかります。
そこで正規表現を使った置換をVBAで行う方法をご紹介します。 私の場合、この動画のマクロを使う作業において1時間以上必要でしたが、正規表現を使うことで、1秒で終了しました。 後は、自分専用の同様の置換マクロをあと数本作れば、苦痛だった字幕修正作業も楽になりそうです。

【VBAで正規表現】テキストや字幕の文字列を正規表現で修正

マクロ動画youtube動画の字幕修正を正規表現をつかってやってみた
VBA(Visual Basic for Applications)を使用してテキストや字幕の文字列を正規表現で修正する方法を説明しています。
手作業で修正する場合よりも、正規表現を使うことで作業が100倍以上速くなります。
具体的な修正方法やパターンの設定、を説明しています。 正規表現を使うことで、文字列の一括置換や特定のパターンを検索するなど、効率的な修正が可能です。

【動画の内容】

●目次
00:00 - イントロ
00:30 - テーマ紹介 自動生成の日本語字幕が誤訳だらけ
02:22 - FreeSoftのエディタ「TeraPad」を使って修正する方法
05:53 - ExcelのVBAで正規表現を使って字幕修正する方法、使用方法は2通り
06:32 - VBAで正規表現を使うには、Microsoft VBScript Regular Expressions 5.5
07:03 - サンプルでは、CreateObject関数を使用
07:14 - Microsoft VBScript Regular Expressions 5.5の参照設定の仕方
07:47 - 正規表現を使った置換の変数の説明
09:27 - マクロの重要コード部分、For文で回す、正規表現で置換するコード
10:15 - パターンを変数に入れる、置換後の文字列を指定、変換するコード
12:44 - 15分程度の動画字幕なら、一瞬で完了。
15:27 - Code Time
17:27 - Ending
18:17 - 終了


動画の字幕の修正に時間がかかりすぎる

YouTube の動画の字幕を修正したことがある方の共通の悩みは、自動で作成された字幕の精度とても悪いということだと思います。
日本語の字幕をつけておくと検索にもヒットしやすいし、視聴回数も増えるなどという情報があるので 、YouTuber は必死で字幕をつけようとするわけです。
また日本語の字幕をもとに、英語の字幕が作成されるので、日本語の字幕が正確で、文章の区切りなどを明確にしておいた方が英語への変換もスムーズです。

1. しかし日常会話ならまだしも、プログラム系の日本語訳ははっきり言って無茶苦茶です。その修正の多さにはうんざりとしていました。


TeraPadを使った字幕置換-1

2. そこで最初に、私は普段使っている terapad と言うテキストエディターを使用して、少しでも効率的な字幕修正を行おうと試みました。


TeraPadを使った字幕置換-2

3. TeraPad を使った置換方法を思いついたことはかなり効率化になりました。とはいえ、やはり時間との戦いと言えるやり方でした。


TeraPadを使った字幕置換-3

4. どのような方法かというそのやり方をこれからご紹介しましょう。下記の図は私が長年愛用している Terapad で字幕ファイル. SRC を開いたところです。


TeraPadを使った字幕置換-4

TeraPadで句点「。」をつける

5. TeraPadの置換では\n が使えます。
そこで行末の”です”や”でした”などの後ろに、句読点の句点「。」をつけることにしました。


TeraPadを使った字幕置換-5

6. 上記では「ですよね\n」を「ですよね。\n」に置換
下は「ですね\n」を「ですね。\n」に置換しています。似たような行末の置換を繰り返したあとで、コードの誤変換を訂正します。


TeraPadを使った字幕置換-6

もっと早く修正したい

7. TeraPadを使った字幕修正も、気に入ってはいましたが、Excelマクロのように連続置換ができません。 TeraPadでもマクロが使えるという噂は知っていましたが、その方法がわかりません。
それを探すくらいならExcelで正規表現置換マクロを作成した方が早いと判断したわけです。


TeraPadを使った字幕置換-7

8. Excelシート上に修正した字幕を貼り付けます。


正規表現を使った字幕置換-8

9. Excelのワークシート上で正規表現置換ができないことからもわかるように、Excel単独では正規表現置換ができません。
Excel自体では正規表現を扱えないので、扱うためには方法が2通りあります。


正規表現を使った字幕置換-9

10. ひとつは参照設定から参照可能なライブラリーファイルの中でMicrosoft VBScript RegularExpression 5.5にチェックを入れてあげる方法です。


正規表現を使った字幕置換-10

11.参照設定せずに後から宣言して、CreateObject関数を使ってライブラリのオブジェクトを使うという方法の二通りあります。


正規表現を使った字幕置換-11

12. 今回の説明では、このCreateObject関数を使った説明をしています。


正規表現を使った字幕置換-12
  Dim regEx As Object
  Set regEx

正規置換コードの考え方

13. この字幕はご覧の通り4行が1セットです。


正規表現を使った字幕置換-13

14. そこで、For文を使い、4行ごとに置換をしていこうと考えました。
ただし、1行目、2行目、4行目は明らかに置換の対象外ですので、このFor文は、今回の置換のケースではなくてもOKです。


正規表現を使った字幕置換-14
  For i = 3 To LastR Step 4
  Set rng = ws.Cells(i, 1)
  regEx.Global = True ' 全てのマッチを置換
'         「です」を「です。」に置換(ただし行末の「です」のみ対象)
  strパターン = "です$"
  str置換 = "です。"
  regEx.Pattern = strパターン
  rng.Value = regEx.Replace(rng.Value, str置換)

15. 行末の「です」を strパターン = "です$"に入れ、
str置換 = "です。"
として、「です。」に変換します。
それを


正規表現を使った字幕置換-15

16. 同様に行末の「ます」を「ます。」に変換します。regExのPatternメソッドに当てはめます。


正規表現を使った字幕置換-16

これらのコードの繰り返しにより、字幕修正を行います。
下記は動画で解説したコードです。

  Sub 字幕置換行末メタ文字参照設定なしの場合()
  Dim ws As Worksheet
  Dim rng As Range
  Dim regEx As Object
  Dim strパターン As String
  Dim str置換 As String
  Dim i As Long
  Dim LastR As Long
  
  Set ws = Worksheets("置換用")
  LastR = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

  ' 正規表現オブジェクトの設定
  Set regEx = CreateObject("VBScript.RegExp")
  
  For i = 3 To LastR Step 4
      Set rng = ws.Cells(i, 1)
      
      regEx.Global = True ' 全てのマッチを置換
      
'         「です」を「です。」に置換(ただし行末の「です」のみ対象)
      strパターン = "です$"
      str置換 = "です。"

      regEx.Pattern = strパターン
      rng.Value = regEx.Replace(rng.Value, str置換)
'
      strパターン = "ます$"
      str置換 = "ます。"

      regEx.Pattern = strパターン
      rng.Value = regEx.Replace(rng.Value, str置換)

      strパターン = "ください$"
      str置換 = "ください。"

      regEx.Pattern = strパターン
      rng.Value = regEx.Replace(rng.Value, str置換)

      strパターン = "しました$"
      str置換 = "しました。"

      regEx.Pattern = strパターン
      rng.Value = regEx.Replace(rng.Value, str置換)

  Next i
Debug.Print "Done!"
End Sub

こちらもおすすめ