見出し画像

配信音声の字幕機能を作ってみた REALITY Advent Calendar #7

こんにちは、REALITY Advent Calendar 2022 7日目担当、UnityチームのIKEPです。
REALITYでは去年も開発合宿をしていましたが、以前の僕のブログ記事で書いたように、僕は今年の4月に新卒としてREALITYにJoinしたため、REALITYの開発合宿に参加するのは今年が初となります!開発も美味しいご飯も堪能できて最高でした!!

(IKEPはサーバチームからUnityチームへ異動しました!合宿での開発も両チームでの知識が役立ちました♪)

作ったもの

普段からエンジニア同士の雑談で「こういった機能があればいいよね」という話をしているのですが、その中で「配信音声の字幕機能があれば、音が出せない環境でもイヤホンなしで配信が見れていいよね」という話が出ました。
僕は過去にGCPのSpeech-to-Textを使ったアプリケーション開発をした経験があったため、その経験を活かして作ってみようと思い、REALITYの配信音声をリアルタイムにテキストに変換し、字幕として表示する機能を作りました!
デモがこちら!

配信者が話すと、視聴者の画面でも話している内容がリアルタイムに更新されている!

GCP Speech-to-Textって何?

GCPのSpeech-to-Textは、Google Cloud Platformのサービスの一つです。
機械学習を利用して自動音声認識を行い、音声文字変換をおこなってくれるものです。
クラウド利用する場合にはAPIが用意されており、音声ファイルから音声文字変換を行う「同期音声認識」、「非同期音声認識」、マイクからの入力などのストリーミング音声をテキストに変換する「ストリーミング音声認識」の3種類が利用できます。
今回はリアルタイムで音声文字変換の結果が欲しいため、「ストリーミング音声認識」を使いました。
GCPのドキュメントを参考にすると、マイクからのリアルタイム音声文字変換が簡単に実装できます!

GCP Speech-to-Textをどうやって使ってるの?

GCP Speech-to-TextのAPIへREALITYの配信サーバからリクエストを送ることで実現しました!
REALITYの配信サーバはWebSocketサーバとなっており、Protobuf形式にシリアライズされた音声データをクライアントと送受信しています。(詳しくはこちら↓)

そのため、配信サーバにパケットデータが送信されてくるたびに、Protobuf形式のデータから音声データのバイナリを取り出し、音声データをGCPのSpeech-to-Text APIへ送信しています!

  1. 配信枠ごとにSpeech-to-Text API clientを作成

  2. クライアントから音声パケットが送信されてくるたびに、

    1. REALITYの音声データはOpus形式であるため、PCM形式にデコード

    2. Speech-to-Text API clientを使ってデコードしたPCMデータを送信

    3. 変換結果のテキストをWebSocketで、配信サーバからクライアントへ送信

  3. クライアントがWebSocketで受信した変換結果のテキストを表示

という流れで実現しました!

クライアントのUIについて

鋭い方はお気づきかもしれませんが、変換結果をリアルタイムに表示する部分については、「配信ボード」の機能を流用して作りました!

今回送受信する変換結果テキストのパケットデータは配信サーバ上で生成していますが、「配信ボード」では配信者端末でパケットデータを生成しています。
そのため、配信者端末でも変換結果テキストを表示するためにWebSocketの受信データを処理する仕組みを追加で実装しました。
その副産物として、配信者、視聴者でUIの表示位置をそれぞれが調整できるようになっています。

まとめ

GCPのSpeech-to-Textのおかげで、リアルタイムに配信者が話している内容を字幕として表示でき、「音を出せない!イヤホン忘れた!」という時や、耳が不自由な方でも、一緒にREALITYの配信を楽しめるようになったのではないかなと思います!
また個人的な面として、僕は英語の聞き取りが苦手ですが、英文テキストになれば理解しやすかったりするので、海外の方の配信も楽しめるかも?と感じました!!

今回実装したものは開発合宿ということもあり、あくまで「あったらいいな」という機能をデモとして作ったため、現状のところリリースの予定はありません。
しかし、せっかく作ったのでなんらかの形で使えるようにブラッシュアップを検討していきたいなと思います!

明日のアドベントカレンダー担当は?

明日は、サーバエンジニアの@a_s_dさんです!
お楽しみに!