1 votos

AppleScript: ¿Es posible comprobar si el Discurso está ejecutando en la actualidad?

Quiero recrear exactamente macOS del Texto incorporado Al Discurso de método abreviado de teclado cuentan con AppleScript. Cuando digo "exactamente", quiero decir "exactamente".

El construido-en opción se puede encontrar en las Preferencias del Sistema → Dictado Y Habla → Texto a Voz:

screen shot

Aquí está la descripción de esta función:

Configurar una combinación de teclas para hablar de texto seleccionado.

El uso de esta combinación de teclas para escuchar su equipo hablan de texto seleccionado. Si el ordenador está hablando, presione las teclas para detener.

La razón por la que quiero volver a esta función (en lugar de simplemente utilizando) es porque está libre de errores; a veces funciona, pero otras veces, presione el método abreviado de teclado y no pasa nada. Si I código manualmente en AppleScript, tengo la esperanza de que el proceso será más fiable.


Entiendo cómo iniciar y detener el Discurso en AppleScript, como se explica aquí.

Pero me gustaría usar el mismo método abreviado de teclado, y por lo tanto el mismo .scpt archivo, tanto para iniciar y detener el Discurso, reflejo de la funcionalidad de la incorporada en el Discurso de método abreviado de teclado.

Estoy usando FastScripts para ejecutar el .scpt archivo por un atajo de teclado.

Si de la misma .scpt archivo es el encargado de parada y de arranque de la Voz, la secuencia de comandos requiere de una declaración de si en la parte superior de la AppleScript, o algo similar, para comprobar inmediatamente si el Discurso es que actualmente se habla o no se habla, antes de que el script pueda continuar. No sé cómo implementar esta comprobación, o si es que es posible.

Pero, he aquí 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, tenía el deseo de la AppleScript para hablar the clipboard, pero luego me di cuenta de que era sobrescribir el original el contenido del portapapeles. Así que, de hecho, quiero que el AppleScript para hablar el contenido de la theSelectedText variable, como se muestra en el código anterior.)

3voto

Baczek Puntos 150

Es posible que con el say comando en un shell, con el AppleScript say comando.

Info para el AppleScript decir comando:

  • usted puede detener el discurso de decir el comando de la misma secuencia hasta que el ejecución de secuencias de comandos, no después de que la secuencia de comandos de salida.
  • Ejemplo:
say "I want to recreate macOS's built-in Text To Speech" waiting until completion no
delay 0.5
say "" with stopping current speech -- this stop the first say command of this script
delay 1
say "Hello"

Esta secuencia de comandos uso de la say comando en un shell para hablar el contenido de la pbpaste comando (el portapapeles), y poner el PID de la say comando a una persistente de la propiedad:

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property this_say_Pid : missing value -- the persistent property

if this_say_Pid is not missing value then -- check the pid of all 'say' commands, if exists then quit the unix process
    set allSayPid to {}
    try
        set allSayPid to words of (do shell script "pgrep -x 'say'")
    end try
    if this_say_Pid is in allSayPid then -- the PID = an item in the list
        do shell script "/bin/kill " & this_say_Pid -- quit this process to stop the speech
        error number -128 -- quits the AppleScript
    end if
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.

-- Speak the clipboard:
--  pbpaste = the contents of the clipboard , this run the commands without waiting, and get the PID of the 'say' command 
set this_say_Pid to do shell script "LANG=en_US.UTF-8 pbpaste -Prefer txt | say > /dev/null 2>&1 & echo $!"

-- Restore original clipboard:
my putOnClipboard:savedClipboard

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:

Es posible que el primer script no funcionará, si el valor de this_say_Pid variable no persisten en todo corre, todo depende de cómo el guión será lanzado. En ese caso, usted debe escribir el PID a un archivo, a fin de utilizar esta secuencia de comandos:

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

set tFile to POSIX path of (path to temporary items as text) & "_the_Pid_of_say_command_of_this_script.txt" -- the temp file
set this_say_Pid to missing value
try
    set this_say_Pid to paragraph 1 of (read tFile) -- get the pid of the last speech
end try

if this_say_Pid is not in {"", missing value} then -- check the pid of all 'say' commands, if exists then quit the unix process
    set allSayPid to {}
    try
        set allSayPid to words of (do shell script "pgrep -x 'say'")
    end try
    if this_say_Pid is in allSayPid then -- the PID = an item in the list
        do shell script "/bin/kill " & this_say_Pid -- quit this process to stop the speech
        error number -128 -- quits the AppleScript
    end if
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.

-- Speak the clipboard:

--  pbpaste = the contents of the clipboard , this run the commands without waiting, and it write the PID of the 'say' command to the temp file
do shell script "LANG=en_US.UTF-8 pbpaste -Prefer txt | say > /dev/null 2>&1 & echo $! > " & quoted form of tFile

-- Restore original clipboard:
my putOnClipboard:savedClipboard

-- *** Important *** : This script is not complete,  you must add the 'putOnClipboard:' handler and the 'fetchStorableClipboard()' handler to this script.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X