YouTube ライブ配信のチャット欄を自動読み上げする
Rust で実装し、音声合成には VOICEVOX を利用する
使用するクレートとその用途
tokio: 非同期ランタイム
serde: シリアライズ / デシリアライズ
serde_json: JSON 形式へのシリアライズ / JSON 形式からのデシリアライズ
envy: 環境変数の読み込み
rodio: 音声デバイスで音声ファイルを再生する
reqwest: HTTP クライアント (YouTube と VOICEVOX の API を叩くのに使う)
anyhow: エラーハンドリングを楽にするやつ
作りたいものについて
YouTube API を叩いてライブ配信のチャット欄の新着メッセージを取得する
VOICEVOX を利用して読み上げ音声を生成してもらう
生成された音声を都度再生する
これから読み上げなくてはならないメッセージの一覧をスレッド間共有する
mpsc チャネルを利用する
YouTube API に対してポーリングして新着メッセージを send するスレッド
ライブ配信のURLの v クエリから video ID を取得する
video ID: T8R8ba-Apc4
video ID をもとに chat ID を取得する
chat ID をもとにチャット欄のメッセージの一覧を取得する
ページングのために nextPageToken を保持しておく
次回の呼び出しで、それ以降のメッセージだけが取得されるように pageToken クエリパラメータに nextPageToken を指定する
VOICEVOX に、新着メッセージそれぞれの読み上げ音声を生成させるスレッド
reqwest crate で VOICEVOX の REST API を叩く
rodio crate の Sink に得られた読み上げ音声を append する ロギングに関して
span という概念
タスクの継続期間
event という概念
span から発生するログ
Subscriber
ログ出力の実装
GUI に関して
GUI で video ID を指定できるようにしたい
配信 URL をテキストエリアにコピペしたら video ID を取り出して読み上げが始まるようにしたい
tauri で GUI を実装すると良さそう?
既存の Rust プログラム (新規メッセージ取得→読み上げ) を流用できそう
参考記事