Retour
Desktop AppLocal AIPrivacy-first

Wavy

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

Wavy

Wavy

Wavy Viking

Wavy Viking

Wavy Space Hunter

Wavy Space Hunter

Wavy

Wavy

Wavy - Lineup des personnages

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

Product DesignSoftware DevelopmentAI Integration

Responsabilités

Full Stack Development

UI/UX Design

Character Animation

Marketing Website

Stack

PythonPyQt6faster-whisperNext.jsSupabaseFigma

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.

Viking - Animation idle

Exploration des technologies

1

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%.

2

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.

3

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.

Ninja skin

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.

Space Hunter skin

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.

Samourai skin

Galerie de skins

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

Viking

Viking

Ninja

Ninja

Sorcerer

Sorcerer

Cyber Hacker

Cyber Hacker

Footballer

Footballer

Knight

Knight

Meca Pilot

Meca Pilot

Pirate

Pirate

Pokemon Blue

Pokemon Blue

Pokemon Red

Pokemon Red

Samurai

Samurai

Secret Agent

Secret Agent

Space Hunter

Space Hunter

Terminator

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.

Visiter wavy.audio