feat: SttPipeline avec cache SQLite (#7) #104

Closed
charles wants to merge 3 commits from feat/7-stt-pipeline-cache into main
Owner

Résumé

Implémente l'issue #7 : pipeline audio complet avec cache SQLite pour éviter les re-transcriptions.

  • SttPipeline : orchestre la réception des bytes audio → moteur STT → cache SQLite
  • PipelineEvent : enum Started | Transcribed(Transcript) | Cached(Transcript) | Error(String) émis via mpsc::Receiver
  • Cache SQLite : table transcriptions(event_id TEXT PRIMARY KEY, text, language, confidence, segments_json, created_at) — lecture avant toute transcription, écriture après
  • DB path : ~/.local/share/fractal-plus/stt-cache.db (via dirs::data_local_dir())
  • Pattern fire-and-forget : SttPipeline::run() spawne un tokio::task et retourne un mpsc::Receiver<PipelineEvent> non bloquant
  • sqlx : query! macro avec features sqlite + runtime-tokio-native-tls + migrate + macros

Fichiers modifiés

Fichier Changement
Cargo.toml Ajout de sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-native-tls", "migrate", "macros"] } dans [workspace.dependencies]
crates/fractal-stt/Cargo.toml Ajout de sqlx = { workspace = true }
crates/fractal-stt/src/pipeline.rs Nouveau fichier : SttPipeline, PipelineEvent, helpers load_from_cache / store_in_cache
crates/fractal-stt/src/lib.rs Export de PipelineEvent et SttPipeline ; renommage du module openai_whisperopenai (conforme à la spec)

Plan de test

  • cargo build -p fractal-stt compile sans erreur
  • Premier appel à pipeline.run(event_id, audio, opts) → reçoit Started puis Transcribed(_)
  • Second appel avec le même event_id → reçoit directement Cached(_), moteur non sollicité
  • Vérifier la présence de la ligne dans ~/.local/share/fractal-plus/stt-cache.db avec sqlite3
  • Erreur moteur → reçoit Error(_), pas de crash

Closes #7

## Résumé Implémente l'issue #7 : pipeline audio complet avec cache SQLite pour éviter les re-transcriptions. - **`SttPipeline`** : orchestre la réception des bytes audio → moteur STT → cache SQLite - **`PipelineEvent`** : enum `Started | Transcribed(Transcript) | Cached(Transcript) | Error(String)` émis via `mpsc::Receiver` - **Cache SQLite** : table `transcriptions(event_id TEXT PRIMARY KEY, text, language, confidence, segments_json, created_at)` — lecture avant toute transcription, écriture après - **DB path** : `~/.local/share/fractal-plus/stt-cache.db` (via `dirs::data_local_dir()`) - **Pattern fire-and-forget** : `SttPipeline::run()` spawne un `tokio::task` et retourne un `mpsc::Receiver<PipelineEvent>` non bloquant - **sqlx** : `query!` macro avec features `sqlite + runtime-tokio-native-tls + migrate + macros` ## Fichiers modifiés | Fichier | Changement | |---|---| | `Cargo.toml` | Ajout de `sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-native-tls", "migrate", "macros"] }` dans `[workspace.dependencies]` | | `crates/fractal-stt/Cargo.toml` | Ajout de `sqlx = { workspace = true }` | | `crates/fractal-stt/src/pipeline.rs` | Nouveau fichier : `SttPipeline`, `PipelineEvent`, helpers `load_from_cache` / `store_in_cache` | | `crates/fractal-stt/src/lib.rs` | Export de `PipelineEvent` et `SttPipeline` ; renommage du module `openai_whisper` → `openai` (conforme à la spec) | ## Plan de test - [ ] `cargo build -p fractal-stt` compile sans erreur - [ ] Premier appel à `pipeline.run(event_id, audio, opts)` → reçoit `Started` puis `Transcribed(_)` - [ ] Second appel avec le même `event_id` → reçoit directement `Cached(_)`, moteur non sollicité - [ ] Vérifier la présence de la ligne dans `~/.local/share/fractal-plus/stt-cache.db` avec `sqlite3` - [ ] Erreur moteur → reçoit `Error(_)`, pas de crash Closes #7
charles closed this pull request 2026-04-06 02:06:08 +00:00
Some checks are pending
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
qa
Required

Pull request closed

Sign in to join this conversation.
No description provided.