Контекст:
У мене є файл 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."
Чи можна виправити цю помилку, щоб, коли вміст буфера обміну починався з будь-якого типу проблемного тексту, мій скрипт залишався чутливим до користувацького обсягу, а затримка не вводилася?
newline + hyphen/dash + space
. Але нерідко достатньо, щоб створити посаду для вирішення питання - це неприємність і вартий енергії. Виступ на повній гучності дуже вражаючий. Це не я обов'язково використовую текст-проблему; це будь-який виділений текст, який містить проблемний текст. Я вважаю за краще, щоб у моєму сценарії не було цієї помилки, оскільки вибраний нами текст непередбачуваний.
set the clipboard to ("[[volm 0.35]] " & ("\n- This is a test."))