有没有人对如何使用Mac的内置听写工具创建Python使用的字符串有任何想法?
要启动听写,您必须在任何文本编辑器中双击Fn键。如果是这种情况,有没有办法将keystroke命令与输入命令结合起来?类似的东西:
步骤1:模拟按键以双击Fn键,启动听写工具,然后 步骤2.使用语音到文本内容作为输入函数的一部分创建变量,即text_string = input(“Start dictation:”)
在这个帖子(Can I use OS X 10.8's speech recognition/dictation without a GUI?)中,用户建议他用CGEventCreateKeyboardEvent(src,0x3F,true)来计算它,但是没有代码。
有什么想法吗?代码样本将不胜感激。
更新:感谢下面的建议,我已经导入了AppScript。我尝试使用这些代码,但没有成功:
from appscript import app, its
se = app('System Events')
proc = app.processes[its.frontmost == True]
mi = proc.menu_bars[1].menu_bar_items['Edit'].menus[1].menu_items['Start Dictation']
user_voice_text = input(mi.click())
print(user_voice_text)
关于如何打开字母输入的听写工具的任何想法?
更新2:
以下是我尝试创建的程序的一个简单示例:
Ideally i want to launch the program, and then have it ask me: "what is 1 + 1?"
Then I want the program to turn on the dictation tool, and I want the program to record my voice, with me answering "two".
The dictation-to-text function will then pass the string value = "two" to my program, and an if statement is then used to say back "correct" or "incorrect".
我试图将命令传递给程序而不必在键盘上输入。
答案 0 :(得分:3)
首先,FnFn听写是NSText
(或可能是NSTextView
?)Cocoa控件的一个特性。如果你有其中一个,那么口述的文本会被插入到该控件中。 (它还使用该控件的现有文本作为上下文。)从使用NSTextView
的应用程序的角度来看,如果您只是创建标准的“编辑”菜单,则“开始听写”项目会添加到结尾,使用FnFn作为快捷方式,任何得到指示的内容都会显示为输入,就像在键盘上输入的内容,或者使用鼠标粘贴或拖动,或通过任何其他输入法一样。
因此,如果您没有GUI应用程序,启用听写将毫无意义,因为您无法获得输入。
如果您有GUI应用程序,最简单的方法是通过NSMenu
获取菜单项,然后单击该项。
您几乎肯定会使用某种GUI库,例如PyQt或Tkinter,它们有自己的方式来访问您的应用程序菜单。但如果没有,你可以通过Cocoa直接进行(使用PyObjC - 它附带Apple预装的Python,但如果您使用的话,那么您必须pip install
第三方Python):
import AppKit
mb = AppKit.NSApp.mainMenu()
edit = mb.itemWithTitle_('Edit').submenu()
sd = edit.indexOfItemWithTitle_('Start Dictation')
edit.performActionForItemAtIndex_(sd)
但如果你正在编写一个在终端中运行的控制台程序(无论是Terminal.app还是像iTerm这样的替代程序),你运行的应用程序都有自己的文本小部件和编辑菜单,并且你可以寄生地使用它的菜单。
问题在于,除非用户允许,否则您无权控制其他应用。在旧版本的OS X中,只需启用"辅助脚本来实现可访问性"全球。从10.10开始,安全和保护的隐私标签中有一个辅助功能主播。 “系统偏好设置”的隐私窗格,其中包含具有权限的应用列表。幸运的是,如果您不在列表中,当您第一次尝试使用辅助功能时,它会弹出一个对话框,如果用户点击它,它就会启动系统偏好设置,显示该锚点,在禁用该复选框的情况下将您的应用添加到列表中,并将其滚动到视图中,因此用户只需单击该复选框即可。
执行此操作的AppleScript是:
tell application "System Events"
click (menu item "Start Dictation" of menu of menu bar item "Edit"
of menu bar of (first process whose frontmost is true))
end tell
"对"在Python中执行等效操作的方法是通过ScriptingBridge
,您可以通过PyObjC访问...但是使用第三方库appscript
要容易得多:
from appscript import app, its
se = app('System Events')
proc = app.processes[its.frontmost == True]
mi = proc.menu_bars[1].menu_bar_items['Edit'].menus[1].menu_items['Start Dictation']
mi.click()
如果你真的想要两次发送Fn键,那么用于生成和发送键盘事件的API是Quartz Events Services的一部分,即使它是CoreFoundation C API,而不是Cocoa ObjC API。也被PyObjC包裹。文档可能有点难以理解,但基本上,您的想法是创建适当类型的事件,然后将其发布到特定应用程序,事件点击或点击位置。因此,您可以创建并发送系统范围的按键Fn键事件,如下所示:
evt = Quartz.CGEventCreateKeyboardEvent(None, 63, True)
Quartz.CGEventPost(Quartz.kCGSessionEventTap, evt)
要发送加密事件,只需将True
更改为False
。