docs/docs/vtubing.md

46 KiB

VTubing

Effective 14 July 2024

Naomi uses her VTuber model for all of her client meetings, as well as streaming. Getting the software to work on Linux is a bit of a nightmare, so this page documents how she does so.

1. OpenSeeFace

In order to track her webcamera, OpenSeeFace needs to be run independently as a native script.

1.1. Installation

This should all be done in your home ~ directory.

  • Begin by cloning the repository:
    • git clone https://github.com/emilianavt/OpenSeeFace
    • cd OpenSeeFace
  • You will need to prepare Python
    • Install the packages: yay -Sy python python-virtualenv
    • Prepare the environment: virtualenv -p python3 env
    • Source the environment: source env/bin/activate
    • Install the dependencies: pip3 install onnxruntime opencv-python pillow numpy

1.2. Running

Naomi uses a bash script to run the program. Put this in ~/Documents/scripts/osf.sh.

#!/bin/bash
cd ~/OpenSeeFace && \
source env/bin/activate && \
python facetracker.py -c 0 -W 1280 -H 720 --discard-after 0 --scan-every 0 --no-3d-adapt 1 --max-feature-updates 900

1.3. Desktop Shortcut

The .desktop file allows this to run from the application tray. Put this in ~/.local/share/applications/osf.desktop.

[Desktop Entry]
Name=OpenSeeFace
Exec=/home/naomi/Documents/scripts/osf.sh
Icon=/home/naomi/Documents/scripts/osf.png
Terminal=true
Type=Application

2. VSeeFace

VSeeFace does not run natively, and will need to run with Wine.

2.1. Installation

Download and run the installer. When selecting a directory, put it in ~/VSeeFace.

2.2. Running

Naomi uses a bash script to run the program. Put this in ~/Documents/scripts/vsf.sh.

#!/bin/bash
wine ~/VSeeFace/VSeeFace.exe --background-color "#00FF00"

The --background-color flag creates a green screen background to be chroma-keyed out by OBS.

1.3. Desktop Shortcut

The .desktop file allows this to run from the application tray. Put this in ~/.local/share/applications/osf.desktop.

[Desktop Entry]
Name=VSeeFace
Exec=/home/naomi/Documents/scripts/vsf.sh
Icon=/home/naomi/Documents/scripts/vsf.png
Terminal=true
Type=Application

3. OBS

OBS allows for virtual camera, as well as for streaming.

3.1. Installation

The obs-studio-liberty package bundles everything together, offering both virtual camera and browser source support. These are essential for the setup.

3.2. Scenes

You can import this JSON file to get Naomi's list of scenes.

Show file
{
  "DesktopAudioDevice1": {
    "prev_ver": 503447552,
    "name": "Desktop Audio",
    "uuid": "3cf343c8-94fa-4e7e-999a-c682a2fee814",
    "id": "pulse_output_capture",
    "versioned_id": "pulse_output_capture",
    "settings": {
      "device_id": "default"
    },
    "mixers": 255,
    "sync": 0,
    "flags": 0,
    "volume": 1.0,
    "balance": 0.5,
    "enabled": true,
    "muted": false,
    "push-to-mute": false,
    "push-to-mute-delay": 0,
    "push-to-talk": false,
    "push-to-talk-delay": 0,
    "hotkeys": {
      "libobs.mute": [],
      "libobs.unmute": [],
      "libobs.push-to-mute": [],
      "libobs.push-to-talk": []
    },
    "deinterlace_mode": 0,
    "deinterlace_field_order": 0,
    "monitoring_type": 0,
    "private_settings": {}
  },
  "AuxAudioDevice1": {
    "prev_ver": 503447552,
    "name": "Mic/Aux",
    "uuid": "a1c8fff9-1d45-467a-b647-73711e02e915",
    "id": "pulse_input_capture",
    "versioned_id": "pulse_input_capture",
    "settings": {
      "device_id": "Remap-Source"
    },
    "mixers": 255,
    "sync": 0,
    "flags": 0,
    "volume": 1.0,
    "balance": 0.5,
    "enabled": true,
    "muted": false,
    "push-to-mute": false,
    "push-to-mute-delay": 0,
    "push-to-talk": false,
    "push-to-talk-delay": 0,
    "hotkeys": {
      "libobs.mute": [],
      "libobs.unmute": [],
      "libobs.push-to-mute": [],
      "libobs.push-to-talk": []
    },
    "deinterlace_mode": 0,
    "deinterlace_field_order": 0,
    "monitoring_type": 0,
    "private_settings": {}
  },
  "current_scene": "Virtual Cam",
  "current_program_scene": "Virtual Cam",
  "scene_order": [
    {
      "name": "Virtual Cam"
    },
    {
      "name": "Stream"
    },
    {
      "name": "Start"
    },
    {
      "name": "BRB"
    },
    {
      "name": "End"
    }
  ],
  "name": "Naomi",
  "groups": [],
  "quick_transitions": [
    {
      "name": "Cut",
      "duration": 300,
      "hotkeys": [],
      "id": 1,
      "fade_to_black": false
    },
    {
      "name": "Fade",
      "duration": 300,
      "hotkeys": [],
      "id": 2,
      "fade_to_black": false
    },
    {
      "name": "Fade",
      "duration": 300,
      "hotkeys": [],
      "id": 3,
      "fade_to_black": true
    }
  ],
  "transitions": [
    {
      "name": "Transition",
      "id": "obs_stinger_transition",
      "settings": {
        "path": "/home/naomi/Documents/stream/stinger.webm",
        "track_matte_enabled": true,
        "audio_monitoring": 2
      }
    }
  ],
  "saved_projectors": [],
  "current_transition": "Transition",
  "transition_duration": 300,
  "preview_locked": false,
  "scaling_enabled": false,
  "scaling_level": 0,
  "scaling_off_x": 0.0,
  "scaling_off_y": 0.0,
  "virtual-camera": {
    "type2": 3
  },
  "modules": {
    "scripts-tool": [],
    "output-timer": {
      "streamTimerHours": 0,
      "streamTimerMinutes": 0,
      "streamTimerSeconds": 30,
      "recordTimerHours": 0,
      "recordTimerMinutes": 0,
      "recordTimerSeconds": 30,
      "autoStartStreamTimer": false,
      "autoStartRecordTimer": false,
      "pauseRecordTimer": true
    },
    "auto-scene-switcher": {
      "interval": 300,
      "non_matching_scene": "",
      "switch_if_not_matching": false,
      "active": false,
      "switches": []
    }
  },
  "resolution": {
    "x": 1920,
    "y": 1080
  },
  "sources": [
    {
      "prev_ver": 503447552,
      "name": "Alerts",
      "uuid": "f1d0e2a1-3bbf-4a75-80ab-91243c5590d4",
      "id": "browser_source",
      "versioned_id": "browser_source",
      "settings": {
        "url": "https://streamlabs.com/alert-box/v3/<redacted>"
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "ObsBrowser.Refresh": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "BRB",
      "uuid": "bccd5453-1e6e-4335-8111-b01adf3e9541",
      "id": "scene",
      "versioned_id": "scene",
      "settings": {
        "id_counter": 4,
        "custom_size": false,
        "items": [
          {
            "name": "Slide Background",
            "source_uuid": "7f03fc0d-6d95-4e9e-b4e7-2e43967b2488",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 1,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Text BRB",
            "source_uuid": "6f46d696-d2f1-49b4-957d-1f06a9392cdc",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 582.0,
              "y": 364.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 3,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Alerts",
            "source_uuid": "f1d0e2a1-3bbf-4a75-80ab-91243c5590d4",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.7999999523162842,
              "y": 1.7999999523162842
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 4,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          }
        ]
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "OBSBasic.SelectScene": [],
        "libobs.show_scene_item.1": [],
        "libobs.hide_scene_item.1": [],
        "libobs.show_scene_item.3": [],
        "libobs.hide_scene_item.3": [],
        "libobs.show_scene_item.4": [],
        "libobs.hide_scene_item.4": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Cam Background",
      "uuid": "6bd1ef08-a91e-4b0b-bb1a-d3ee2387f5f5",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "close_when_inactive": true,
        "local_file": "/home/naomi/Documents/stream/virtual-cam-bg.webm",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Cam Overlay",
      "uuid": "bf638a3c-5133-406c-a3d2-541723f715f9",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "close_when_inactive": true,
        "local_file": "/home/naomi/Documents/stream/virtual-cam-overlay.webm",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Chat",
      "uuid": "005e5143-427d-405c-84aa-b50210ad015f",
      "id": "browser_source",
      "versioned_id": "browser_source",
      "settings": {
        "url": "https://streamlabs.com/widgets/chat-box/v1/<redacted>",
        "width": 500,
        "css": "body { background: white }"
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "ObsBrowser.Refresh": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "End",
      "uuid": "74d15386-4a95-4a1e-90ce-6b4f4c77615f",
      "id": "scene",
      "versioned_id": "scene",
      "settings": {
        "id_counter": 4,
        "custom_size": false,
        "items": [
          {
            "name": "Slide Background",
            "source_uuid": "7f03fc0d-6d95-4e9e-b4e7-2e43967b2488",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 1,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Text End",
            "source_uuid": "e84200d5-b7bf-4230-afff-ff7cbae8a8d3",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 586.0,
              "y": 363.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 3,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Alerts",
            "source_uuid": "f1d0e2a1-3bbf-4a75-80ab-91243c5590d4",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.7999999523162842,
              "y": 1.7999999523162842
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 4,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          }
        ]
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "OBSBasic.SelectScene": [],
        "libobs.show_scene_item.1": [],
        "libobs.hide_scene_item.1": [],
        "libobs.show_scene_item.3": [],
        "libobs.hide_scene_item.3": [],
        "libobs.show_scene_item.4": [],
        "libobs.hide_scene_item.4": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Game",
      "uuid": "b4b086c6-2733-4c66-b833-b0546d8d928f",
      "id": "xcomposite_input",
      "versioned_id": "xcomposite_input",
      "settings": {
        "capture_window": ""
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {},
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Model",
      "uuid": "61587530-1788-4a8a-9854-55d7ab8643c1",
      "id": "xcomposite_input",
      "versioned_id": "xcomposite_input",
      "settings": {
        "capture_window": "",
        "show_cursor": false
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {},
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {},
      "filters": [
        {
          "prev_ver": 503447552,
          "name": "Chroma Key",
          "uuid": "3c3151f6-95cf-431c-8f9d-d0c4d0276265",
          "id": "chroma_key_filter",
          "versioned_id": "chroma_key_filter_v2",
          "settings": {},
          "mixers": 0,
          "sync": 0,
          "flags": 0,
          "volume": 1.0,
          "balance": 0.5,
          "enabled": true,
          "muted": false,
          "push-to-mute": false,
          "push-to-mute-delay": 0,
          "push-to-talk": false,
          "push-to-talk-delay": 0,
          "hotkeys": {},
          "deinterlace_mode": 0,
          "deinterlace_field_order": 0,
          "monitoring_type": 0,
          "private_settings": {}
        }
      ]
    },
    {
      "prev_ver": 503447552,
      "name": "Slide Background",
      "uuid": "7f03fc0d-6d95-4e9e-b4e7-2e43967b2488",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "close_when_inactive": true,
        "local_file": "/home/naomi/Documents/stream/slide-bg.webm",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Start",
      "uuid": "527629ef-79c9-4b1a-a006-738220d3e68f",
      "id": "scene",
      "versioned_id": "scene",
      "settings": {
        "id_counter": 4,
        "custom_size": false,
        "items": [
          {
            "name": "Slide Background",
            "source_uuid": "7f03fc0d-6d95-4e9e-b4e7-2e43967b2488",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 1,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Text Start",
            "source_uuid": "f8ec5105-3e0e-44df-925e-1de60b69aac9",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 557.0,
              "y": 413.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 3,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Alerts",
            "source_uuid": "f1d0e2a1-3bbf-4a75-80ab-91243c5590d4",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.7999999523162842,
              "y": 1.7999999523162842
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 4,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          }
        ]
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "OBSBasic.SelectScene": [],
        "libobs.show_scene_item.1": [],
        "libobs.hide_scene_item.1": [],
        "libobs.show_scene_item.3": [],
        "libobs.hide_scene_item.3": [],
        "libobs.show_scene_item.4": [],
        "libobs.hide_scene_item.4": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Stream",
      "uuid": "7936741f-a3a3-478d-acdc-ca0e25fc1da1",
      "id": "scene",
      "versioned_id": "scene",
      "settings": {
        "id_counter": 6,
        "custom_size": false,
        "items": [
          {
            "name": "Stream Background",
            "source_uuid": "d9b7efee-1348-4d0f-9b2d-f7ea0ecad7e7",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 1222.0,
              "y": 403.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 1,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Game",
            "source_uuid": "b4b086c6-2733-4c66-b833-b0546d8d928f",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 54.0,
              "y": 98.0
            },
            "scale": {
              "x": 0.71406251192092896,
              "y": 0.71428573131561279
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 3,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Model",
            "source_uuid": "61587530-1788-4a8a-9854-55d7ab8643c1",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 1266.0,
              "y": 607.0
            },
            "scale": {
              "x": 0.58046877384185791,
              "y": 0.58055555820465088
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 4,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Stream Overlay",
            "source_uuid": "26865859-0f4d-4e3f-8285-e7567de6ab80",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 2,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Alerts",
            "source_uuid": "f1d0e2a1-3bbf-4a75-80ab-91243c5590d4",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.7999999523162842,
              "y": 1.7999999523162842
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 5,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Chat",
            "source_uuid": "005e5143-427d-405c-84aa-b50210ad015f",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 1420.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 6,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          }
        ]
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "OBSBasic.SelectScene": [],
        "libobs.show_scene_item.1": [],
        "libobs.hide_scene_item.1": [],
        "libobs.show_scene_item.3": [],
        "libobs.hide_scene_item.3": [],
        "libobs.show_scene_item.4": [],
        "libobs.hide_scene_item.4": [],
        "libobs.show_scene_item.2": [],
        "libobs.hide_scene_item.2": [],
        "libobs.show_scene_item.5": [],
        "libobs.hide_scene_item.5": [],
        "libobs.show_scene_item.6": [],
        "libobs.hide_scene_item.6": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Stream Background",
      "uuid": "d9b7efee-1348-4d0f-9b2d-f7ea0ecad7e7",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "close_when_inactive": true,
        "local_file": "/home/naomi/Documents/stream/stream-bg.webm",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Stream Overlay",
      "uuid": "26865859-0f4d-4e3f-8285-e7567de6ab80",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "close_when_inactive": true,
        "local_file": "/home/naomi/Documents/stream/stream-overlay.webm",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Text BRB",
      "uuid": "6f46d696-d2f1-49b4-957d-1f06a9392cdc",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "local_file": "/home/naomi/Documents/stream/slide-text-brb.webm",
        "close_when_inactive": true,
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Text End",
      "uuid": "e84200d5-b7bf-4230-afff-ff7cbae8a8d3",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "local_file": "/home/naomi/Documents/stream/slide-text-end.webm",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Text Start",
      "uuid": "f8ec5105-3e0e-44df-925e-1de60b69aac9",
      "id": "ffmpeg_source",
      "versioned_id": "ffmpeg_source",
      "settings": {
        "local_file": "/home/naomi/Documents/stream/slide-text-start.webm",
        "close_when_inactive": true,
        "undo_uuid": "f8ec5105-3e0e-44df-925e-1de60b69aac9",
        "looping": true
      },
      "mixers": 255,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "libobs.mute": [],
        "libobs.unmute": [],
        "libobs.push-to-mute": [],
        "libobs.push-to-talk": [],
        "MediaSource.Restart": [],
        "MediaSource.Play": [],
        "MediaSource.Pause": [],
        "MediaSource.Stop": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    },
    {
      "prev_ver": 503447552,
      "name": "Virtual Cam",
      "uuid": "251f1f3f-846d-475d-a496-9c9afd69125a",
      "id": "scene",
      "versioned_id": "scene",
      "settings": {
        "id_counter": 3,
        "custom_size": false,
        "items": [
          {
            "name": "Cam Background",
            "source_uuid": "6bd1ef08-a91e-4b0b-bb1a-d3ee2387f5f5",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 1,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Model",
            "source_uuid": "61587530-1788-4a8a-9854-55d7ab8643c1",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 2,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 1920.0,
              "y": 1080.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 3,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          },
          {
            "name": "Cam Overlay",
            "source_uuid": "bf638a3c-5133-406c-a3d2-541723f715f9",
            "visible": true,
            "locked": false,
            "rot": 0.0,
            "pos": {
              "x": 0.0,
              "y": 0.0
            },
            "scale": {
              "x": 1.0,
              "y": 1.0
            },
            "align": 5,
            "bounds_type": 0,
            "bounds_align": 0,
            "bounds_crop": false,
            "bounds": {
              "x": 0.0,
              "y": 0.0
            },
            "crop_left": 0,
            "crop_top": 0,
            "crop_right": 0,
            "crop_bottom": 0,
            "id": 2,
            "group_item_backup": false,
            "scale_filter": "disable",
            "blend_method": "default",
            "blend_type": "normal",
            "show_transition": {
              "duration": 0
            },
            "hide_transition": {
              "duration": 0
            },
            "private_settings": {}
          }
        ]
      },
      "mixers": 0,
      "sync": 0,
      "flags": 0,
      "volume": 1.0,
      "balance": 0.5,
      "enabled": true,
      "muted": false,
      "push-to-mute": false,
      "push-to-mute-delay": 0,
      "push-to-talk": false,
      "push-to-talk-delay": 0,
      "hotkeys": {
        "OBSBasic.SelectScene": [],
        "libobs.show_scene_item.1": [],
        "libobs.hide_scene_item.1": [],
        "libobs.show_scene_item.3": [],
        "libobs.hide_scene_item.3": [],
        "libobs.show_scene_item.2": [],
        "libobs.hide_scene_item.2": []
      },
      "deinterlace_mode": 0,
      "deinterlace_field_order": 0,
      "monitoring_type": 0,
      "private_settings": {}
    }
  ]
}

3.3. Profile

This configuration file sets up the OBS profile.

[General]
Name=Naomi

[Output]
Mode=Simple
FilenameFormatting=%CCYY-%MM-%DD %hh-%mm-%ss
DelayEnable=false
DelaySec=20
DelayPreserve=true
Reconnect=true
RetryDelay=2
MaxRetries=25
BindIP=default
IPFamily=IPv4+IPv6
NewSocketLoopEnable=false
LowLatencyEnable=false

[Stream1]
IgnoreRecommended=false

[SimpleOutput]
FilePath=/home/naomi
RecFormat2=mkv
VBitrate=2500
ABitrate=160
UseAdvanced=false
Preset=veryfast
NVENCPreset2=p5
RecQuality=Stream
RecRB=false
RecRBTime=20
RecRBSize=512
RecRBPrefix=Replay
StreamAudioEncoder=aac
RecAudioEncoder=aac
RecTracks=1
StreamEncoder=nvenc
RecEncoder=nvenc

[AdvOut]
ApplyServiceSettings=true
UseRescale=false
TrackIndex=1
VodTrackIndex=2
Encoder=obs_x264
RecType=Standard
RecFilePath=/home/naomi
RecFormat2=mkv
RecUseRescale=false
RecTracks=1
RecEncoder=none
FLVTrack=1
StreamMultiTrackAudioMixes=1
FFOutputToFile=true
FFFilePath=/home/naomi
FFExtension=mp4
FFVBitrate=2500
FFVGOPSize=250
FFUseRescale=false
FFIgnoreCompat=false
FFABitrate=160
FFAudioMixes=1
Track1Bitrate=160
Track2Bitrate=160
Track3Bitrate=160
Track4Bitrate=160
Track5Bitrate=160
Track6Bitrate=160
RecSplitFileTime=15
RecSplitFileSize=2048
RecRB=false
RecRBTime=20
RecRBSize=512
AudioEncoder=libfdk_aac
RecAudioEncoder=libfdk_aac

[Video]
BaseCX=1920
BaseCY=1080
OutputCX=1920
OutputCY=1080
FPSType=0
FPSCommon=30
FPSInt=30
FPSNum=30
FPSDen=1
ScaleType=bicubic
ColorFormat=NV12
ColorSpace=709
ColorRange=Partial
SdrWhiteLevel=300
HdrNominalPeakLevel=1000

[Audio]
MonitoringDeviceId=default
MonitoringDeviceName=Default
SampleRate=48000
ChannelSetup=Stereo
MeterDecayRate=23.53
PeakMeterType=0

[Panels]
CookieId=#redacted

3.4. Docks

This configuration file loads Naomi's standard dock layout. Sensitive information has been redacted. This specifically goes in ~/.config/obs-studio/global.ini.

[General]
Pre19Defaults=false
Pre21Defaults=false
Pre23Defaults=false
Pre24.1Defaults=false
MaxLogs=10
InfoIncrement=1
ProcessPriority=Normal
EnableAutoUpdates=true
ConfirmOnExit=true
HotkeyFocusType=NeverDisableHotkeys
FirstRun=true
InstallGUID=#Redacted
CurrentTheme3=Light
LastVersion=503382018
InfoLastVersion=32993938767872

[Video]
Renderer=OpenGL

[BasicWindow]
PreviewEnabled=true
PreviewProgramMode=false
SceneDuplicationMode=true
SwapScenesMode=true
SnappingEnabled=true
ScreenSnapping=true
SourceSnapping=true
CenterSnapping=false
SnapDistance=10
SpacingHelpersEnabled=true
RecordWhenStreaming=false
KeepRecordingWhenStreamStops=false
SysTrayEnabled=true
SysTrayWhenStarted=false
SaveProjectors=false
ShowTransitions=true
ShowListboxToolbars=true
ShowStatusBar=true
ShowSourceIcons=true
ShowContextToolbars=true
StudioModeLabels=true
VerticalVolControl=false
MultiviewMouseSwitch=true
MultiviewDrawNames=true
MultiviewDrawAreas=true
MediaControlsCountdownTimer=true
WarnBeforeStartingStream=false
WarnBeforeStoppingStream=false
WarnBeforeStoppingRecord=false
geometry=AdnQywADAAAAAA8AAAAAAAAAFn8AAAQ3AAARNgAAACAAABVsAAAC2AAAAAICAAAAB4AAAA8AAAAAIAAAFn8AAAQ3
DockState=AAAA/wAAAAD9AAAAAwAAAAAAAAB0AAAC1/wCAAAAAfsAAAAiAEMAaABhAHQAXwBlAHgAdAByAGEAQgByAG8AdwBzAGUAcgEAAAAXAAAC1wAAAFAA////AAAAAQAAAY4AAALX/AIAAAAB/AAAABcAAALXAAAAUAD////8AQAAAAL7AAAAMABSAGUAZABlAG0AcAB0AGkAbwBuAHMAXwBlAHgAdAByAGEAQgByAG8AdwBzAGUAcgEAAAXyAAAAwwAAAFAA////+wAAACgAQQBjAHQAaQBvAG4AcwBfAGUAeAB0AHIAYQBCAHIAbwB3AHMAZQByAQAABrkAAADHAAAAUAD///8AAAADAAAHgAAAAQT8AQAAAAf7AAAAFABzAGMAZQBuAGUAcwBEAG8AYwBrAQAAAAAAAAE1AAAAoAD////7AAAAFgBzAG8AdQByAGMAZQBzAEQAbwBjAGsBAAABOQAAATIAAACgAP////sAAAASAG0AaQB4AGUAcgBEAG8AYwBrAQAAAm8AAAGSAAAA3gD////7AAAAHgB0AHIAYQBuAHMAaQB0AGkAbwBuAHMARABvAGMAawEAAAQFAAABHwAAAIIA////+wAAACIARgBlAGUAZABfAGUAeAB0AHIAYQBCAHIAbwB3AHMAZQByAQAABSgAAAExAAAAUAD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAAZdAAABIwAAAJ4A////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAACYgAAAbgAAAK8AAAAyAAABXYAAALXAAAABAAAAAQAAAAIAAAACPwAAAAA
ExtraBrowserDocks=[{"title": "Redemptions", "url": "https://www.twitch.tv/popout/naomilgbt/reward-queue", "uuid": "redacted"}, {"title": "Feed", "url": "https://dashboard.twitch.tv/popout/u/naomilgbt/stream-manager/activity-feed?uuid=redacted", "uuid": "redacted"}, {"title": "Chat", "url": "https://dashboard.twitch.tv/popout/u/naomilgbt/stream-manager/chat?uuid=redacted", "uuid": "redacted"}, {"title": "Actions", "url": "https://dashboard.twitch.tv/popout/u/naomilgbt/stream-manager/quick-actions?uuid=redacted", "uuid": "redacted"}]
AlwaysOnTop=false
EditPropertiesMode=false
DocksLocked=false
SideDocks=false

[Basic]
Profile=Naomi
ProfileDir=Naomi
SceneCollection=Naomi
SceneCollectionFile=Naomi
ConfigOnNewProfile=true

[OBSWebSocket]

[Accessibility]
SelectRed=255
SelectGreen=65280
SelectBlue=16744192
MixerGreen=2522918
MixerYellow=2523007
MixerRed=2500223
MixerGreenActive=5046092
MixerYellowActive=5046271
MixerRedActive=5000447

[PropertiesWindow]
cx=720
cy=580

[ScriptLogWindow]
geometry=AdnQywADAAAAAAABAAAAGQAAAlgAAAGoAAAAAQAAABkAAAJYAAABqAAAAAEAAAAAB4AAAAABAAAAGQAAAlgAAAGo

[Appearance]
Theme=com.obsproject.Yami.Light