切り抜きAIの学習データ生成

2年ほど前にミドコロAIと言うVTuberの動画の見所をスコアリングしてくれるAIをつくりました。 当時はLSTM(Long Short-Term Memory)を使ってスコアの計算を学習させたのですが、最近の流行はTransformerに移りつつあると言うことでTransformerで再チャレンジしようと思ってます。

さてAIを作るためにまず必要になるのは教師データです。VTuberの動画は様々な切り抜き動画が存在するので、この切り抜き動画を教師データとして使いたいところです。 切り抜き動画を教師データとするには、オリジナルの動画と切り抜き動画の対応箇所を見つけることがほぼ必須でしょう。2年前もこれに苦戦しました。そこで、今回は前回とは少し違ったアプローチで教師データ作成に取り組んでみました。

過去のアプローチ: 音声波形のマッチング

動画には音声と映像の2つのメディアが含まれています。 VTuberの動画は動きが少ないものが多いため、映像だとどこが同じシーンなのかを見極めるのが難しいです。 そこで音声のほうに注目しました。

単純なアプローチとしては、音の波形を1つずつずらしながら、マッチするところを探していくという方法があります。前回はこのアプローチを使いました。問題点としてはかなりの計算時間が必要になると言うことです。音声の波形データは1秒間に数千から数万のサンプリング点からなっており、それをずらしながら一致を判定するのは大変です。

またそもそも切り抜き動画は必ずしも連続した時間を切り取っているとは限りません。 元動画のいくつかの部分を切り取ってつなげたものを切り抜き動画としている場合もあります。こうなると切り抜き動画をの音声をずらしながら、元動画とマッチさせようとしても一致する部分がそもそもないと言うこともあります。

このように音声波形をマッチングさせると言う単純な方法では問題点が多く、正しく切り抜き動画と元動画の対応を取ることができませんでした。前回はこの問題点に目をつぶり、強引に学習データとして利用していました。

字幕検索というアプローチ

AI作成に再チャレンジするに当たって、VTuberが話す内容でマッチングさせるというアプローチを取るためには、実は音声データは必要ないと気づきました。 YouTubeでは自動で字幕が作成されています。そこで、この字幕を使って切り抜き動画の字幕と元動画の字幕で対応する箇所を検索すれば良さそうです。

特に最近のAIのトレンドであるTransformerはもともと文字列の処理をターゲットとして使われてきました。 おかげで、文字列のAIモデルについては膨大なデータを使って既に学習済みのモデルを利用できます。 そこで学習済モデルを使って字幕の文字列を特徴量にマッピングし、切り抜き動画と元動画で字幕の特徴が一致する箇所を検索します。

方法のメリットは、文章として意味のある単位で区切った状態でマッチングを行うため、波形データを扱うよりも圧倒的にデータ点数が少なくなることです。 また文単位でマッチングさせることで、飛び飛びの切り抜きでも元動画と対応をとることができます。

教師切り抜きマスクの生成

切り抜き動画と類似度の高い部分を1層でない部分は0で表現すると切り抜き部分だけが1であるマスクを教師データとして生成することができます。このマスクをスコアの代わりとして学習すれば切り抜かれやすい部分がスコア1として学習できるでしょう。 言い換えれば、動画の見所をスコアとして表現することができます。

問題は類似のが高い部分が複数出てきたり、どの程度類似度が高いと一致したとみなしていいのかと言う閾値をどう決めるかの問題です。 ここでは確実度の高い切り抜かれ部分を1、切り抜かれてない部分を0、どちらとも言い難い部分を0.5として教師データを生成します。

確実度の高いマッチ

ある切り抜き動画の一部の字幕文章と本動画の文章がマッチした際に、それが対応してると確信して言えるのはどんな時でしょうか。 それは元動画の字幕文章を検索した結果、類似度が最も高いものが100%に近く、かつ、2番目に高いものの差が十分にある時でしょう。 そこで次の判定式を使います。

1 - similarity[1] < similarity[1] - similarity[2]

ここでsimilarity[i]はi番目に高い類似度を表します。この判定式を満たした場合は、確信度が高くマッチしたとして1を割り当てます。

確実度の低いマッチ

確信度の高いものを1としてそれ以外を0とするのもありですが、そうすると0の箇所は「切り抜かれてない確信度が高い」ものと「確信度は低いけど切り抜かれているかもしれない」の両方を表すことになってしまいます。これはちょっと気持ちが悪いので、上の条件式を満たさなかった検索上位の箇所については0.5を割り当てて、検索上位にすら入れなかった部分だけを0にします。

まとめ

切り抜きAIの学習に向けて、元動画と切り抜き動画から教師データ生成を行いました。元動画中で切り抜き動画に対応する部分を検出し、その箇所を1としたマスクを生成しました。次は、元動画を入力してマスク学習させて、各タイミング毎のスコアを計算するAIを作ります(予定)。

コメント

タイトルとURLをコピーしました