dotfiles/bin/rice-dictate
Sarthak 7f41cf7a82 replace the old dotfiles with the sakura line rice
The bare $HOME repo is gone. This is now the rice: install.sh, rice-*
scripts in bin/, configs in home/ linked into $HOME, theme templates, st
and the particle wallpaper. Clone to ~/rice and run install.sh.
2026-09-14 19:44:44 +05:30

51 lines
1.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# rice-dictate - offline voice typing into the focused window (nerd-dictation).
#
# rice-dictate toggle start listening, or stop and finish typing
# rice-dictate status on / off
#
# The first run downloads a small English speech model (about 40 MB) into
# ~/.config/nerd-dictation/model. Drop a different VOSK model there to change language.
set -uo pipefail
run="${XDG_RUNTIME_DIR:-/tmp}/rice"
model_dir="${XDG_CONFIG_HOME:-$HOME/.config}/nerd-dictation/model"
model_url="https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip"
mkdir -p "$run"
listening() { pgrep -u "$UID" -f 'nerd-dictation begin' >/dev/null; }
poke() { date +%s%N > "$run/dictation.rev"; }
fetch_model() {
local tmp
rice-notify send "Dictation" "Downloading the speech model (about 40 MB)…"
tmp=$(mktemp -d) || return 1
if curl -fsSL -o "$tmp/model.zip" "$model_url" && unzip -q "$tmp/model.zip" -d "$tmp"; then
mkdir -p "$(dirname "$model_dir")"
mv "$tmp"/vosk-model-* "$model_dir"
rm -rf "$tmp"
rice-notify send "Dictation" "Model ready. Press super + ctrl + x again to start."
else
rm -rf "$tmp"
rice-notify send "Dictation" "Could not download the speech model"
return 1
fi
}
case "${1:-toggle}" in
toggle)
command -v nerd-dictation >/dev/null || { rice-notify send "Dictation" "Install nerd-dictation-git to dictate"; exit 1; }
if listening; then
nerd-dictation end
poke
elif [[ ! -d $model_dir ]]; then
fetch_model
else
setsid -f nerd-dictation begin --simulate-input-tool=XDOTOOL >/dev/null 2>&1
poke
notify-send -a rice -u low -t 1500 "Dictation" "Listening. super + ctrl + x to stop."
fi
;;
status) listening && echo on || echo off ;;
*) sed -n '2,9p' "$0" | sed 's/^# \{0,1\}//'; exit 2 ;;
esac