diff --git a/jigasi-vosk-backend.sh b/jigasi-vosk-backend.sh new file mode 100644 index 0000000..a143a1e --- /dev/null +++ b/jigasi-vosk-backend.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# Quick Jigasi Installer with VOSK backend - *buntu (LTS) based systems. +# SwITNet Ltd © - 2024, https://switnet.net/ +# GPLv3 or later. + +#Check if user is root +if ! [ "$(id -u)" = 0 ]; then + echo "You need to be root or have sudo privileges!" + exit 0 +fi +exit_if_not_installed() { +if [ "$(dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed")" != "1" ]; then + echo " This instance doesn't have $1 installed, exiting..." + echo " If you think this is an error, please report to: + -> https://forge.switnet.net/switnet/quick-jibri-installer/issues " + exit +fi +} + +clear +echo '' +echo '########################################################################' +echo ' Jigasi Transcript addon' +echo '########################################################################' +echo ' by Software, IT & Networks Ltd' +echo '' + +exit_if_not_installed jitsi-meet + +export DOMAIN="$(find /etc/prosody/conf.d/ -name \*.lua|awk -F'.cfg' '!/localhost/{print $1}'|xargs basename)" +export JIG_TRANSC_PASWD="$(tr -dc "a-zA-Z0-9#*=" < /dev/urandom | fold -w 16 | head -n1)" +JIGASI_CONFIG="/etc/jitsi/jigasi/config" +MEET_CONF="/etc/jitsi/meet/${DOMAIN}-config.js" +JIG_SIP_CONF="/etc/jitsi/jigasi/config" +JIG_SIP_PROP="/etc/jitsi/jigasi/sip-communicator.properties" +#JIG_TRANSC_PASWD_B64="$(echo -n "$JIG_TRANSC_PASWD" | base64)" + +apt-get -q2 update + +# Disbale +echo "jigasi jigasi/sip-account string ''" | debconf-set-selections +echo "jigasi jigasi/sip-password password ''" | debconf-set-selections + +echo "Installing Jigasi, SIP configuration disabled by default." +apt-get -y install gettext-base jigasi docker.io + +echo "Please select a language for the VOSK transcription model:" +echo "1) Chinese" +echo "2) English" +echo "3) French" +echo "4) German" +echo "5) Hindi" +echo "6) Japanese" +echo "7) Russian" +echo "8) Spanish" + +read -p "Enter the number corresponding to your language choice: " lang_choice + +case $lang_choice in + 1) + echo "You selected Chinese." + VOSK_DOCKER_MODEL="alphacep/kaldi-cn" + ;; + 2) + echo "You selected English." + VOSK_DOCKER_MODEL="alphacep/kaldi-en" + ;; + 3) + echo "You selected French." + VOSK_DOCKER_MODEL="alphacep/kaldi-fr" + ;; + 4) + echo "You selected German." + VOSK_DOCKER_MODEL="alphacep/kaldi-de" + ;; + 5) + echo "You selected Hindi." + VOSK_DOCKER_MODEL="alphacep/kaldi-hi" + ;; + 6) + echo "You selected Japanese." + VOSK_DOCKER_MODEL="alphacep/kaldi-ja" + ;; + 7) + echo "You selected Russian." + VOSK_DOCKER_MODEL="alphacep/kaldi-ru" + ;; + 8) + echo "You selected Spanish." + VOSK_DOCKER_MODEL="alphacep/kaldi-es" + ;; + *) + echo "Invalid selection. Please choose a number between 1 and 8." + ;; +esac + +# Running selected VOSK docker model. +docker run -d -p 2700:2700 ${VOSK_DOCKER_MODEL}:latest + +echo "Setting up Jigasi transcript with current platform..." + +# Jitsi Meet +echo "> Patching Jitsi Meet's config.js for Transcription support." +echo " Read more at patches/jigasi/jigasi-meet-config.patch file" +envsubst < patches/jigasi/jigasi-meet-config.patch | patch --no-backup-if-mismatch -d / -p1 + +# Jigasi +echo "> Patching jigasi's sip-communicator.properties configuration." +echo " Read more at patches/jigasi/jigasi-sip-properties.patch file" +cp "$JIG_SIP_PROP" ${JIG_SIP_PROP}-dpkg-file +envsubst < patches/jigasi/jigasi-sip-properties.patch | patch --no-backup-if-mismatch -d / -p1 + +# Create transcribe user on hidden domain. +prosodyctl register transcriber recorder."$DOMAIN" "$JIG_TRANSC_PASWD" + +# Restart services. +systemctl restart prosody \ + jicofo \ + jigasi \ + jibri* \ + jitsi-videobridge2 + +echo "" +echo "Full transcript files are available at:" +echo "--> /var/lib/jigasi/transcripts/" +echo "" +echo "Happy transcripting!" +echo "" diff --git a/patches/jigasi/jigasi-meet-config.patch b/patches/jigasi/jigasi-meet-config.patch new file mode 100644 index 0000000..f7ac5ac --- /dev/null +++ b/patches/jigasi/jigasi-meet-config.patch @@ -0,0 +1,40 @@ +# Quick Jigasi Installer with VOSK backend - *buntu (LTS) based systems. +# SwITNet Ltd © - 2024, https://switnet.net/ +# GPLv3 or later. + +Enable transcription on jitsi meet config.js file. + +diff --git a/etc/jitsi/meet/${DOMAIN}-config.js b/etc/jitsi/meet/${DOMAIN}-config.js +index f412891..f704157 100644 +--- a/etc/jitsi/meet/${DOMAIN}-config.js ++++ b/etc/jitsi/meet/${DOMAIN}-config.js +@@ -407,9 +407,9 @@ var config = { + // autoCaptionOnRecord: false, + + // Transcription options. +- // transcription: { ++ transcription: { + // // Whether the feature should be enabled or not. +- // enabled: false, ++ enabled: true, + + // // Translation languages. + // // Available languages can be found in +@@ -424,7 +424,7 @@ var config = { + // // detected based on the environment, e.g. if the app is opened in a chrome instance which + // // is using french as its default language then transcriptions for that participant will be in french. + // // Defaults to true. +- // useAppLanguage: true, ++ useAppLanguage: true, + + // // Transcriber language. This settings will only work if "useAppLanguage" + // // is explicitly set to false. +@@ -434,7 +434,7 @@ var config = { + + // // Enables automatic turning on transcribing when recording is started + // autoTranscribeOnRecord: false, +- // }, ++ }, + + // Misc + diff --git a/patches/jigasi/jigasi-sip-properties.patch b/patches/jigasi/jigasi-sip-properties.patch new file mode 100644 index 0000000..886cc76 --- /dev/null +++ b/patches/jigasi/jigasi-sip-properties.patch @@ -0,0 +1,80 @@ +# Quick Jigasi Installer with VOSK backend - *buntu (LTS) based systems. +# SwITNet Ltd © - 2024, https://switnet.net/ +# GPLv3 or later. + +Modify sip-communicator.properties to run Jigasi along with VOSK Models. + +diff --git a/etc/jitsi/jigasi/sip-communicator.properties b/etc/jitsi/jigasi/sip-communicator.properties +index 7a8d0f3..ae5369a 100644 +--- a/etc/jitsi/jigasi/sip-communicator.properties ++++ b/etc/jitsi/jigasi/sip-communicator.properties +@@ -165,12 +165,12 @@ org.jitsi.jigasi.xmpp.acc.USE_DEFAULT_STUN_SERVER=false + + # If you want jigasi to perform authenticated login instead of anonymous login + # to the XMPP server, you can set the following properties. +-# org.jitsi.jigasi.xmpp.acc.USER_ID=SOME_USER@SOME_DOMAIN +-# org.jitsi.jigasi.xmpp.acc.PASS=SOME_PASS +-# org.jitsi.jigasi.xmpp.acc.ANONYMOUS_AUTH=false ++org.jitsi.jigasi.xmpp.acc.USER_ID=transcriber@recorder.${DOMAIN} ++org.jitsi.jigasi.xmpp.acc.PASS=${JIG_TRANSC_PASWD} ++org.jitsi.jigasi.xmpp.acc.ANONYMOUS_AUTH=false + + # To fix SSL/TLS required by client but not supported by server +-#org.jitsi.jigasi.xmpp.acc.ALLOW_NON_SECURE=true ++org.jitsi.jigasi.xmpp.acc.ALLOW_NON_SECURE=true + + # Can be used in combination with jitsi-meet module mod_auth_jitsi-shared-secret + # To have jigasi use a random username on every call +@@ -187,7 +187,7 @@ org.jitsi.jigasi.xmpp.acc.USE_DEFAULT_STUN_SERVER=false + # Activate this property if you are using self-signed certificates or other + # type of non-trusted certicates. In this mode your service trust in the + # remote certificates always. +-# net.java.sip.communicator.service.gui.ALWAYS_TRUST_MODE_ENABLED=true ++net.java.sip.communicator.service.gui.ALWAYS_TRUST_MODE_ENABLED=true + + # Enable this property to be able to shutdown gracefully jigasi using + # a rest command +@@ -196,31 +196,31 @@ org.jitsi.jigasi.xmpp.acc.USE_DEFAULT_STUN_SERVER=false + # Options regarding Transcription. Read the README for a detailed description + # about each property + +-#org.jitsi.jigasi.ENABLE_TRANSCRIPTION=false +-#org.jitsi.jigasi.ENABLE_SIP=true ++org.jitsi.jigasi.ENABLE_TRANSCRIPTION=true ++org.jitsi.jigasi.ENABLE_SIP=false + + # whether to use the more expensive, but better performing + # "video" model when doing transcription + # org.jitsi.jigasi.transcription.USE_VIDEO_MODEL = false + + # delivering final transcript +-# org.jitsi.jigasi.transcription.DIRECTORY=/var/lib/jigasi/transcripts +-# org.jitsi.jigasi.transcription.BASE_URL=http://localhost/ +-# org.jitsi.jigasi.transcription.jetty.port=-1 +-# org.jitsi.jigasi.transcription.ADVERTISE_URL=false ++org.jitsi.jigasi.transcription.DIRECTORY=/var/lib/jigasi/transcripts ++org.jitsi.jigasi.transcription.BASE_URL=http://localhost/ ++org.jitsi.jigasi.transcription.jetty.port=-1 ++org.jitsi.jigasi.transcription.ADVERTISE_URL=false + + # save formats +-# org.jitsi.jigasi.transcription.SAVE_JSON=false +-# org.jitsi.jigasi.transcription.SAVE_TXT=true ++org.jitsi.jigasi.transcription.SAVE_JSON=false ++org.jitsi.jigasi.transcription.SAVE_TXT=true + + # send formats +-# org.jitsi.jigasi.transcription.SEND_JSON=true +-# org.jitsi.jigasi.transcription.SEND_TXT=false ++org.jitsi.jigasi.transcription.SEND_JSON=true ++org.jitsi.jigasi.transcription.SEND_TXT=false + + # Vosk server +-# org.jitsi.jigasi.transcription.customService=org.jitsi.jigasi.transcription.VoskTranscriptionService ++org.jitsi.jigasi.transcription.customService=org.jitsi.jigasi.transcription.VoskTranscriptionService + # org.jitsi.jigasi.transcription.vosk.websocket_url={"en": "ws://localhost:2700", "fr": "ws://localhost:2710"} +-# org.jitsi.jigasi.transcription.vosk.websocket_url=ws://localhost:2700 ++org.jitsi.jigasi.transcription.vosk.websocket_url=ws://localhost:2700 + + # Whisper live transcription server + # org.jitsi.jigasi.transcription.customService=org.jitsi.jigasi.transcription.WhisperTranscriptionService diff --git a/quick_jibri_installer.sh b/quick_jibri_installer.sh index d7508cd..ee0edcc 100644 --- a/quick_jibri_installer.sh +++ b/quick_jibri_installer.sh @@ -546,7 +546,6 @@ JIBRI_XORG_CONF="/etc/jitsi/jibri/xorg-video-dummy.conf" WS_MATCH1="# ensure all static content can always be found first" WS_MATCH2="external_api.js" MEET_MATCH1="disable simulcast support." -#GC_SDK_REL_FILE="http://packages.cloud.google.com/apt/dists/cloud-sdk-$(lsb_release -sc)/Release" # Make sure we can rely on the match strings. printf "> Testing match strings on config files.\n" @@ -700,24 +699,16 @@ do done sleep .1 ##Jigasi -#if [ "$(curl -s -o /dev/null -w "%{http_code}" "$GC_SDK_REL_FILE" )" == "404" ]; then - #printf "> Sorry Google SDK doesn't have support yet for %s, - #thus, Jigasi Transcript can't be enable.\n\n" "$(lsb_release -sd)" -#elif [ "$(curl -s -o /dev/null -w "%{http_code}" "$GC_SDK_REL_FILE" )" == "200" ]; then - #while [ "$ENABLE_TRANSCRIPT" != "yes" ] && [ "$ENABLE_TRANSCRIPT" != "no" ] - #do - #read -p "> Do you want to setup Jigasi Transcription: (yes or no) +while [ "$ENABLE_TRANSCRIPT" != "yes" ] && [ "$ENABLE_TRANSCRIPT" != "no" ] +do + read -p "> Do you want to setup Jigasi Transcription: (yes or no) #( Please check requirements at: https://forge.switnet.net/switnet/quick-jibri-installer )$NL" -r ENABLE_TRANSCRIPT - #if [ "$ENABLE_TRANSCRIPT" = "no" ]; then - #printf " - Jigasi Transcription won't be enabled.\n\n" - #elif [ "$ENABLE_TRANSCRIPT" = "yes" ]; then - #printf " - Jigasi Transcription will be enabled.\n\n" - #fi - #done -#else - #echo "No valid option for Jigasi. Please report this to -#https://forge.switnet.net/switnet/quick-jibri-installer/issues" -#fi + if [ "$ENABLE_TRANSCRIPT" = "no" ]; then + printf " - Jigasi Transcription won't be enabled.\n\n" + elif [ "$ENABLE_TRANSCRIPT" = "yes" ]; then + printf " - Jigasi Transcription will be enabled.\n\n" + fi +done sleep .1 #Grafana while [ "$ENABLE_GRAFANA_DSH" != "yes" ] && [ "$ENABLE_GRAFANA_DSH" != "no" ] @@ -1173,7 +1164,16 @@ if [ "$ENABLE_NC_ACCESS" = "yes" ]; then fi fi sleep .1 - +#Jigasi w/VOSK backend. +if [ "$ENABLE_TRANSCRIPT" = "yes" ]; then + printf "\nJigasi with VOSK backend will be enabled." + if [ "$MODE" = "debug" ]; then + bash "$PWD"/jigasi-vosk-backend.sh -m debug + else + bash "$PWD"/jigasi-vosk-backend.sh + fi +fi +sleep .1 #Grafana Dashboard if [ "$ENABLE_GRAFANA_DSH" = "yes" ]; then printf "\nGrafana Dashboard will be enabled."