Quiero recrear exactamente la función de método abreviado de teclado Texto a voz incorporado de macOS con AppleScript. Cuando digo "exactamente", quiero decir "exactamente".
La opción incorporada se puede encontrar en Preferencias del sistema → Dictado & Speech → Text to Speech:
Aquíestáladescripcióndeestafunción:
Establezcaunacombinacióndeteclasparahablareltextoseleccionado.
Useestacombinacióndeteclasparaescucharasucomputadorahablareltextoseleccionado.Silacomputadoraestáhablando,presionelasteclasparaparar.
Larazónporlaquequierovolveracrearestacaracterística(enlugardesimplementeusarla)esporquetieneerrores;Avecesfunciona,perootrasvecespresionoelatajodetecladoynopasanada.SilocodificomanualmenteenAppleScript,esperoqueelprocesoseamásconfiable.
ComprendocómoiniciarydetenerSpeechenAppleScript,
Pero me gustaría usar el mismo método abreviado de teclado y, por lo tanto, el mismo archivo .scpt, tanto para iniciar como para detener el habla, lo que refleja la funcionalidad del método abreviado de teclado de voz integrado.
Estoy utilizando FastScripts para ejecutar el archivo .scpt con un método abreviado de teclado.
Si el mismo archivo .scpt se encarga de iniciar y detener el habla, la secuencia de comandos requiere una instrucción if en la parte superior del AppleScript, o algo similar, para verificar de inmediato si se está hablando o no la voz, antes el guión puede proceder. No sé cómo implementar esta comprobación, o si es posible.
Pero, esto es lo que tengo:
if <This is where I need your help, Ask Different> then
say "" with stopping current speech
error number -128 -- quits the AppleScript
end if
-- Back up original clipboard contents:
set savedClipboard to my fetchStorableClipboard()
-- Copy selected text to clipboard:
tell application "System Events" to keystroke "c" using {command down}
delay 1 -- Without this, the clipboard may have stale data.
set theSelectedText to the clipboard
-- Restore original clipboard:
my putOnClipboard:savedClipboard
-- Speak the selected text:
say theSelectedText waiting until completion no
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
on fetchStorableClipboard()
set aMutableArray to current application's NSMutableArray's array() -- used to store contents
-- get the pasteboard and then its pasteboard items
set thePasteboard to current application's NSPasteboard's generalPasteboard()
-- loop through pasteboard items
repeat with anItem in thePasteboard's pasteboardItems()
-- make a new pasteboard item to store existing item's stuff
set newPBItem to current application's NSPasteboardItem's alloc()'s init()
-- get the types of data stored on the pasteboard item
set theTypes to anItem's types()
-- for each type, get the corresponding data and store it all in the new pasteboard item
repeat with aType in theTypes
set theData to (anItem's dataForType:aType)'s mutableCopy()
if theData is not missing value then
(newPBItem's setData:theData forType:aType)
end if
end repeat
-- add new pasteboard item to array
(aMutableArray's addObject:newPBItem)
end repeat
return aMutableArray
end fetchStorableClipboard
on putOnClipboard:theArray
-- get pasteboard
set thePasteboard to current application's NSPasteboard's generalPasteboard()
-- clear it, then write new contents
thePasteboard's clearContents()
thePasteboard's writeObjects:theArray
end putOnClipboard:
(Originalmente, quería que AppleScript hablara the clipboard
, pero luego me di cuenta de que esto estaba sobrescribiendo el contenido original del portapapeles. Entonces, en realidad quiero que AppleScript exprese el contenido de la variable theSelectedText
, como se demuestra en el código anterior.)