Talon
Contents
- 1 mishearings
- 2 alternatives
- 3 Talon with remote Dragon
- 4 linux gnome remarks
- 5 linux notifications
- 6 linux pull all repos in ~/.talon/user
- 7 automation / run on start / app switch
- 8 alternative paste method
- 9 change to webengine (mac specific)
- 10 draw image
- 11 react on hiss
- 12 vs code syntax highlight extension
- 13 german
- 14 script: print all talon commands
- 15 script: reminder
- 16 script: full mouse grid
- 17 script: pokey cursorless
- 18 script: text selection
- 19 script: talon hud
- 20 setup WebSpeech for Dictation
- 21 practice
- 22 telector fix suggestion
- 23 knausj formatters actions
- 24 code block example with optional formatters
- 25 script for overlay commands
- 26 script for hissing
- 27 script cursor scrolling while hissing
- 28 script simple cron task
- 29 script overwrite alphabet
- 30 script launch sound settings
- 31 script space to pause talon
- 32 script up_down_modifiers.talon
- 33 script: move mouse based on screenshot
- 34 script: windows lock screen
- 35 script: copy mouse position to clipboard
- 36 vs code plugin cursorless
- 37 eye tracking
- 38 taras awesome list
- 39 user scripts
- 40 alternative/additional software
- 41 mac "bug": dots added randomly while typing
- 42 mac specific: key combinations
- 43 press key for 2 seconds
- 44 videos
- 45 VIM add-ins/programmes
- 46 select text and extend selection
- 47 parrot
- 48 debugging
- 49 search talon repos
- 50 conformer
- 51 alternative movement command
- 52 options
- 53 mac key "option"
- 54 set speech timeout
- 55 control zoom mouse scale
- 56 {number_small}
- 57 mixed mode
- 58 talon deck
- 59 push-to-talk
- 60 repeat keypress
- 61 cheatsheets
- 62 Mouse Input Alternatives
- 63 Operating System Navigation (like Vim)
- 64 help window too tall
- 65 windows installation considerations
- 66 .talon
- 67 hardware
- 68 linux: function keys f13 - f24 (ERROR invalid hotkey f13)
- 69 insert multiline text
- 70 RUST beta
- 71 additional words vs. words to replace
- 72 macos terminal specific
- 73 macos zoom mouse / mouse grid
- 74 UK vs. US
- 75 rango
- 76 wait
- 77 dictate until keyword "over"
- 78 disable voice input when app is in focus
mishearings
what i said | what talon understood | possible fix/alias |
---|---|---|
series | serious | |
urge | each | |
or | for/four | |
press | plus | |
comma space | colon space | comgap,spamma: ", " |
colon space | comma space | colp,spolon: ": " |
alternatives
alphabet
alternatives for when the "defaults" (knausj-repo) are not well recognized merged with some from tavis rudds alphabet (https://gist.github.com/tavisrudd/5361092)
alphabet | alternative |
---|---|
air | acid |
air | aim |
air | alf |
air | any |
air | arch |
air | axel |
bat | batch |
bat | best |
bat | bill |
bat | bit |
bat | bob |
bat | bony |
bat | bot |
cap | carl |
cap | char |
cap | cock |
cap | cole |
drum | dan |
drum | dave |
drum | dozen |
each | birch |
each | ease |
each | east |
each | ebike |
each | ed |
each | eric |
each | eve |
fine | fake |
fine | faint |
fine | fig |
fine | flow |
fine | fox |
fine | foxy |
fine | fred |
gust | gary |
gust | gear |
gust | gig |
gust | golf |
gust | grace |
harp | hal |
harp | ham |
harp | hank |
harp | hate |
harp | hoop |
harp | hoof |
harp | hotel |
sit | dice |
sit | ice |
sit | ida |
sit | ink |
sit | ish |
sit | itchy |
sit | ivan |
sit | ivy |
jury | jack |
jury | jail |
jury | jane |
jury | jed |
jury | joe |
jury | judge |
jury | jug |
jury | julia |
crunch | kale |
crunch | keel |
crunch | kick |
crunch | kid |
crunch | kirk |
crunch | krife |
crunch | kyle |
look | else |
look | lazy |
look | little |
look | lou |
look | luka |
made | mary |
made | met |
made | midge |
made | mike |
made | miley |
made | murphy |
near | nasal |
near | nate |
near | neal |
near | nerd |
near | noy |
odd | oats |
odd | odin |
odd | oink |
odd | orange |
odd | osh |
odd | out |
odd | ox |
odd | oz |
pit | palm |
pit | pete |
pit | pink |
pit | pip |
pit | play |
pit | pom |
pit | premier |
pit | prince |
quench | quebec |
quench | queen |
quench | quinn |
quench | quick |
red | ralph |
red | ree |
red | remo |
red | ring |
red | rip |
red | risk |
red | robin |
red | root |
sun | salty |
sun | sam |
sun | side |
sun | sis |
sun | smith |
sun | soi |
sun | spun |
trap | tay |
trap | tea |
trap | tess |
trap | timy |
trap | tit |
trap | tosh |
trap | trip |
urge | unix |
urge | urch |
urge | urn |
urge | usher |
urge | ute |
urge | yuck |
vest | van |
vest | video |
vest | vince |
vest | vine |
vest | void |
vest | voss |
vest | you |
whale | wages |
whale | wasp |
whale | wes |
whale | wet |
whale | whip |
whale | will |
whale | wish |
plex | lex |
plex | x-ray |
plex | xin |
yank | yak |
yank | yan |
yank | yep |
yank | yoke |
yank | york |
yank | young |
yank | yugi |
zip | zap |
zip | zeke |
zip | zimeesi |
zip | zircon |
zip | zoko |
zip | zone |
zip | zoo |
zip | zulu |
actions/commands/symbols
action/command/symbol | knausj builtin alternative(s) | user/custom alternative(s) |
---|---|---|
backspace | clear left, delete, wipe | junk |
brace | - | (right) curve |
enter | - | break, clap, oke, okay, pick, punch |
exclamation mark (!) | bang | boom |
colon | - | half stack |
comma | - | drip |
delete | forward delete | eat, junk right, slurp, spunk |
dollar sign | dollar | dolly |
hash | - | prison |
katie | - | cathy |
redo that | - | yup |
tilde (~) | - | wiggle |
tab | - | yes |
undo that | - | crash, geez, fuck, nope, not that, rollback, scratch that, whoops, wrong |
semicolon | - | sammy, semi, stack, wink |
space | - | pah, put, void |
formatters
knausj | user/custom alternative(s) |
---|---|
all cap | shout |
Talon with remote Dragon
v2
Running Linux or Mac Talon against Windows Dragon, take two: 1. Find the latest “Released” message in beta Make sure to sort the search by recent instead of relevant. 2. Install Talon on Windows and run it (talon.exe or talon_console.exe). The system tray icon by the clock is barely visible with the default taskbar as it’s black, sorry, I will fix this sometime. 3. Right click on the Talon icon by the clock, go to Scripting, then “Open ~/talon”. Find draconity.toml in this directory and open it in a text editor. 4. Add this text at the end of draconity.toml: [[socket]] host = "0.0.0.0" port = 38065 5. Copy the authentication key at the top of draconity.toml, you will need to have it to configure your other computer. Also note down the IP address of your Windows computer. 6. Install Talon on your non-Windows computer, open draconity.toml in the same way, edit the authentication key to match the Windows computer, and add this text at the end: [[remote]] host = "WINDOWS_IP_HERE" port = 38065 7. Run Dragon on the Windows computer and wake up the microphone.
v1
source: https://news.ycombinator.com/item?id=24850417
lunixbochs 4 months ago [–] Talon can also use Dragon remotely from a Windows machine or VM, kind of like aenea but more tightly integrated (the host is driving instead of the guest). And I do have some users voluntarily switching from Mac Dragon to the improved speech engine in the Talon beta. Mac Dragon has been kind of buggy for the last few years so you're not missing much. ianhorn 4 months ago [–] Any chance you have pointers on how to set that up? You'd probably laugh/cry to see my setup right now, with my Windows desktop on the left monitors and my MacBook on the right monitors because I need both... purely because Dragon is only sold on Windows since this started been an issue for me. A more tightly coupled super-aenea sounds pretty fantastic. lunixbochs 4 months ago [–] Sure: First run Talon on both sides. Then go to your talon home directory (click talon icon in tray -> scripting -> open ~/talon). There's a draconity.toml file there. On the Dragon side, you need to uncomment and update the `[[socket]]` section to listen on an accessible IP. On the client side (Mac in your case), uncomment / update the `[[remote]]` section to point at your other machine. You also need to make sure both configs have the same secret value. From there, restart Dragon and look in the Talon log on the Mac side for a line like "activating speech engine: Dragon". To prevent command conflicts, I recommend setting Dragon to "command mode" (if you have DPI), and only adding scripts to Talon on the Mac side. If it doesn't work, you can uncomment the `logfile` line in draconity.toml on the Dragon side, restart Dragon, and look in the log to see what's going on.
linux gnome remarks
also if you’re on latest gnome you should install appindicator support, they removed that for some reason
linux notifications
Put this in notify.py from talon import Module, Context, app, speech_system, actions ctx = Context() mod = Module() def on_phrase(j): phrase = getattr(j["parsed"], "_unmapped", j["phrase"]) phrase = " ".join(word.split("\\")[0] for word in phrase) app.notify(phrase) speech_system.register('post:phrase', on_phrase) # above enables notifications. Below supports toggling them. do_notify = True @mod.action_class class Actions: def notify_toggle(): """Toggle OS notifications""" global do_notify if do_notify: speech_system.unregister('post:phrase', on_phrase) else: speech_system.register('post:phrase', on_phrase) do_notify = not do_notify 3:53 And in a .talon file: talon notify: user.notify_toggle().
linux pull all repos in ~/.talon/user
source: https://talonvoice.slack.com/archives/CKYAFAADA/p1651807016464379
find ~/.talon/user -name .git -print -execdir git pull --ff-only \;
automation / run on start / app switch
load things on talon startup
from talon import app, speech_system def on_launch(): speech_system.mimic("command history") app.register('launch', on_launch)
start talon in sleep mode
from talon import actions, app def on_ready(): actions.speech.disable() app.register('launch', on_ready)
start talon with mouse control enabled
from talon import actions, app def on_launch(): actions.tracking.control_toggle() app.register('launch', on_launch)
run action on app switch
def on_app_switch(app): ... ui.register("app_activate", on_app_switch) ui.register("app_launch", on_app_switch)
alternative paste method
in case anyone else is finding the actions.user.paste()
problematic (too slow) on linux, you can use this replacement code in code/edit.py
in the interim, which seems to be work fine based on testing (not sure if someone posted another workaround already):
@mod.action_class class Actions: def paste(text: str): """Pastes text and preserves clipboard""" #with clip.revert(): # clip.set_text(text) # actions.edit.paste() # # sleep here so that clip.revert doesn't revert the clipboard too soon # actions.sleep("150ms") # TODO: qt clipboard is bugged, do it manually old = subprocess.check_output(['xclip', '-o', '-sel', 'clip']) clip.set_text(text) actions.edit.paste() actions.sleep("150ms") clip.set_text(old.decode("utf-8"))
note you may have to install xclip depending on your distro (edited)
change to webengine (mac specific)
from talon import speech_system, Context from talon.engines.w2l import WebW2lEngine, W2lEngine from talon.engines.webspeech import WebSpeechEngine w2l = W2lEngine(model='en_US-sconv-beta6', debug=True) speech_system.add_engine(w2l) webspeech = WebSpeechEngine() speech_system.add_engine(webspeech) # set the default engine ctx = Context() ctx.settings = { 'speech.engine': 'wav2letter', } from talon.mac import applescript import subprocess if applescript.run(''' on webSpeechRunning() if application id "com.google.Chrome" is not running then return false tell application id "com.google.Chrome" to get (every window's every tab's URL as string) contains "http://localhost:7419/" end webSpeechRunning webSpeechRunning() ''') == 'false': subprocess.run(['/usr/local/bin/launch', '-bi', 'com.google.Chrome', 'http://localhost:7419']) subprocess.run(['/usr/local/bin/appswitch', '-hi', 'com.google.Chrome'])
draw image
from talon.canvas import Canvas from talon.skia import Image im1 = Image.from_file("image1.png") # current directory is ~/.talon def draw(canvas): canvas.draw_image(im1, canvas.x, canvas.y) canvas = Canvas(0, 0, 200, 200) canvas.register('draw', draw) canvas.freeze()
react on hiss
from talon import noise, ctrl, cron import time active_hiss = {"start": None, "cron": None} HISS_MINIMUM_THRESHOLD = 0.25 def hiss_over_threshold(): if not active_hiss["start"]: return False delta = time.time() - active_hiss["start"] trigger = delta > HISS_MINIMUM_THRESHOLD if delta: print("hisssing complete %0.2fs (trigger = %s)" % (delta, trigger)) return trigger def stop_hiss(): if hiss_over_threshold(): ctrl.mouse_click(0) if active_hiss["cron"]: cron.cancel(active_hiss["cron"]) active_hiss["cron"] = None active_hiss["start"] = None def start_hiss(): if not active_hiss["start"]: active_hiss["start"] = time.time() active_hiss["cron"] = cron.interval("16ms", check_hiss) def on_hiss(noise): if noise: start_hiss() else: stop_hiss() def check_hiss(): delta = float(time.time() - active_hiss["start"]) should_click = delta > HISS_MINIMUM_THRESHOLD print("hisssing check: %0.2f s"% delta) if should_click: stop_hiss() noise.register('hiss', on_hiss)
vs code syntax highlight extension
source: https://marketplace.visualstudio.com/items?itemName=mrob95.vscode-talonscript
german
add german dictation mode (using `vosk`)
source: https://github.com/mqnc/talon_german
updated repos/forks due to changes in 0.3
https://github.com/2d6/talon_german
install specific vosk version (libvosk.dll error 0x7f)
C:\Users\gpunktschmitz\AppData\Roaming\talon\.venv\Scripts>pip install vosk==0.3.21 Requirement already satisfied: vosk==0.3.21 in c:\users\gpunktschmitz\appdata\roaming\talon\.venv\lib\site-packages (0.3.21) Requirement already satisfied: cffi>=1.0 in c:\talon\lib\site-packages (from vosk==0.3.21) (1.15.1) Requirement already satisfied: pycparser in c:\talon\lib\site-packages (from cffi>=1.0->vosk==0.3.21) (2.21)
knausj_german
https://github.com/hanuele/knausj_german
german.talon - switch between talon (en) and dragon (de)
source: https://github.com/wingerath/talon_german/blob/wolle_personal/german.talon
mode: user.german - ^(englisch | english)$: user.engine_mimic("geh schlafen") mode.disable("user.german") user.enable_withSound() ^(snore)$: user.engine_mimic("geh schlafen") user.sound_disable() user.app_color_black() talon sleep | snore | go to sleep: skip() ^german$: user.sound_disable() Umbruch: actions.key("shift-enter")
engine.py
from talon import speech_system, Context, actions from talon.engines.w2l import W2lEngine from talon.engines.vosk import VoskEngine #w2l = W2lEngine(model='en_US', debug=False) w2l = W2lEngine(model='en_US-conformer', debug=False) #vosk_de = VoskEngine(model='vosk-model-de-0.6', language='de_DE') speech_system.add_engine(w2l) #speech_system.add_engine(vosk_de) # # ideally you integrate this into your engines.py file #1 # from talon import speech_system, Context # # # # especially this should not be here but in your engines.py file: ctx = Context() ctx.settings = { 'speech.engine': 'wav2letter', # your default engine goes here # 'speech.engine': 'dragon', # your default engine goes here }
german webspeech mod
https://github.com/knausj85/knausj_talon/compare/master...jpaddison3:german-web-speech
script: print all talon commands
source: https://gist.github.com/tararoys/c538b7ae8e1f21db9a794c2c0f5becf4
script: reminder
source: https://gist.github.com/tararoys/d138b36731262fb8ae452814c13b9d4f
script: full mouse grid
https://github.com/tararoys/modified_full_mouse_grid
script: pokey cursorless
https://github.com/pokey/pokey_talon/tree/master/apps/vscode/cursorless
script: text selection
https://github.com/splondike/talon_telector
script: talon hud
https://github.com/chaosparrot/talon_hud
setup WebSpeech for Dictation
file: user/engines.py
webspeech = WebSpeechEngine() speech_system.add_engine(webspeech) # set the default engine ctx = Context() ctx.settings = { 'speech.engine': 'wav2letter', }
file: user/webspeech.talon
mode: dictation - settings(): speech.engine = 'webspeech' speech.language = 'en_US'
While Talon is running, open http://localhost:7419 in Chrome. You'll probably also need to allow microphone access the first time you enable it.
practice
practice talon
https://chaosparrot.github.io/talon_practice/
Practice Speechrec Mappings
https://github.com/shervinemami/practice_speechrec_mappings
telector fix suggestion
https://github.com/splondike/talon_telector/blob/94381bf9a9d6bb7f513275a885fcdb0ee66b7917/talon_interface.py#L374 6:12 try replacing 391 - 404 with this: src = (rect1.x, rect1.y + rect1.height / 2) dst = (rect2.x + rect2.width+2, rect2.y + rect2.height / 2) actions.mouse_move(*src) actions.mouse_click() time.sleep(0.1) actions.mouse_move(*dst) actions.key('shift:down') actions.mouse_click() actions.key('shift:up') time.sleep(0.1)
knausj formatters actions
settings(): user.code_private_function_formatter = "SNAKE_CASE" user.code_protected_function_formatter = "SNAKE_CASE" user.code_public_function_formatter = "SNAKE_CASE" user.code_private_variable_formatter = "SNAKE_CASE" user.code_protected_variable_formatter = "SNAKE_CASE" user.code_public_variable_formatter = "SNAKE_CASE"
code block example with optional formatters
if [<user.formatters>] <user.text> then: formatters = formatters or "NOOP" insert("if (") user.insert_formatted(text, formatters) insert(") {}") key(left) key(enter)
script for overlay commands
from talon.scripting import global_speech_system from talon import canvas, ui, ctrl, cron from talon.types import Rect display_canvas = True def _draw(canvas): print(canvas.x) paint = canvas.paint paint.textsize = 24 canvas.clear("ffffff00") paint.color = "ffffffff" canvas.draw_text(text, canvas.x + 30, canvas.y + 30) def reposition_canvas(): x, y = ctrl.mouse_pos() print(x, y) can.move(x, y) if display_canvas: can = canvas.Canvas.from_rect(Rect(500, 850, 600, 50)) can.register("draw", _draw) can.show() can.freeze() text = "" # cron.interval("1s", reposition_canvas) # reposition_canvas() def _log(args): global text, can text = " ".join(args["text"]) can.freeze() if display_canvas: global_speech_system.register("phrase", _log)
script for hissing
from talon import noise, ctrl def on_hiss(active): ctrl.mouse_click() noise.register("hiss", on_hiss)
script cursor scrolling while hissing
from talon import ctrl, noise, cron from time import sleep, time from user.knausj_talon.code.mouse import start_cursor_scrolling, stop_scroll start = 0 running = False noise_length_threshold = "500ms" threshold_passed = False def still_running(): global running global threshold_passed if running: threshold_passed = True start_cursor_scrolling() print('hiss duration passed threshold, starting gaze scroll') def cursor_scroll_on_hiss(is_active): global start global running global threshold_passed if is_active: start = time() running = True cron.after(noise_length_threshold, still_running) else: running = False if threshold_passed: threshold_passed = False stop_scroll() print('end of hiss detected, disabling gaze scroll') noise.register('hiss', cursor_scroll_on_hiss)
script simple cron task
from talon import cron import time def on_interval(): now = time.perf_counter() print(f"{now:.3f}s") cron.interval('1ms', on_interval)
script overwrite alphabet
"overwrite" knausj vocabulary with custom cope by adding context
alphabet = "air bat cap drum each fine gust harp sit jury crunch look made near odd pit quench red sun trap urge vest whale plex yank zip" letters = "abcdefghijklmnopqrstuvwxyz" from talon import Context ctx = Context() ctx.matches = 'os: mac' ctx.lists['user.letter'] = dict(zip(default_alphabet, letters_string))
script launch sound settings
one can type text by quoting it
sound settings: key(super) "sound settings" key(enter)
script space to pause talon
key(space:down): speech.disable() key(space:up): speech.enable()
script up_down_modifiers.talon
hold down <user.modifiers>+: key("{modifiers}:down") release <user.modifiers>+: key("{modifiers}:up")
script: move mouse based on screenshot
source: https://github.com/thinium/knausj_talon/blob/bdf222f7/apps/ableton/locate.py
from talon.experimental.locate import locate_hover from talon import Module, ctrl mod = Module() @mod.action_class class Actions: def locate(name: str): """Find an image on the screen and put the mouse in the center""" locate_hover(name, threshold=0.95) def nudge_mouse(x: int, y: int): """Move the mouse relatively""" _x, _y = ctrl.mouse_pos() ctrl.mouse_move(_x + x, _y + y)
script: windows lock screen
from talon import Module mod = Module() @mod.action_class class Actions: def sleeplock(): "Locks the screen" from ctypes import cdll user32lib = cdll.LoadLibrary(r'C:\Windows\System32\user32.dll') user32lib.LockWorkStation()
os: windows - lock it up: user.sleeplock() mimic('sleep all')
script: copy mouse position to clipboard
copy mouse (move|position): x = mouse_x() y = mouse_y() clip.set_text("mouse_move({x}, {y})")
vs code plugin cursorless
https://github.com/pokey/cursorless-talon
eye tracking
tobii eye tracker positioning
https://help.tobii.com/hc/en-us/articles/210250305-Position-in-front-of-the-Tobii-Eye-Tracker
[VIDEO] Talon Eye Tracking + Optikey Mouse
https://www.youtube.com/watch?v=PQkJE-rtn-g
calibration exits
if the tracker is very confused by what happened, calibration will exit before 9 dots have disappeared
-> rearrange angle / lights
taras awesome list
https://gist.github.com/tararoys/480d9b32c137d2f2f882ce06ccf12604
user scripts
- https://github.com/knausj85/knausj_talon
- https://github.com/blakewatson/talon-scripts/tree/new_api
- https://github.com/2shea/talon_starter_pack
- https://github.com/pjedge/talon_scripts_public
- https://github.com/AndreasArvidsson/talon-user
alternative/additional software
OptiKey
OptiKey - Full computer control and speech with your eyes
VoiceAttack
video showing how to use for programming
mac "bug": dots added randomly while typing
system preferences > keyboard
disable option "add period with double-space"
mac specific: key combinations
on Mac the modifier typically needs to be pressed "with the key" so one cannot
- press modifier key :down
- press key
- release modifier key :up
while on windows/linux this works
e.g. to press n
then h
while pressing cmd-ctrl
: key(cmd-ctrl-n cmd-ctrl-h)
press key for 2 seconds
user.key_async("space", "2000ms")
videos
- https://www.youtube.com/watch?v=1776iDFA9_w
- https://www.youtube.com/watch?v=wTY_kvtngAY
- https://www.youtube.com/watch?v=OR03sSXqOpc
- https://www.youtube.com/watch?v=gxaJeAEZRYo
- https://www.youtube.com/watch?v=UGKXJDWAbhE
channels
- https://www.youtube.com/@ergoeverything5673/videos
- https://www.youtube.com/@tararoys/videos
- https://www.youtube.com/@emilyshea3957/videos
- https://www.youtube.com/@theprogrammingpiglet1681/videos
- https://www.youtube.com/@PokeyRuleJams/videos
- https://www.youtube.com/@talonvoice/videos
- https://www.youtube.com/@LambdaIsland/videos
- https://www.youtube.com/@andreasarvidsson1388/videos
- https://www.youtube.com/@yokai2555/videos
- https://www.youtube.com/@bietola581/videos
- https://www.youtube.com/@freddydrennan4438/videos
- https://www.youtube.com/@LambdaIsland/videos
VIM add-ins/programmes
programmes that enables to control the OS/application in a "vimmy"-way
Firefox
- https://addons.mozilla.org/en-US/firefox/addon/vimium-c/
- https://addons.mozilla.org/en-GB/firefox/addon/vimium-ff/
Chrome
- https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb
- https://chrome.google.com/webstore/detail/vimium-c-all-by-keyboard/hfjbmagddngcpeloejdejnfgbamkjaeg
Windows
Mac
select text and extend selection
when selecting text one would say select word left
to extend the selection one could say 2nd
repetitive to extend the selection +1 word to the left (3rd
, 4th
, etc would do +2, +3 words, etc)
parrot
quickstart
- make ~/.talon/parrot
- copy parrot_ensemble_012.pkl to ~/.talon/parrot/model.pkl (from https://github.com/chaosparrot/parrotpy_tryout_bundle)
- create a ~/.talon/parrot/patterns.json file
- download parrot_integration.py from #beta and move it to ~/.talon/user/
- create a .talon file based on the pdf
- make the sounds
v2 changes
- updated
parrot_integration.py
- update patterns.json: s/f1/f0/
A parrot testing file
source: https://talonvoice.slack.com/archives/C01QEDFH60J/p1627679500015900
parrot(cluck): "cluck" parrot(tut): "tut" parrot(palate_click): "palate_click" parrot(pop): "pop" parrot(gluck): "gluck" parrot(finger_snap): "finger_snap" parrot(ch): "ch" parrot(ah): "ah" parrot(oh): "oh" parrot(ee): "ee" parrot(ue): "ue" parrot(ae): "ae" parrot(horse): "horse" parrot(whistle): "whistle" parrot(chopper): "chopper" parrot(hurr): "hurr" parrot(hmm): "hmm" parrot(oo): "oo" parrot(lll): "lll" parrot(yee): "yee" parrot(uh): "uh" parrot(fff): "fff" parrot(buzz) "buzz" parrot(generator): "generator" parrot(hiss): "hiss" parrot(shush): "shush" parrot(x): "x"
action after noise ends
parrot(hiss:stop): print("hiss stop")
action when noise starts
parrot(hiss:start): print("hiss start")
start/stop noise recognition
actions.mode.disable('noise') actions.mode.enable('noise')
tryout bundle
https://github.com/chaosparrot/parrotpy_tryout_bundle
Parrot.PY
https://github.com/chaosparrot/parrot.py
video explaining how to: https://www.youtube.com/watch?v=2j90vhzRoT8
debugging
test command [REPL]
using the sim()
function
Talon REPL | Python 3.9.4 (default, Apr 24 2021, 16:58:24) [GCC 7.5.0] on linux) >>> sim("slack close right sidebar") [1] "slack close right sidebar" path: user/gpunkt_talon/mode-all.linux.talon rule: "slack close right sidebar"
show what events where triggered [REPL]
Talon REPL | Python 3.9.4 (default, Apr 24 2021, 16:58:24) [GCC 7.5.0] on linux) >>> events.tail()
find where actions are defined/overloaded
Talon REPL | Python 3.9.4 (default, Apr 24 2021, 16:58:24) [GCC 7.5.0] on linux) >>> actions.find('user.system_command') [user/knausj_talon/core/system_command.py] user.system_command(cmd: str) execute a command on the system * [user/knausj_talon/core/system_command.py] def system_command(cmd: str): """execute a command on the system""" os.system(cmd) [user/knausj_talon/core/system_command.py] user.system_command_nb(cmd: str) execute a command on the system without blocking * [user/knausj_talon/core/system_command.py] def system_command_nb(cmd: str): """execute a command on the system without blocking""" subprocess.Popen(cmd, shell=True)
search talon repos
https://search.talonvoice.com/
conformer
version history
- a74 - first/original release
- a108 - second release
- b108 - third release: changed packaging but not performance
in Talon >= 0.2.0-8 conformer can be used without a language model (by renaming lm-ngram.bin
)
alternative movement command
instead of go up fifth
one can say go up five times
options
with b108 there is a torch
option
engine = W2lEngine(model='en_US-conformer', debug=True, torch=True)
mac key "option"
use 'alt' instead of 'opt' or 'option' - example: key(shift-option-down)
set speech timeout
save to settings.talon
settings(): speech.timeout = 0.3
customize for dictation mode
save to settings-dictation-mode.talon
mode: dictation - settings(): speech.timeout = 0.3
control zoom mouse scale
https://search.talonvoice.com/search/?q=zoom_mouse.config&fold_case=auto®ex=false&context=true
{number_small}
one can use numbers like key("cmd-alt-{number}")
but if that number won't exceed 99 one should use {number_small}
which caps at 99 whereas {number}
is capable of infinite numbers (e.g. one hundred trillion)
mixed mode
source: https://talonvoice.slack.com/archives/G9YTMSZ2T/p1641064850309500
dictation_mode.talon
, add this at the top:
experiment: anchor-file
modes.talon
, add at the bottom:
^mixed mode$: mode.disable("sleep") mode.enable("dictation") mode.enable("command")
talon deck
Stream deck inspired interactive dashboard for Talon Voice
https://github.com/AndreasArvidsson/talon-deck
push-to-talk
key(ctrl-m:down): speech.enable() # app.notify("Talon Wake") key(ctrl-m:up): speech.disable() # app.notify("Talon Sleep")
repeat keypress
source: https://talonvoice.slack.com/archives/C7ENXA7C4/p1662565066417169
key(left left) key(left:2)
cheatsheets
generate own cheatsheat based on user profile
https://github.com/tararoys/talon-cheatsheet
Mouse Input Alternatives
Name (Costs) | Link | Hardware Requirements | Software Requirements | Operating System | Tracker Type |
---|---|---|---|---|---|
CameraMouse (FREE) | http://cameramouse.org | webcam | - | (W) | Head |
CVC Eye Tracker (fork of OpenGazer) (FREE) | https://github.com/tiendan/OpenGazer | webcam | - | (A) (L) | Eye |
Enable Viacam (FREE) | https://eviacam.crea-si.com | webcam | - | (L) (W) | Head |
EyeMine - OptiKey fork optimized to play Minecraft (FREE) | https://github.com/SpecialEffect/EyeMine | eye tracker (https://github.com/Optikey/Optikey/wiki/Supported-eye-trackers) | - | (W) | Eye |
FaceTrackNoIR ($$$) | http://www.facetracknoir.nl/home/default.htm | webcam / eye tracker | - | (W) | Eye or Head |
Head Mouse (DIY) | https://www.instructables.com/Head-Mouse-Game-controller-or-disability-aid/ | Arduino + | - | (A) (L) (W) | Head |
HeadMouse Nano ($$$) | https://www.orin.com/access/headmouse/ | - | - | (A) (W) | Head |
Head Tracking System (DIY) | https://www.youtube.com/watch?v=5Nimz4M-sxU | PS3 Eye Cam + | OpenTrack / Drivers for PS3 Eye Cam | (?) | Head |
KinesicMouse ($$$) | http://kinesicmouse.xcessity.at | iPhone or iPad | - | (W) | Head |
OptiKey (FREE) | http://www.optikey.org | eye tracker (https://github.com/Optikey/Optikey/wiki/Supported-eye-trackers) | - | (W) | Eye |
Physical Presenter Mouse ($$$) | https://www.amazon.co.uk/dp/B0B4JVTN4F/ | - | - | (A) (L) (W) | Head? |
Precision Gaze Mouse (FREE) | https://precisiongazemouse.org | webcam (and eye tracker) | - | (W) | Eye and Head |
Project Gameface (FREE) | https://github.com/google/project-gameface | webcam | - | (W) | Head and Face |
Project IRIS ($$$) | http://iris.xcessity.at | tobii EyeX, tobii 4C or tobii Eye Tracker 5 | Tobii EyeX Engine | (W) | Eye |
Quha Zono (2/X) ($$$) | https://www.quha.com | - | - | (A) (W) | Head (Gyroscopic) |
talon script - dense mouse grid | https://github.com/tararoys/dense-mouse-grid | microphone | - | (A) (L) (W) | - |
talon script - flex mouse grid | https://github.com/brollin/flex-mouse-grid | microphone | - | (A) (L) (W) | - |
talon script - hissing mouse | https://github.com/tararoys/hiss-mouse | microphone | - | (A) (L) (W) | - |
Tracky Mouse (FREE) | https://github.com/1j01/tracky-mouse | - | - | (A) (L) (W) | Eye |
warpd (FREE) | https://github.com/rvaiya/warpd | - | - | (A) (L) | - |
Windows - Ease of Access (FREE) | https://support.microsoft.com/en-gb/windows/get-started-with-eye-control-in-windows-1a170a20-1083-2452-8f42-17a7d4fe89a9#bkmk_usewin_win10 | Tobii Eye Tracker | Tobii Eye Tracking Core Software | (W) | Eye |
Operating System: A: Apple MacOS; L: Linux; W: Windows
Name (Costs) | Link | Software Requirements | Operating System |
---|---|---|---|
fluent search (FREE) | https://fluentsearch.net/ | - | (W) |
hunt-n-peck (FREE) | https://github.com/zsims/hunt-and-peck | - | (W) |
Homerow ($$$) | https://www.homerow.app | - | (A) |
invader-vim (FREE) | https://github.com/bluecamel/invader_vim | python | (L) |
kindaVim ($$$) | https://kindavim.app/ | - | (A) |
Shortcat (FREE) | https://shortcat.app | - | (A) |
Vimac (is now Homerow) (FREE) | https://vimacapp.com/ | - | (A) |
VimMotion (FREE) | https://github.com/dwarvesf/VimMotionApp | - | (A) |
VoiceComputer ($$$) | https://voicecomputer.com | dragon naturally speaking | (W) |
win-vind (FREE) | https://pit-ray.github.io/win-vind/ | - | (W) |
Operating System: A: Apple MacOS; L: Linux; W: Windows
help window too tall
lower imgui.scale
and user.help_max_command_lines_per_page
in settings.talon
inside knausj_talon folder
windows installation considerations
the cursor doesn't show on login by default
it only appears once you move the mouse - so eyetracking doesn't work until you move a mouse.
To fix this one has to create the registry key:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] "EnableCursorSuppression"=dword:00000000
eyetracking stops working after an elevation prompt
Lower UAC (User Account Control) one step to: "Notify me only when apps try to make changes to my computer (do not dim my desktop)"
disable sound enhancement
when this option is enabled the pop sound might get interpreted as 'bat', 'od' or 'Paul' or '£'
in the microphone properties (sound settings > recording > properties > advanced > signal enhancements > enable audio enhancements) uncheck the option enable audio enhancements
.talon
os: linux os: windows app.name: Meld
the same keys are OR'd by default, different keys are AND'd by default
hardware
microphone
- Audio Technica BP894
- Blue Yeti
- Jabra Evolve 40 UC Professional Wired Headset, Mono
- Jabra Evolve 75s
- Samson q9u
linux: function keys f13 - f24 (ERROR invalid hotkey f13)
there is also 'xkb' / 'xkbmap' which I did not look into
if the function keys are not available talon log will show the message
ERROR invalid hotkey f13
this can be fixed using xmodmap and creating / editing the file ~/.Xmodmap
keycode 191 = F13 F13 F13 keycode 192 = F14 F14 F14 keycode 193 = F15 F15 F15 keycode 194 = F16 F16 F16 keycode 195 = F17 F17 F17 keycode 196 = F18 F18 F18 keycode 197 = F19 F19 F19 keycode 198 = F20 F20 F20 keycode 199 = F21 F21 F21 keycode 200 = F22 F22 F22 keycode 201 = F23 F23 F23 keycode 202 = F24 F24 F24
to load the file run xmodmap ~/.Xmodmap
to make it available after a reboot
echo 'xmodmap ~/.Xmodmap' >> ~/.xinitrc
insert multiline text
^insert multiline text$: """ this is the first line and the second line line three ... """
RUST beta
stream deck support
stream deck software/services has to be stopped
example
# pressing buttons deck(button_1): deck(button_2): ... etc deck(pedal_left): deck(pedal_middle): deck(pedal_right): # for the Stream Deck plus: # pressing the dial like a button deck(dial_1): deck(dial_2): ... etc # rotating the dial deck(dial_1:change): print(value) # touch screen tap deck(touch): print("{x} {y}")
gamepad support
link to test gamepad: https://gamepad-tester.com/
example
gamepad(left_xy:repeat): x = x * 20 y = y * -60 mouse_scroll(y, x) gamepad(north): key(cmd-`) gamepad(south): key(cmd-tab) gamepad(r1:down): mouse_drag(0) gamepad(r1:up): mouse_release(0) gamepad(l1:down): mouse_drag(1) gamepad(l1:up): mouse_release(1) gamepad(right_xy:repeat): mx = mouse_x() my = mouse_y() x = x * 25 y = y * 25 mouse_move(mx + x, my - y)
axis
left_xy left_x left_y left_z right_xy right_x right_y right_z dpad_xy dpad_x dpad_y north south east west
buttons
c z l1 l2 l3 r1 r2 r3 select start mode dpad_up dpad_down dpad_left dpad_right
additional words vs. words to replace
dictation mode: use words to replace
don't use additional words for replacement, because it also boosts the word priority
additional words example
case: saying root
becomes route
additional_words.csv:
root,route route,rout
That tells Talon that I want the word root
pronounced like how it thinks route
sounds, and route
when saying rout
macos terminal specific
pf secure keyboard input is enabled, talon can't see hotkeys
terminal menu: checkbox "secure input"
macos zoom mouse / mouse grid
system preferences -> privacy -> screen recording, need to allow talon
UK vs. US
add replacements to knausj_talon/settings/words_to_replace.csv
sources
- https://gist.githubusercontent.com/heiswayi/12ca9081ae1f18f6438b/raw/4ca91f60a102265417783bbc013f73dc8841a3ac/spelling.csv
- https://wiki.ubuntu.com/EnglishTranslation/WordSubstitution
rango
inspect toggles
In the background script/service worker enter this in the console:
- Firefox:
await browser.storage.local.get("hintsToggle")
- Chrome:
await chrome.storage.local.get("hintsToggle")
enter background script/service worker
- In Firefox go to about:debugging#/runtime/this-firefox and click inspect
- In chrome chrome://extensions, enable developer mode and click on "service worker"
wait
there are insert_wait
(for text) and key_wait
(for chained commands) which can be configured in a .talon file under settings():
these might be used configured if keys/inputs get mixed up
dictate until keyword "over"
dictate [<phrase>]$: mode.enable("dictation") user.parse_phrase(phrase or "")
add to `file core/modes/dictation_mode.talon`
over [<phrase>]$: user.command_mode(phrase or "")
disable voice input when app is in focus
from talon import actions, ui def sleep_talon(app): if app.name in ["Slack", "Discord", "Teams"]: actions.speech.disable() ui.register('app_activate', sleep_talon)