はじめに
「LLPlayer」という言語学習に特化した動画プレイヤーを作りました。
Windows にしか現在対応していません。
デモ動画を GitHub に用意したので気になる方はご覧になっていただけるとうれしいです。
GPLライセンスの完全無料のOSSです。
GitHub (ソース、ビルド)
https://github.com/umlx5h/LLPlayer
紹介ホームページ
https://llplayer.com/
機能
他の動画プレイヤーにない言語学習者をサポートするための様々なユニークな機能を備えています。
AI字幕生成 (ASR字幕)
音声から自動で字幕を生成できる OpenAIの Whisper というとんでもないOSSがあります。100言語に現在対応しているようです。
https://github.com/openai/whisper
これの C++版で whisper.cpp というのがあります。
https://github.com/ggerganov/whisper.cpp
これを動画プレイヤーとして統合しました。
AIとタイトルに書いていますが、私がやってることはこのライブラリを動画プレイヤーに統合しているだけになります。
リアルタイムかつストリーム処理を行うため、動画のシーク位置から音声データを取り出し、ffmpeg APIを直接叩きWAVに変換し、Whisper に音声データをオンメモリで渡す実装をしています。
該当コード (たった600行で実装できる非常にシンプルな機能なのがわかります)
https://github.com/umlx5h/LLPlayer/blob/main/FlyleafLib/MediaPlayer/SubtitlesASR.cs
動画の再生位置から音声を取り出すため、例えば2時間ある動画でも任意の位置から字幕を生成できるのです!
非同期で処理されるので 「字幕生成速度 > 動画の再生速度」 となればどんな動画でも一瞬で字幕付きで見ることができます。
(最近のCPU、GPUであればほぼこの状態にできるはずです。)
ffmpegのネイティブAPIを直接叩いているため非常に高速に動作します。
またCUDAやVulkanにも対応しているため、GPUを搭載していればより高速に字幕生成ができます。
またオンラインの動画からもリアルタイムに字幕生成が可能です。
ちなみにこのAI字幕機能は最近ニュースになったVLCと同様だと思います。なお PotPlayer は12月に既に対応していたようです。
VLCにAI字幕作成機能と自動翻訳機能が搭載される予定
https://gigazine.net/news/20250110-vlc-real-time-subtitling/
VLCと差別化するポイントは LLPlayerは言語学習者向けに字幕に関連する機能をたくさん備えている点があります。
(まだVLCが公開されていないので詳細な違いは不明です。)
OCR字幕
動画の字幕にはテキスト字幕とビットマップ字幕の2種類が存在します。
ビットマップ字幕の場合はただの画像データなのでテキストとして処理できませんが、LLPlayerはテキストに変換する機能をデフォルトで備えています。
テキストデータを取り出すことで、翻訳機能や単語検索機能が利用可能になります。
こちらもASR字幕と同じく、現在の再生位置の字幕からOCRを実行します。よって待つ必要はほぼありません。
Tesseract と Microsoft OCRに対応しています。
同様の変換できるツールに SubtitleEdit というツールがありますが
LLPlayer は ffmpeg APIを直接叩き ビットマップデータをOCRエンジンに渡すため非常に高速に動作する利点があります。
しかし SubtitleEdit のようにOCR結果を人力で補正する機能は、ないのでビットマップ字幕の解像度によっては精度は落ちてしまいます。
デュアル字幕
二種類の字幕を同時に表示できます。
内蔵字幕でも外部字幕でもテキスト字幕でもビットマップ字幕でも、あらゆる字幕を2つ表示できます。
デュアル字幕をきちんと実装している動画プレイヤーは自分の知る限りだと PotPlayer だけでそれ以外はほとんど使えないか、実用的でないことがほとんどです。
例えば他の通常のプレイヤーは以下のような問題があります。LLPlayerではこれらすべて解決しています。
- 同じ字幕を同時に表示できない
- UIと統合されておらず隠し機能になってる
- テキスト字幕とビットマップ字幕を同時に表示できない
- 2つの字幕が重なってしまう (オーバーラップする)
- 片方がビットマップ縦字幕の場合うまく表示できない
- それぞれのサイズを個別に調整できない
- 2つの字幕の間隔を調整できない
- 画面外に字幕が出てしまう
- 動画の外の黒背景の領域に字幕を移動できない
- 字幕の縦方向のアライメントをカスタマイズできない
またそれぞれの字幕のサイズや位置を非常に柔軟に調整できるようにしました。
おそらく同程度にカスタマイズできる動画プレイヤーは現状存在しないはずです。
字幕サイドバー
テキスト字幕に加えてビットマップ字幕もサイドバーとして表示できます。
単語検索などが通常の字幕と同様に可能です。
またネタバレ対策機能を備えています。(現在の字幕より後ろを隠す機能)
初見の動画を見るときに便利です。
リアルタイム翻訳
PotPlayer に搭載されている機能ですが、現在位置の字幕を翻訳することができます。
現在はGoogleとDeepLに対応しています。
課題としては動画字幕の場合前後の文脈も考慮した上で翻訳できないため、精度がどうしても低くなるというのがあります。
これの解決方法はいまだにわかっていません。
学習向けに2字幕表示するのであれば精度はある程度許容するしかないと考えています。
単語翻訳、検索
字幕の単語を翻訳したり検索することができます。同時にコピペも可能なのでクリップボードを監視する辞書ツールとの連携も可能です。
(ちなみに英語辞書ツールは LDOCE5Viewer がおすすめです。)
また同様のことを字幕サイドバーでも行えます。
使用技術
言語がC#/.NET9 で UIフレームワークが WPF です。
.NET9にしたのは C# 14? の field キーワードをどうしても使用したかったからです。
動画プレイヤーを0から作るのは難易度と労力があまりにも高すぎるため、以下のFlyleafという.NETのライブラリを使用しました。
https://github.com/SuRGeoNix/Flyleaf
このFlyleafというライブラリはたった1人の方が作られていてシンプルでありながらクオリティが非常に高いのでもっと注目を集まってもいいのにと思っています。
動画プレイヤーを実装するにあたり他のライブラリとして libmpv や libVLC がありますがこれらはすべてCで書かれているとても巨大なライブラリで、ライブラリ側の改造が非常に困難であるため採用しないことにしました。
AI字幕やデュアル字幕などの要件を実現するには 必ずffmpeg APIを直接叩く必要があるのですが、ライブラリ側を修正できないと実装は難しいことが想定されます。
そもそもCライブラリの場合大量の依存を用意し、ビルドすることすら常人には難しいのです。
今回 C#/.NET を初めて触りましたがこれが非常に良かったです。他人のコードをベースにしましたがVisual Studio のデバッガ機能があまりにも強力であるため、コード解析が容易ですし
何よりマネージドな環境では一切メモリリークが発生しないのが良いです。
C# は ネイティブAPIを[DllImport]で 簡単かつ高速に呼び出しできるので、メモリリークが発生する箇所はffmpeg APIを使うネイティブ部分だけに限定できます。これが大きなメリットだと思いました。
またWPFも初めて触りましたが、かなりいい技術だと思いました。
枯れているためChatGPTとの相性が非常に良いです。また見た目とビジネスロジックを完全に分離できるのが非常に良かったです。(あらゆるUIフレームワークで随一かも?)
いわゆる「モダン」じゃないのが逆にいいと思いました。
ローカルLLMの流れが来ているので、もっと使われてもいいなと思いました。
全てC#/WPFなので、Cで書かれている動画プレイヤーより非常に簡単に改造できます。
なぜ作ったか
Netflix や Youtube 用の拡張 で Language Reactor という便利なブラウザ拡張があります。
https://chromewebstore.google.com/detail/language-reactor/hoombieeljmmljlkjmnheibnpciblicm
これと同じことをありとあらゆる動画 (ローカル動画、オンライン動画) でできるようにしたかったので作ることにしました。
既存のプレイヤーだと mpv, VLC, PotPlayer 等を試しましたが、一番まともに使えるのが PotPlayer のみでそれ以外はデュアル字幕などほぼ機能していなかったため作ることにしました。
また日本人英語学習者向けに 英辞郎などの辞書を閲覧、検索できる PDIC というツールがあります。
(新版がでないようですが、書籍の英辞郎 第11版 に付属するツールです)
http://pdic.la.coocan.jp/
これと関連し、ブラウザで任意の英単語を英辞郎で引くことができるツールに Firepop というブラウザ拡張があります。
https://addons.mozilla.org/ja/firefox/addon/firepop/
このFirepopツールの凄いところが、英語の変化形も考慮した上でフレーズを引けるところです。
これは普通の辞書ツールではほとんど対応していないはずです。
英辞郎は大量にフレーズや慣用句のデータがあるため、ここから意味を引けるととっても便利なはずです。
LLPlayerではこの連携機能を日本人向けにこっそり搭載しており、Firepopと同様の方法で文と単語を PDIC に送っているため、英語の意味を簡単に引くことができます。
とりあえずこれを最初に実現しましたが、せっかくなのでASR字幕など様々な機能を実装し、OSSとして公開することにしました。
参考資料
動画プレイヤーでの ffmpeg API の扱い方はほとんど資料がないので困難でしたが、以下を主に参考にしました。
[日本語の情報]
有用な情報を公開していただきありがとうございます!
[英語の情報]
http://dranger.com/ffmpeg/ffmpeg.html
https://github.com/rambod-rahmani/ffmpeg-video-player
情報が非常に少ないため、更に理解力を高めるには mpvやVLCやffplayのコードを読み込んでいくしか方法はなさそうです。
(スクラッチで動画プレイヤーを作っていないので、現状そこまで深く理解できていません。)
今後の展望
今後は特定の言語に特化した機能を追加していきたいです。
例えば英語は需要が高いため、何らかの辞書APIを統合したりすることを考えています。
日本語も世界中にアニメファンが多いため、需要が高いと考えています。なので rikaichamp などのブラウザ拡張を WebView として統合することを考えています。
(すべて自前で実装するのは大変なため、比較的楽な形で統合することを予定)
また現在Windows にしか対応していないので、クロスプラットフォーム(Mac, Linux) にも対応していきたいです。
.NETには Avalonia というクロスプラットフォームのフレームワークがあります。これを使う予定です。
何か要望などありましたらコメントやIssue気軽にお願いします。
いいアイデアかつ実現可能と思ったら積極的に実装していこうと思います。