¿Cómo cambiar el volumen de "decir" en AppleScript?

Aquí hay una línea de mi AppleScript que habla el texto seleccionado:

set this_say_Pid to do shell script "LANG=en_US.UTF-8 pbpaste -Prefer txt | say > /dev/null 2>&1 & echo $!"

Me gustaría que el volumen de habla fuera mucho más bajo. Preferiría no lograr esto disminuyendo el volumen general de mi sistema.

Puedo disminuir con éxito el volumen de sayla Terminal con el siguiente código:

say "[[volm 0.35]] This is a sentence"

Pero, cuando inserto [[volm 0.35]]en mi do shell scriptcuerda, el volumen no cambia.

Respuestas (3)

Dado que está canalizando la salida del pbpaste comando directamente a say command , entonces, por ejemplo [[volm 0.35]], debería ser parte de lo que está en el portapapeles, por ejemplo, [[volm 0.35]]debe preceder al contenido de lo que realmente se iba a decir.

Intentaría usar lo siguiente en lugar de lo que está usando:

set howLoudAndWhatToSay to "[[volm 0.35]] \"" & (get the clipboard as string) & "\""

set this_say_Pid to do shell script "say " & howLoudAndWhatToSay & " > /dev/null 2>&1 & echo $!"

Actualización: si desea seguir usando pbpaste, entonces este comando de ejemplo debería funcionar:

set this_say_Pid to (do shell script "echo \"[[volm 0.35]] $(LANG=en_US.UTF-8 pbpaste -Prefer txt)\" | say > /dev/null 2>&1 & echo $!")

Tenga en cuenta las principales diferencias entre el comando dentro del do shell script "..." comando en su pregunta y mi respuesta.

  • echo \"[[volm 0.35]]se agrega delante de LANG=...y tenga en cuenta el espacio después de ]].
  • El LANG=en_US.UTF-8 pbpaste -Prefer txtahora está incluido en $(...)el cual está usando Command Substitution para, en esencia, concatenar lo que se repite en la canalización antes del say comando .

  • Además de una comilla doble literal de cierre coincidente \", antes de la tubería a say, para ir con el que está en echo \"[[volm 0.35]]. Funcionó en pruebas limitadas sin el uso de comillas dobles de apertura y cierre; sin embargo, probablemente sea mejor encerrarlo entre comillas dobles para tener en cuenta algo que el shell podría intentar expandir innecesariamente .

Dicho esto, en mi sistema, el uso 0.35del valor en [[volm 0.35]]no funcionó bien porque era difícil percibir la diferencia de volumen con respecto a mi configuración normal. Sin embargo, el uso 0.3de [[volm 0.3]]la diferencia fue notable. (Esta es una de las razones por las que usé "eg [[volm 0.35]]" en mi oración inicial).

respuesta sencilla:

say "[[volm 0.04]] This is a sentence"

Me parece que de 0,01 a 0,04 es la salida de menor volumen.

Cuando probé 0.25 o 0.35 el volumen no cambió.

Simplemente mueva la primera comilla doble:... "say [[volm 0.35]] This is a sentence"

En Terminal.app, las comillas no son necesarias en absoluto y say [[volm 0.35]] This is a sentencesimplemente funcionan.


En su línea de código, tendría que anteponer [[volm 0.35]]el texto copiado.

En Terminal, la siguiente línea funcionaría:

cat <(echo [[volm 0.35]] ) <(LANG=en_US.UTF-8 pbpaste -Prefer txt) | say 

pero no consigo que esto funcione correctamente en su línea AppleScript; probablemente tenga que escapar de uno o varios elementos.

Lo siento, no fui claro. Estoy tratando de lograr el cambio de volumen con AppleScript, no directamente en la Terminal. No sé dónde [[volm 0.35]]pertenece en la línea de código que proporcioné.
Algunas reflexiones y observaciones... Si bien cat <(echo [[volm 0.35]] ) <(LANG=en_US.UTF-8 pbpaste -Prefer txt) | say, tal como está, funciona bien en un bash shell , no funciona en un sh shell , que es lo que usa AppleScript. Así que no creo que tenga que ver con escapar de ninguna parte de ese comando en particular . Si abre la Terminal, asumiendo que es el shell predeterminado , bashy escribe shy presiona enter , luego ejecuta el mismo comando , se produce un error sh: syntax error near unexpected token `(', al igual que en AppleScript. Parece que al sh shell no le gusta la sustitución de procesos.
Si bien uno podría anteceder ese comando con bash -c , por ejemplo set this_say_Pid to (do shell script "bash -c \"cat <(echo [[volm 0.35]] ) <(LANG=en_US.UTF-8 pbpaste -Prefer txt) | say > /dev/null 2>&1 & echo $!\""), para ejecutarlo realmente en un bash shell , el say comando funcionará correctamente pero no obtendrá el piddel say comando , lo que, por supuesto, anula el propósito. Con suerte, la esfera de Rubik puede usar lo que sugerí en mi respuesta si no hay otra forma de hacerlo en la línea de su sugerencia.
De acuerdo, descubrí una forma de solucionar el problema que tenía el sh shell<(...) con la Sustitución de procesos y ofrecer una solución mediante el pbpasteuso de Sustitución de comandos $(...)en su lugar, como se muestra en mi respuesta actualizada, que aún incluye mi respuesta original, ya que muestra otra forma de lograr el lo mismo, aunque dos líneas de código en lugar de una. :)