Wavy
Dictée vocale locale pour Linux, bientôt sur Mac et Windows

Wavy

Wavy Viking

Wavy Space Hunter

Wavy

Défi
Créer un outil de dictée vocale qui fonctionne entièrement en local sur Linux, sans dépendre du cloud, tout en offrant des performances comparables aux solutions commerciales.
Opportunité
Développer une alternative privacy-first aux solutions de dictée vocale existantes, optimisée pour les utilisateurs Linux et les développeurs.
Disciplines
Responsabilités
Full Stack Development
UI/UX Design
Character Animation
Marketing Website
Stack
Contexte
En tant que développeur sous Linux, je cherchais un outil de dictée vocale qui tourne rapidement sur mon PC en local, avec un modèle state-of-the-art. Les solutions existantes comme Google Dictation ou Dragon nécessitent une connexion cloud, ce qui pose des problèmes de confidentialité et de latence. D'autres outils locaux manquent de fluidité ou utilisent des modèles obsolètes.
Je voulais quelque chose de simple : un assistant qui écoute, transcrit et colle directement dans n'importe quelle application, sans LLM conversationnel, sans complexité inutile. Après avoir exploré le marché et testé plusieurs alternatives, j'ai décidé de construire ma propre solution.

Exploration des technologies
Modèles de transcription
J'ai évalué plusieurs modèles de speech-to-text : Whisper d'OpenAI (state-of-the-art mais lourd), Vosk (rapide mais moins précis), et DeepSpeech (obsolète). faster-whisper s'est imposé comme le meilleur compromis : même qualité que Whisper original, mais 4x plus rapide avec une empreinte mémoire réduite de 50%.
Tests de performance
J'ai benchmarké faster-whisper sur CPU (Intel) avec différents modèles. Le modèle tiny traite 10s d'audio en 0.29s (35x temps réel), base en 0.38s (26x temps réel), et small en 1.17s (8.5x temps réel). Le modèle small offre le meilleur compromis qualité/vitesse : transcription quasi-instantanée avec une précision largement suffisante pour l'usage quotidien.
Analyse des alternatives
Superwhisper et Glaido (macOS uniquement, sans interface animée), Talon Voice (payant, macOS), Nerd Dictation (CLI basique sans UI), Voice2Text (extension browser limitée). Aucune solution ne combinait interface graphique fluide et fun, exécution locale 100% privée, et personnalisation poussée sur Linux.
Conception de l'expérience
Widget flottant
Plutôt qu'une application classique avec fenêtre, j'ai opté pour un widget flottant always-on-top. L'utilisateur peut le placer dans un coin de l'écran, le cacher/afficher avec un raccourci global (Alt+Q par défaut), et lancer l'enregistrement audio avec un autre raccourci (Alt+W par défaut). Tous les raccourcis sont totalement personnalisables par l'utilisateur. Le widget reste accessible sans monopoliser l'espace de travail.

Animations et feedback
J'ai créé une frame statique du personnage, puis utilisé Veo2 pour générer la vidéo animée (192 frames extraites). Le personnage réagit aux actions : idle breathing quand inactif, listening animation pendant l'enregistrement, processing pendant la transcription. Ces micro-interactions rendent l'outil vivant et rassurant.

Système de skins
Pour rendre l'expérience personnalisable, j'ai développé 14 skins différents (Viking, Ninja, Space Hunter, etc.). Pour chaque skin, j'ai créé une frame statique puis généré l'animation vidéo avec Veo2, testant différents prompts pour obtenir le style et les mouvements voulus. Le système de skins utilise un format JSON simple pour faciliter l'ajout de nouveaux personnages.

Galerie de skins
14 personnages animés uniques. Chaque skin comprend 192 frames.

Viking

Ninja

Sorcerer

Cyber Hacker

Footballer

Knight

Meca Pilot

Pirate

Pokemon Blue

Pokemon Red

Samurai

Secret Agent

Space Hunter

Terminator
Développement technique
1Architecture application
Application PyQt6 avec architecture en couches : UI layer (widget, animations), Core layer (audio recording, hotkey management), AI layer (faster-whisper inference). Communication asynchrone via Qt signals/slots pour garder l'UI responsive pendant l'inférence.
2Pipeline de transcription
Capture audio via PyAudio (16kHz, mono), détection de silence pour auto-stop, conversion en format attendu par Whisper, inférence avec faster-whisper, post-processing (capitalisation, ponctuation), injection dans l'application active via xdotool.
3Optimisations
Lazy loading du modèle Whisper (chargé au premier usage, pas au démarrage). Cache des résultats de transcription pour éviter les re-calculs. Support multi-GPU avec sélection automatique. Fallback CPU si pas de GPU disponible.
4Distribution
Packaging en AppImage pour compatibilité universelle Linux. L'AppImage embarque Python, PyQt6, et les dépendances, permettant un lancement en un clic sans installation système. Téléchargement du modèle Whisper au premier lancement.
Site web et tracking
Landing page Next.js
Site web marketing avec Next.js 14 (App Router), déployé sur Vercel. Présentation du produit, démo vidéo, galerie de skins, wishlist. Design monochrome cohérent avec l'application.
Gestion de la wishlist
Base Supabase pour gérer la wishlist et identifier qui est intéressé par le produit. Les utilisateurs peuvent s'inscrire sur le site pour être notifiés des nouvelles releases et recevoir le lien de téléchargement.
Communication
Emails automatiques via Resend pour notifier les personnes inscrites des nouvelles releases. Page Roadmap sur le site pour communiquer les updates et permettre aux utilisateurs de suivre le développement du produit.
Résultats
L'application fonctionne à 100% en local, sans aucune connexion cloud requise. Toutes les transcriptions se font directement sur la machine de l'utilisateur, garantissant une confidentialité totale.
J'ai créé 14 skins personnalisables pour le widget. Pour chaque personnage, j'ai designé une frame statique puis utilisé Veo2 pour générer les animations vidéo (192 frames extraites par skin). Ce système de personnalisation rend l'expérience unique pour chaque utilisateur.
Le site web (Next.js + Supabase + Vercel) a été lancé récemment pour gérer la wishlist et communiquer sur le projet. La distribution se fait via AppImage pour simplifier l'installation sur Linux, permettant un lancement en un clic sans dépendances système complexes.
Envie d'essayer Wavy ?
Visitez le site officiel pour télécharger l'application et en savoir plus.