在Python内部使用Mac的听写

时间:2014-09-08 03:50:42

标签: python macos dictation

有没有人对如何使用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".

我试图将命令传递给程序而不必在键盘上输入。

1 个答案:

答案 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