Darkwood · Symfony 8 · Voice-first · 2026-05-17

Flowvox update

De la console au worker vocal temps réel - web, Mercure, iOS.

Parler
→
Transcrire
→
Diffuser
@matyo91

Thèse

Symfony peut devenir une plateforme d'agents vocaux temps réel.

Pas un chatbot. Un système : workers, providers, UI live, mobile natif.

01 | thèse @matyo91

Roadmap narrative

Six phases. Une évolution visible.

① Console POC
② Workers Flow
③ Dashboard Mercure
④ OpenAI Realtime
⑤ UX Native iOS
⑥ Voice agents
02 | roadmap @matyo91

Phase 1 · 2024

POC console.
whisper.cpp sur Symfony.

Enregistrer. Transcrire. Lire le texte dans le terminal.

03 | phase 1 @matyo91

Phase 1

Pipeline minimal

flowchart LR
  MIC[Micro] --> FFM[ffmpeg WAV]
  FFM --> CLI[whisper-cli]
  CLI --> OUT[stdout]
04 | poc pipeline @matyo91

Limite du POC

Ça marche.
Mais ce n'est pas un produit.

Pas de UI

Tout dans le terminal.

Pas de live

Texte après STOP seulement.

Pas de scale

Une session, un process.

05 | limite @matyo91

Phase 2

Workers distribués.
Flow + Messenger.

START / STOP par session. Un worker long-running par sessionId.

06 | phase 2 @matyo91

Pourquoi Flow ?

Orchestration fiber, pas spaghetti async.

flowchart TB
  MSG[Messenger START/STOP] --> IN[InputProviderFlow]
  IN --> REC[RecorderFlow]
  REC --> TR[TranscribeFlow]
  TR --> DSP[DisplayFlow]
07 | flow @matyo91

Pourquoi Symfony ?

Le worker n'est pas l'UI.

Messenger

Contrôle asynchrone ciblé.

Doctrine

Sessions, historique, export.

Ports

Mercure, providers, use cases.

08 | symfony @matyo91

Multi-session

alpha · beta · demo

php bin/console voice:worker --session=demo
php bin/console voice:start --session=demo
php bin/console voice:stop --session=demo
09 | cli @matyo91

Phase 3

Dashboard temps réel.
Mercure + Turbo.

L'UI observe. Le worker exécute.

10 | phase 3 @matyo91

Architecture

Publish first, persist after.

flowchart LR
  W[Worker] --> E[VoiceDomainEvent]
  E --> M[Mercure]
  E --> DB[(PostgreSQL)]
  M --> WEB[Browser Turbo]
  M --> iOS[Hotwire Native]
11 | mercure arch @matyo91

Événements

Le contrat live.

recording_started
transcription_partial
transcription_final
error
12 | events @matyo91

Architecture providers

Un pipeline.
Plusieurs moteurs.

Local

whisper_cpp · whisper_cpp_stream

Cloud batch

openai_batch · gpt-4o-transcribe

Cloud live

openai_realtime_whisper

13 | providers @matyo91

Providers

Registre plug-in

flowchart TB
  ENV[FLOWVOX_TRANSCRIPTION_PROVIDER] --> REG[TranscriptionProviderRegistry]
  REG --> W[WhisperCpp]
  REG --> WS[WhisperCppStream]
  REG --> B[OpenAiBatch]
  REG --> R[OpenAiRealtime]
14 | registry @matyo91

Phase 4

OpenAI Realtime API.
Le texte pendant qu'on parle.

15 | phase 4 @matyo91

Realtime audio pipeline

PCM 24 kHz → WebSocket → partials

sequenceDiagram
  participant W as Worker
  participant F as ffmpeg
  participant O as OpenAI Realtime
  participant M as Mercure
  W->>F: PCM stream
  F->>O: input_audio_buffer.append
  O-->>W: transcription_partial
  W->>M: publish
16 | realtime pipeline @matyo91

whisper-stream local

Même UX.
Moteur différent.

Privé

SDL2 + whisper-stream · fenêtre glissante

Cloud

VAD OpenAI · gpt-4o-transcribe

17 | local vs cloud @matyo91

Live demo

DEMO

worker · START · parler · STOP · Mercure

18 | demo @matyo91

Phase 5

UX Native + Hotwire iOS.

Une codebase Twig. Une expérience native.

19 | phase 5 @matyo91

Hotwire Native

WKWebView + bridges.

Twig
↔
Stimulus Bridge
↔
Swift UI
20 | hotwire @matyo91

ux_is_native()

Même template.
Deux expériences.

{% verbatim %}{% if not ux_is_native() %}
  …
{% endif %}{% endverbatim %}
21 | native twig @matyo91

iOS validé

iPhone physique · LAN · Mercure JWT.

flowvox-ios
192.168.x.x
Live transcript
22 | ios @matyo91

darkwood/navi

Trace structurée.
Workflows demain.

NDJSON · Actions · Context - base pour assistants programmables.

23 | navi @matyo91

Phase 6 · Horizon

Voice-first interface.

Translate

Realtime multilingue

Agents

Tool calling vocal

Navi

Workflows déclaratifs

24 | future @matyo91

Stack cible

Flowvox dans l'écosystème Darkwood

flowchart TB
  FV[Flowvox] --> FLOW[darkwood/flow]
  FV --> NAVI[darkwood/navi]
  FV --> SAI[Symfony AI]
  FV --> UF[Uniflow]
  SAI --> RT[OpenAI Realtime]
  NAVI --> WF[Voice workflows]
25 | stack @matyo91

Vision produit

Parler à son application.
Elle répond en temps réel.

Dictée · réunions · accessibilité · agents vocaux métier.

26 | vision @matyo91

État d'avancement

MVP bout en bout.

~90%

Workers + Flow

~85%

UI + Mercure

~70%

iOS native

27 | status @matyo91

Conclusion

Flowvox = plateforme vocale Symfony.

Workers
+
Providers
+
Live UI
+
Native
28 | conclusion @matyo91

Darkwood · Symfony · Uniflow

github.com/darkwood-com/flowvox

Article · YouTube · Démo live

darkwood.com · Symfony AI · Flow · Navi

29 | merci @matyo91