# Phase 7 - Problème de Compilation (Macro Conflicts) **Date**: 2025-11-29 **Status**: ⚠️ Bloqué - Conflit de macros entre GroveEngine et spdlog --- ## Résumé du Problème L'implémentation de Phase 7.1 (STT Service Layer) est **fonctionnellement complète** mais ne compile pas à cause de **conflits de macros** entre: 1. **GroveEngine** (`JsonDataNode.h`) - définit des macros qui polluent le namespace global 2. **spdlog/fmt** - templates de formatting qui entrent en conflit avec les macros 3. **nlohmann::json** - interfère avec l'ordre d'inclusion ### Symptômes ```cpp // Erreurs typiques: error: request for member 'empty' in 'm_speakQueue', which is of non-class type 'int' error: no match for 'operator=' (operand types are 'std::shared_ptr' and 'int') error: 'logger' was not declared in this scope ``` **Cause racine**: Les macros dans `JsonDataNode.h` remplacent `logger` et `queue` par `int`, causant des erreurs de compilation dans tout code qui: - Utilise `std::queue` - Utilise `spdlog::logger` - Inclut `JsonDataNode.h` (via `VoiceService.hpp`) --- ## Architecture Implémentée (Phase 7.1) ### ✅ Fichiers Créés | Fichier | Lignes | Status | Description | |---------|--------|--------|-------------| | `src/services/ISTTService.hpp` | 104 | ✅ Complet | Interface du service STT | | `src/services/STTService.hpp` | 66 | ✅ Complet | Implémentation service STT | | `src/services/STTService.cpp` | 180 | ⚠️ Ne compile pas | Logic métier STT | | `src/shared/audio/VoskSTTEngine.hpp` | 77 | ✅ Complet | Engine STT local Vosk | | `src/shared/audio/VoskSTTEngine.cpp` | 201 | ✅ Complet | Implémentation Vosk | | `config/voice.json` | 36 | ✅ Complet | Config Phase 7 | ### 📝 Fichiers Modifiés | Fichier | Modifications | Status | |---------|---------------|--------| | `src/shared/audio/ISTTEngine.hpp` | Ajout factory multi-engine | ✅ OK | | `src/shared/audio/STTEngineFactory.cpp` | Support Vosk + auto-selection | ✅ OK | | `src/services/VoiceService.hpp` | Intégration ISTTService | ✅ OK | | `src/services/VoiceService.cpp` | Nouvelle méthode configureSTT | ⚠️ Ne compile pas | | `src/main.cpp` | Chargement config Phase 7 | ✅ OK | | `CMakeLists.txt` | Ajout fichiers + dépendance Vosk | ✅ OK | --- ## Fonctionnalités Implémentées ### Phase 7.1 - Service Layer (MVP) ✅ **Interface ISTTService**: - Modes passive/active (enum `STTMode`) - Callbacks pour transcription et keywords - Support multi-engines via factory - Méthodes: `start()`, `stop()`, `setMode()`, `transcribe()`, `transcribeFile()` **Implémentation STTService**: - Chargement config JSON (active_mode, whisper_api) - Factory pattern pour créer engines (Vosk, Whisper API, auto) - Callbacks fonctionnels (non testés) - État: mode actif uniquement (passive mode = Phase 7.2) **Engine Vosk**: - Support modèles locaux (vosk-model-small-fr-0.22) - Transcription fichiers WAV - Transcription données PCM - Compile flag `HAS_VOSK` pour compilation optionnelle - Parse JSON results de Vosk - Lecture fichiers WAV (header + PCM data) **Factory Pattern**: ```cpp STTEngineFactory::create( type, // "vosk", "whisper-api", "auto" modelPath, // "./models/vosk-model-small-fr-0.22" apiKey // Fallback Whisper API ) ``` **Configuration**: ```json { "stt": { "active_mode": { "enabled": true, "engine": "vosk", "model_path": "./models/vosk-model-small-fr-0.22", "language": "fr" }, "whisper_api": { "api_key_env": "OPENAI_API_KEY" } } } ``` --- ## Solutions Tentées (Sans Succès) ### 1. Ordre des Includes ❌ ```cpp // Testé: nlohmann/json avant tout #include #include "VoiceService.hpp" // Résultat: Macros déjà définies par JsonDataNode.h ``` ### 2. Macros SPDLOG ❌ ```cpp // Testé: Utiliser SPDLOG_LOGGER_INFO au lieu de m_logger->info SPDLOG_LOGGER_INFO(m_logger, "message"); // Résultat: Mêmes conflits (macros fmt sous-jacentes) ``` ### 3. Logs Sans Format ⚠️ Partiel ```cpp // Testé: Enlever tous les paramètres de format m_logger->info("STT service started"); // au lieu de "... {}", var // Résultat: Réduit les erreurs mais ne résout pas le problème de fond ``` ### 4. Namespaces Explicites ❌ ```cpp // Testé: ::std::queue, ::spdlog::logger // Résultat: Macros s'appliquent avant la résolution du namespace ``` --- ## Solutions Possibles (Non Testées) ### Option A: Fixer GroveEngine 🔨 **Modifier** `external/GroveEngine/include/grove/JsonDataNode.h` Problème: JsonDataNode.h définit probablement des macros comme: ```cpp #define logger // quelque chose #define queue // quelque chose ``` **Action**: Remplacer les macros par des constexpr ou enum class **Avantage**: Résout le problème à la racine **Inconvénient**: Modifie GroveEngine (dépendance externe) ### Option B: Isolation de Namespace 🔒 Créer un fichier séparé sans includes GroveEngine: ```cpp // stt_impl.cpp - PAS d'include JsonDataNode.h namespace aissia::stt_impl { // Toute la logique STT ici } ``` **Avantage**: Isole le problème **Inconvénient**: Duplication de code, complexité ### Option C: Refactor en Service Séparé 🏗️ ```cpp // Ne pas intégrer STTService dans VoiceService // Créer un service indépendant communicant via IIO pub/sub ``` **Avantage**: Meilleure séparation des responsabilités **Inconvénient**: Refonte architecture (temps) ### Option D: Compiler en Bibliothèque Statique 📦 ```cmake # Compiler STTService en lib séparée AVANT VoiceService add_library(AissiaSTT STATIC src/services/STTService.cpp) # Avec flags de compilation spécifiques ``` **Avantage**: Contrôle fin sur ordre de compilation **Inconvénient**: Peut ne pas suffire (macros sont au preprocessor) --- ## Recommandation **Option A** (Fixer GroveEngine) est la meilleure solution long terme: 1. Identifier les macros problématiques dans `JsonDataNode.h` 2. Les remplacer par: ```cpp // Au lieu de #define logger ... static constexpr int LOGGER_SOMETHING = ...; ``` 3. Mettre à jour GroveEngine ou forker **Court terme**: Désactiver STTService dans CMakeLists et continuer Phase 7.2 (PocketSphinx) en parallèle. --- ## Impact ### ✅ Ce qui fonctionne - Architecture STT complète (interfaces, factory, engines) - Configuration JSON - Integration conceptuelle dans VoiceService - Tests peuvent être écrits (sans exécution) ### ❌ Ce qui bloque - Compilation de `VoiceService.cpp` - Compilation de `STTService.cpp` - Tests d'intégration - Utilisation effective du STT ### 🔄 Workaround Temporaire ```cpp // Dans main.cpp: NE PAS appeler voiceService.configureSTT() // Le reste de l'application compile et fonctionne ``` --- ## Prochaines Étapes ### Court Terme (Déblocage) 1. ✅ Documenter le problème (ce fichier) 2. ⏭️ Commit le code actuel (architecture valide) 3. ⏭️ Investiguer GroveEngine/JsonDataNode.h 4. ⏭️ Tester Option A (fix macros) ### Moyen Terme (Phase 7.2) Si Option A échoue: - Implémenter PocketSphinxEngine séparément (compile indépendamment) - Tests unitaires des engines (sans VoiceService) - Documentation architecture alternative ### Long Terme (Phase 7 Complète) - Résoudre conflits macros définitivement - Intégration complète STT → VoiceService - Tests end-to-end avec microphone --- ## Logs de Compilation (Exemple) ``` /src/services/VoiceService.cpp:84:34: error: request for member 'empty' in 'm_speakQueue', which is of non-class type 'int' 84 | while (!m_speakQueue.empty()) m_speakQueue.pop(); | ^~~~~ /src/services/VoiceService.cpp:10:42: error: no match for 'operator=' (operand types are 'std::shared_ptr' and 'int') 10 | m_logger = spdlog::get("VoiceService"); | ^ /spdlog/sinks/stdout_color_sinks.h:39:17: error: 'logger' was not declared in this scope; did you mean 'spdlog::logger'? ``` **Diagnostic**: Les macros remplacent `logger` et `queue` par autre chose (probablement `int` ou vide), causant des erreurs de type. --- ## Références - **Plan original**: `plans/PHASE7_STT_IMPLEMENTATION.md` - **Issue similaire**: https://github.com/gabime/spdlog/issues/1897 (macro conflicts) - **Vosk API**: https://alphacephei.com/vosk/ - **GroveEngine**: `external/GroveEngine/include/grove/JsonDataNode.h` --- **Auteur**: Claude Code **Dernière mise à jour**: 2025-11-29 **Status**: 🔴 Bloqué - Attend résolution conflits macros