¿Cómo sortear el error de comando "decir" al configurar el volumen?

Contexto:

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 saycomando. 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.


Cómo reproducir el 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á.


Formas adicionales de reproducir el error:

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.


El efecto del error:

  • 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 saydirectamente 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?

Gracias por traer eso a mi atención. Eso fue un error tipográfico que acabo de arreglar. Sí, puedo reproducir el error desde Script Editor.app, reemplazando la primera línea con la siguiente línea de código:set the clipboard to ("[[volm 0.35]] " & ("\n- This is a test."))
Si bien mi edición más reciente se publicó después de que publicaras tu comentario "Está bien, después de algunas pruebas..." , en realidad estaba trabajando en esta edición y descubrí la revelación de la nueva línea antes de leer tu comentario. Fue una coincidencia.
Con respecto a su segundo comentario, mi script toma el texto seleccionado y lo coloca en el portapapeles. No es tan frecuente que el texto seleccionado comience con más de una nueva línea o un 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.

Respuestas (2)

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 $!"
De hecho, descubrí que su primera solución contiene un nuevo error. Si el portapapeles contiene un guión que no va seguido de un espacio, entonces su código no leerá el texto. Por ejemplo, intenta usar este texto:-Speak this sentence.
Actualicé mi respuesta, puse un espacio de escape después de '[[volm 0.35]]
Encontré un error en tu segunda solución. Si el texto contiene un apóstrofe, el código pronunciará mal la palabra que contiene el apóstrofe. Si hay más de un apóstrofe en el texto del portapapeles, solo se pronunciará mal la primera palabra que contenga un apóstrofe. Por ejemplo, ejecute el código con la siguiente línea en el portapapeles: They've been here and they've been here and they've been here.Notará que el primero They'vese 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).

Su solución funciona perfectamente y también está libre de errores.