はじめに
こんにちは、FANTECH本部の前田(@arabian9ts)です。
私の所属する事業部では、海外展開を行っている複数事業において、ファンコミュニティサービスや動画配信プラットフォームを運用しています。
その中で、アーティストの海外進出を支援するための技術的な取り組みの一部である、ライブ配信中の多言語字幕機能をリリースしたので、そのシステムについてご紹介します。
なお、ライブ配信中の字幕機能については、今後の海外展開戦略の一部であり、現在も海外を意識した技術投資を行っています。
HLSで字幕を利用するには
FANTECH本部では、HLS(HTTP Live Streaming)を利用しており、HLSで字幕を利用する場合はマスタープレイリストと呼ばれるm3u8ファイルに、字幕ソース情報をメディアタグで記載します。
■マスタープレイリストの例
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="日本語",DEFAULT=NO,AUTOSELECT=NO,LANGUAGE="ja",FORCED=NO,CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog",URI="subtitles_ja.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=NO,AUTOSELECT=NO,LANGUAGE="en",FORCED=NO,CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog",URI="subtitles_en.m3u8"
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=4504720,AVERAGE-BANDWIDTH=3902800,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=720x1280,SUBTITLES="subs",FRAME-RATE=30.000
live-a_720p30.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=3968800,AVERAGE-BANDWIDTH=3440800,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=540x960,SUBTITLES="subs",FRAME-RATE=30.000
live-a_540p30.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=1697520,AVERAGE-BANDWIDTH=1482800,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=360x640,SUBTITLES="subs",FRAME-RATE=30.000
live-a_360p30.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=1161600,AVERAGE-BANDWIDTH=1020800,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=240x426,SUBTITLES="subs",FRAME-RATE=30.000
live-a_240p30.m3u8
例えば、subtitles_ja.m3u8
の内容は次のように、WebVTTファイルのセグメントが列挙されています。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-TARGETDURATION:4
#EXT-X-PROGRAM-DATE-TIME:2025-05-18T05:08:50.1Z
#EXTINF:4.000,
subtitles_ja_00000.vtt
#EXT-X-PROGRAM-DATE-TIME:2025-05-18T05:08:54.1Z
#EXTINF:4.000,
subtitles_ja_00001.vtt
#EXT-X-PROGRAM-DATE-TIME:2025-05-18T05:08:58.1Z
...
WebVTTの中身は、以下のようになっています。
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:207000,LOCAL:00:00:00.000
00:00:00.000 --> 00:00:04.266
hello, world!
つまり、HLSで配信されている映像にリアルタイムに字幕を付与する場合、上記のようにマスタープレイリストに字幕用プレイリストを差し込むことができれば良いことになります。 加えて、字幕用のプレイリストに対応したWebVTTファイルを生成し、S3やMediaPackageへパッケージすれば、字幕を実現することができます。
アーキテクチャ
まずは、最終的なアーキテクチャについてご紹介します。 MediaLiveのHLS出力を仲介する字幕付与アプリケーションがFargateで動作しています。 今回実装したのは、このFargate上で動作するアプリケーションになります。
通常であれば、MediaLiveからの出力をS3またはMediaPackageへ直接流す構成が一般的だと思います。今回構築した字幕システムでは、MediaLiveからの出力を一度Fargateで動作するアプリケーションで受け、文字起こしと翻訳を実行します。その後、字幕情報としてHLSのプレイリストに記載し、S3またはMediaPackageへインジェストします。入力も出力もHLSになっています。
ここまでの処理を情報を踏まえて、Fargate上で動作するアプリケーションでは、以下の順序で処理を行います。
- MediaLiveから送信されるセグメントファイルを受け取り、S3またはMediaPackageへインジェストする。
- 文字起こしを実行し、WebVTTファイルをS3またはMediaPackageへインジェストする。
- 字幕用のプレイリストに、新しく生成したWebVTTファイルを記載し、S3またはMediaPackageへインジェストする。
セグメントファイル、メディアプレイリスト、マスタープレイリストの順序でMediaLiveからデータを受信するため、それぞれのデータに合わせて字幕情報を付与して後段に流します。
当たり前ですが、AWS製品はそれら同士を組み合わせて利用することを想定されていると思いますので、こういった構成を取ることにはある程度の難易度もあります。
そして、ライブ配信アーキテクチャに自分たちのアプリケーションロジックを組み込むことで可用性を損なう可能性があり、ある程度のリスクがあるとも捉えられます。
実は、プロダクトとして字幕を実現する方法は他にもあります。 では、なぜ今回このようなアーキテクチャになっているのかを説明します。
アーキテクチャの選択肢と今回の選定理由
MediaLiveでは、HLS出力グループを複数設定することが可能です。 文字起こし用のHLS出力を追加し、映像パイプラインとは異なるシステムで文字起こし、翻訳を行うことも可能です。 この場合、字幕付与処理が配信自体の可用性に影響することはありません。 一方で、字幕情報がHLSに載らないことになり、映像と同期する処理は別途実装することになります。
私が担当しているプロダクトは複数あり、そのいずれもで字幕システムを利用する可能性があります。各プロダクトで字幕を利用する際に、映像と字幕を同期する実装を行っていると、字幕の導入工数が上がってしまうことや、プロダクトごとに実装を共通化できず、字幕機能の品質を担保できない可能性があります。
そのため、できるだけWeb標準に近い形で字幕を提供し、ほとんどの処理をプレイヤー実装に一任できるようにすることを優先しました。
これは、複数プロダクトで字幕を導入する上での一種の制約とも言えますが、Web標準に近い形で実現できることによるメリットも大きいです。
文字起こし・翻訳ソリューションの選定について
現在では、文字起こしのためのソリューションはかなり豊富に存在するため、要件に応じて技術選定が可能です。
今回は、複数製品を検討した後、最終的にAmazon Transcribe、Amazon Translateを選定しました。 選定理由は以下になります。
- 固有名詞の文字起こし・翻訳精度向上を実施しやすい(カスタム語彙・辞書の利用)。
- 応答速度が速い(特に、Translate)。
- ノイズが少ない環境において、他ソリューションと比較しても文字起こしの精度が高い(2025年1月時点)。
- Translateでは、カジュアルな表現や堅い表現を選択できる。
- 利用する上でクラウドリソース管理をしなくて良い(APIコールですぐに利用を開始でき、文字起こしした時間での請求になる)。
精度面以外でも、カスタム語彙や辞書の利用は、アーティスト名をできるだけ間違えないようにする上で重要です。
また、複数プロダクトを運用する立場においては、リソース管理が不要であることも地味に嬉しいポイントになります。
精度向上に向けての取り組み
アーティスト名などの固有名詞は、できるだけ文字起こし段階で間違えないようにしたいところです。
今回の字幕アプリケーション開発は、社内のAIオペレーション室とのインナーソーシングで実現しており、精度評価や固有名詞の扱いについても連携しました。
Amazon Transcribeでは、Phrase
とDisplayAs
からなる対をカスタム語彙として利用できます。
https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html
つまり、カスタム語彙を設定するために、アーティスト名がどのように間違えて文字起こしされるかを知らなければなりません。
間違えたパターンをひらすらカスタム語彙として登録することで、次から間違えにくくなります。
2回目の配信以降は、間違えたパターンをひたすらカスタム語彙に登録することで精度向上を狙えますが、データがない初回配信では一工夫必要です。
アーティスト名をText-To-Speechによって発話させ、抑揚やスピードを調整して複数パターンの音声ファイルを作ります。
これらをAmazon Transcribeに文字起こしさせることで、どのようにアーティスト名を間違えるか事前に検証することが可能です。
今回の初配信も、Text-To-Speechによって音声データを複数パターン生成し、事前に間違えたフレーズを登録しておくことで、精度高く固有名詞を認識することができていました。
まとめ
社内のAIオペレーション室とインナーソーシングし、リアルタイム多言語字幕機能をリリースすることができました。
アーティスト名も固有名詞として正しく文字起こし、翻訳ができており、ある程度満足のいく字幕機能になりました。
また、既にこの字幕機能を利用した海外展開強化のための新機能実装を行っているため、そちらの機能もリリースされ次第、こちらのブログにて発信します。