Outil de Transcription et de Traduction Intelligente et Synchrone
OTTIS est une solution open-source conçue pour faciliter la traduction instantanée dans un contexte pédagogique. Développée par l'équipe du projet (Nantes Université, Faculté des Sciences et Techniques), cette application permet de briser les barrières linguistiques entre enseignants et étudiants.
| Fonctionnalité | Description |
|---|---|
| Reconnaissance vocale | Capture et transcrit le discours de l'enseignant en temps réel |
| Traduction multilingue | Traduction du discours dans plus de 100 langues |
| Synthèse vocale | Restitution du discours traduit dans la langue de l'étudiant |
| Chat multilingue | Outil de messagerie instantanée avec traduction intégrée |
| Prise de notes automatique | Génération de notes multilingues à partir du discours |
| Diffusion de présentations | Affichage de présentations sous-titré (PowerPoint, Pdf) |
- Cours magistraux : Traduction simultanée pour les étudiants internationaux
- Conférences : Diffusion multilingue en temps réel
- Travaux pratiques : Assistance linguistique pour les étudiants
- Réunions administratives : Facilitation des échanges multiculturels
| Composant | Version minimale | Description | Vérification |
|---|---|---|---|
| PHP | 8.2 | Runtime PHP (requis par composer.json : ^8.2) |
php -v |
| Composer | 2.x | Gestionnaire de dépendances PHP | composer --version |
| Node.js + npm | 18.x / 9.x | Outils qualité JS (ESLint, Prettier, Vitest) pour make check / make test — développement uniquement |
node -v && npm -v |
| Outil | Version | Rôle | Installation |
|---|---|---|---|
| Git | 2.x | Contrôle de version | sudo apt install git |
| Make | 4.x | Exécution des tâches | sudo apt install make |
| Unzip | 6.x | Extraction des archives | sudo apt install unzip |
| LibreOffice | 7.x | Requis : conversion PPTX → PDF et ODP → PPTX (soffice --headless) |
sudo apt install libreoffice |
| curl (CLI) | 7.x | Requis : téléchargement de fichiers distants ("uncloud") et statistiques d'usage DeepL | sudo apt install curl |
| ImageMagick | 6.x ou 7.x | Optionnel : fallback PDF → Images si l'extension PHP imagick est absente |
sudo apt install imagemagick |
| MTA (postfix, sendmail…) | — | Optionnel : envoi d'e-mails (/email/send, fonction PHP mail()) |
sudo apt install postfix |
| Serveur | Configuration requise | Fichier de configuration |
|---|---|---|
| Apache | Module rewrite activé | .htaccess (fourni) |
| Nginx | Configuration personnalisée | À adapter |
| Dépendance | Version | Rôle | Utilisation |
|---|---|---|---|
| php | ^8.2 | Langage PHP | Runtime |
| phpoffice/phppresentation | ^1.2 | Lecture/écriture de présentations PowerPoint | Utilisée dans PPTXNotesExtractor.php (fallback) |
| phpoffice/common | ^1.1 | Bibliotheque commune PHPOffice | Dépendance transitive de phppresentation |
| vlucas/phpdotenv | ^5.5 | Chargement des variables d'environnement | Utilisée dans Security/init.php, public/index.php |
| monolog/monolog | ^3.5 | Logging structuré | Utilisée dans config/logging.php, Security/logger.php |
| apereo/phpcas | ^1.6.2 | Authentification CAS (SSO) | Utilisée dans Security/init.php |
| Extension | Version | Rôle | Installation | Vérification |
|---|---|---|---|---|
| imagick | latest | Conversion PDF → Images (méthode primaire) | sudo apt install php-imagick + sudo phpenmod imagick |
php -m | grep imagick |
| curl | — | Appels API traduction (DeepL, Google…) et phpCAS | sudo apt install php-curl |
php -m | grep curl |
| dom, xml, simplexml, xmlreader/writer | — | Lecture des PPTX/ODP, phpCAS | sudo apt install php-xml |
php -m | grep dom |
| zip | — | Extraction des archives PPTX/ODP | sudo apt install php-zip |
php -m | grep zip |
| gd | — | Traitement d'images (phpoffice/phpspreadsheet, transitive) | sudo apt install php-gd |
php -m | grep gd |
| mbstring, iconv | — | Chaînes multi-octets (phpspreadsheet) | sudo apt install php-mbstring |
php -m | grep mbstring |
| fileinfo, ctype, zlib | — | Requises par les bibliothèques PHPOffice | généralement incluses | php -m |
# HTTPS
git clone https://gitlab.intra.univ-nantes.fr/dsin/spin/omist.git
# ou SSH
git clone git@gitlab.intra.univ-nantes.fr:dsin/spin/omist.git
cd omist# Installer Composer (si non installé)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
php composer-setup.php && \
php -r "unlink('composer-setup.php');" && \
mv composer.phar /usr/local/bin/composer
# Installer UNIQUEMENT les dépendances de production (pas de dev)
composer install --no-dev --optimize-autoloader
# Installer les extensions PHP requises
sudo apt-get install -y php-imagick php-curl php-xml php-zip php-gd php-mbstring
sudo phpenmod imagick
sudo systemctl restart apache2
# Installer les binaires externes requis
sudo apt-get install -y libreoffice curl
# Optionnel : agent de messagerie pour l'envoi d'e-mails (/email/send)
sudo apt-get install -y postfix# Copier le fichier d'exemple
cp .env.example .env
# Configurer les variables nécessaires (voir section Configuration ci-dessous)
nano .env # ou utiliser votre éditeur préféré
# IMPORTANT : Configurer les tokens API de traduction
cp tables/tokens.json.example tables/tokens.json
nano tables/tokens.jsonupload_max_filesize = 50M post_max_size = 50M max_execution_time = 300 max_input_time = 300
extension=imagick
user = ottis group = www-data
listen = /run/php/php-fpm.omist.sock
listen.owner = www-data listen.group = www-data
pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 ; max_requests afin de permettre le renouvellement périodique des workers. pm.max_requests = 500 ;
; Activer les access logs FPM et configurer un fichier error_log pour qu'il soit accessible par l'utilisateur du pool php_admin_value[error_log] = /home/omist/logs/fpm-error.log php_admin_flag[log_errors] = on
; Limiter la mémoire php_admin_value[memory_limit]=512M
; Upload settings php_admin_value[upload_max_filesize] = 50M php_admin_value[post_max_size] = 50M php_admin_value[max_execution_time] = 300 php_admin_value[max_input_time] = 300
Copiez .env.example en .env et configurez uniquement les variables suivantes :
# Configuration minimale requise pour la production
APP_ENV=production # Obligatoire : development, staging, ou production
# Authentification CAS (true/false - voir section "Authentification CAS" ci-dessous)
CAS_ENABLED=false
# Serveur LibreTranslate (optionnel - défaut : https://translate.terraprint.co/translate)
LIBRETRANSLATESERVER=
# Proxy (optionnel - laisser vide si aucun)
HTTP_PROXY=Note : les tokens API de traduction ne se configurent pas dans ce fichier, mais dans
tables/tokens.json(voir ci-dessus). Seules les variables listées ci-dessus sont lues par le code.
Important : Les tokens API (GOOGLE_API_TOKENS, DEEPL_FREE_TOKENS, DEEPL_PRO_TOKENS, MICROSOFT_TRANSLATOR_KEY, etc.) ne sont PAS configurés dans le fichier .env. Ils doivent être définis dans le fichier
tables/tokens.jsonavec la structure suivante :{ "WHICHTRANSLATOR": ["DEEPLFREE"], "GOOGLETOKENS": ["votre_token_google_1", "votre_token_google_2"], "DEEPLFREETOKENS": ["votre_token_deepl_free"], "DEEPLPROTOKENS": [] }La clé
LIBRETRANSLATESERVERne se configure pas danstokens.jsonmais dans.env(voir ci-dessus). Les clés lues par le code (src/Service/TokenConfigService.php) sont :WHICHTRANSLATOR,GOOGLETOKENS,DEEPLFREETOKENS,DEEPLPROTOKENS.
Le projet inclut un fichier .htaccess configuré pour :
- Rediriger toutes les requêtes vers
/public/ - Gérer les exceptions (fichiers existants,
.well-known/, etc.)
Assurez-vous que le module rewrite est activé :
sudo a2enmod rewrite
sudo systemctl restart apache2<VirtualHost *:80>
ServerName ottis.votre-domaine.fr
DocumentRoot /chemin/vers/omist/public
<Directory /chemin/vers/omist/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/ottis-error.log
CustomLog ${APACHE_LOG_DIR}/ottis-access.log combined
</VirtualHost>L'application s'appuie sur apereo/phpcas pour l'authentification centralisée (SSO). La configuration se trouve dans config/cas.php :
return [
'enabled' => (bool) (getenv('CAS_ENABLED') ?: false), // Piloté par la variable CAS_ENABLED du fichier .env
'host' => 'login.univ-nantes.fr',
'port' => 443,
'url' => '/cas26m/',
'server_validation' => false,
'cert_path' => null,
'dev_mode' => false,
// ...
];Important : l'activation du CAS se pilote par la variable
CAS_ENABLEDdu fichier.env(désactivée par défaut dans le dépôt). Le fichierconfig/cas.phppointe vers le serveur CAS de Nantes Université : adaptezhost,porteturlà votre établissement avant de passerCAS_ENABLED=true, sinon les routes protégées renverront une erreur d'authentification.
- Routes protégées (CAS obligatoire) :
/,/conference,/conference/{roomId} - Routes publiques (sans CAS) :
/auditor,/auditor/{roomId} - Filtrage par affiliation : l'accès aux zones protégées exige une affiliation
eduPersonAffiliationparmifaculty,staff,employee,teacher(sinon HTTP 403).
# Optimiser l'autoloader
composer install --no-dev --optimize-autoloader
# Vérifier la configuration
APP_ENV=production \
APP_DEBUG=false \
php public/index.php- Utiliser Apache avec le
.htaccessfourni - Configurer les permissions :
mkdir -p tmp/ uploads/ logs/ chown -R www-data:www-data . chmod -R 755 . chmod -R 775 tmp/ uploads/ logs/
- Activer la rotation des logs :
logrotate -f /etc/logrotate.d/ottis
.
├── .env.example # Modèle de configuration environnement
├── .htaccess # Configuration Apache (racine)
├── ARCHITECTURE.md # Documentation de l'architecture MVC
├── LICENSE # Licence Apache 2.0
├── Makefile # Tâches de qualité de code
├── composer.json # Dépendances PHP
├── package.json # Dépendances JavaScript (racine)
├── phpunit.xml # Configuration PHPUnit
├── phpstan.neon # Configuration PHPStan
│
├── config/ # Configuration applicative
│ ├── cas.php # Configuration de l'authentification CAS
│ ├── logging.php # Configuration Monolog
│ ├── routes.php # Définition des routes MVC
│ └── security.php # Configuration de sécurité
│
├── public/ # Point d'entrée web
│ ├── .htaccess # Configuration Apache
│ ├── index.php # Front Controller MVC
│ ├── js/ # Code JavaScript
│ │ ├── package.json # Dépendances JS locales
│ │ ├── vitest.config.js # Configuration Vitest
│ │ ├── lib/ # Bibliothèques JavaScript personnalisées
│ │ │ ├── auditor/ # Module auditeur
│ │ │ ├── chat/ # Module de chat
│ │ │ ├── conference/ # Module de conférence
│ │ │ ├── dom/ # Utilitaires DOM
│ │ │ ├── language/ # Gestion des langues
│ │ │ ├── network/ # Utilitaires réseau
│ │ │ ├── pdf/ # Gestion PDF
│ │ │ ├── state/ # Gestion d'état
│ │ │ └── utils/ # Utilitaires divers
│ │ ├── tests/ # Tests JavaScript
│ │ └── *.js # Points d'entrée (auditor-init.js, conference-init.js, home-init.js)
│ ├── lang/ # Fichiers de traduction JSON
│ ├── styles/ # Feuilles de style CSS
│ └── uploads/ # Fichiers uploadés
│
├── Security/ # Modules de sécurité (hérités)
│ ├── csrf.php # Protection CSRF
│ ├── error_handler.php # Gestionnaire d'erreurs
│ ├── init.php # Initialisation
│ ├── load_env.php # Chargement .env (fallback)
│ ├── logger.php # Wrapper Monolog
│ ├── room_tokens.php # Gestion des tokens de salle
│ ├── sanitize.php # Sanitization
│ └── validate.php # Validation
│
├── src/ # Code source PHP (PSR-4: App\\)
│ ├── Controller/ # Contrôleurs MVC
│ │ ├── AuditorController.php
│ │ ├── BaseController.php # Classe de base
│ │ ├── ConferenceController.php
│ │ ├── EmailController.php
│ │ ├── ExtractController.php
│ │ ├── HomeController.php
│ │ ├── ImageController.php
│ │ ├── SubtitlesController.php
│ │ ├── TextController.php
│ │ └── UploadController.php
│ ├── Model/ # Modèles (à développer)
│ ├── Security/ # Sécurité MVC
│ │ └── RoomTokenManager.php
│ ├── Service/ # Services
│ │ ├── LanguageLoader.php
│ │ ├── RandomNameGenerator.php
│ │ ├── RoomInfoService.php
│ │ ├── Router.php # Routeur HTTP
│ │ └── TokenConfigService.php
│ └── Utils/ # Utilitaires
│ ├── Csrf.php
│ ├── PPTXNotesExtractor.php # Extraction des notes PPTX
│ ├── Sanitizer.php
│ └── Validator.php
│
├── tests/ # Tests PHP
│ ├── Integration/
│ └── Unit/
│ └── Security/
│ ├── SanitizeTest.php
│ └── ValidateTest.php
│
├── views/ # Vues MVC
│ ├── auditor/ # Vues auditeur
│ ├── conference/ # Vues conférence
│ ├── errors/ # Pages d'erreur
│ │ ├── 404.php
│ │ ├── 500.php
│ │ └── maintenance.php
│ ├── extract/ # Vues extraction
│ ├── home/ # Vues accueil
│ ├── layouts/ # Layouts
│ │ └── default.php
│ ├── partials/ # Partials (à créer)
│ ├── remote/ # Vues distantes
│ ├── subtitles/ # Vues sous-titres
│ └── upload/ # Vues upload
│
├── scripts/ # Scripts shell
├── tools/ # Outils de développement
├── tmp/ # Fichiers temporaires
├── logs/ # Logs applicatifs
└── uploads/ # Fichiers uploadés
Le projet suit une architecture MVC (Modèle-Vue-Contrôleur) moderne avec :
- Front Controller (
public/index.php) : Point d'entrée unique - Routeur (
src/Service/Router.php) : Gestion des URLs et routage - Contrôleurs (
src/Controller/) : Logique métier - Services (
src/Service/) : Logique réutilisable - Vues (
views/) : Présentation (PHP + HTML) - Modèles (
src/Model/) : Accès aux données (à développer)
Ce projet est distribué sous la licence Apache 2.0.
- Fichier : LICENSE
- Résumé : Vous pouvez utiliser, modifier et distribuer ce logiciel selon les termes de la licence Apache 2.0.
- Auteurs : Jérémie Bourdon, Jeanne Dionisi (Nantes Université)
- Forker le dépôt
- Créer une branche :
git checkout -b feature/ma-fonctionnalite - Respecter les standards :
- Code PHP : PSR-12
- Code JavaScript : ESLint (Airbnb)
- Commits : Conventions Angular (
feat:,fix:,docs:, etc.)
- Exécuter les tests :
make test - Soumettre une Pull Request
- PHP : Utiliser les classes du namespace
App\ - Contrôleurs : Étendre
BaseController - Vues : Utiliser
$this->escape()pour les sorties utilisateur - Routes : Définir dans
config/routes.php - Tests : Couvrir les nouvelles fonctionnalités
- Vérifier les issues existants
- Créer un nouvel issue avec :
- Étapes pour reproduire
- Comportement attendu
- Comportement réel
- Version de PHP et du navigateur
Pour des questions sur :
- L'architecture MVC : Consulter ARCHITECTURE.md
- Les dépendances : Consulter ce README
- Le développement : Contacter l'équipe du projet
| Métrique | Valeur |
|---|---|
| Version | 0.1.0 |
| Langues supportées | 100+ |
| Contrôleurs | 10 |
| Services | 5 |
| Tests unitaires PHP | 2 fichiers |
| Tests JavaScript | 25+ fichiers |
| Dépendances PHP | 6 (production) + 3 (dev) |
| Dépendances JS | 6 (dev) + 2 (tests) |