Как изменить громкость «говорить» в AppleScript?

Вот строка из моего AppleScript, которая произносит выделенный текст:

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

Я бы хотел, чтобы громкость речи была намного ниже. Я бы предпочел не делать этого, уменьшая общий объем системы.

Я могу успешно уменьшить громкость sayв Терминале с помощью следующего кода:

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

Но когда я вставляю [[volm 0.35]]свою do shell scriptстроку, громкость не меняется.

Ответы (3)

Поскольку вы передаете вывод команды pbpaste непосредственно в say команду , то, например, [[volm 0.35]]он должен быть частью того, что находится в буфере обмена, поскольку, например, [[volm 0.35]]должен предшествовать содержанию того, что на самом деле будет сказано.

Я бы попробовал использовать следующее вместо того, что вы используете:

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 $!"

Обновление: если вы хотите продолжать использовать pbpaste, тогда эта примерная команда должна работать:

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 $!")

Обратите внимание на основные различия между командой внутри do shell script "..." команды в вашем вопросе и моим ответом.

  • echo \"[[volm 0.35]]добавляется перед LANG=...и обратите внимание на пробел после ]].
  • LANG=en_US.UTF-8 pbpaste -Prefer txtТеперь заключено в котором $(...)используется подстановка команд, чтобы, по сути, объединить то, что отображается в конвейере перед say командой .

  • А также совпадающая закрывающая двойная кавычка \"перед каналом to say, чтобы перейти к тому, что находится в echo \"[[volm 0.35]]. Он работал в ограниченном тестировании без использования открывающих и закрывающих двойных кавычек, однако, вероятно, лучше заключить его в двойные кавычки, чтобы учесть то, что оболочка может попытаться расширить без необходимости .

Тем не менее, в моей системе использование 0.35значения in [[volm 0.35]]не работало хорошо, так как было трудно воспринять разницу в громкости по сравнению с моей обычной настройкой. Однако 0.3при использовании [[volm 0.3]]разница была заметна. (Это одна из причин, почему я использовал «например [[volm 0.35]]» в первом предложении.)

простой ответ:

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

Мне кажется, что от 0,01 до 0,04 - это меньший выходной объем.

Когда пробовал 0.25 или 0.35 громкость не менялась.

Просто переместите первую двойную кавычку:... "say [[volm 0.35]] This is a sentence"

В Terminal.app кавычки вообще не нужны и say [[volm 0.35]] This is a sentenceпросто работают.


В вашей строке кода вам нужно будет добавить [[volm 0.35]]скопированный текст.

В Терминале будет работать следующая строка:

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

но я не заставляю это правильно работать в вашей строке AppleScript - возможно, мне нужно избежать одного или нескольких элементов.

Извините, я не ясно выразился. Я пытаюсь выполнить изменение громкости с помощью AppleScript, а не напрямую в терминале. Я не знаю, где [[volm 0.35]]находится строка кода, которую я предоставил.
Некоторые мысли и наблюдения... В то время как cat <(echo [[volm 0.35]] ) <(LANG=en_US.UTF-8 pbpaste -Prefer txt) | say, как есть, он нормально работает в bash оболочке , он не работает в sh оболочке , которую использует AppleScript. Поэтому я не думаю, что это связано с экранированием какой-либо части этой конкретной команды . Если вы откроете терминал, предполагая, что это оболочка по умолчанию , bashи наберете shи нажмете ввод , затем выполните ту же команду , она выдаст ошибку sh: syntax error near unexpected token `(', как и в AppleScript. Похоже, sh оболочке не нравится замена процесса.
Хотя эту команду можно было бы предварить , например , чтобы фактически запустить ее в оболочке, команда будет работать правильно, но вы не получите команду , bash -c что 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 $!\""), bash конечно , say тогда противоречит pidцели . Надеюсь, сфера Рубика сможет использовать то, что я предложил в своем ответе, если нет другого способа сделать это в соответствии с вашим предложением. say
Хорошо, я нашел способ обойти проблему, с которой sh оболочка столкнулась с заменой процесса, <(...)и предложить решение, используя pbpasteвместо этого замену команд $(...), как показано в моем обновленном ответе, который все еще включает мой первоначальный ответ, поскольку он показывает другой способ выполнить то же самое, только две строки кода вместо одной. :)