はじめに
つい最近、Microsoft Teamsのビデオ通話機能に日本語のライブキャプション機能がついたことをこちらの記事で知りました。
実際に試してみると80〜90%くらいの認識精度でライブキャプションが生成されて「これは使えそう!」と直感し、パッと思いついた自然言語処理のツールを使ってWordCloudを作ってみました。
この結果が案外良かったので、今回はサンプルとしてyoutube動画の日本語字幕を取得してwordcloudにする方法を記事にまとめました。
vttファイルとは
Web Video Text Tracksの略でテキストデータファイルです。
字幕やキャプション、説明、章、メタデータなどのWebビデオに関する情報が含まれています。
vttファイルの取得方法
簡単に入手する方法としては、youtubeの字幕がついている動画やMicrosoft TeamsやStreamのトランスクリプションからダウンロードできます。
youtube動画からの字幕の取得方法はこちらの記事が参考になります。
今回使用する動画の字幕(vttファイル)
つい最近見た「ジェイコブス・ラダー」という映画があるのですが、その解説動画がyoutubeに上がっていたのでその字幕を使ってみることにします。
以下をTerminal(Macです)で実行すると動画のvttファイルを取得できます。
今回は取得したvttファイルを”ジェイコブス・ラダー解説動画.vtt”という名前で保存して、Google Colabを使って処理していきます。
$ pip install youtube_dl
$ python3 -m youtube_dl --sub-lang ja --write-auto-sub --skip-download --sub-format vtt -o '%(id)s' https://www.youtube.com/watch?v=tLSc6WyZ0SY
事前準備
日本語のWordCloudを作るために日本語フォントを用意します。
以下ではこちらの記事を参考に、必要なパッケージをインストールして行きます。(以下の処理はすべてGoogle Colabでやっています)
まずはvttファイルを読み込んで行きます。
#Pythonでvttファイルを読み込むためのライブラリをインストール
!pip install webvtt-py
#ライブラリのインポート
import webvtt
import os
#字幕を保存するリストを作成
sentences_sep=[]
#vttファイルの中の時刻を除いた字幕部分だけ取り出す。
#INPUT_PATHはvttファイルの置いてあるGoogle Colabの場所へのパスです。
for caption in webvtt.read(os.path.join(INPUT_PATH, "ジェイコブス・ラダー解説動画.vtt")):
sentences_sep.append(caption.text)
これで出力した結果は以下。
きちんと日本語字幕が取れてますね!
次に、形態素解析の準備をします。
#Mecabのインストール
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
#シンボリックリンクによるエラー回避
!ln -s /etc/mecabrc /usr/local/etc/mecabrc
#辞書(mecab-ipadic-NEologd)のインストール
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1
#Mecab辞書のパス
path = "-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd"
import MeCab
#Taggerインスタンスを作る
mecab = MeCab.Tagger(path)
# 区切ったレス群ごとに形態素解析を実行
chasen_list = [mecab.parse(sentence) for sentence in sentences_sep]
#ノイズ(不要品詞)の除去
word_list = []
for chasen in chasen_list:
for line in chasen.splitlines():
if len(line) <= 1: break
speech = line.split()[-1] ## 品詞情報を抽出
if "名詞" in speech:
if (not "非自立" in speech) and (not "代名詞" in speech) and (not "数" in speech):
word_list.append(line.split()[0])
#単語の連結
word_line = ",".join(word_list)
形態素解析後のword_lineは以下。
いい感じに単語が分割されてまとまっています。
これでWordCloud化の準備完了です!
wordcloudを作る!
日本語のWordCloudを作るためには日本語用のフォントファイルが必要です。
今回はMacの中にデフォルトで入っていた”Arial Unicode.ttf”のファイルをGoogle Colabにアップロードして使用しました。
from wordcloud import WordCloud
f_path = os.path.join(INPUT_PATH, "Arial Unicode.ttf")
stop_words = ["そう","私たち"]#表示しない関係なさそうな言葉を入れておく
#インスタンスの生成(パラメータ設定)
wordcloud = WordCloud(
font_path=f_path, #フォントの指定
width=1024, height=640, #生成画像のサイズの指定
background_color="white", #背景色の指定
stopwords=set(stop_words), #意図的に表示しない単語
max_words=80, #最大単語数
max_font_size=200, min_font_size=5, #フォントサイズの範囲
collocations = False #複合語の表示
)
#文字列を与えてWordCloud画像を生成
output_img = wordcloud.generate(word_line)
#matplotlibで描画
import matplotlib.pyplot as plt
plt.figure(figsize=(18,15)) #figsizeで表示する大きさを指定
plt.imshow(output_img)
plt.axis("off") #目盛りを非表示にする
plt.show()
出力結果は以下になります。
ネタバレになるので映画の中身への言及は避けますが、映画のテーマがきれいに抽出されています。
ジェイコブス・ラダー(1990年)はサイレントヒルの製作に大きく影響を与えた作品と言われていますので、(少し怖いですが)興味のある方は是非観てみてください。
おわりに
今回は、最近の自然言語処理でかなり精度が向上して色々なシーンで使われるようになったライブキャプションの活用先を考える目的で、簡単なWordCloudを作成してみました。
最近ではweb会議が一般的になり、またライブキャプションで自動的に字幕がつくようになっていますので、この情報をうまく使うことで動画を要約したり、何についての動画なのかを、動画を見る前にパッと意味的に理解できるようなサービスを作ることができるかもしれませんね。
需要があるかわかりませんが、参考になれば幸いです。