5

有人对如何使用 Mac 的内置听写工具创建 Python 使用的字符串有任何想法吗?

要启动听写,您必须在任何文本编辑器中双击 Fn 键。如果是这种情况,有没有办法将击键命令与输入命令结合起来?就像是:

第 1 步:模拟击键双击 Fn 键,启动听写工具,然后第 2 步。使用语音转文本内容作为输入函数的一部分创建变量,即 text_string = input(“Start听写:“)

在这个线程中(我可以在没有 GUI 的情况下使用 OS X 10.8 的语音识别/听写吗?),一位用户建议他使用 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".

我试图将命令传递给程序,而无需在键盘上打字。

4

1 回答 1

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 中执行等效操作的“正确”方法是 via 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)

要发送按键事件,只需将其更改TrueFalse.

于 2014-09-08T06:02:59.033 回答