Як обійти помилку команди «сказати» під час встановлення гучності?


2

Контекст:

У мене є файл AppleScript .scpt, який говорить про вибраний текст у системному голосі. Вибраний текст копіюється в буфер обміну, а потім текст промовляється за допомогою sayкоманди. Сценарій спрацьовує натисканням клавіші через FastScripts.

Оскільки звук тексту в мові macOS за замовчуванням занадто гучний (а для мови не існує глобального регулювання гучності), я використовую AppleScript для встановлення гучності як частки від поточного обсягу. Я дізнався, як цього досягти з цієї посади:

Як змінити гучність "сказати" в AppleScript?

Ось частина мого коду, яка стосується мого питання:

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

Вищевказаний код говорить в тексті буфера обміну в обсязі, який становить 35% від поточного обсягу системи, що я хочу. (Так, за замовчуванням звукова мова справді така гучна.)

Код працює добре, за винятком я виявив помилку.


Як відтворити помилку:

Щоб побачити цю помилку, скопіюйте наступний текст у буфер обміну та запустіть наведений вище код:

 

- This is a test.

Текст проблеми важко відформатувати в Markdown (для чого використовується Stack Exchange), тому що 1) порожні нові рядки автоматично видаляються, і 2) комбінація дефісу-пробілу перетворюється на точку відліку списку. Ось чому вищенаведене форматування тексту виглядає вибагливим; Мені довелося використати блок-котирування, щоб обійти проблему першої, і мені довелося додати блок коду, щоб обійти проблему другу.

Ось проблема-текст, буквально прописаний словами (якщо ви хочете відкрити текстовий файл і відтворити текст):

newline
hyphen space Text

Переконайтеся, що ви включаєте порожній новий рядок, коли копіюєте текст у буфер обміну. Переконайтеся, що між дефісом та першим словом тексту є пробіл. Інакше помилка не вийде на поверхню.

Текст проблеми повинен бути самим початком тексту буфера обміну. Тобто, якщо проблемний текст знаходиться посередині або в кінці тексту буфера обміну, помилка не з’явиться на поверхні.


Додаткові способи відтворення помилки:

Дефіс (-) може бути замінений на тире (-) ( ⌥ option+ -) або em dash (-) ( ⌥ option+ ⇧ shift+ -), і помилка все одно вийде на поверхню. Наскільки я виявив у своїх тестах, немає інших знаків пунктуації, які можна замінити дефісом, який спровокує помилку.


Є ще один спосіб запустити помилку, який не передбачає дефісу чи дефіса. Якщо тексту передують щонайменше 2 символи нового рядка, помилка з’явиться на поверхні.

Наприклад:

  • Якщо є 1 символ нового рядка, помилка не з’явиться на поверхні.

  • Якщо над текстом є 47 символів нового рядка, помилка з’явиться на поверхні.

Чи є пробіли між 2+ символами нового рядка та текстом, значення не має; помилка поверхня в будь-якому випадку.


Ефект помилки:

  • Під час запуску коду AppleScript із проблемним текстом у буфері обміну, обсяг не зменшується ні на один біт; Буфер обміну буде розмовляти на рівні гучності системи.

  • Також спостерігається помітна затримка до того, як текст буде промовлено.


Щоб було зрозуміло, хоча контекст мого питання - це .scpt файл, технічно це не помилка AppleScript. Помилка існує при використанні sayбезпосередньо в Terminal.app. Наприклад, введіть у Terminal наступне для відтворення помилки:

say "[[volm 0.35]]
- This is a test."

Чи можна виправити цю помилку, щоб, коли вміст буфера обміну починався з будь-якого типу проблемного тексту, мій скрипт залишався чутливим до користувацького обсягу, а затримка не вводилася?


Дякую за те, що ви звернули на це увагу. Це був помилковий помилок. Так, я можу відтворити помилку в Script Editor.app, замінивши перший рядок наступним рядком коду:set the clipboard to ("[[volm 0.35]] " & ("\n- This is a test."))
сфера

Хоча моя остання редакція була опублікована після того, як ви опублікували коментар "Добре, після деякого тестування ..." , я фактично працював над цією редакцією і відкрив відкриття нового рядка, перш ніж читати ваш коментар. Це був збіг.
сфера

Що стосується вашого другого коментаря, мій сценарій бере вибраний текст і ставить його в буфер обміну. Не так часто вибирається текст починається з декількох нових рядків або а newline + hyphen/dash + space. Але нерідко достатньо, щоб створити посаду для вирішення питання - це неприємність і вартий енергії. Виступ на повній гучності дуже вражаючий. Це не я обов'язково використовую текст-проблему; це будь-який виділений текст, який містить проблемний текст. Я вважаю за краще, щоб у моєму сценарії не було цієї помилки, оскільки вибраний нами текст непередбачуваний.
сфера

Відповіді:


2

Найкраще - помістити "[[volm 0.35]]" в оболонку (а не в буфер обміну), наприклад:

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

Або, якщо ви хочете помістити " [[volm 0.35]] " в буфер обміну, використовуйте одиничні лапки, як-от так:

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

Я фактично виявив, що ваше перше рішення містить нову помилку. Якщо буфер обміну містить дефіс, за яким не пробіл, то ваш код не буде говорити текст. Наприклад, спробуйте скористатися цим текстом:-Speak this sentence.
сфера

Я оновив свою відповідь і поставив пробіл після '[[volm 0.35]]
jackjr300

Я знайшов помилку у вашому другому рішенні. Якщо текст містить апостроф, то код буде неправильно вимовляти слово, яке містить апостроф. Якщо в тексті буфера обміну є більше одного апострофа, то лише перше слово, яке містить апостроф, буде неправильно вимовлено. Наприклад, запустіть код у наступному рядку в буфері обміну: They've been here and they've been here and they've been here.Ви помітите, що перший They'veвимовляється як "вони". Але це не велика справа; у вашому першому рішенні немає цієї помилки, тому я просто використаю перше рішення.
сфера

1

Просто додайте кому після [[volm 0.35]] частини вашого сценарію оболонки. Пробіл після коми, ймовірно, не потрібно.

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

Це також виключає другу помилку (дефіс та текст без розділення пробілу).


Ваше рішення працює відмінно, а також без помилок.
сфера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.