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 を取得する
URLの例: https://www.youtube.com/watch?v=T8R8ba-Apc4&feature=youtu.be
video ID: T8R8ba-Apc4
video ID をもとに chat ID を取得する
https://developers.google.com/youtube/v3/docs/videos/list?hl=ja
chat ID をもとにチャット欄のメッセージの一覧を取得する
https://developers.google.com/youtube/v3/live/docs/liveChatMessages/list?hl=ja
ページングのために nextPageToken を保持しておく
次回の呼び出しで、それ以降のメッセージだけが取得されるように pageToken クエリパラメータに nextPageToken を指定する
VOICEVOX に、新着メッセージそれぞれの読み上げ音声を生成させるスレッド
reqwest crate で VOICEVOX の REST API を叩く
rodio crate の Sink に得られた読み上げ音声を append する
ロギングに関して
https://github.com/tokio-rs/tracing を初めて使ってみようと思っている
span という概念
タスクの継続期間
event という概念
span から発生するログ
Subscriber
ログ出力の実装
GUI に関して
GUI で video ID を指定できるようにしたい
配信 URL をテキストエリアにコピペしたら video ID を取り出して読み上げが始まるようにしたい
tauri で GUI を実装すると良さそう?
既存の Rust プログラム (新規メッセージ取得→読み上げ) を流用できそう
参考記事
ソースコード https://github.com/0918nobita/yt-chat-tts
Rust でお気楽非同期プログラミング https://qiita.com/Kumassy/items/fec47952d70b5073b1b7
envy crate https://github.com/softprops/envy
YouTube Live チャット欄をAPIでリアルタイム取得 https://qiita.com/iroiro_bot/items/ad0f3901a2336fe48e8f
Rustでログってどう取るの? https://zenn.dev/belle/articles/900e490ae8dbfe
Tauri https://tauri.app/