Δρομολόγηση ήχου συστήματος στην είσοδο του μικροφώνου για χρήση σε videoconference, OBS κτλ.

Κατά τη διάρκεια της πανδημίας και της βαριάς χρήσης τηλεκπαίδευσης, ο εκπαιδευτικός οργανισμός στον οποίο εργάζομαι έκανε χρήση του webex training (όχι meetings). Η συγκεκριμένη εφαρμογή δεν είχε δυνατότητα διαμοιρασμού του audio συστήματος, λειτουργία σχεδόν απαραίτητη σε πολλά μαθήματα για ευνόητους λόγους. Οι περισσότερες δασκάλες, (μέσα στην άγνοιά τους) ανέβαζαν το volume στα ηχεία του υπολογιστή, ώστε ο ήχος να περάσει μέσω του φυσικού μικροφώνου στους μαθητές. Έτσι δημιουργούνταν “ωραίες” καταστάσεις με την επιστροφή του ήχου στους μαθητές και infinite loops κτλ. Η λύση που έδωσα τότε στο πρόβλημα αυτό ήταν να χρησιμοποιήσω virtual devices (VB-Cable) και μια εξαιρετική εφαρμογή αναδρομολόγησης ήχου (VB-voicemeeter). Με σωστές ρυθμίσεις στο default μικρόφωνο και ηχεία των Windows και αντίστοιχες ρυθμίσεις στην εφαρμογή τηλεδιάσκεψης, μπορούσα να πετύχω αυτό που ήθελα, δηλαδή να περνάω τον ήχο συστήματος σαν είσοδο στο μικρόφωνο, αλλά ταυτόχρονα να τον ακούω και εγώ στα ακουστικά μου, χωρίς να υπάρχουν προβλήματα επιστροφής ήχου κτλ. Φυσικά όλα αυτά έγιναν στα windows, μια που το webex training ήταν (και είναι) windows only app και δεν έτρεχε με κανέναν θεό στο Linux.

Fast forward στο σήμερα, που χρησιμοποιώ πλέον εφαρμογές τηλεδιάσκεψης για προσωπική χρήση στο Linux. Τα ΖΟΟΜ και Webex δεν είναι πλέον δωρεάν (έχουν time limit) και η εφαρμογή που χρησιμοποιώ είναι το Google Meet που καλύπτει όλες τις ανάγκες μου. Το πρόβλημα του Google Meet είναι ότι μπορεί να διαμοιράσει ήχο συστήματος, αλλά μόνο μέσα από tab του Google Chrome. Δηλαδή μπορώ να περάσω τον ήχο ενός youtube video (εφόσον παίζει σε chrome tab), αλλά όχι τον ήχο από ένα π.χ. video που παίζει τοπικά στο vlc. Επομένως έπρεπε να βρω τρόπο να κάνω στο Linux, ό,τι έκανα και με το Voicemeeter στα Windows.

Στο Linux, στην πλειονότητα των διανομών, χρησιμοποιείται το PulseAudio ως sound server, ενώ σιγά σιγά αντικαθίσταται από το πιο μοντέρνο pipewire. To Linux Mint χρησιμοποιεί το PulseAudio, επομένως ο οδηγός που ακολουθεί θα δουλέψει σε οποιαδήποτε διανομή χρησιμοποιεί PulseAudio.

Αυτό που θα κάνουμε είναι με τη χρήση εικονικών συσκευών (null_sinks) και “καλωδίων” (loopbacks) να αναδρομολογήσουμε τον ήχο, χωρίς να έχουμε πρόβλημα επιστροφής (δηλαδή ο ήχος-φωνή των συνομιλητών να τους επιστρέφει πίσω). Σημειωτέον ότι όλα τα παρακάτω απαιτούν τη χρήση ακουστικών και ΟΧΙ ηχείων, καθώς στη δεύτερη περίπτωση η φωνή των συνομιλητών θα επιστρέφει μέσω του φυσικού μικροφώνου και θα δημιουργεί πρόβλημα “infinite loop”.

Για να διευκολύνω όποιον επιθυμεί να υλοποιήσει τέτοια αναδρομολόγηση ήχου για τις δικές του ανάγκες, έφτιαξα ένα script που θα σας σετάρει το σύστημα ήχου αυτόματα χωρίς να κοπιάσετε.

#!/bin/bash


pactl list sinks|egrep -i 'sink|name:'

read -p "Enter the headphones you want to use: " selection
HEADSET=$selection
# echo "you selected $HEADSET"
clear

pactl list sources|egrep -i 'source|name:'

read -p "Enter the microphone you want to use: " selection
MICROPHONE=$selection
# echo "you selected $MICROPHONE"

# MICROPHONE=alsa_input.usb-Kingston_HyperX_Virtual_Surround_Sound_00000000-00.analog-stereo
# HEADSET=alsa_output.usb-Kingston_HyperX_Virtual_Surround_Sound_00000000-00.analog-stereo

# Create the null sinks
# virtual1 gets your audio sources (mplayer ...) that you want to hear and share
# virtual2 gets all the audio you want to share (virtual1 + micro)

pactl load-module module-null-sink sink_name=virtual1 sink_properties=device.description="virtual1_SystemAudio"
pactl load-module module-null-sink sink_name=virtual2 sink_properties=device.description="virtual2_SystemAudio+Mic"

# now set as default sink the virtual1 because we DO want system sound go to virtual1 and THEN to headset
pactl set-default-sink virtual1

# Now create the loopback devices, all arguments are optional and can be configured with pavucontrol

pactl load-module module-loopback source=virtual1.monitor sink=$HEADSET
pactl load-module module-loopback source=virtual1.monitor sink=virtual2
pactl load-module module-loopback source=$MICROPHONE sink=virtual2

# This should not be necessary, however some programs (zoom. viber etc.) won't be able to see monitors
# We could manually re-assign them with pavucontrol or similar, but creating a virtual source is more convenient 
# pactl load-module module-virtual-source source_name=virtual2.mic master=virtual2.monitor source_properties=device.description=Virtual2Mic >> "${module_file}"
# module-virtual-source has great latency ~400ms, so it is better to use module-remap-source

pactl load-module module-remap-source master=virtual2.monitor source_name=virtual.mic  source_properties=device.description="virtual_mic_SystemAudio+Mic"

# restart pulse to unload everything
# systemctl --user restart pulseaudio.service

Η ακόλουθη εικόνα δείχνει τι θα υλοποιήσουμε:

Όλες οι αλλαγές που γίνονται από το script είναι προσωρινές και χάνονται μετά από επανεκκίνηση του συστήματος ή επανεκκίνηση του sound server (systemctl --user restart pulseaudio.service).

Μόλις τρέξουμε το script, θα μας εμφανίσει τις εξόδους ήχου του συστήματος και θα πρέπει να επιλέξουμε με αριθμό αυτήν που επιθυμούμε σαν default έξοδο:

Στη συνέχεια θα εμφανίσει τις εισόδους και θα πρέπει να επιλέξουμε το μικρόφωνο που επιθυμούμε. ΠΡΟΣΟΧΗ μην επιλέξετε κάποια είσοδο με κατάληξη “.monitor”:

image

Τέλος, ανοίγουμε την εφαρμογή video conference της αρεσκείας μας και επιλέγουμε στις ρυθμίσεις της εφαρμογής έξοδο στα ακουστικά μας (ΠΡΟΣΟΧΗ) και είσοδο από το εικονικό μικρόφωνο “virtual 2”.

Αυτό ήταν. Στα ακουστικά μας θα ακούμε τα πάντα όλα, ενώ ο οποιοσδήποτε ήχος από το σύστημά μας θα περνάει στους συνομιλητές μας, χωρίς πρόβλημα επιστροφής ήχου.

Εάν επιθυμούμε κάποια άλλη αναδρομολόγηση, μπορούμε να την πετύχουμε χειροκίνητα πλέον από την εφαρμογή pavucontrol που μπορούμε να εγκαταστήσουμε από το software center της διανομής μας, αν δεν είναι ήδη εγκατεστημένη.

6 «Μου αρέσει»