Skip to content

Instantly share code, notes, and snippets.

@kurone-kito
Last active March 4, 2024 01:59
Show Gist options
  • Save kurone-kito/1e3702eb0534916cf37e27b439374872 to your computer and use it in GitHub Desktop.
Save kurone-kito/1e3702eb0534916cf37e27b439374872 to your computer and use it in GitHub Desktop.
黒音キトの配信環境の解説

黒音キトの配信環境

まだ執筆中の箇所が多くあります。ご容赦ください。

0. Index

  1. ハードウェア構成図
  2. オーディオルーティング構成
  3. 配信時の映像のフロー
  4. OBS のシーンについて
  5. 配信前後のフロー
  6. この文書のライセンス

1. ハードウェア構成図

---
title: 凡例
---
graph LR
  A == 映像信号 ==> B
  A -- 音声信号 --> B
  A -. 無線通信 .-> B
Loading

⚙️ 共通部分: ボイス処理

graph LR
  Mic("🎤")
  MicIF(KWS-899R\nワイヤレスマイク I/F)
  NUC(intel NUC\nボイス処理)
  Out((出力))
  UR(Steinberg UR22C\nオーディオ I/F)
  Mic -. UHF .-> MicIF
  MicIF --> UR
  NUC --> UR
  UR --> Out
  UR --> NUC
Loading

⚙️ 共通部分: 配信プレビュー

graph LR
  BTr(Bluetooth\nレシーバー)
  Out((出力))
  Pixel("📱 Pixel 6 Pro\n配信プレビュー")
  Pixel -.-> BTr
  BTr --> Out
Loading

🌐 主に Web 開発作業配信の場合

graph
  BTt(Bluetooth\nトランスミッター)
  iCA(iConnectAudio 4+\nオーディオルーター)
  iPhone("📱 iPhone 13 Pro Max\nアバター表示")
  Mac("💻 Apple MacBook Air\n配信 and 作業環境")
  Monitor("🖥️")
  Phone("🎧")
  Preview(["⚙️ 共通部分\n配信プレビュー"])
  Voice(["⚙️ 共通部分\nボイス処理"])
  BTt -.-> Phone
  iCA --> BTt
  iCA --> Mac
  iPhone ==> Mac
  Mac --> iCA
  Mac ==> Monitor
  Preview --> iCA
  Voice --> iCA
Loading

🎮 主に Switch ゲーム配信の場合

graph
  iPhone("📱 iPhone 13 Pro Max\nアバター表示")
  Capture(AVerMedia GC553\nゲームキャプチャー)
  iCA(iConnectAudio 4+\nオーディオルーター)
  Monitor("🖥️")
  Phone("🎧")
  Preview(["⚙️ 共通部分\n配信プレビュー"])
  Switch("🎮 Nintendo Switch\nゲーム機")
  Voice(["⚙️ 共通部分\nボイス処理"])
  Mac("💻 Apple MacBook Air\n配信環境")
  Capture ==> Mac
  Capture ==> Monitor
  iCA --> Mac
  iCA --> Phone
  iPhone ==> Mac
  Mac --> iCA
  Mac ==> Monitor
  Preview --> iCA
  Switch ==> Capture
  Voice --> iCA
Loading
  • Bluetooth トランスミッターは遅延が無視できず、ゲーム音声との同期が取れないため、この時は有線接続としています。
    (AptX LL 対応トランスミッター&ヘッドホン、もしくは独自無線方式でアナログ入力のあるワイヤレスヘッドホンを探しています……)

🔫 主に PC ゲーム配信の場合

graph
  Capture(AVerMedia GC553\nゲームキャプチャー)
  HDMI(HDMI スプリッター)
  iCA(iConnectAudio 4+\nオーディオルーター)
  iPhone("📱 iPhone 13 Pro Max\nアバター表示")
  Mac("💻 Apple MacBook Air\n配信環境")
  Monitor("🖥️")
  NUX(intel NUC Extreme\nゲーム)
  Phone("🎧")
  Preview(["⚙️ 共通部分\n配信プレビュー"])
  Voice(["⚙️ 共通部分\nボイス処理"])
  iCA --> Phone
  iPhone ==> Mac
  Capture ==> Mac
  HDMI ==> Capture
  HDMI ==> Monitor
  iCA --> Mac
  iCA --> NUX
  Mac --> iCA
  NUX ==> HDMI
  NUX --> iCA
  Preview --> iCA
  Voice --> iCA
Loading
  • Mermaid 構文の都合上、矢印が逆転している箇所があることにご留意ください。
  • FAQ: なんでゲームキャプチャーのパススルー機能使わず、スプリッターで分配かましてるの?
    • →MacBook Air がシャットダウン中、映像全部死ぬから

👓 主に VR 配信の場合

graph
  Capture(AVerMedia GC553\nゲームキャプチャー)
  HDMI(HDMI スプリッター)
  iCA(iConnectAudio 4+\nオーディオルーター)
  iPhone("📱 iPhone 13 Pro Max\n配信プレビュー")
  Mac("💻 Apple MacBook Air\n配信環境")
  Monitor("🖥️")
  NUX(intel NUC Extreme\nVR ゲーム)
  Phone("🎧")
  Voice(["⚙️ 共通部分\nボイス処理"])
  VR("👓 Valve Index\nVR ヘッドセット")
  NUX ==> VR
  Capture ==> Mac
  HDMI ==> Capture
  HDMI ==> Monitor
  iCA --> Mac
  iCA --> NUX
  iPhone -.-> Phone
  Mac --> iCA
  NUX ==> HDMI
  NUX --> iCA
  Voice --> iCA
  VR --> Phone
Loading
  • この状況の場合、アバター表示を妥協して、静止画表示しています。
  • iPhone に AirPods Pro を接続し、外音取り込み機能(逆ノイキャン)を有効にすることで、VR ゲームの音声と iPhone での配信プレビューの音声とを同時に聞くことができます。

🧨 VRC ワールド開発の作業配信、他諸事情で MacBook Air が死んでいる場合の代替構成

graph
  iCA(iConnectAudio 4+\nオーディオルーター)
  iPhone("📱 iPhone 13 Pro Max\nアバター表示")
  Monitor("🖥️")
  NUX("intel NUC Extreme\n配信 and (作業 or ゲーム)環境")
  Phone("🎧")
  Preview(["⚙️ 共通部分\n配信プレビュー"])
  Voice(["⚙️ 共通部分\nボイス処理"])
  iCA --> Phone
  iPhone -. AirPlay .-> NUX
  NUX ==> Monitor
  iCA --> NUX
  NUX --> iCA
  Preview --> iCA
  Voice --> iCA
Loading

✈️ 最小構成: 渡航先での配信の場合

graph
  Airpods("🎧 Airpods Pro")
  iPhone("📱 iPhone 13 Pro Max\nアバター表示")
  Pixel("📱 Pixel 6 Pro\n配信プレビュー")
  Mac("💻 Apple MacBook Air\n配信 and 作業環境")
  iPhone ==> Mac
  Airpods -.-> Mac
  Mac -.-> Airpods
Loading

2. オーディオルーティング構成

iConnectAudio 4+

iConnectAudio 4+ のオーディオルーティング構成は以下の通りです。

本機器は 1 ポート辺り 6ch の USB 入力を 2 ポート、加えて 4ch のアナログ入力持ちます。
(使用していませんが MIDI インターフェイスなども備えています)

graph
  Mac("💻 Apple MacBook Air\n配信環境")
  Mic("🎤\nAnalog 3ch")
  NUX("intel NUC Extreme\nゲーム環境")
  Phone("🎧")
  Preview(["⚙️ 共通部分\n配信プレビュー\nAnalog 1-2ch"])
  Mac -- "1-2ch -> 5-6ch" --> NUX
  Mac -- "1-2ch -> mix" --> Phone
  Mic -- "3ch -> 1ch" --> Mac
  Mic -- "3ch -> 1ch" --> NUX
  NUX -- "1-2ch -> 5-6ch" --> Mac
  NUX -- "1-2ch -> mix" --> Phone
  Preview -- "1-2ch -> mix" --> Phone
Loading

intel NUC

intel NUC において、ボイス調整を行なっています。 渡航先などを想定して、Mac にも同等の環境を用意しています。

以下の VST ホスト環境に対して VST プラグインと総称する各種ソフトウェアエフェクターを導入し、ボイス調整を行なっています。

graph
  In((Input))
  Out((Output))
  DeNoise("RX8 Spectral De-noise\nノイズキャンセラー\n切ると音圧調整で定量的ノイズが増幅される")
  DeClick("RX8 DeClick\nクリックノイズキャンセラー\n切ると音圧調整で突発的ノイズが増幅される")
  VoicePitcher("ToneBoosters VoicePitcher\nピッチ&フォルマント調整\n切ると地声になる")
  Equalizer("ToneBoosters Equalizer\n音域&強調調整\n切ると音域が偏り、ケロケロしたり物足りなくなったりする")
  Compressor("ToneBoosters Compressor\n音圧調整\n切ると声が極端に小さくなる")

  In --> DeNoise
  DeNoise --> DeClick
  DeClick --> VoicePitcher
  VoicePitcher --> Equalizer
  Equalizer --> Compressor
  Compressor --> Out
Loading

3. 配信時の映像のフロー

graph LR
  Capture(AVerMedia GC553\nゲームキャプチャー)
  Chat("💬 Restream Chat\nコメント表示")
  Discord("📞 Discord\nボイスチャット")
  iPhone("📱 iPhone 13 Pro Max\nアバター表示")
  VSCode("Visual Studio Code\n実際の作業画面")
  Video("🎞️ 動画ファイル")
  Capture --> OBS
  Chat --> OBS
  Discord --> OBS
  iPhone --> OBS
  Video --> OBS
  VSCode --> OBS

  Facebook("Facebook Live")
  OBS("OBS Studio\n映像ソース")
  Pixel("📱 Pixel 6 Pro\n配信プレビュー")
  Restream("Restream.io\n配信プラットフォーム")
  Twitch("Twitch")
  Twitter("Twitter Live")
  YouTube("YouTube")
  OBS --> Restream
  Restream --> Facebook
  Restream -. Twitch 規約上\n同時配信は不可 .-> Twitch
  Restream --> Twitter
  Restream --> YouTube
  YouTube -.-> Pixel
Loading

OBS の配信開始に連動して、Restream による各配信プラットフォームへの配信が開始し、配信終了に連動して配信が終了します。この際自動的に配信枠の作成・終了も行われます。
(ただこれには欠点もあり、ネットの瞬断などで配信が一時的に切断された場合、枠ごとぶった斬られます)

4. OBS のシーンについて

状態遷移図

stateDiagram-v2
  state useGame <<choice>>
  state useSpecial <<choice>>
  Prepare : 準備中シーン
  Game : ゲーム シーン\nキャプチャとアバター
  End : 終了シーン
  [*] --> useSpecial : 配信開始
  Develop --> End : 作業終了
  End --> [*] : 配信終了
  Game --> End : ゲーム終了
  Prepare --> useGame : 準備完了
  Special --> [*] : 配信終了
  useGame --> Develop : キャプチャ不使用
  useGame --> Game : キャプチャ使用
  useSpecial --> Prepare : 通常時
  useSpecial --> Special : 特殊な配信時
  state Develop {
    Code : VSCode 表示\nFirefox を PiP 表示
    PbP : Firefox と VSCode を\n等分割表示
    Web : Firefox 表示\nVSCode を PiP 表示
    Code --> PbP : フォーカス\n自動検知
    Code --> Web : フォーカス\n自動検知
    PbP --> Code : フォーカス\n自動検知
    PbP --> Web : フォーカス\n自動検知
    Web --> Code : フォーカス\n自動検知
    Web --> PbP : フォーカス\n自動検知
  }
  state Special {
    direction LR
    Avatar : アバターのみ表示
    Capture : キャプチャーのみ表示
    [*] --> Avatar
    [*] --> Capture
    Avatar --> [*]
    Capture --> [*]
  }
  note right of Special : 特殊な配信でのみ使用
Loading

自動などの表記がない場合、手動的なシーン操作を行っています。

各シーン解説

シーンで使用する共通パーツ解説

  • コメント表示
    • Restream Chat を使用しています。
    • Restream Chat は Restream.io による配信プラットフォームへの配信に連動して、各配信プラットフォームからのコメントを表示します。
  • OBS 本体のウィンドウキャプチャ
    • ビットレート表示: これが死にかけてクルクルした場合、ネット死んだんだなって解ってもらえます。
  • ゲームキャプチャ
    • AVerMedia GC553 を使用しています。
    • ビデオとオーディオを分けてキャプチャしています。
  • Discord
  • アバター表示
    • iPhone 13 Pro Max で表示しているアバターを有線または AirPlay 経由でキャプチャしています。
    • Fallback として、静止画像の立ち絵も用意しています。
  • 準備中・終了時テキスト
    • これは OBS のテキストソースで表示しています。
    • チャンネル登録・高評価・コメント・Twitter フォローなどのお願いをしています。
  • メインコンテンツのテキスト
    • これも OBS のテキストソースで表示しています。
    • ゲームのタイトルや現在の作業内容を一言で表示しています。

準備中シーン

配信開始してから、実際の配信スタートまでに流す準備中のテロップを表示します。

場合によっては作業中画面をこの段階から表示してしまう場合もあります。(私もやってます)

時間制限を示す、残り時間やプログレスバー、長さ固定のムービーなどを流すと視聴者の流出を防ぎやすいですが、時間ブッチを繰り返すと信用を失う諸刃の剣です。

ゲーム シーン

  • 共通パーツ
    • コメント表示
    • OBS 本体のウィンドウキャプチャ
    • ゲームキャプチャ
    • Discord
    • アバター表示
    • メインコンテンツのテキスト

人によっては時計やチャンネル登録者数を表示する人もいます。

Develop シーン

  • 共通パーツ
    • コメント表示
    • OBS 本体のウィンドウキャプチャ
    • Discord (原則非表示)
    • アバター表示
    • メインコンテンツのテキスト
  • 固有パーツ
    • Code
      • VS Code 表示
      • Firefox を PiP 表示
    • PbP
      • Firefox と VS Code を等分割表示
    • Web
      • Firefox 表示
      • VS Code を PiP 表示

人によっては時計やチャンネル登録者数を表示する人もいます。

終了シーン

配信終了の旨のテロップを表示します。 (私は複数プラットフォームで配信しているので、やっていませんが)人によっては YouTube における、チャンネル登録やおすすめ動画表示のための、プレースホルダーを表示する方もいます。

特殊シーン

以下のシーンは文字通り全画面に表示するシーンです。 原則として Discord 配信のような特定内輪での配信など、特殊な配信でしか使用しません。

  • アバターのみ表示
  • キャプチャーのみ表示

自動シーンスイッチャー

開発作業配信などの場合、複数ウィンドウに取っ替え引っ替えフォーカスを当てて作業する場合があります。 一般的にライブ配信では、現在作業しているウィンドウを大きく表示して視認性を確保するのが望ましいですが、これを手動で行うのは大変です。

そこで、OBS には自動シーンスイッチャーという機能があります。 これを使用すると、特定のウィンドウがアクティブになったときに、自動的にシーンを切り替えることができます。

私の環境では、以下のように設定しています。

  • ブラウザ表示: Firefox を大きく表示し、VS Code を PiP 表示
    • 条件: Firefox のウィンドウをアクティブにしたとき
  • コード表示: VS Code を大きく表示し、Firefox を PiP 表示
    • 条件: VS Code のウィンドウをアクティブにしたとき
  • PbP 表示: Firefox と VS Code を等分割表示
    • 条件: Firefox か VS Code 以外のウィンドウをアクティブにしたとき

5. 配信前後のフロー

10 ステップに分けて、順番に行うタスクリストを列挙します。

I. 配信前、4 週間 〜 数時間までの間に完了するタスクリスト

  1. 配信するゲームなどの企画を立てます。
    • 企画というと大仰な印象ありますが、“APEX Legends でランクマ回す” 程度の一行企画でも問題ありません。
  2. 1 をもとに、配信概要を作成します。
    • これはそのまま YouTube の配信アーカイブの概要になるものです。
  3. 1 をもとに、サムネを作ります。
    • 繰り返しの場合、使いまわせるようにテンプレートを作っておくと良いです。

II. 配信前、3 週間 〜 30 分前までの間に完了するタスクリスト

I の後に行います。より早く行うに越したことはありませんが、余程大規模なイベントを除き 3 週間以上前の告知はお勧めしません。忘れてしまいますので。

  1. Restream.io にログインし、I-2 と I-3 を使い配信イベントを登録します。
    • この段階で各プラットフォームにおける、イベント機能がある場合イベントが登録されます。
      • なお、私の利用しているプラットフォームだと、YouTube のみ対応しています。
        Twitch のカレンダーとかは未対応っぽい。
  2. 1 により各プラットフォームのイベントの URL が発行されるため、そこへ遷移してより詳細なイベントの設定を行います。
    • 検索タグ設定や、プレイするゲーム名の設定など。
  3. 1 の URL を添えて、配信の予告を告知・ツイートします。

III. 配信前、当日朝 〜 30 分前までに完了するタスクリスト

  1. II-1 により RTMP のストリームキーが発行されるため、OBS Studio を起動して、設定の配信カテゴリより上書きします。
  2. 1 に引き続き、OBS の配信シーンを選択し、テロップに I-2 の概要を簡略化して記入します。
    • この工程は忘れないこと! これを忘れると、例えば “APEX Legends をプレイしているのに、配信テロップが Minecraft のままとなっていて、その結果視聴者から「最近のスケルトンはボセック撃ってくるのか」とか「クリーパー飛んでくるのん?」とか指摘を受ける”ような大恥級の事故が発生し得るので注意。

III. 配信前、3 時間 〜 10 分前までに完了するタスクリスト

  1. (時間が圧している場合は省略可)ここで配信に関わる端末を一斉再起動します。
    • スマホやキャプチャーボードなども、可能な限り再起動します。
    • これにより、システムに蓄積したゴミを一掃でき、変な不具合が発生するのを抑止します。
    • 時間に余裕があるなら、再起動前にシステムやアプリの一斉アップデート (brew upgradechoco upgrade -y all など) もやっておくと、より望ましいです。
  2. iPhone 側のアバター表示設定を行います。
    1. iPhone の集中モードを設定して、リア友からの唐突な着信による身バレを防ぎます。
    2. iPhone でカスタムキャストを起動して、配信を始めます。
      • この際必ず “バーチャルライブ配信”を OFF にして、VirtualCast で別の独り言配信を始めないよう注意します。
    3. iPhone を PC または Mac に接続します。
      • Mac に接続する場合、有線接続することで OBS からはキャプチャデバイスとして認識され、OBS から iPhone の画面を配信できるようになります。
      • Windows の場合、Reflector などの任意の AirPlay レシーバー アプリ経由で PC に接続する必要があります。
  3. 配信に必要なアプリを一斉起動して、適宜レイアウトを調整します。
    • Discord
    • OBS Studio
    • Restream Chat
    • Twitter
  4. PC スペックが貧弱な場合、必要に応じて各種アプリを renice します。
  5. 机上にコーヒー、水、お菓子、時には酒も用意します。
  6. Discord でマイク確認をして、視聴者に読唇術の訓練をさせる放送事故を回避します。
  7. 必要に応じて Discord のボイスチャットを開始します。
    • 他者との通話によるコラボ案件などの場合は、ここで最終ブリーフィングをしておくのも良いかもしれません。

IV. 配信前、20 分 〜 2 分前までに完了するタスクリスト

  1. Pixel 側の設定を行い、配信プレビュー環境を整えます。
    1. Bluetooth レシーバーに接続し、Pixel からの音声をヘッドホンから直接聞けるようにします。
    2. Pixel で II-3 を YouTube アプリで開き、待機枠に参加します。
  2. ゲームなどを起動し、OBS で適切にキャプチャできていることを確認します。
  3. OBS のシーンを切り替えて、ゲーム音声、マイク音声が適切にキャプチャできていることを確認します。
    • Discord ボイスチャットを開始している場合、これも OBS で音声キャプチャできていることを確認して、独り言配信を回避します。
  4. OBS のシーンを準備中に戻します。
  5. OBS のスタジオモードを有効にして、プレビュー シーンにメイン配信のシーンを指定しておきます。
  6. II-1 のツイートのリンクをクリップボードに入れておきます。

V. 配信前、5 分 〜 0 分前までに完了するタスクリスト

  1. OBS の配信開始ボタンを押下します。
  2. 各プラットフォームを巡回し、ライブ配信が始まっていることを確認します。
  3. II-1 ツイートのリンクをつけて、Twitter で配信開始の告知をします。
    • ライブ配信が始まっている場合、当該ツイートに “YouTube でも同時配信中” の旨を II-1 ツイートのリンクとともに、リプライでぶら下げます。
  4. Restream Chat に“まもなく配信を始めます。しばらくお待ちください”という旨のコメントを投下します。
  5. タイミングを見計らい、トランジション ボタンを押下してシーンを切り替えます。

VI. 配信開始から 0 分 〜 3 分後までに完了するタスクリスト

  1. 自身の声がライブ配信されていること、ゲーム音声や Discord 通話相手の声がライブ配信されていることを確認します。
  2. 挨拶します。
  3. 簡単な自己紹介します。エレベーターピッチを考えておくとより良いです。
  4. (開発作業配信の場合のみ) シーンスイッチャーを開始します。
  5. 配信概要を説明します。
  6. OBS のスタジオモードを終了します。(これはお好みに応じて)

VII. 配信開始から 3 分後 〜 全工程の 6-7 割くらい

楽しめ!🐱

VIII. 配信全工程の 6-7 割くらい

  1. ここまでの内容を中間まとめに入ります。
  2. このチャンネルでの活動内容を、視聴者に対するベネフィットに大きく寄った視点で、簡単に説明します。
  3. ちょっとシリアス強めな口調で、緊張感ある空気にして視聴者にお願いがある旨を投げかけます。
  4. 唐突に明るい口調に転じて、高評価をお願いします。
  5. 高評価の方法をノリの良い感じで説明します。
  6. 高評価してくれたことに対して、感謝の気持ちを表明します。
  7. さらにチャンネル登録もお願いします。

この 2〜7 のトークは口癖にできると尚良し!

IX. 配信終了 3 分前のタスクリスト

  1. まとめに入る感じで、今回の配信の内容を振り返ります。
  2. VIII-1 〜 VIII-6 と同様のトークを繰り返します。
  3. 次回配信の告知をします。
  4. 配信終了の挨拶をします。
  5. (開発作業配信の場合のみ) シーンスイッチャーを終了します。
    • これを忘れると、配信終了シーンから勝手に帰ってきてしまう放送事故が発生します。
  6. 配信終了シーンに切り替えます。

X. 配信終了後 0 分 〜 2 時間のタスクリスト

  1. 配信をプレビューして、配信終了シーンに切り変わったことを確認します。
  2. 配信が終わった旨を Restream Chat にコメントします。
  3. 配信 BGM 音量をフェードアウトします。
  4. OBS の配信停止ボタンを押下します。
  5. 配信 BGM 音量を戻します。
  6. 配信終了と視聴していただいたお礼のツイートをします。
  7. 他者との通話によるコラボ案件などの場合は、ここで反省会やアフタートーク会を行うのも良いでしょう。
  8. OBS ほか、各種アプリやゲームを終了します。
  9. Pixel の YouTube アプリを終了し、Qi スタンドに立てます。
  10. iPhone のカスタムキャストアプリを終了し、MagSafe 充電器に貼りつけます。
  11. YouTube のライブ配信のアーカイブにアクセスし、終了画面やチャプターなどの編集をします。
  12. 次回配信までの健康維持のためにも、いっぱい寝ましょう 😴

6. この文書のライセンス

MIT に準じます。原則、以下を満たせば自由に利用できます。

  • 出典の明記
  • 責任は取りません
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment