# SecondVoice - Prochaines Étapes

**Date**: 20 novembre 2025
**Status**: Setup complet, ready to build

---

## ✅ Ce qui est fait

### Infrastructure
- ✅ Structure projet complète (src/, docs/, recordings/)
- ✅ CMakeLists.txt configuré avec vcpkg
- ✅ vcpkg.json avec toutes les dépendances
- ✅ .gitignore configuré
- ✅ config.json template
- ✅ .env.example
- ✅ build.sh helper script
- ✅ README.md complet

### Code Implémenté
- ✅ **audio/AudioCapture**: PortAudio wrapper pour capture audio
- ✅ **audio/AudioBuffer**: Buffer avec export WAV
- ✅ **api/WhisperClient**: Client HTTP pour Whisper API (multipart/form-data)
- ✅ **api/ClaudeClient**: Client HTTP pour Claude API (JSON)
- ✅ **ui/TranslationUI**: Interface ImGui avec bouton Stop
- ✅ **core/Pipeline**: Orchestration 3 threads
- ✅ **utils/Config**: Loader JSON + .env
- ✅ **utils/ThreadSafeQueue**: Template thread-safe
- ✅ **main.cpp**: Entry point

### Documentation
- ✅ docs/SecondVoice.md (vision projet)
- ✅ docs/implementation_plan.md (design technique)
- ✅ README.md (setup + usage)

---

## 🚀 Prochaines Actions Immédiates

### 1. Setup Environnement (Toi)

```bash
# 1. Installer vcpkg si pas déjà fait
git clone https://github.com/microsoft/vcpkg.git ~/vcpkg
cd ~/vcpkg
./bootstrap-vcpkg.sh
export VCPKG_ROOT=~/vcpkg
# Ajouter dans ~/.bashrc:
echo 'export VCPKG_ROOT=~/vcpkg' >> ~/.bashrc

# 2. Installer dépendances système
sudo apt update
sudo apt install -y libasound2-dev libgl1-mesa-dev libglu1-mesa-dev

# 3. Créer .env
cd /mnt/e/Users/Alexis\ Trouvé/Documents/Projets/secondvoice
cp .env.example .env
# Éditer .env et ajouter tes vraies API keys:
# OPENAI_API_KEY=sk-...
# ANTHROPIC_API_KEY=sk-ant-...
nano .env
```

### 2. Premier Build

```bash
# Lancer le build
./build.sh

# Ou manuellement:
cmake -B build -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
cmake --build build -j$(nproc)
```

**Note**: Le premier build va prendre du temps (vcpkg va compiler toutes les dépendances).

### 3. Test Audio Simple

Avant de tester le pipeline complet, on va faire un test standalone de l'audio capture.

**Créer un test simple** (`test_audio.cpp`):

```cpp
#include "src/audio/AudioCapture.h"
#include "src/audio/AudioBuffer.h"
#include <iostream>
#include <thread>
#include <chrono>

int main() {
    secondvoice::AudioCapture capture(16000, 1, 5);
    secondvoice::AudioBuffer buffer(16000, 1);

    if (!capture.initialize()) {
        std::cerr << "Failed to init audio" << std::endl;
        return 1;
    }

    std::cout << "Recording 10 seconds..." << std::endl;

    capture.start([&buffer](const std::vector<float>& data) {
        buffer.addSamples(data);
        std::cout << "Captured chunk: " << data.size() << " samples" << std::endl;
    });

    std::this_thread::sleep_for(std::chrono::seconds(10));

    capture.stop();

    if (buffer.saveToWav("test_recording.wav")) {
        std::cout << "Saved to test_recording.wav" << std::endl;
    }

    return 0;
}
```

**Build + test**:
```bash
# Ajouter test_audio dans CMakeLists.txt (temporaire)
# Ou compiler manuellement
```

### 4. Test Whisper API

**Créer un test** (`test_whisper.cpp`):

```cpp
#include "src/api/WhisperClient.h"
#include "src/audio/AudioBuffer.h"
#include <iostream>

int main() {
    // Load API key from .env
    std::string api_key = "sk-...";  // Replace with real key

    secondvoice::WhisperClient client(api_key);

    // Load test audio (Chinese speech)
    secondvoice::AudioBuffer buffer(16000, 1);
    // TODO: Load from existing WAV file

    auto result = client.transcribe(buffer.getSamples(), 16000, 1, "zh", 0.0f);

    if (result.has_value()) {
        std::cout << "Transcription: " << result->text << std::endl;
    } else {
        std::cerr << "Failed" << std::endl;
    }

    return 0;
}
```

**Test avec audio chinois sample**:
- Chercher sample audio chinois gratuit (YouTube ou sample sites)
- Convertir en WAV 16kHz mono si nécessaire
- Tester transcription

### 5. Test Claude API

**Créer un test** (`test_claude.cpp`):

```cpp
#include "src/api/ClaudeClient.h"
#include <iostream>

int main() {
    std::string api_key = "sk-ant-...";  // Replace

    secondvoice::ClaudeClient client(api_key);

    std::string chinese = "你好，今天我们讨论项目进度。";

    auto result = client.translate(chinese);

    if (result.has_value()) {
        std::cout << "Traduction: " << result->text << std::endl;
    } else {
        std::cerr << "Failed" << std::endl;
    }

    return 0;
}
```

### 6. Test Pipeline Complet

```bash
cd build
./SecondVoice
```

**Ce qui doit se passer**:
1. Fenêtre ImGui s'ouvre
2. "Recording..." affiché
3. Audio capturé en temps réel
4. Transcriptions chinoises affichées
5. Traductions françaises affichées
6. Clic "STOP RECORDING" → sauvegarde audio

### 7. Debug & Fix

**Problèmes attendus** :

1. **Build errors** (dépendances vcpkg)
   - Vérifier vcpkg installé
   - Vérifier VCPKG_ROOT
   - Réinstaller package si nécessaire: `vcpkg install portaudio`

2. **Audio capture fails**
   - Vérifier microphone disponible: `arecord -l`
   - Tester avec `arecord -d 5 test.wav`
   - Vérifier permissions audio

3. **Whisper API errors**
   - Vérifier clé API
   - Tester avec curl:
     ```bash
     curl https://api.openai.com/v1/audio/transcriptions \
       -H "Authorization: Bearer $OPENAI_API_KEY" \
       -F file=@test.wav \
       -F model=whisper-1
     ```

4. **Claude API errors**
   - Vérifier clé API
   - Tester avec curl:
     ```bash
     curl https://api.anthropic.com/v1/messages \
       -H "x-api-key: $ANTHROPIC_API_KEY" \
       -H "anthropic-version: 2023-06-01" \
       -H "content-type: application/json" \
       -d '{
         "model": "claude-haiku-4-20250514",
         "max_tokens": 1024,
         "messages": [{"role": "user", "content": "Traduis: 你好"}]
       }'
     ```

5. **UI doesn't appear**
   - Vérifier OpenGL installé: `glxinfo | grep OpenGL`
   - Tester avec autre ImGui example
   - Vérifier DISPLAY variable si SSH

6. **Latence trop élevée**
   - Réduire chunk_duration_seconds dans config.json (10s → 5s)
   - Tester avec différentes valeurs
   - Mesurer latence Whisper + Claude séparément

7. **Memory leaks**
   - Utiliser valgrind: `valgrind --leak-check=full ./SecondVoice`
   - Vérifier smart pointers utilisés partout

---

## 🎯 Critères de Succès MVP

Pour valider le MVP, il faut que:

1. ✅ **Build compile** sans erreurs
2. ✅ **Audio capture fonctionne** (test avec `test_audio`)
3. ✅ **Whisper transcrit correctement** (>85% précision sur sample chinois)
4. ✅ **Claude traduit correctement** (traduction naturelle FR)
5. ✅ **UI s'affiche** et reste responsive
6. ✅ **Pipeline complet fonctionne** bout-à-bout
7. ✅ **Bouton Stop arrête proprement** et sauvegarde audio
8. ✅ **Latence acceptable** (<10s entre audio et traduction affichée)
9. ✅ **Pas de crash** sur 30min recording
10. ✅ **Audio sauvegardé** est lisible (test avec `aplay` ou VLC)

---

## 🔧 Améliorations Possibles (Post-MVP)

### Performance
- [ ] Optimiser chunk size (benchmark 5s vs 10s vs 30s)
- [ ] Pool de threads pour processing parallèle
- [ ] Cache API responses (éviter double-call)
- [ ] Streaming Whisper (si API supporte)

### Qualité
- [ ] Retry logic sur API failures (exponential backoff)
- [ ] Detect silence (skip chunks vides)
- [ ] Audio normalization avant Whisper
- [ ] Confidence score Whisper (filter low confidence)

### UI/UX
- [ ] Settings panel (change chunk size runtime)
- [ ] Pause/Resume button
- [ ] Volume meter (visualize audio input)
- [ ] Status indicators (API call in progress)
- [ ] Copy translation button
- [ ] Export transcript button

### Features
- [ ] Auto-summary post-meeting (Claude analyse transcript)
- [ ] Export structured (audio + CN + FR + summary)
- [ ] Système de recherche (backlog meetings)
- [ ] Speaker diarization (qui parle)
- [ ] Multi-language support (JP, KR, etc)

---

## 📊 Métriques à Mesurer

### Pendant le développement
- **Build time**: vcpkg + compile (first build vs incremental)
- **Audio latency**: Capture → buffer ready
- **Whisper latency**: Audio → transcription (varie selon chunk size)
- **Claude latency**: Texte CN → texte FR
- **Total latency**: Audio → Display
- **Memory usage**: RSS au démarrage vs après 30min
- **CPU usage**: % pendant recording + processing

### Pendant l'usage réel
- **Transcription accuracy**: % mots corrects (subjectif, compare avec native speaker)
- **Translation quality**: Compréhensible ? Naturelle ?
- **Crash rate**: 0 sur 1h recording
- **API cost**: $ par meeting (tracker usage réel)

---

## 📝 Notes de Développement

### Bugs Connus / TODO
- [ ] Pipeline.cpp ligne 150: `std::put_time` requiert `<iomanip>` (ajouter include)
- [ ] ThreadSafeQueue: Pas de clear() method (ajouter si besoin)
- [ ] Config: Pas de validation (e.g., sample_rate > 0)
- [ ] Error messages: Pas assez descriptifs (améliorer logging)
- [ ] main.cpp: Pas de signal handler (Ctrl+C ne sauvegarde pas audio)

### Optimisations Possibles
- AudioBuffer: std::vector<float> → mmap si très gros
- API clients: Connection pooling (httplib keep-alive)
- UI: Limit messages affichés (actuellement unbounded)

### Code Quality
- Ajouter unit tests (Google Test)
- Ajouter CI/CD (GitHub Actions)
- Ajouter pre-commit hooks (clang-format)
- Documenter API avec Doxygen

---

## 🎓 Ressources Utiles

### Documentation APIs
- [Whisper API](https://platform.openai.com/docs/api-reference/audio)
- [Claude API](https://docs.anthropic.com/claude/reference/messages)
- [PortAudio](http://portaudio.com/docs/v19-doxydocs/)
- [ImGui](https://github.com/ocornut/imgui)

### Samples Audio Chinois
- [YouTube](https://www.youtube.com/results?search_query=chinese+conversation) (utiliser youtube-dl)
- [Tatoeba](https://tatoeba.org/en/audio/index/cmn) (phrases chinoises)
- [Common Voice](https://commonvoice.mozilla.org/zh-CN) (dataset open)

### Debug Tools
- `arecord -l`: Liste microphones disponibles
- `aplay test.wav`: Play WAV file
- `valgrind --leak-check=full ./SecondVoice`: Check memory leaks
- `gdb ./SecondVoice`: Debug crashes
- `strace ./SecondVoice`: Trace syscalls

---

## 🚦 Status Tracking

### Phase 1 - Setup (DONE ✅)
- ✅ Structure projet
- ✅ CMake + vcpkg
- ✅ Code complet implémenté
- ✅ Documentation

### Phase 2 - Build & Test (CURRENT)
- ⬜ Setup vcpkg + dépendances
- ⬜ Premier build réussi
- ⬜ Test audio capture
- ⬜ Test Whisper API
- ⬜ Test Claude API
- ⬜ Test pipeline complet

### Phase 3 - Debug & Tuning
- ⬜ Fix build errors
- ⬜ Fix runtime errors
- ⬜ Optimiser latence
- ⬜ Valider qualité transcription/traduction

### Phase 4 - Real-World Test
- ⬜ Test avec sample audio chinois
- ⬜ Test recording 30min sans crash
- ⬜ Test en condition réelle (meeting avec Tingting)

---

**Next immediate action**: Setup vcpkg et lancer `./build.sh`

Bonne chance ! 🚀
