Instance locale de BigBlueButton
Si vous n’avez pas accès à une instance BBB pour exécuter B3Desk et la tester, vous pouvez lancer un conteneur BBB.
Voici les étapes à suivre pour avoir un conteneur BBB local correctement configuré.
Étapes d’installation
Il existe un script officiel pour construire l’image Docker de BBB.
Il est disponible bigbluebutton/create_bbb.sh après avoir lancé la commande git submodule update --init.
Créer le conteneur BBB
./bigbluebutton/create_bbb.sh --image=imdt/bigbluebutton:3.0.x-develop --update bbb30
L’image est assez volumineuse (~8Go), il faudra donc être patient.
Le script devrait afficher l’url et le secret du service BBB.
URL: https://bbb30.test/bigbluebutton/
Secret: unknownBbbSecretKey
Link to the API-Mate:
https://bbb30.test/api-mate/#server=https://bbb30.test/bigbluebutton/&sharedSecret=bbbSecretKey
Cette commande vous montre également comment accéder au BBB API-Mate.
Copiez l’url BBB (BIGBLUEBUTTON_ENDPOINT) et ajoutez
apià la fin, ainsi que la clé secrète (BIGBLUEBUTTON_SECRET) dans votre fichier web.envLancez les conteneurs B3Desk
Vous avez maintenant un réseau b3desk_default avec tous les services en cours d’exécution et un service BBB autonome
Vous devez les connecter ensemble avec :
Ajouter le conteneur BBB au réseau local
docker network connect b3desk_default bbb30
Vous pouvez vérifier si ces services sont effectivement connectés avec un curl depuis bbb30 vers un service B3Desk par exemple
Autoriser les requêtes http avec BBB
BBB doit explicitement autoriser les requêtes http vers b3desk, sans quoi les fichiers de présentation n’apparaîtront pas dans le salon :
docker exec bbb30 sed -i '$ a insertDocumentSupportedProtocols=https,http' /etc/bigbluebutton/bbb-web.properties
docker exec bbb30 bbb-conf --restart
Lancer un conteneur existant
Si vous avez déjà installé BBB et que le conteneur existe toujours, il n’est pas nécessaire de le réinstaller (le script create_bbb.sh supprime toute instance existante et recrée une version mise à jour).
Vous devez simplement connecter les services :
docker network connect b3desk_default bbb30
Et lancer le conteneur BBB :
docker start bbb30
Vous pouvez vérifier qu’il fonctionne effectivement avec :
docker ps -a
Configurer l’enregistrement MP4
Pour configurer BBB afin qu’il traite les enregistrements en vidéo MP4, comme en production, vous devez effectuer une intervention manuelle. Il s’agit d’un problème qui n’est pas encore résolu.
Ouvrir une session dans le conteneur :
ssh bbb30
Installer le paquet bbb-playback-video :
sudo apt-get install bbb-playback-video
Éditer le fichier
/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml:
sudo vim /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
Ajouter le traitement et la publication vidéo dans le fichier :
steps:
archive: "sanity"
sanity: "captions"
captions:
- "process:presentation"
- "process:video"
"process:presentation": "publish:presentation"
"process:video": "publish:video"
Redémarrer la file d’attente de traitement des enregistrements
sudo systemctl restart bbb-rap-resque-worker.service
Configurer la transcription IA
La transcription nécessite d’avoir livekit comme moteur audio (afin d’avoir des pistes séparées) et un ensemble de scripts pour extraire l’audio, envoyer les pistes à un modèle de transcription, récupérer les transcript puis les envoyer à un second modèle pour produire une synthèse.
L’installation est automatisée, disponible avec le script suivant, aussi disponible à cette adresse.
Le script demandera des informations sur le service à utiliser (Albert ou OpenAI) ainsi que la clé d’API. Après installation de la documentation est disponible dans /tmp/bbb-record-ai-summary-ai-summary-new-format sous format markdown.
Après un enregistrement, le transcript ainsi que le résumé sont alors disponibles via l’endpoint getRecordings de l’API BBB.
Le prompt de résumé par défaut utilisé est :
Create a concise summary that includes:
1. Main topics discussed
2. Key decisions made
3. Action items (if any)
4. Important points raised
Detect the language of the transcript and write the entire summary in that same language.
Never translate or switch languages.
Keep the summary clear, professional, and under 500 words.
#!/bin/bash -ex
AI_PROVIDER="${1:-${AI_PROVIDER:-}}"
AI_API_KEY="${2:-${AI_API_KEY:-}}"
usage() {
echo "Usage: $0 <ai-provider> <api-key>"
echo ""
echo "Supported ai-provider values: claude, openai, albert"
echo "You can also set AI_PROVIDER and AI_API_KEY in the environment."
}
if [[ -z "$AI_PROVIDER" || -z "$AI_API_KEY" ]]; then
usage
exit 1
fi
case "$AI_PROVIDER" in
claude)
LLM_API_KEY_PATH=".llm.anthropic_api_key"
TRANSCRIPTION_PROVIDER=""
;;
openai)
LLM_API_KEY_PATH=".llm.openai_api_key"
TRANSCRIPTION_PROVIDER="openai"
;;
albert)
LLM_API_KEY_PATH=".llm.albert_api_key"
TRANSCRIPTION_PROVIDER="albert"
;;
*)
echo "Unsupported ai-provider: $AI_PROVIDER"
usage
exit 1
;;
esac
sudo apt update
# LIVEKIT
sudo apt-get install bbb-livekit -y || true
sudo yq e -i '.livekit.enabled = true' /etc/bigbluebutton/bbb-webrtc-sfu/production.yml
sudo systemctl restart bbb-webrtc-sfu
sudo systemctl restart livekit-server
echo "audioBridge=livekit" | sudo tee -a /etc/bigbluebutton/bbb-web.properties
sudo systemctl restart bbb-web nginx
# DEB
sudo apt install debhelper po-debconf -y || true
wget -O /tmp/bbb-record-ai-summary-ai-summary-new-format.zip https://bigbluebutton.nyc3.digitaloceanspaces.com/bbb-record-ai-summary-ai-summary-new-format.zip
cd /tmp
unzip -o bbb-record-ai-summary-ai-summary-new-format.zip
cd /tmp/bbb-record-ai-summary-ai-summary-new-format/
sudo ./build.sh
cd ..
sudo apt install ./bbb-record-ai-summary_0.1.0_all.deb -y || true
sudo touch /etc/bigbluebutton/ai-summary.yml
sudo yq eval ".llm.provider = \"$AI_PROVIDER\"" -i /etc/bigbluebutton/ai-summary.yml
sudo yq eval "$LLM_API_KEY_PATH = \"$AI_API_KEY\"" -i /etc/bigbluebutton/ai-summary.yml
sudo yq eval '.llm.language = "en"' -i /etc/bigbluebutton/ai-summary.yml
sudo touch /etc/bigbluebutton/post-archive-transcription.yml
sudo yq eval '.language = "en"' -i /etc/bigbluebutton/post-archive-transcription.yml
if [[ -n "$TRANSCRIPTION_PROVIDER" ]]; then
sudo yq eval ".${TRANSCRIPTION_PROVIDER}.api_key = \"$AI_API_KEY\"" -i /etc/bigbluebutton/post-archive-transcription.yml
else
echo "Skipping transcription API key setup for provider '$AI_PROVIDER' because no matching transcription backend is available."
fi
captions_type="$(yq eval '.steps.captions | tag' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml 2>/dev/null || true)"
# normalize steps.captions to an array.
if [[ "$captions_type" == "!!str" ]]; then
captions_value="$(yq eval '.steps.captions' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml)"
if [[ -n "$captions_value" && "$captions_value" != "null" ]]; then
sudo CAPTIONS_VALUE="$captions_value" \
yq eval -i '.steps.captions = [strenv(CAPTIONS_VALUE)]' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
fi
fi
# check for the new config entry and add it only if missing.
captions_type="$(yq eval '.steps.captions | tag' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml 2>/dev/null || true)"
if [[ "$captions_type" == "!!seq" ]]; then
has_ai_summary="$(yq eval '.steps.captions[] | select(. == "process:ai-summary")' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml 2>/dev/null || true)"
if [[ -z "$has_ai_summary" ]]; then
sudo yq eval -i '.steps.captions = .steps.captions + ["process:ai-summary"]' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
fi
sudo yq eval -i '.steps.captions[] style="double"' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
fi
sudo yq eval '.steps."process:ai-summary" = "publish:ai-summary"' -i /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
sudo yq eval -i '.steps."process:ai-summary" style="double"' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
sudo yq eval -i '
.steps."process:ai-summary" = "publish:ai-summary" |
(.steps."process:ai-summary" | key) style="double" |
.steps."process:ai-summary" style="double"
' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
sudo systemctl restart bbb-rap-resque-worker livekit-server bbb-webrtc-recorder
bbb-conf --salt