今年早些时候,我的两只手肘都患上了 "枕骨隧道综合症",一种重复性劳损。因此,我几乎不能使用鼠标或键盘;几分钟后,我的手臂就会有灼痛感。即使我试图将我的电脑使用限制在60秒内,我也会在无意中使情况变得更糟。
正如你可能想象的那样,这是一个相当大的问题;作为一个软件开发人员,我的整个职业生涯都是建立在能够使用键盘的基础上的!"。
在多次尝试用物理治疗、人体工程学、支架、饮食和补充剂、处方药、补充剂、心身反省和其他一堆东西来解决这个问题的失败后,我已经找到了一个解决方案,使我能够在不冒进一步神经损伤的风险的情况下提高工作效率。我现在几乎只用一个麦克风和一个眼球追踪器来工作。
在这篇文章中,我将向你展示这个工作流程是什么样子的,以及我是如何优化它以满足我的需求的。
用Talon写代码
听写软件已经存在了很长时间,但它通常纯粹用于转录语音,通常用于法律和医疗行业。编写代码是一个不同的野兽,因为有很多语法和惯例以及非字典中的词汇。
幸运的是,有专门的软件存在!我目前使用的是Talon Voice,这是一个专门为帮助软件开发人员在不使用手的情况下工作而建立的工具。
Talon有一个免费的公共版本,但令人兴奋的东西发生在付费的私人测试版。
让我们深入了解这个软件是如何工作的。
字母表
作为一个新的Talon用户,你学习的第一件事是如何口述单个字母。
一般来说,你不会一次听写一个字母,但它偶尔也会派上用场,比如指定CSS单位(px,rem等)。
在语音方面,英语是一种令人讨厌的语言。我们的许多字母听起来都一样。电话接线员说 "M like Mary","T as in Thomas "是有原因的。
但这些词往往是多音节的,而且没有人有时间去做这些事。因此,Talon包括了它自己的单音节单词的音标映射(大部分)。
-
a- 空气 -
b- 蝙蝠 -
c- 帽 -
d- 鼓
当我对着麦克风说 "鼓 "时,字母d ,就像我在键盘上按下那个键一样。
你可以通过在字母前加 "ship "来大写字母。"ship drum "将输出D ,而不是d 。
数字是正常说话的,从0到9。如果我想输出1024 ,我会说 "一零二四"。
热键和序号
Talon对大多数特殊字符有直观的映射。command cap例如,按住command ,同时按下C ,复制到剪贴板。control command space ,在MacOS上会打开Emoji抽屉,因为那是操作系统级的映射。
某些键被映射为更短/更简单的术语。我说 "junk "而不是 "backspace"。"Delete "变成了 "dell"。如果你对任何一个映射不满意,顺便说一下,在Talon中一切都可以编辑。
箭头键的前缀是 "去"。如果我想把光标向左移动,我说go left 。
如果不是因为有一个很棒的补充,这将是非常乏味的:序数。
在英语中,序数是用于描述顺序的数字,如 "第五"、"第九 "或 "第三百"。在Talon中,它们被用来重复命令。如果我想向左走9个空格,我会说go left ninth 。
这个措辞有点奇怪。当然,"向左走9 "会更直观,对吗?但是nine 已经被占用了;它输出的是字面数字9 。
这对所有的命令都有效。如果我想写数字1000 ,我会说one zero third ,把0 这个字符重复3次。
格式化程序
编写JavaScript的传统方法是对变量使用camelCase。事实上,当涉及到变量名时,有很多约定俗成的做法!但是,我们可以通过Talon来解决这个问题。Talon对此有一个解决方案:格式化器。
格式化器是一个命令,它将转换之后说出的文本。例如,当我说 "camel hello world "时,软件会输出helloWorld 。反之,"snake hello world "会产生hello_world 。
如果你想输出不经过转换的文本,命令是say 。"say hello world "将输出hello world 。
格式化程序可以被组成。例如,我喜欢用UPPER_SNAKE来表示JavaScript常量。
const DARK_COLORS = {
primary: 'hsl(230deg, 100%, 50%)',
// ...and so on
};
为了输出DARK_COLORS ,我可以把snake 和allcaps 格式化组合起来。"allcaps snake dark colors" 输出DARK_COLORS 。
命令模式
虽然Talon确实有一个 "听写模式",但默认模式是基于命令的。命令可以被认为是函数。到目前为止,我们所看到的一切都是基于命令的。
例如,当我说focus chrome ,这就像我在调用focus 函数,并传递chrome 作为参数。focus 是一个命令,可以聚焦指定的应用程序,所以这相当于使用 Spotlight 选择 Chrome。
focus 但这并不是Talon中内置的一些黑盒式的本地东西;它是一个社区命令包的一部分。我可以访问和编辑源代码,它是用Python写的。
class Actions:
def switcher_focus(name: str):
"""Focus a new application by name"""
for app in ui.apps():
if name in app.name and not app.background:
app.focus()
break
Talon的真正力量在于能够创建你自己的命令。它提供了大量的API,用于与操作系统交互和输出字符。我已经为前端开发创建了十几个方便的实用程序,而且我希望随着我不断地使用它,我还会增加更多的实用程序。
你可以使用类似YAML的语法添加简单的 "说X来产生Y "的命令。
react: insert("import React from 'react';")
当我说 "react "时,软件会输出import React from 'react'; 。
对于更复杂的命令,你可以写Python函数。举个例子,当我说 "styled button fancy button "时会发生什么。
const FancyButton = styled.button`
| <-- Cursor placed here
`;
第二个词,button ,会与一组已知的HTML元素相匹配。后面的词,fancy button ,被UpperCamelCased并用于组件名称。它添加了一些空白,并将光标移到适当的位置。
这里是该命令的Python源代码。
@ctx.capture(rule='styled <user.html_elements> <user.text>')
def create_styled_component(m):
component_name = actions.user.formatted_text(
m.text,
'PUBLIC_CAMEL_CASE'
)
return f'const {component_name} = styled.{m.html_elements}``'
这里是Talon的映射。
你也可以看看[我的]命令[分叉],其中包括我添加的所有React的东西--但请注意,它是混乱的、不完整的,而且记录得很差。
同音字
无论语音识别技术有多好,总是会有一些难以解决的歧义。
例如,如果我说 "查看我的网站",我是指site 还是sight ?或者可能是cite ?
为了解决这些模糊不清的问题,Talon包括一个phones 命令。
菜单UI!
为了选择正确的同音字,Talon会弹出一个小菜单。因为Talon中的所有东西都是通过API提供的,我想我们可以用同样的UI来做其他事情
我很高兴能对这个想法进行更多的实验。
作为鼠标替代品的眼球追踪
到目前为止,我的设置中最科幻的部分是我的眼球追踪器。
我使用[tobii 5]。它是一个带有红外线传感器的条状物,可以追踪你的眼睛运动。它贴在你的显示器前面。
有趣的是,它并不是作为鼠标的替代品销售的;它是为Windows用户设计的,用于某种竞技游戏。但是Talon--我用来听写的同一个软件--包括定制的MacOS驱动程序,使它可以作为鼠标的替代品。
点击是一个两步过程。首先,你看着你想点击的地方,然后用嘴发出啪啪的声音。这将会放大,并使你能够真正精确地进行点击。第二次弹出的声音将执行左键点击。
还有双击、右击、拖动和释放等命令。这需要一些时间来适应,但它的效果出乎意料地好。它的精确度足以做一些相当精确的事情。
tobii 5的售价为229美元。你也可以尝试找到tobii 4C,据说它能提供更流畅的Talon体验,但它们真的很罕见。
更大的画面
到目前为止,我所分享的只是我所学到的冰山一角,而我所学到的只是更大的冰山一角,Talon是一个非常强大的工具,而我仍在摸索。我花了好几年时间才熟练掌握了键盘,所以我的听写之旅还很早。
事实上,我想说的是,这整个山寨行业是相当新的。Talon是一项美妙的技术,它已经对我的生活产生了巨大的积极影响,但我认为未来还有很多潜力和机会。
Talon每天都在继续改进--它使用专有的机器学习算法来处理语音识别,我已经看到它有了明显的改进。其他产品如[Serenade]似乎也很引人注目。
同时,像[Neuralink]这样的公司正在努力在我们的大脑和日常技术之间建立一种 "直接联系"。这听起来像科幻小说,但我可能很快就能 "思考 "我的代码的存在✨😮✨
到目前为止我的成果
我说我的工作速度可能是我正常速度的50%左右*。现在,这并不意味着我产生了50%的结果;这只是意味着我需要更无情地确定优先次序。
我听说学习Vim可以使之更有效。取决于我的伤势还能持续多久,我可能会考虑换人。
到目前为止,我发现最大的问题是嗓子劳累;我不习惯每天说话8个多小时!我想我需要建立一个耐受性。我想我需要建立一种耐受性,我希望随着时间的推移在这方面能做得更好。
最初的几周很艰难。除了速度慢和令人沮丧之外,当你自己编写命令时,Talon的工作效果最好。我试图把它设置好,结果却弄伤了自己。能够通过语音配置Talon是一个真正的里程碑,从那时起,它变得更加顺利了。
说实话,发现我的工作不需要我的手,这真是一种解脱。最近,我听到Kent C Dodds和Joel Hooks在[蛋头播客中]谈论Kent如何警惕自己的手受伤,因为作为一个软件开发者和教育者,手是他的赚钱工具*。我以前也有同样的感觉,而现在我看到,只要有一点决心和很多了不起的技术,就没有什么能阻挡我的脚步💖。
可访问性很重要
还有一件事我想谈一谈,它有点不那么有趣。
事情是这样的:你不可能患上 "桡骨隧道综合症"。即使你患上了,它也可能在几周后自行消失;许多病例会自动解决,而且大多数对保守治疗反应良好。我是一个边缘案例。
然而,在你生命中的某个时刻,你可能会经历某种损伤,无论是暂时的还是永久的。几乎我们所有人都会*。
我们很容易落入将无障碍环境视为影响其他人的东西的陷阱,一个假设的抽象群体。我知道无障碍性很重要已经很多年了,但对我来说感觉有点模糊;我从来没有看到有人因为我忽略了在没有鼠标或键盘的情况下进行测试而努力使用我做的东西。现在对我来说,这感觉更加紧迫。
我仍然有令人难以置信的特权,我无意将我的情况与其他人的情况进行比较。但这一经历给了我一个窗口,让我了解在一个没有考虑到其他输入机制的互联网上操作是什么样子。在我适应眼动仪之前,事情是很棘手的。而某些事情比过去要困难得多。
互联网已经成为关键的基础设施。它是生活在现代社会中的一个必要部分,而且它需要能够被访问作为前端开发者,我们的工作是倡导它,并确保我们在构建时考虑到无障碍原则。
没有比现在更好的时机了
我从这次经历中还学到了一件事。我应该优先考虑那些对我来说很重要的东西!
我最早建立的网络应用之一是一个教育平台。这是十年前的事了,它是用PHP、MySQL和jQuery构建的。
当我发现[可汗学院]时,我放弃了那个产品,它基本上是我正在做的,但比它好得多。后来我在可汗学院担任软件工程师,做了我职业生涯中最有成就感的一些工作。
我早就想象过,在某个时候,我会在教育领域开始自己的事业。尽管多年来我一直有做这件事的动机,但我一直把它推迟。这个经历让我学到了一些宝贵的东西。我没有无限的时间在我面前。如果有我想做的事情,我应该现在就去做,因为我以后可能就做不到了。
几周前,我离开了Gatsby公司的高级软件工程师的工作,去追求这个梦想。我的第一个项目是一个在线互动课程,向JS开发人员传授高级CSS技能。我已经看到了围绕着CSS的许多挫折,目标是让你有坚如磐石的信心,有能力实现任何布局,并建立各种很酷、更高级的体验。