Tengo un archivo .scpt de AppleScript que habla el texto seleccionado en System Voice. El texto seleccionado se copia en el portapapeles y luego se pronuncia mediante el say
comando. El script se activa con una pulsación de tecla a través de FastScripts.
Como el volumen de Text-to-Speech de macOS es demasiado alto de forma predeterminada (y no hay un control de volumen global para Speech), utilizo AppleScript para configurar el volumen como una fracción del volumen actual. Aprendí cómo lograr esto de esta publicación:
¿Cómo cambiar el volumen de "decir" en AppleScript?
Aquí está la parte de mi código que es relevante para mi pregunta:
set the clipboard to ("[[volm 0.35]] " & (the clipboard))
set this_say_Pid to do shell script "LANG=en_US.UTF-8 pbpaste -Prefer txt | say > /dev/null 2>&1 & echo $!"
El código anterior habla el texto del portapapeles a un volumen que es el 35% del volumen actual del sistema, que es lo que deseo. (Sí, el discurso audible es realmente así de alto de forma predeterminada).
El código funciona bien, excepto que descubrí un error.
Para observar este error, copie el siguiente texto en el portapapeles y luego ejecute el código anterior:
- This is a test.
El texto del problema es difícil de formatear en Markdown (que es lo que usa Stack Exchange) porque 1) las nuevas líneas en blanco se eliminan automáticamente y 2) una combinación de guión y espacio se convierte en una viñeta de lista. Esta es la razón por la cual el formato de texto anterior se ve torcido; Tuve que usar una cita en bloque para sortear el problema uno, y tuve que agregar un bloque de código para sortear el problema dos.
Aquí está el texto del problema, literalmente escrito con palabras (si desea abrir un archivo de texto y recrear el texto):
newline
hyphen space Text
Asegúrese de incluir la nueva línea en blanco cuando copie el texto en el portapapeles. Asegúrese de que haya un espacio entre el guión y la primera palabra del texto. De lo contrario, el error no aparecerá.
El texto del problema debe ser el comienzo del texto del portapapeles. Es decir, si el texto del problema está en el medio o al final del texto del portapapeles, el error no aparecerá.
El guión (-) se puede sustituir por un guión corto (–) ( + ⌥ option) -o un guión largo (—) ( ⌥ option++ ), y el error seguirá apareciendo. Por lo que he encontrado en mis pruebas, no hay otros símbolos de puntuación que puedan sustituir al guión que activará el error.⇧ shift-
Hay otra forma de activar el error, que no implica un guión o una raya. Si el texto está precedido por al menos 2 caracteres de nueva línea, el error aparecerá.
Por ejemplo:
Si hay 1 carácter de nueva línea, el error no aparecerá.
Si hay 47 caracteres de nueva línea sobre el texto, el error aparecerá.
No importa si hay espacios entre los 2 o más caracteres de nueva línea y el texto; el error sale a la superficie de cualquier manera.
Al ejecutar el código AppleScript con el texto del problema en el portapapeles, el volumen no disminuye ni un bit; el portapapeles se hablará al nivel de volumen del sistema.
Además, hay un retraso notable antes de que se pronuncie el texto.
Para ser claros, aunque el contexto de mi pregunta es un archivo .scpt, técnicamente no es un error de AppleScript. El error existe cuando se usa say
directamente en Terminal.app. Por ejemplo, escriba lo siguiente en Terminal para reproducir el error:
say "[[volm 0.35]]
- This is a test."
¿Es posible remediar este error, de modo que, cuando el contenido del portapapeles comience con cualquier tipo de texto problemático, mi secuencia de comandos siga siendo sensible al volumen personalizado y no se introduzca un retraso?
Lo mejor es poner '[[volm 0.35]] ' en el shell (no en el portapapeles), así:
set this_say_Pid to do shell script "say '[[volm 0.35]]\\ '$(LANG=en_US.UTF-8 pbpaste -Prefer txt) > /dev/null 2>&1 & echo $!"
O, si quiere poner " [[volm 0.35]] " en el portapapeles, use comillas simples, así:
set the clipboard to ("'[[volm 0.35]] '" & (the clipboard))
set this_say_Pid to do shell script "LANG=en_US.UTF-8 pbpaste -Prefer txt | say > /dev/null 2>&1 & echo $!"
-Speak this sentence.
They've been here and they've been here and they've been here.
Notará que el primero They've
se pronuncia como "they vee". Pero, esto no es gran cosa; su primera solución no tiene este error, así que simplemente usaré la primera solución.Simplemente agregue una coma después de la parte [[volm 0.35]] de su script de shell. Probablemente no se requiera un espacio después de la coma.
set the clipboard to ("[[volm 0.35]], " & ("\n- This is a test."))
Esto también elimina el segundo error (guion y texto sin espacio de separación).
esfera de rubik
set the clipboard to ("[[volm 0.35]] " & ("\n- This is a test."))
esfera de rubik
esfera de rubik
newline + hyphen/dash + space
. Pero a menudo es una molestia y vale la pena la energía crear una publicación para resolver el problema. El discurso a todo volumen es muy sorprendente. No soy yo necesariamente quien está empleando el texto-problema; es cualquier selección de texto que existe que contiene el texto del problema. Preferiría que mi script no tuviera este error, porque el texto que selecciono es impredecible.