【Mac】Vimeoの日本語自動生成を修正利用する。


私の場合、Vimeoの一番安いクラスPlusの会員、700円/月、250GBになっています。現在はもうPlusの募集は無く、新体系でStarterが登場し1,200円/月、2TBということになっています。Vimeoの有料会員のサービスに、日本語字幕の自動生成が含まれるようになりました。これを使うのが経済的です。最近、自動生成される文字起こしも、使い物になってきていると感じます。このやり方の何がいいかというと、自分でテキストエディタなどで修正を行なって即反映できること。実は字幕データの修正は、つまり文字の移動や時刻の移動などは、アプリやWeb上で行うより、使い慣れたテキストエディタで行う方がラクです。Vimeoはそうした形での利用に向いています。例えばVimeoの自動字幕起こしを元に作った例は、こんな感じです。

自動字幕起こしにvimeoを使った例_OBS~音声の設定 9分(動画🎥)

字幕起こしについては、色々触ってみましたが、今一番コスパがいいと思うのは、Vimeoです。動画をアップロード→自動字幕起こし→srtをダウンロード→下記の文字修正→テキストエディタ上で文字直し→必要ならFinalCutProへ読み込んで尺の調整→完成アップロード、となります。Vimeoの翻訳レベルは割と高い、句読点、。が入っている点も好みです。

さらに、Vimeoは動画配信をそのまま、差し替え自由、広告なしでやってくれる点を忘れてはなりません。

修正作業を効率化するフロー及びツールを作りましたので、以下にご紹介します。

ポイント解説

1 Vimeoの日本語(自動生成)を利用しダウンロードします。ところが。

ところが、自動生成したものは、下のように、文字と文字の間に、不規則に、空白が入っており、このまま使いたくありません。それから、auto_generated_captions.vttとしてダウンロードされます。つまりvttファイルです。それと連番が0から始まっています。srtは連番は1から始まる必要があり、Final Cut Proで使うためには変換が必要になります。これも全体の流れを複雑にしている理由でもありますが。

Vimeoで最初に自動生成されるvttファイル( auto_generated_captions.vtt )は、上のようにかなり低品質。これを活用するか、別の文字起こしアプリを使うか迷うところだが。。

2 MacのAutomatorを使い、Appleスクリプトを記述します。

(1)文字と文字の空白を削除する。

(2)”–>”の前後の空白も削除されてしまうので、” –> “に置き換える。

(3)先頭行を”WEBVTT “だけにして、2行目に空白行を挿入する。

 Vimeo修正用 Appleスクリプト:コピーしてご利用ください。

「 AppleScriptを実行」を挿入

on run {input, parameters}
	set filePath to POSIX path of input
	
	-- Remove all spaces from the file
	do shell script "sed -i '' -e 's/ //g' " & quoted form of filePath
	
	-- Ensure the arrow has spaces on both sides
	do shell script "sed -i '' -e 's/-->/ --> /g' " & quoted form of filePath
	
	-- Ensure the first line is exactly "WEBVTT"
	do shell script "sed -i '' -e '1s/.*/WEBVTT/' " & quoted form of filePath
	
	return input
end run

3 クイックアクションで、vttファイルを修正します。

コピーしたvttファイルの上で右クリック→クイックアクション→vimeoのvttの修正、を起動します。

すると、以下のように、修正されます。

これを元に、テキストエディットで更に手直しを行い、vttファイルを完成します。それをvimeoの字幕へアップロードします。

上記説明とは直接には関係ありませんが、この際、あると便利なものを作っておきます。

vttからsrt生成、srtからvtt生成についても、あちこちで変換ツールが提供されていますが、Macとして一番使いやすいのは、Finderから対象ファイルの上で右クリックで操作できるのが一番ラクです。そのためのAppleスクリプトは以下です。ご利用ください。

vttからsrt生成兼連番付け直しスクリプト

vttからsrtを作成するときは、連番が0からではなく、1から始まるようにする必要があります。vttファイル上で作業するときに、いくつかの文章行をまとめたり削除したりしますと、当然、連番は変わっていきます。連番の付け直しの作業も行います。つまり、このスクリプトは、vttからsrtを生成するときとsrtの内容を手直しして連番を正しくしたいときに使います。_renumbered.srtが新しくできます。
(1)「 AppleScriptを実行」を挿入

-- 手順1 内容を複製した新たなSRTファイルを作成する。
on run {input, parameters}
	set srtFilePath to POSIX path of (first item of input)
	
	-- 新しいファイル名を作成
	set fileName to do shell script "basename " & quoted form of srtFilePath
	set baseName to text 1 thru ((offset of "." in fileName) - 1) of fileName
	set newFileName to baseName & "_renumbered.srt"
	set newFilePath to (text 1 thru -((count fileName) + 1) of srtFilePath) & newFileName
	
	-- ファイルをコピーして新しいファイルを作成する
	do shell script "cp " & quoted form of srtFilePath & " " & quoted form of newFilePath
	
	-- 次の処理に新しいファイルのパスを渡す
	return {newFilePath}
end run

(2)「 AppleScriptを実行」を挿入

-- 手順2 新しいSRTファイルの内容を更新する。
on run {input, parameters}
	set newFilePath to POSIX path of (first item of input)
	
	-- SRTファイルの内容を読み込む
	set fileContent to read newFilePath as «class utf8»
	set fileLines to paragraphs of fileContent
	
	-- 新しい内容を生成
	set newContent to ""
	set counter to 1
	set lineCount to count of fileLines
	
	repeat with i from 1 to lineCount
		if (item i of fileLines) contains "-->" then
			-- 連番を追加
			set newContent to newContent & (counter as string) & linefeed
			-- 時刻行
			set newContent to newContent & (item i of fileLines) & linefeed
			-- 文章情報行
			if i + 1 ≤ lineCount then
				set newContent to newContent & (item (i + 1) of fileLines) & linefeed
			end if
			-- 空白行
			set newContent to newContent & linefeed
			-- 連番カウンターを増加
			set counter to counter + 1
		end if
	end repeat
	
	-- ファイルに新しい内容を書き込む
	set fileHandle to open for access newFilePath with write permission
	set eof of fileHandle to 0
	write newContent to fileHandle as «class utf8»
	close access fileHandle
	
	return input
end run

srtからvtt生成用Appleスクリプト

(1)「 AppleScriptを実行」を挿入

-- 手順1 内容を複製した新たなvttファイルを作成する。
on run {input, parameters}
	set srtFilePath to POSIX path of input
	
	-- 拡張子をVTTに置き換える
	set newFilePath to replaceExtension(srtFilePath, "vtt")
	
	-- ファイル名を作成する
	set fileName to do shell script "basename " & quoted form of srtFilePath
	set baseName to text 1 thru ((offset of "." in fileName) - 1) of fileName
	set newFileName to baseName & ".vtt"
	
	-- 新しいファイルのパスを生成する
	set newFilePath to (text 1 thru -((count fileName) + 1) of srtFilePath) & newFileName
	
	-- ファイルをコピーして新しいファイルを作成する
	do shell script "cp " & quoted form of srtFilePath & " " & quoted form of newFilePath
	
	-- 手順2に新しいファイルのパスを渡す
	return {newFilePath}
end run

-- 拡張子を置き換える補助関数
on replaceExtension(filePath, newExtension)
	set AppleScript's text item delimiters to "."
	set pathItems to text items of filePath
	set lastItem to last item of pathItems
	set last item of pathItems to newExtension
	set AppleScript's text item delimiters to "."
	set newPath to pathItems as text
	return newPath
end replaceExtension

(2)「 AppleScriptを実行」を挿入

-- 手順2   次に、手順1で新たに作ったVTTファイルに対して、
-- (1) 先頭行に文字列"WEBVTT"を含む行を挿入する。
-- (2) 2行目に空白の行を挿入する。
-- (3) 3行目以降から、読み込んだデータを書き込む。
-- (4) "-->" がある行は、行の中の","を"."に置き換える。

on run {input, parameters}
	set newFilePath to POSIX path of (first item of input)
	
	-- ファイル内容を読み込む
	set fileContent to read newFilePath as «class utf8»
	set fileLines to paragraphs of fileContent
	
	set newContent to "WEBVTT" & linefeed & linefeed
	
	-- 条件に基づいてファイル内容を更新
	repeat with i from 1 to count fileLines
		set lineText to item i of fileLines
		
		if i > 1 then -- 読み込みデータの2行目以降
			if lineText contains "-->" then -- (4)
				set lineText to textReplace(lineText, ",", ".")
			end if
		end if
		
		set newContent to newContent & lineText & linefeed
	end repeat
	
	-- ファイルに新しい内容を書き込む
	set fileHandle to open for access newFilePath with write permission
	set eof of fileHandle to 0
	write newContent to fileHandle as «class utf8»
	close access fileHandle
	
	return input
end run

-- 文字列中の特定の文字を置き換える
on textReplace(inputText, findText, replaceText)
	set AppleScript's text item delimiters to findText
	set textItems to text items of inputText
	set AppleScript's text item delimiters to replaceText
	set newText to textItems as text
	set AppleScript's text item delimiters to ""
	return newText
end textReplace

4 まとめ

補足しますが、Vimeoの自動生成は音声がある場合、作動します

Vimeoの自動生成を使うのは、動画の尺は変えない段階まで来てから、字幕だけ付けるという場合、有効でしょう。あるいはもしFinal Cut Proで動画編集をしているなら、Final Cut Proの字幕ファイル読み込みはsrtファイルだけなので、先に述べてきた通りAppleスクリプトでvtt→srtを生成して、srtを読み込みFinal Cut Proで編集する方法があります。

字幕起こしアプリVrewも、Filmoraも代替方法とします。

ただ、Vimeoの自動生成をテキストエディタで修正したものを、srtとvttを変換しながらFinal Cut Proで修正するのが、そこそこ分かりやすい方法ですが、いかんせん、何回も変換するのは面倒。

使い慣れたテキストエディタが、一番使いやすい!

さて、説明してきたように、Vimeoの自動生成ファイルはvttファイルです。それを手直ししながら全部済むなら一番ラクです。

誰にでも操作できるツールは、Windows、Mac問わず、テキストエディタです。正直言って、字幕起こしアプリの中で、文字を直したり、移動したり、時刻を変更する作業は、どれを使ったとしても、私には、更新に不安定さを感じますし、作業方法があれこれ変えられてしまうアプリ会社の都合も入ってきます。ところが、テキストエディタは、昔から殆ど変わりません。メニューバーも1行程度しかありません。ですから、やることは、

「Vimeo他の自動字幕起こしを行ったら、すぐに自分のテキストエディタへダウンロードをする。
動画を適当なプレーヤーで表示しながら、各字幕の開始時刻、終了時刻、文字の修正を、テキストエディタへ直接書き込む。」

以上のことだけで十分です。

さらにあると便利だと感じるのは、「時刻情報をxxx分xxx秒(いやxxx秒だけの方がわかりやすいかも)、だけズラせ」というスクリプトを動作できるようにすれば、それはさらに便利でしょう。この改善(スクリプトは完成しています。)は後日、ブログで投稿したいと思います。

結論的に言うならば、

簡単な字幕の修正なら、vttファイルのままで、時刻ずらしスクリプトなどを使ってテキストエディタで処理する、複雑な修正なら、連番の付け直しをしてsrtファイルに変換して、Final Cut Proに読み込んで、動画との紐付きを視覚的に確認しながら処理する、と言うことになります。

器材記録:

Vimeo(PLUS会員)
Automator
テキストエディット
Mac mini M2 Ventura
BGM:オリジナル音楽

以上です。