lefteros_by SomniusX
EN ↗Πες ένα γεια

25 Φεβρουαρίου 2026 / Lefteris Iliadis (SomniusX)

Οδηγός για Offline Voxtype-style Dictation σε Arch & Hyprland και άλλες διανομές (#3 post)

25 Φεβρουαρίου 2026

Αν θες να έχεις push-to-talk voice-to-text σε Arch, χωρίς cloud, με Hyprland ή οποιονδήποτε Wayland compositor, εδώ είναι οδηγός βήμα-βήμα που δουλεύει.

Αν θες να έχεις push-to-talk voice-to-text σε Arch, χωρίς cloud, με Hyprland ή οποιονδήποτε Wayland compositor, εδώ είναι οδηγός βήμα-βήμα που δουλεύει.


1. Εγκατάσταση απαραίτητων πακέτων

Ανοίγεις τερματικό και τρέχεις:

  paru -S whisper.cpp wtype wl-clipboard alsa-utils libnotify
  • whisper.cpp → offline speech-to-text

  • wtype → γράφει κείμενο στο ενεργό παράθυρο

  • wl-clipboard → προαιρετικά για copy στο clipboard

  • alsa-utils → για να καταγράφει το μικρόφωνο

  • libnotify → για να δείχνεις notifications στην οθόνη


2. Κατέβασε το μοντέλο

Δημιούργησε φάκελο και κατέβασε το base μοντέλο:

mkdir -p ~/.local/share/whisper
cd ~/.local/share/whisper
wget https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin

Το base.en είναι γρήγορο και αξιόπιστο για τους περισσότερους υπολογιστές. Αν έχεις δυνατό CPU, μπορείς να πάρεις το small.en για ακόμα καλύτερη ακρίβεια.

Προφανώς αυτό είναι για ΑΓΓΛΙΚΑ ΜΟΝΟ, ψάχνω πως μπορώ ανάλογα το keybord layout να διαλέγει το ανάλογο whisper model.. (διαβάστε 2ο post)


3. Δημιουργία του toggle push-to-talk script

Φτιάχνουμε ένα script που κάνει record όταν πατάς και μετά transcribe όταν πατάς ξανά:

mkdir -p ~/.local/bin
nano ~/.local/bin/voxtype

Και μέσα στο αρχείο βάζεις:

#!/usr/bin/env bash

MODEL="$HOME/.local/share/whisper/ggml-base.en.bin"
TMP_WAV="/tmp/whisper-record.wav"
TMP_OUT="/tmp/whisper-output.txt"

# If recording is running, stop and transcribe
if pgrep -x "arecord" > /dev/null; then
    pkill -INT arecord
    notify-send "Voxtype" "Processing..."

    # Transcribe using whisper.cpp
    whisper-cli -m "$MODEL" -f "$TMP_WAV" -otxt -of "/tmp/whisper-output" > /dev/null 2>&1

    # Check correct output file
    OUTPUT_FILE="/tmp/whisper-output.txt"
    if [[ -f "$OUTPUT_FILE" ]]; then
        cat "$OUTPUT_FILE" | wtype -  # type into active window
        cat "$OUTPUT_FILE" | wl-copy  # optional copy to clipboard
    else
        notify-send "Voxtype" "Error: transcription file missing"
    fi

    rm -f "$TMP_WAV" "$TMP_OUT"
    exit 0
fi

# Otherwise, start recording
notify-send "Voxtype" "Recording..."

## do -c 1 for mono recording ## arecord -f cd -c 1 -t wav "$TMP_WAV" &
arecord -f cd -t wav "$TMP_WAV" &

# Ξεκίνα καταγραφή
notify-send "Voxtype" "Recording..."
arecord -f cd -c 1 -t wav "$TMP_WAV" &

Εάν έχεις πρόβλημα μπορεί να φταίει που γράφει Stereo ήχο το μικρόφωνο, μπορείς με -c 1 να γράψει Mono.

Κάνουμε το script εκτελέσιμο:

chmod +x ~/.local/bin/voxtype

4. Ρύθμιση keybind στο Hyprland

Άνοιξε το αρχείο ρυθμίσεων:

nano ~/.config/hypr/hyprland.conf

Και πρόσθεσε μια γραμμή για το keybind (πχ SUPER + X):

bind = SUPER, X, exec, ~/.local/bin/voxtype

Μετά κάνεις reload Hyprland:

hyprctl reload

5. Πως δουλεύει

  1. Εστίασε σε ένα text field (πχ browser ή editor)

  2. Πάτα SUPER + X → ξεκινά η καταγραφή, βλέπεις notification “Recording…”

  3. Μίλα όσο θέλεις

  4. Πάτα SUPER + X ξανά → σταματά η καταγραφή, τρέχει το whisper, και το κείμενο γράφεται αυτόματα στο ενεργό παράθυρο και αντιγράφεται στο clipboard


6. Tips / Βελτιώσεις

  • Αν βλέπεις garbled text, βεβαιώσου ότι η γραμμή arecord -f cd -c 1 -t wav χρησιμοποιεί -c 1 (mono)

  • Μπορείς να αλλάξεις το μοντέλο σε small.en για πιο ακριβή αναγνώριση

  • Τα notifications κάνουν πιο ξεκάθαρο πότε ηχογραφεί και πότε επεξεργάζεται πριν το κάνει paste


Με αυτόν τον τρόπο έχεις ένα fully offline Voxtype-style dictation σε Arch και χωρίς root, χωρίς ydotool και χωρίς daemons, που δουλεύει σταθερά σε Wayland/Hyprland.


7. Τίτλοι Τέλους

  • Προσπάθεια ίδιας λειτουργίας σε άλλα wm/de, π.χ. kde/gnome/κ.α.
  • Ιδέα την πήρα από το VoxType του Omarchy αλλά χωρίς το ουσιαστικό VoxType.io
  • Προσπάθεια χρήσης Ελληνικών είτε αναγνωρίζοντας το keyboard layout είτε με άλλο keyboard binding (πιο εύκολο) (διαβάστε 2ο post)