Voglio ricreare esattamente la funzione di scorciatoia da tastiera di sintesi vocale di MacOS con AppleScript. Quando dico "esattamente", intendo "esattamente".
L'opzione built-in può essere trovata in Preferenze di Sistema → Dettatura e amp; Voce → Sintesi vocale:
Eccoladescrizionediquestafunzione:
Setakeycombinationtospeakselectedtext.
Usethiskeycombinationtohearyourcomputerspeakselectedtext.Ifthecomputerisspeaking,pressthekeystostop.
Laragionepercuivoglioricrearequestafunzione(invecediusarlasemplicemente)èperchéèbacata;avoltefunziona,ma,altrevolte,premolascorciatoiadatastieraenonsuccedenulla.SelocodificomanualmenteinAppleScript,sperocheilprocessosiapiùaffidabile.
CapiscocomeavviareeinterrompereSpeechinAppleScript,
Ma mi piacerebbe usare la stessa scorciatoia da tastiera, e quindi lo stesso file .scpt, per avviare e fermare il parlato, rispecchiando la funzionalità della scorciatoia da tastiera vocale incorporata.
Sto usando FastScripts per eseguire il file .scpt con una scorciatoia da tastiera.
Se lo stesso file .scpt è responsabile sia dell'avvio che dell'arresto del parlato, lo script richiede un'istruzione if nella parte superiore di AppleScript, o qualcosa di simile, per controllare immediatamente se il parlato è attualmente in corso o meno, prima lo script può procedere. Non so come implementare questo controllo, o se è addirittura possibile.
Ma ecco cosa ho:
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:
(Originariamente, volevo che l'AppleScript parlasse the clipboard
, ma poi mi sono reso conto che questo stava sovrascrivendo il contenuto degli appunti originali. Quindi, in realtà, voglio che l'AppleScript parli il contenuto della variabile theSelectedText
, come dimostrato nel codice precedente.)