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

2

Contexto:

Tengo un archivo .scpt de AppleScript que habla el texto seleccionado en la voz del sistema. El texto seleccionado se copia al portapapeles, y luego el texto se pronuncia a través del comando say . La secuencia de comandos se activa mediante la pulsación de teclas a través de FastScripts

Debido a que el volumen de texto a voz de macOS es demasiado alto de forma predeterminada (y no hay control de volumen global para el habla), uso AppleScript para configurar el volumen como una fracción del volumen actual. Aprendí cómo lograr esto a partir de este post:

¿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í, la voz audible es realmente tan alta por defecto).

El código funciona bien, excepto que he descubierto 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 utiliza Stack Exchange) porque 1) las nuevas líneas en blanco se eliminan automáticamente, y 2) una combinación de espacio de guión se convierte en un punto de viñeta de lista. Esta es la razón por la cual el formato de texto anterior se ve borroso; Tuve que usar un blockquote para solucionar el problema uno, y tuve que agregar un bloque de código para solucionar el problema dos.

Aquí está el texto del problema, literalmente en 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 al copiar 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 principio del texto del portapapeles. Es decir, si el texto del problema está en la mitad o al final del texto del portapapeles, el error no aparecerá. .

Formas adicionales para reproducir el error:

El guión (-) puede sustituirse por un guión (-) ( ⌥ opción + - ) o un guión de em (-) ( Opción + ⇧ shift + - ), 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.

Hay otra forma de desencadenar el error, que no implica un guión o guión. 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, surgirá el error.

Si hay espacios entre los 2+ caracteres de nueva línea y el texto no importa; el error surge de cualquier manera.

El efecto del error:

  • Al ejecutar el código AppleScript con el texto del problema en su portapapeles, el volumen no disminuye un bit; el portapapeles se emitirá a nivel de volumen del sistema.

  • Además, hay un retraso notable antes de que se pronuncie el texto.

Para ser claro, si bien 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 la 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 comienza con cualquier tipo de texto de problema, mi script sigue siendo sensible al volumen personalizado y no se introduce un retraso?

    
pregunta rubik's sphere 05.04.2017 - 02:15

2 respuestas

2

Lo mejor es poner '[[volm 0.35]]' en el shell (no en el portapapeles), de esta forma:

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 quieres poner " [[volm 0.35]] " en el portapapeles, usa las comillas simples, como esta:

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 $!"
    
respondido por el jackjr300 05.04.2017 - 17:31
1

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 (guión y texto sin separar el espacio).

    
respondido por el klanomath 22.04.2017 - 07:36

Lea otras preguntas en las etiquetas