diff options
-rw-r--r-- | README.org | 31 | ||||
-rw-r--r-- | group_vars/all.yml | 3 | ||||
-rw-r--r-- | inventory.yml | 18 | ||||
-rw-r--r-- | roles/caption/tasks/aeneas.yml | 12 | ||||
-rw-r--r-- | roles/caption/tasks/main.yml | 16 | ||||
-rwxr-xr-x | roles/caption/templates/process-captions.py | 7 |
6 files changed, 71 insertions, 16 deletions
@@ -6,6 +6,12 @@ ansible-galaxy collection install community.general Production: needs prod-vars.yml, see prod-vars.yml.sample Docker: needs docker-vars.yml, see docker-vars.yml.sample +* How to use this playbook + +1. Install ansible on your local machine and check out this repo. +2. Copy the ansible_vars block from conf.org to prod-vars.yml in this repo (alongside inventory.yml), or set emacsconf-ansible-directory in Emacs and then use emacsconf-ansible-tangle-vars to tangle the file. +3. Find the ansible-playbook command you want to run and try it out. + * Wiki ** Ikiwiki *** Prod @@ -166,8 +172,31 @@ Use a test pattern (don't know if this works) ansible-playbook -i inventory.yml prod-playbook.yml --tags test -e icecast_test_track=dev -e icecast_test=pattern * Captioning -Set up whisper +Set up whisper: ansible-playbook -i inventory.yml prod-playbook.yml --tags caption +Update caption script: + +ansible-playbook -i inventory.yml prod-playbook.yml --tags process-captions + ffmpeg -y -i handwritten/reencode.webm -t 60 -vcodec copy -acodec copy test.webm +* Other useful things + +nodemon -w . -e yml -x 'ansible-playbook -i inventory.yml prod-playbook.yml --tags vnc; true' +* OBS + +sudo su - orga -c vncserver +ssh -L 15902:127.0.0.1:5902 res + +Resizing VNC after connection +xrandr -s 1280x720 + +pacmd load-module module-null-sink sink_name=DevelopmentSink sink_properties=device.description="DevelopmentSink" + +pavucontrol +vncserver -kill :1 +vncserver -kill :2 + +Firefox profiles like to be created in an X environment +firefox -no-remote -CreateProfile "{{ emacsconf_id }}-{{ item.item.id }} diff --git a/group_vars/all.yml b/group_vars/all.yml index f7bbbc4..7ab7c6b 100644 --- a/group_vars/all.yml +++ b/group_vars/all.yml @@ -11,8 +11,11 @@ emacsconf_tracks: id: gen watch: https://emacsconf.org/{{ emacsconf_year }}/watch/gen/ watch_lowres: https://live.emacsconf.org/{{ emacsconf_year }}/watch/gen-480p/ + vnc_id: 5 - name: Development id: dev watch: https://emacsconf.org/{{ emacsconf_year }}/watch/dev/ watch_lowres: https://live.emacsconf.org/{{ emacsconf_year }}/watch/dev-480p/ + vnc_id: 6 icecast_emacsconf_user: emacsconf +emacsconf_home: /home/{{ emacsconf_user }} diff --git a/inventory.yml b/inventory.yml index f91434d..f3603b0 100644 --- a/inventory.yml +++ b/inventory.yml @@ -6,6 +6,18 @@ prod: ansible_become: true emacsconf_group: org cpus: 12 + obs: + ansible_host: res.emacsconf.org + ansible_python_interpreter: /usr/bin/python3 + ansible_become: true + emacsconf_group: org + cpus: 12 + # obs: + # ansible_host: obs + # remote_user: sacha + # ansible_ssh_user: sacha + # ansible_python_interpreter: /usr/bin/python3 + # ansible_become: true front: ansible_host: front0.emacsconf.org remote_user: orga @@ -43,12 +55,6 @@ prod: ansible_ssh_user: orga ansible_python_interpreter: /usr/bin/python3 ansible_become: true - obs: - ansible_host: obs - remote_user: sacha - ansible_ssh_user: sacha - ansible_python_interpreter: /usr/bin/python3 - ansible_become: true all: hosts: localhost: diff --git a/roles/caption/tasks/aeneas.yml b/roles/caption/tasks/aeneas.yml new file mode 100644 index 0000000..e280e7e --- /dev/null +++ b/roles/caption/tasks/aeneas.yml @@ -0,0 +1,12 @@ +- name: Install packages + package: + name: + - espeak + - python3-espeak + - ffmpeg + - libespeak-dev +- name: Install aeneas + ansible.builtin.pip: + name: + - numpy + - aeneas diff --git a/roles/caption/tasks/main.yml b/roles/caption/tasks/main.yml index 353b83b..3fa997c 100644 --- a/roles/caption/tasks/main.yml +++ b/roles/caption/tasks/main.yml @@ -17,6 +17,8 @@ - tqdm - torchaudio - num2words +- name: Set up aeneas + include: aeneas.yml - name: Create group group: name: "{{ emacsconf_group }}" @@ -31,7 +33,7 @@ path: "{{ emacsconf_caption_dir }}" state: directory - name: Copy the script for processing the files - tags: process-captions + tags: process-captions, wip template: src: process-captions.py dest: "{{ emacsconf_caption_dir }}/process-captions.py" @@ -63,9 +65,9 @@ group: "{{ emacsconf_group }}" mode: "g+rwX" recurse: true -- name: Restart caption monitoring service - become: true - service: - name: captions - enabled: true - state: started +# - name: Restart caption monitoring service +# become: true +# service: +# name: captions +# enabled: true +# state: started diff --git a/roles/caption/templates/process-captions.py b/roles/caption/templates/process-captions.py index b650bec..da99203 100755 --- a/roles/caption/templates/process-captions.py +++ b/roles/caption/templates/process-captions.py @@ -47,6 +47,7 @@ TRIM_AUDIO = False MODEL = os.environ.get('MODEL', 'large') # Set to tiny for testing WORK_DIR = "{{ emacsconf_caption_dir }}" JSON_FILE = os.path.join(WORK_DIR, 'talks.json') +DO_SRV2 = False # ---------------------------------------------------------------- @@ -94,7 +95,7 @@ def get_files_to_work_on(directory): else: val['base'] = os.path.join(os.path.dirname(val['video'] or val['audio']), base_name(val['video'] or val['audio'])) - if ALWAYS or (not 'vtt' in val or not 'srv2' in val): + if ALWAYS or (not 'vtt' in val or (DO_SRV2 and not 'srv2' in val)): if not 'audio' in val and 'video' in val: # No audio, need to convert it val = extract_audio(val) @@ -141,6 +142,8 @@ def generate_captions(work): result = clean_up_timestamps(result) with open(new_file, 'w') as vtt: whisper.utils.write_vtt(result['segments'], file=vtt) + with open(work['base'] + '.txt') + whisper.utils.write_txt(result['segments'], file=txt) work['vtt'] = new_file if 'srv2' in work: del work['srv2'] return work @@ -209,7 +212,7 @@ if len(needs_work) > 0: if work['audio']: if ALWAYS or not 'vtt' in work: work = generate_captions(work) - if ALWAYS or not 'srv2' in work: + if DO_SRV2 and (ALWAYS or not 'srv2' in work): work = generate_srv2(work) # print("Aligning words", audio_file, datetime.datetime.now()) # word_cuts = align_words(cuts) |