2014-09-08 4 views
4

Есть ли у кого-нибудь идеи о том, как использовать встроенный инструмент диктовки Mac для создания строк, которые будут использоваться Python?Использование диктовки Mac внутри Python

Чтобы запустить диктовку, вы должны дважды нажать клавишу Fn внутри любого текстового редактора. Если это так, есть ли способ комбинировать команду нажатия клавиш с командой ввода? Что-то наподобие:

Шаг 1: Имитировать нажатие клавиши двойного нажатия клавиши Fn, запуск инструмента диктовки, а затем Шаг 2. Создание переменной с использованием содержимого речи в текст как часть функции ввода , т. е. text_string = input («Начать диктовку»)

В этой теме (Can I use OS X 10.8's speech recognition/dictation without a GUI?) пользователь предлагает, чтобы он вычислил ее с помощью CGEventCreateKeyboardEvent (src, 0x3F, true), но кода нет.

Любые идеи? Образцы кода были бы оценены.

UPDATE: Благодаря приведенным ниже предложениям, я импортировал 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) 

Любые идеи о том, как я могу включить инструмент диктовки для ввода для строки?

UPDATE 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". 

Im пытается передать команды в программе никогда не печатая на клавиатуре.

+0

[Этот вопрос] (http://stackoverflow.com/questions/21396985/how-to-use-cgeventcreatekeyboardevent-in-python-on-mac) может быть полезен для изучения того, как использовать 'CGEventCreateKeyboardEvent'. Также, COYG! – dano

+0

Связанный вопрос спрашивает, как использовать iOS API из OS X, поэтому я не уверен, насколько он полезен. Посмотрите API OS X (который не будет запускаться с 'UI' и, что более важно, который будет частью библиотеки разработчиков Mac, а не библиотеки разработчиков iOS), а затем вы можете посмотреть, можете ли вы использовать их через , например, PyObjC или AppleEvents. – abarnert

+0

Кроме того, я точно не помню, но я думаю, что Quartz.CGEventCreateKeyboardEvent' может быть одной из функций, которые были нарушены PyObjC 2.5, а поскольку Apple включает в себя 2.5.1 с предустановленным Python 2.7 от 10.7 до 10.10 , вы можете получить ошибки, которые не имеют смысла. Попробуйте и посмотрите; если вы это сделаете, перейдите на PyObjC 3.0 или новее. – abarnert

ответ

3

Во-первых, диктант FnFn является функцией NSText (или, может быть, NSTextView?) Какао-контроль. Если у вас есть один из них, продиктованный текст вставляется в этот элемент управления. (Он также использует существующий текст этого элемента для контекста.) С точки зрения приложения с использованием NSTextView, если вы просто создаете стандартное меню «Правка», элемент «Начало диктовки» добавляется в конец, а FnFn - как ярлык, и все, что продиктовано, появляется как входной сигнал, так же как ввод, введенный на клавиатуре, или вставляемый или перемещаемый с помощью мыши, или с помощью любого другого метода ввода.

Итак, если у вас нет приложения с графическим интерфейсом, включение диктовки будет бессмысленным, потому что у вас нет способа получить вход.

Если у вас есть приложение с графическим интерфейсом, простейшая вещь - просто получить пункт меню через NSMenu и нажать на элемент.

Вы почти наверняка используете какую-то графическую библиотеку, такую ​​как PyQt или Tkinter, которая имеет свой собственный способ доступа к меню вашего приложения. Но если нет, то вы можете сделать это прямо через какао (используя 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), приложение, в котором вы работаете, имеет свой собственный текстовый виджет и меню Edit, и вы можете паразитно вместо этого используйте его меню.

Проблема в том, что у вас нет разрешения просто управлять другими приложениями, если пользователь не разрешает это делать.В более ранних версиях 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 

«Право» способ сделать эквивалент в Питоне через 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, который (хотя это API-интерфейс CoreFoundation C, а не API-интерфейс Cocoa ObjC) также обернут PyObjC. Документация может быть немного сложной для понимания, но в основном идея состоит в том, что вы создаете событие соответствующего типа, а затем отправляете его в конкретное приложение, ответ на событие или местоположение крана. Таким образом, вы можете создать и отправить общесистемного ключ вниз Fn-ключевое событие, как это:

evt = Quartz.CGEventCreateKeyboardEvent(None, 63, True) 
Quartz.CGEventPost(Quartz.kCGSessionEventTap, evt) 

Чтобы отправить ключ вверх событие, просто изменить что True к False.

+0

Это очень полезно, спасибо! Но я еще не там. Этот код не работает, но вам должно быть ясно, чего я пытаюсь достичь: из приложения appcript import app, его se = app ('Системные события') proc = app.processes [its.frontmost == Истинный] ми = proc.menu_bars [1] .menu_bar_items [ 'Edit']. меню [1] .menu_items [ 'Start диктовка'] user_voice_text = вход (mi.click()) печати (user_voice_text) Как я делаю этот код работать? – RollingStone1234

+0

@ RollingStone1234: Я понятия не имею, что вы пытаетесь сделать. До последних двух строк это всего лишь мой пример кода. Затем вы вызываете 'input (mi.click())', который будет печатать все, что было возвращено 'mi.click()' (которое, я думаю, будет либо 'None', либо' aem' object) в качестве приглашения, дождитесь пользователь вводит строку текста на консоли и возвращает этот текст. Так ... почему? Что вы пытаетесь выполнить, передав 'mi.click()' to 'input()'? – abarnert

+0

Да, я пытаюсь создать переменную, называемую user_voice_text, которая определяется выходом инструмента диктовки ...Например: в идеале я хочу запустить программу, а затем спросить меня: что такое 1 + 1? Затем я хочу, чтобы программа включила инструмент диктовки, и я хочу ответить «два». Затем функция dictation-to-text передает строковое значение = «two» в мою программу, а затем оператор if используется для выражения «правильного» или «неправильного». Я пытаюсь передать команды программе, даже не набрав на клавиатуре. Имеют смысл? Спасибо @abarnert – RollingStone1234

Смежные вопросы