Paradigm Shift Design

ISHITOYA Kentaro's blog.

寝る時間を確保するために、動画の字幕を可能な限り効率的につけたいんだ...

最近、私が小学生の頃から、お世話になっている和久内先生がYoutubeを始めるということで、撮影と編集を手伝っています。

先生のチャンネルは、こちらです。

和久内明 文化・教養チャンネル「現代知の挑戦」

是非、ご覧ください。
できたらチャンネル登録してね。

はじめに

日記です。ログです。

超絶安易な気持ちで、安請け合い

動画を見ていただければわかるんですが、和久内先生がなんらかのテーマに基づいて全編ずっと話している動画なんですね。

で、撮影・編集で一番辛いのテロップを入れることなんですよ。

いやー、最初は軽い気持ちだったんです。

有名なYoutuber、 はじめしゃちょーとか、 ヒカルさんとか、 朝倉未来さんとか、 みてると、ちゃんと全文字起こしして、タイミング合わせて小気味よくテロップが出るんですよ。
音を出せない状況でもみられるように、ってことなのかな。どうなんだろう。

例えばこんな感じ。 www.youtube.com

それで、トークが中心だとやっぱりテロップ必須だよね!って。
しかも、Youtubeの字幕じゃなくて、動画の中に編集で入れた方が文字が大きくて読みやすいよね!って。
思ったんですよ。

Youtubeチャンネルの話を和久内先生としていた時、最初動画編集は外注するって言われて。
いやいやいや、と。
ヒカルさんとか朝倉未来さんとかの大御所でも、外注は雇ってるかもしれないけど、基本的には自分のチームで動画の編集やってるって聞いたことがあったから、 「最初は広告とかもないし、可能な限り低予算で始めましょう!」
「編集も管理も私ができるので任せてください!」
「先生は内容をしっかり考えてください、私が裏方は全部やるので!」
「できるだけ高頻度で、可能なら週2本配信しましょう!」
とか、ノリで言ってきたわけですよ。

いやね、動画の編集とかほとんどやったことないんだけれど、字幕って結局、書き起こしでしょみたいな。
昔、研究室でDiscussion Miningっていう研究を先輩のツッチーがやってて、動画見ながら書きおこししたことがあるから、その時の経験で、まぁ動画時間の3倍くらいで終わるよね!って。
うん、思ってたんですよ。

第1回の動画撮影と編集、無知にもほどがある

それで、第1回の動画を撮影して。
動画編集ならPremiereでしょ!とかいう安易な考えで、操作方法もわかんないのにぐぐりながら動画を読み込んで、動画を聞きつつ、書き起こしをして、タイムラインにエッセンシャルオブジェクトを配置していったわけですよ。

それがこの動画。
youtu.be

あとで字幕のスタイルとか変えたいなと思ったんだけど、動画だけ差し替えたりできないのね。実装のこと考えたらそりゃできないわな、って思うんだけど、差し替えられると思ってたから誤字ってたりします。

いや、それでね、12時間かかったんですよ。編集するのに。
この動画の元素材の長さは16分46秒で、12時間...
動画1分あたりの作業時間43分...???
3倍ってなんの話だったっけ...???

いやいやいや、週2で配信?
仕事しながら24時間捻出すんの?え?
無知にもほどがあるでしょ。

いやいやいや、慣れてなかったから時間かかったんだよと。
慣れてくれば半分くらいにはなるよ...ならないなぁ...

第2回の動画撮影と編集 Google先生に聞く

それで私ぐぐりました。簡単に動画に字幕を入れる方法がないかと。
「動画 字幕 効率」と聞くと、Google先生はいろいろ教えてくれました。

要約すると

  • 文字起こしとオブジェクト配置は別でやろう
  • Excelとかメモ帳で書き起こしをしよう
  • Photoshopでオブジェクト挿入しよう

って感じで。

ほほうと。たしかにPremiereのインターフェース上で書き起こしをすることはなかったなと、思いまして。
ただ、オブジェクト配置はPhotoShopね、ってことで調べたんですが、Premiereに配置した後に文字を修正しようと思うとPhotoShopまで戻らなくてはならないので、廃案で。
とりあえず、書き起こしだけでも使い慣れたエディタで入力してみましょう!ということで。

2本目の動画は、 youtu.be 素材動画が26分57秒...ッ

普通に書き起こしをし始めて、これ音声認識でいけるんじゃないのって。
でググったら、Google Documentsの音声認識がいいと。

ほほー、と思って試してみたんだけど、精度がダメダメ。
音声がきちんと撮れていないのか、あーうーが多いからなのか、ちょっと使い物にならなかった。

それでいろいろまた調べてみると、

という記事を見つけたので、早速Vrew公式サイトからアプリをダウンロードして使ってみた。 音声の認識精度はそこそこ。音声を聞きながらテロップを編集できて便利!とか思ったんだけれど

  • 音声認識がぼろっと落ちている場合がある
  • 認識精度はそこそことは言え、普通に30%くらいは認識間違いをしているので書き起こししないといけない
  • 書き起こしをしないといけないのに、エディタとプレーヤーが使いにくい

という感じで、ちょっと使いにくかった。

で、Vrewの記事読んでたら、Premiereに読み込ませることのできるXML形式がある、というので、ほほぅ、じゃそれを生成すればいいじゃんとなり。コードを書きました。 説明とか書いてないので、使えないかもですが。必要な人がいれば書きます...

github.com

finalcut proのXMLが特殊で、エッセンシャルグラフィックの情報をBASE64エンコードしてるんだけれど、UTF-16LEの文字コードの頭に数バイト変なプレフィックスがついてて、それがないとPremiereで認識してくれないのね。BOMなのかな...よくわかんないから、Premiereで出力したFinalCut ProのXMLの中のデータの一部分を切り取って作ったデータの頭にくっつけてみた。

$styleStartByte = mb_substr(base64_decode("Zg8AAAAAAAB7ACIAbQBTAGgAYQBkAG8"), 0, 8);
// ...
$xpath->query("$clipitemPath/filter[1]/effect/parameter[1]/value")->
  item(0)->nodeValue =
  base64_encode($styleStartByte . mb_convert_encoding(
    sprintf($captionTemplate, $caption->getText()), 'UTF-16LE'));

ら、うごいたので、やっぱなんかついてんだなー、まぁ動いたからいいかーみたいな感じで追求してない。
2-3時間でスクリプトはできて。

ちょっと悩んだのが、タイムライン上で字幕のエッセンシャルグラフィックをどこに置くか。本当はVrewみたいに、発話の頭出しができれば一番いいんだけれど。面倒くさいから、均等割つけにしてみた。まぁ、オブジェクトが自動で挿入されるだけマシだしね。と割り切って。

それで、スクリプトできたから書き起こしだーってことで、楽したいから音声認識サービスをいろいろ探してたんだけど、最終的にnottaというiOSアプリにした。
半年で5000円くらいなんだけど、認識精度が結構高いのと、使い勝手がいいので。
Macのプレビューアプリで、動画の音声だけ取り出して、iCloudに突っ込んで、ファイルをiCloud経由でnottaに読み込ませる。nottaで処理開始すると、1-2分?もっと短いかな。それくらいで処理が完了して、テキストファイルやSRTファイルを出力できる。

AI解析音声自動文字起こしTRASC(トラスク)|IMAGICA Lab. Inc. と言うのもあって、結構認識精度高いんだけど、アプリの方が決済周りとかも楽なんで、notta使うことにした。

そいで、nottaで作った音声認識結果のテキストファイルをコピって、エディタで開いて、時間消して、動画再生しながら誤認識結果を削除したり、フィラーを削除したり、挿入する字幕の文字数に合わせて1行の長さを調整したりして。1.5時間かかんないくらいで終わりました。Premiere上で書き起こしするのに比べて格段に楽だった。
なんで俺はPremiere上で書き起こししてたんだ...?

書き起こしの時って、動画を巻き戻したりしながら音声を何度も聞いて、文字にしていくんだけれど、ちょうどいいプレーヤーがなくて、いろいろプレーヤーとか探しました。
QuickTimePlayer、MKPlayerとか使ってみたのですが、あんまり良くないんだよなーとか我慢しながら使ってた。

完成した、下処理済みのテキストファイルを作ったスクリプトに渡して、

php -f generator.php -- \
  -f 書き起こしした字幕テキスト1行1エッセンシャルグラフィック.txt \
  -o 出力.xml

とコマンドを実行するとFinalCut ProのXMLが出力される。
これをPremiereで読み込んで、均等割つけされたエッセンシャルグラフィックをタイミング設定していくわけですよ。動画に含まれるフィラーを削除したりしながら。
7時間。合計で6.5時間。動画1分あたり、19分。
1本目が、43分だったから倍速以上!!!

第3-6回の動画撮影と編集 ひたすら修練

動画の長さ 作業時間 動画1分の作業時間(分) 手法
第1回 16分46秒 12時間00分 42.9 Premiereで頑張る
第2回 26分57秒 8時間30分 18.9 nottaとスクリプト利用
第3回 13分17秒 4時間03分 18.3 nottaとスクリプト利用
第4回 15分52秒 4時間39分 17.6 nottaとスクリプト利用
第5回 17分56秒 4時間50分 16.2 nottaとスクリプト利用
第6回 22分47秒 5時間51分 15.4 nottaとスクリプト利用

時間が短くなっていってるのは慣れが大きいのと、書き起こしのときにつかうプレーヤーも結果、結局Premiereで再生するのが最強という結論に。ショートカットキーもいろいろ覚えた。

再生・停止(スペースキー)、in点の設定(i)と、in点に移動(Shift-i)、シャトルの巻き戻し・停止・早送り(j/k/l)を覚えれば大体OK。

で、でもやっぱ4時間以上かかるわけですよ。
元動画が短ければいいけど、週2ペースなら、寝る時間削るしかないわけで...

第7回の動画撮影と編集 平均割付から進化

第6回の動画が22分47秒と長かったのもあって、ちょっとこの手法を追求して行って手が早くなったとしても、作業時間の短縮にはつながらないなと悟ってしまったわけです。
Vrewみたいに、発話の頭にエッセンシャルグラフィックを配置できたらもう少し楽なのにな...nottaが出力するテキストファイルに時間ついてたなーということで、 以下のロジックで、人手で謝り訂正したテキストを、nottaの出力したテキストファイルの時間にうまく対応づけしてみようと。

  • まず、nottaで解析したタイムコード付きの文字列を一文字ずつ、時間と対応づける
  • 人手で謝り訂正したテキストの1行ずつをsimilar_textにかける
  • similar_text ( string $string1 , string $string2 [, float &$percent = null ] ) : int
  • string1に人手で謝り訂正したテキストをカタカナに変換したもの
  • string2にstring1の半分〜2倍の長さの文字列を、1文字ずつずらしてカタカナに変換したもの
  • percentが一番高いものを取り出して、移動したインデックス+string2の長さ分インデックスを移動させる
  • その時の最初のindexをstart、最後のindexをendとする
php -f generator.php -- \
  -f 書き起こしした字幕テキスト1行1エッセンシャルグラフィック.txt \
  -c 音声認識エンジンで出力した開始時刻付きのテキスト.txt \
  -o 出力.xml

みたいに動かすと、音声認識エンジンで解析した開始時間付きのテキストに含まれる、謝り訂正した字幕テキストを探して、開始時刻を設定できるようにした。
その結果、大きくずれることもあるけれど、均等割つけをするよりもずっと効率が上がって、1分あたり12分40秒で処理できるようになりました。

おーおー。

第8回の動画撮影と編集 SRTファイルを使おう

nottaの出力するテキストファイルは、開始時刻だけついていて、終了時刻がないので、タイミングの精度がイマイチだった。
SRTファイルのフォーマット見たら、終了時刻もついてるじゃないの。
それで、同じようなロジックで、SRTファイルを読みこんで、終了時刻をみるようにした。

php -f generator.php -- \
  -f 書き起こしした字幕テキスト1行1エッセンシャルグラフィック.txt \
  -c 音声認識エンジンで出力したSRTファイル.srt \
  -o 出力.xml

とかって動かして、ついに動画1分あたり、10分切って、9分45秒!!!

やったー!寝れる!!!!!!

工程管理

ここでは、動画の字幕作成にフォーカスしましたが、工程はWrikeで管理してて、Blue Print用意して、毎回タスク管理しつつ時間計測しています。

f:id:kent013:20201226043853p:plain
WrikeのYoutube動画工程Blue Print

バイトでやってもいいよって言う人がいたら、連絡ください...

まとめ

動画の長さ 作業時間 動画1分の作業時間(分) 手法
第1回 16分46秒 12時間00分 42.9 Premiereで頑張る
第2回 26分57秒 8時間30分 18.9 nottaとスクリプト利用
第3回 13分17秒 4時間03分 18.3 nottaとスクリプト利用
第4回 15分52秒 4時間39分 17.6 nottaとスクリプト利用
第5回 17分56秒 4時間50分 16.2 nottaとスクリプト利用
第6回 22分47秒 5時間51分 15.4 nottaとスクリプト利用
第7回 18分45秒 4時間00分 12.8 nottaの時刻付きテキスト
第8回 15分01秒 2時間28分 9.8 nottaのSRT

SRTファイルに含まれる一つ字幕の長さができるだけ短い方が、より精度高く字幕を発話にマッチングできるんじゃないかなーと思って、いろいろな解析エンジンが出力するSRTファイルを見てみた。
Youtubeの自動解析は、細かく出してくれるんだけど、認識精度が低くて、かつ多分2行にわけて制御する前提なのか字幕と字幕が時間的に被ってたりするので使い物にならず。しかもSRTダウンロードできるようになるまでに2時間とかかかるし。
Vrewは認識できないと、テキスト生成を飛ばしちゃうのでダメで。
いろいろ試したけど、結局nottaが出力するSRTファイルでいいかな、となっています。

本当はjuliusとか使って音声認識しつつDPマッチングして行った方が精度上がるんでしょうけれど。次のトライでやってみようかなと思います。
動画作ってるので、正解があるからDeepLearning使った方がいいかもしれない。

で、どうしてVrew使わないのってとこなんですが

  • 字幕の誤り訂正と、下処理は慣れたテキストエディタの方が楽。リッチなUIとか必要ないし、その方が効率が良い
  • 字幕として出したい文字列やタイミングって、結局Vrewとかが解析したものと違うものになりがち
  • Premiere上でフィラーのトルツメするのとタイミング合わせは同時にやりたい

という要求があり、Vrew使うとむしろ編集に時間かかるんですよね。

とりあえず、10分切ったから、週2で公開しようと思っても、一応寝れる感じにはなってきた、ということでログでした。

スクリプトは使いたい人がいればどうぞ。ちゃんと説明してよ、って言われたら説明書きます。

github.com

長くなっちゃった...

さいごに

和久内明先生の文化・教養チャンネル「現代知の挑戦」は、こちらから。
https://www.youtube.com/channel/UCscmiGezlYmy7UpDxtJBtRA

現時点での最新話は、第8話です。 youtu.be 生き残っていく知ってどんな知なんだろう、残したい知、伝えたい知ってなんだろう。
和久内先生の視点から、いろいろな詩人・小説家・文学作品を紹介しつつ、語るチャンネルです。

興味のある方は是非どうぞ。