0 votos

Cómo detener el discurso en la acción de Automator

Puedo hacer un Applescript dentro de automator para que lea el texto a velocidad N:

on run {input, parameters}
  repeat with thisText in input
      say thisText speaking rate 400
  end repeat
end run

Sin embargo, ¿hay alguna forma de detener el discurso en un momento dado? Existe la opción de hacer clic en la rueda dentada de la barra de menús superior, pero estaba buscando una forma de atajo.

1voto

Talos Potential Puntos 45

Tengo algunas soluciones diferentes:

  • Este applescript mata inmediatamente todo el discurso que se está ejecutando en su ordenador:
do shell script "killall com.apple.speech.speechsynthesisd"
  • Alternativamente, usted podría tener un único script que comprueba si el discurso se está ejecutando y matará a ese discurso en particular, (básicamente simula el atajo de alt-esc, PERO usted puede agregar la función de tasa a la script). Encontré un script en línea hace un tiempo que hace esto. Aquí está el enlace . También hice mi propia versión que cambia la tasa (al final del post). El control de la tasa está donde dice [[tasa 800]]. Este script copia el texto al portapapeles y añade '[[rate 800]]' que las voces de apple tts interpretan como una orden para cambiar a esa tasa. El portapapeles se lee a la velocidad modificada. Se puede ajustar hasta como 1000 o algo así.

  • Sin embargo, si realmente quieres hacer que la tasa de conversión de texto a voz por defecto de tu mac sea más rápida (que es para lo que sospecho que estás usando este script), te recomiendo encarecidamente que cambies la tasa por defecto usando un pequeño truco que se me ocurrió hace un tiempo (te permite ir hasta 720 WPM). Tengo un video que lo describe todo. Básicamente, cambia la tasa por defecto usando un script.

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 0.1

tell application "System Events"

  set varClip to "[[rate 800]]" & (the clipboard)
  delay 0.1
  set the clipboard to varClip

end tell

delay 0.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:

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