2 votos

¿Cómo evitar el error del comando "say" al ajustar el volumen?

Contexto:

Tengo un archivo AppleScript .scpt que dice el texto seleccionado en la Voz del Sistema. El texto seleccionado se copia en el portapapeles, y luego el texto se habla a través de la say mando. El script se activa pulsando una tecla a través de FastScripts.

Dado que el volumen del Text-to-Speech de MacOS es demasiado alto por defecto (y no hay control de volumen global para el Speech), utilizo AppleScript para establecer el volumen como una fracción del volumen actual. Aprendí cómo lograr esto de este post:

¿Cómo cambiar el volumen de "say" 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 dice el texto del portapapeles a un volumen que es el 35% del volumen actual del sistema, que es lo que deseo. (Sí, el Habla audible es realmente así de alto por defecto).

El código funciona bien, pero he descubierto un error.


Cómo reproducir el fallo:

Para observar este error, copie el siguiente texto en el portapapeles y, a continuación, ejecute el código anterior:

- This is a test.

El problema es que el texto 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-espacio se convierte en una viñeta de lista. Esta es la razón por la que el formato del texto de arriba se ve torcido; tuve que usar una cita de bloque para evitar el problema uno, y tuve que añadir un bloque de código para evitar el problema dos.

Aquí está el problema-texto, literalmente deletreado en palabras (si quieres 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úrate de que hay un espacio entre el guión y la primera palabra del texto. De lo contrario, el error no aparecerá.

El texto-problema debe ser el principio del texto del portapapeles. Es decir, si el texto problemático se encuentra en medio o al final del texto del portapapeles, el error no aparecerá.


Formas adicionales de reproducir el fallo:

El guión (-) puede sustituirse por un guión (-) ( option + - ) o un guión (-) ( option + shift + - ), y el fallo seguirá apareciendo. Por lo que he encontrado en mis pruebas, no hay otros símbolos de puntuación que puedan ser sustituidos por el guión que desencadenen el error.


Hay otra forma de activar el error, que no implica ni guión ni raya. Si el texto va precedido de 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, aparecerá el error.

No importa si hay espacios entre los más de 2 caracteres de nueva línea y el texto; el error aparece de cualquier forma.


El efecto del bicho:

  • Al ejecutar el código AppleScript con el texto problemático en el portapapeles, el volumen no se reduce ni un ápice; se hablará con el 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, esto no es técnicamente un error de AppleScript. El error existe cuando se utiliza 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 para que, cuando el contenido del portapapeles comience con cualquier tipo de texto problemático, mi script siga siendo sensible al volumen personalizado y no se introduzca un retardo?

0 votos

Gracias por llamar mi atención sobre ello. Era una errata que acabo de corregir. Sí, soy capaz de reproducir el error desde dentro script Editor.app, mediante la sustitución de la primera línea con la siguiente línea de código: set the clipboard to ("[[volm 0.35]] " & ("\n- This is a test."))

0 votos

Aunque mi edición más reciente se publicó después de que usted publicara su "Bien, después de algunas pruebas..." comentario, 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.

0 votos

Respecto a tu segundo comentario, mi script coge el texto seleccionado y lo pone 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 es lo suficientemente frecuente como para que sea una molestia y merezca la pena dedicarle energía a crear un puesto para resolver el problema. El habla a todo volumen es muy sorprendente. No es me necesariamente que está empleando el texto-problema; es cualquier selección de texto que existe que contiene el texto-problema. Preferiría que mi script no tuviera este bug, porque el texto que selecciono es impredecible.

2voto

Baczek Puntos 150

Lo mejor es poner '[[volm 0.35]] '[[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, utiliza las 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 $!"

0 votos

En realidad he encontrado que su primera solución contiene un nuevo bicho. Si el portapapeles contiene un guión que no va seguido de un espacio, tu código no pronunciará el texto. Por ejemplo, intente utilizar este texto: -Speak this sentence.

0 votos

He actualizado mi respuesta, he puesto un espacio de escape después de '[[volm 0.35]]

0 votos

He encontrado 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óstrofo en el texto del portapapeles, sólo se pronunciará mal la primera palabra que contenga un apóstrofo. 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. Observará que el primer They've se pronuncia como "they vee". Pero, esto no es un gran problema; su primera solución no tiene este error, así que simplemente usaré la primera solución.

1voto

klanomath Puntos 19587

Simplemente añada una coma después de la parte [[volm 0.35]] de su shell script. Un espacio después de la coma probablemente no sea necesario.

set the clipboard to ("[[volm 0.35]], " & ("\n- This is a test."))

Esto también elimina el segundo error (guión y texto sin espacio de separación).

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