Espeak поддерживает язык разметки синтеза речи (SSML ), и вы можете просто поместить эти теги в середину простого текстового файла (, т.е. вам не нужно преобразовывать все целиком что касается правильного SSML ). Тег, который вы ищете, вероятно,
. Другие возможные теги перечислены здесь:http://espeak.sourceforge.net/ssml.html
Espeak не будет использовать их по умолчанию, вам нужно будет передать флаг -m
. Например, вы можете использоватьespeak -m -f your_file.txt
Документация довольно краткая, поэтому вам, возможно, придется погрузиться в исходный код, чтобы найти такие вещи, как возможные значения. (Я бы написал документацию получше, но есть неслитые патчи девятилетней давности и исходный репозиторий недоступен, поэтому кажется, что проект полностью мертв. )Возможные значения тега выделения (и некоторых других тегов )можно найти здесь на Github . Они:
Например,:Did you mean the
Обратите внимание, что это не будет работать без кавычек (, в то время как
будет работать в HTML, но не будет работать без кавычек в SSML/espeak ).
В качестве альтернативы, espeak может по-разному читать слова, написанные прописными буквами, используя флаг -k
:, если вы используете команду espeak -k20 -f your_file.txt
, вы заметите, что она меняет высоту тона для слов, написанных «ПОЛНЫМИ ЗАГЛАВНЫМИ». Эти две опции не смешиваются, поэтому вы не можете выделить и изменение высоты тона, используя обе опции.
Однако в SSMLвы можете смешивать их:Did you mean the
будет читаться как с акцентом, так и с более высоким тоном.
Чтобы передать group
в awk как переменную, вам нужно -v group="developers"
и чтобы awk обрабатывал ее как переменную (, а не строковый литерал ), он должен быть вне двойных кавычек, например
awk -v group="developers" '{print "changegrp " group " \""$0"\""}'
Тем не менее, вы можете избежать многих головных болей, используя что-то вроде
find. -type d -name '* *' -exec changegrp developers {} \;
или (, если changegroup
поддерживает несколько файловых аргументов -Я не знаком с конкретной командой)
find. -type d -name '* *' -exec changegrp developers {} +
См. также
Обойти find
и awk
и предположить, что вас интересуют только каталоги (в соответствии с вашим первым фрагментом кода):
shopt -s globstar dotglob nullglob
for name in./**/*' '*; do
[[ -d $name ]] && [[ ! -L $name ]] && changegrp developers "$name"
done
или,
shopt -s globstar dotglob nullglob
for name in./**/*' '*/; do
[[ ! -L ${name%/} ]] && changegrp developers "$name"
done
Здесь используется простой цикл для выполнения команды changegrp
для каждого каталога, в имени которого есть хотя бы один пробел. Это делается с помощью шаблона подстановки **
(, включенного с помощью параметра оболочки globstar
в bash
), который соответствует подкаталогам. Параметры оболочки nullglob
и dotglob
используются для того, чтобы оболочка удаляла несопоставленные шаблоны, а также сопоставляла скрытые имена.
Тест -L
используется здесь для исключения символических ссылок на каталоги (тест -d
будет истинным как для каталогов, так и для символических ссылок на каталоги ).
Во втором варианте приведенного выше кода мы выбираем только каталоги, добавляя /
в конце шаблона. Эту косую черту нужно убрать для теста -L
, что и делает ${name%/}
.
Тогда было бы легко сделать строку developers
переменной:
shopt -s globstar dotglob nullglob
group=developers
for name in./**/*' '*; do
changegrp "$group" "$name"
done
(Этот код дополнительно применяется changegrp
к всем именам, которые содержат пробелы в текущем каталоге или под ним, в соответствии с другими фрагментами кода в вопросе.)