скрипт bash с использованием espeak говорит только первое слово

Я пишу сценарий bash для преобразования текстов песен в аудиоклипы с использованием espeak. Проблема в том, что espeak говорит только первое слово, а не строку за строкой, которую я читаю. Я пытался поместить строки в файл с кавычками, но это не решило проблему.

Вот мой сценарий bash:

#!/bin/bash
input="$1"
##input="/path/to/txt/file"
while IFS= read -r line
do
  echo "$line"
  espeak -k cantonese $line

done < "$input"

Здесь текстовый файл построчно:

"Work it"
"Make it"
"Do it"
"Make us"
"Harder"
"Better"
"Faster"
"Stronger"

Как заставить говорить на эспике каждое слово? ] Обратите внимание, что каждое слово произносится, когда я читаю из файла, используя опцию -f.

2
задан 12 June 2019 в 04:07

1 ответ

Вместо:

espeak -k cantonese $line

Использовать:

espeak -k cantonese "$line"

Когда вы опускаете двойные кавычки вокруг $line, оболочка выполняет разбиение слов по результату расширения параметра , и каждое слово передается как отдельный аргумент командной строки для espeak. Команда espeak говорит только о первом аргументе. Запись "$line" вместо $line подавляет разбиение слов, в результате чего весь текст, сохраненный в параметре line, передается как один аргумент в espeak. (Он также подавляет сглаживание , что является другой вещью, которую вы не хотите делать в этой ситуации, хотя ваши тестовые входы, скорее всего, пока не вызывали ее.)

Это происходит даже в более простом использовании espeak. Например, espeak hello world говорит просто «привет», а espeak 'hello world' или espeak "hello world" говорит «привет мир».

Что касается рода цитат использование, причина написать "$line", а не '$line', в том, что одинарные кавычки слишком сильны для того, что вам нужно. Они будут подавлять разбиение и сглаживание слов, но они также подавляют расширение параметров. Таким образом, с '$line' команда espeak будет видеть буквенный текст $line вместо любого текста, содержащегося в параметре line.

3
ответ дан 12 June 2019 в 04:07

Другие вопросы по тегам:

Похожие вопросы: